listen/accept 流程
三次握手
syn x
syn y ,ack x+1
ack y+1
服务器端在调用listen之后,内核会建立两个队列,SYN队列和ACCEPT队列,其中ACCPET队列的长度由backlog指定。(listen的参数)
服务器端在调用accpet之后,将阻塞,等待ACCPT队列有元素。
客户端在调用connect之后,将开始发起SYN请求,请求与服务器建立连接,此时称为第一次握手。
服务器端在接受到SYN请求之后,把请求方放入SYN队列中,并给客户端回复一个确认帧ACK,此帧还会携带一个请求与客户端建立连接的请求标志,也就是SYN,这称为第二次握手
客户端收到SYN+ACK帧后,connect返回,并发送确认建立连接帧ACK给服务器端。这称为第三次握手
服务器端收到ACK帧后,会把请求方从SYN队列中移出,放至ACCEPT队列中,而accept函数也等到了自己的资源,从阻塞中唤醒,从ACCEPT队列中取出请求方,重新建立一个新的sockfd,并返回。
取出之后,此时的accpet队列中就没有了资源。
SYN包含的TCP连接选项
MSS tcp最大分节
窗口规模选项
时间戳
结束流程
发起端说 FIN M
接收端说 ack M+1
接收端说 FIN N
发起端说 ack N+1
2msl ip数据在链路上存在的最大时间
Ip4 数据报最大65535-20 =65515 最小MTU 68字节 20固定头长,最多40字节选项
Ip6 数据报最大65575 -40-20TCP头= 65515 比上面多了40字节 最小MTU 1280字节
MTU IP4 一般1500
IP6 最大净荷模式,mss=65535 发送数据包的限制就是MTU的限制
IP4 一般MTU = mss + tcp头+ip头 =1460+20+20