首页 > 其他分享 >套接字连接以及TCP三次握手详解

套接字连接以及TCP三次握手详解

时间:2023-02-21 22:33:58浏览次数:27  
标签:addr int TCP 描述符 详解 接字 连接 客户端

在套接字和地址文章中,我们画出基于套接字接口网络应用的一张图,本文章就是详细解释这些函数具体怎么实现的。

客户端和服务器工作的核心逻辑

socket创建套接字

客户端和服务器使用socket函数来创建一个套接字描述符。

int socket(int domain, int type, int protocol)

clientfd =  Socket(AF_INET,SOCK_STREAM , 0)
  • domain 就是指 PF_INET、PF_INET6 以及 PF_LOCAL 等,表示什么样的套接字。
  • type 可用的值是:
    SOCK_STREAM: 表示的是字节流,对应 TCP;
    SOCK_DGRAM: 表示的是数据报,对应 UDP;
    SOCK_RAW: 表示的是原始套接字。
  • protocol 原本是用来指定通信协议的,但现在基本废弃。因为协议已经通过前面两个参数指定完成。protocol 目前一般写成 0 即可。

socket返回的clientfd描述符仅是部分打开的,还不能用于读写,如何完成打开套接字的工作,取决于我们是客户端还是服务端。

connect连接

客户端通过调用 connect函数来建立和服务器的连接。

int connect(int clientid, const struct sockaddr *addr,socklen_t addrlen); 

connect 函数会阻塞,一直到连接成功建立或是发生错误。
如果(x:y,addr.sin_addr:addr.sin_port) 成功,clientfd描述符现在就准备好可以读写了,并且得到的连接是由套接字对
刻画的,其中x表示客户端的IP地址,而y表示临时端口,它唯一地确定了客户端主机上的客户端进程。

bind将套接字和套接字地址绑定

绑定套接字意味着为套接字分配地址和端口号。
bind函数告诉内核将addr中服务器套接字地址和套接字描述符sockfd联系起来。

bind(int fd, sockaddr * addr, socklen_t len)

sockaddr * addr:虽然接收的是通用地址格式,实际上传入的参数可能是 IPv4、IPv6 或者本地套接字格式。
bind 函数会根据 len 字段判断传入的参数 addr 该怎么解析,len 字段表示的就是传入的地址长度,它是一个可变值。

listen监听

客户端是发起连接请求的主动实体。服务器是等待来自客户端的连接请求的被动实体,默认情况下,内核会认为 socket 函数创建的描述符对应干主动套接字(active sock
) 不是客户端使用的。
它存在于一个连接的客户端,服务器调用 1isten函数告诉内核,播述符是被服务器

int listen (int socketfd, int backlog)

backlog 参数的确切含义要求对TCP P协议的理解,这超出了我们讨论的范围。通常我们会把它设置为一个较大的值。比首1024。

accept

服务器通过调用 accept 函数来等待来自客户端的连接请求。

int accept(int listenfd, struct sockaddr *addr, int *addrlen);

accept 函数等待来自客户端的连接请求到达侦听描述符 listenfd,然后在addc中填写客户端的套接字地址,并返回一个已连接描述符(connected descriptor),这个描述可被用来利用UnixI/O函数与客户端通信。
监听描述符是作为客户端连接请求的一个端点。它通常被创建一次,并存在于服务器的整个生命周期。
已连接描述将是客户端和服务器之间已经建立起来了的连接的一个端点。服务器每次接受连接请求时会创建一次,它只存在于服务器为一个客户端服务的过程中。
这两者的区别,能够让服务器同时处理多个客户端连接。每次一个连接请求到达监听描述符时,我们可以派生(fork)一个新的进程,它通过已连接描述符与客户端通信。

标签:addr,int,TCP,描述符,详解,接字,连接,客户端
From: https://www.cnblogs.com/JavaGoTray/p/17136643.html

相关文章

  • tcp的粘包现象
    粘包现象只出现在tcp协议中多条消息之间没有边界,并且还有一大堆优化算法发送端:两条消息很短并且发送的间隔很短接收端:接收消息不及时解决粘包问题的本......
  • Kroger EDI 855 采购订单确认报文详解
    本文着重讲述KrogerEDI项目中,供应商发给Kroger的X12855EDI规范报文(采购订单确认)解读。在此前的文章如何读懂X12报文中,我们对X12已经做了详细的介绍,大家可以以此为基础......
  • bfs详解
    bfs详解1,bfs的基本概念bfs是广度优先搜索,是一种对树形结构的遍历,他的思想是先选定一个点,从这个点出发,每次只走一步,分为四个方向,直到找到正确答案,相较于dfs的直接递归,bfs......
  • Flutter帧率监控 | 由浅入深,详解获取帧率的那些事
    前言做线上帧率监控上报时,少不了需要弄明白如何通过代码获取实时帧率的需求,这篇文章通过图解配合Flutter性能调试工具的方式一步步通俗易懂地让你明白获取帧率的基础知识,以......
  • 一文详解SpEL表达式注入漏洞
    摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段。本文分享自华为云社区《​​SpEL表达式注入漏洞分析、检查与......
  • 华为HCIA认证R&S路由与交换综合实验案例详解
    HCIA-R&S综合实验一这篇文章主要介绍了华为HCIA认证R&S路由与交换综合实验,结合具体实验案例形式详细分析了华为HCIA认证路由与交换子网划分、路由配置相关原理、操作技巧与......
  • 使用java.util.Timer实现定时任务,详解Thread.sleep() in a loop, probably busy-waiti
    很多时候,我们需要定时任务实现一些诸如刷新,心跳,保活等功能。这些定时任务往往逻辑很简单,使用定时任务的框架(例如springboot@Scheduled)往往大材小用。下面是一个定时任......
  • 一文详解SpEL表达式注入漏洞
    摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段。本文分享自华为云社区《SpEL表达式注入漏洞分析、检查与防......
  • 一、全国医保接口开发详解(整体介绍)
    一、开发过程1、需求分析第一、首先肯定要仔细阅读接口文档,设计接口系统整体架构,也就是接口系统、HIS系统、医保系统各自的职责。搞清楚文档接口要实现的技术,是调用程......
  • tcpdump用法
    超详细的网络抓包神器tcpdump使用指南https://juejin.cn/post/68449040841687695491.基本语法和使用方法tcpdump的常用参数如下:$tcpdump-ieth0-nn-s0-vport80-......