TCP连接的建立与终止

来源:互联网 发布:安徽建筑大学网络教育 编辑:程序博客网 时间:2024/05/20 20:48

先附上正常连接和正常关闭情况下TCP状态变迁图
这里写图片描述
两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。TCP特意设计了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接。
这里写图片描述
两个应用程序同时都执行主动关闭也是可能的,TCP协议也允许这样的同时关闭(simultaneous close)
这里写图片描述
TIME_WAIT
1. TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL,它是任何报文段被丢弃前在网络内的最长时间。
2. 防止上一次连接中的交互包,迷路后重新接收到,影响新的连接(经过2MSL,上一次连接中所有的重复包都会消失)。
3. 当TCP执行一个主动关闭时,第四次挥手的ACK可能会丢失,该连接必须在TIME_WAIT状态停留2MSL,这样另一端超时重发第三次挥手的FIN,主动关闭方可以再发送一次ACK。
4. 通过修改/etc/sysctl.conf文件,服务器能够快速回收和重用那些TIME_WAIT的资源。
CLOSE_WAIT
主动方发起关闭请求之后,被动方处于CLOSE_WAIT状态,通常情况下这个状态的时间应该很短,如果出现大量CLOSE_WAIT状态,说明被动方程序有问题,应该在主动方发起关闭时,被动方要在recv或者send检测到,然后立即也发起close操作。
TCP的半关闭
close和shutdown
1. close只是把文件描述符的引用计数减1,只有在该文件描述符的计数变为0时才关闭文件描述符。那么在单线程或者多线程模型中,在任意地方close一次就会关闭连接,但是在多进程模型中,共享的同一个socket必须所有的进程都调用了close才会真正的关闭连接。并且close直接终止读和写两个方向的数据传输。
2. shutdown则不然,这里是没有引用计数什么事的,只要调用了就会去关闭连接。所以,调用shutdown与多线程、多进程无关。并且shutdown有三个选项,SHUT_RD,SHUT_WR,SHUT_RDWR,可以选择关闭。
这里写图片描述

0 0
原创粉丝点击