TCP三次握手与四次挥手
2016-03-08 11:34
441 查看
各个状态的意义如下:
LISTEN 侦听来自远方TCP端口的连接请求
SYN-SENT 在发送连接请求后等待匹配的连接请求
SYN-RECEIVED 在收到和发送一个连接请求后等待对连接请求的确认
FIN-WAIT-1 等待远程TCP的连接中断请求
FIN-WAIT-2 从远程TCP等待连接中断请求
CLOSE-WAIT 等待从本地用户发来的连接中断请求
CLOSING 等待远程TCP对连接中断的确认
LAST-ACK 等待原来发向远程TCP的连接中断请求的确认
TIME-WAIT 等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED 没有任何连接状态
TCP协议的连接时全双工连接,一个TCP连接存在双向的读写通道
简单来说是"先关读,后关写",一共需要四个阶段
1.服务器读通道关闭
2.客户机写通道关闭
3.客户机读通道关闭
4.服务器写通道关闭
关闭行为是在发送方数据发送完毕之后,给对方发出一个FIN数据段。直到接收到对方发送的FIN,且对方收到了
ACK之后,双方的数据通信完全结束,过程中,每次接收都需要返回数据段ACK
详细讲解TCP关闭连接过程:
Client调用close()函数,向Server发送FIN,请求关闭连接,Server收到FIN之后返回确认ACK,同时关闭通道,
此时的Server处于CLOSE_WAIT状态
Client收到对自己的FIN确认后,关闭写通道,不再向连接中写入任何数据
接下来Server调用Close()来关闭连接,给Client发送FIN,Client收到后给Server回复ACK确认,同时Client关闭
读通道,进入TIME_WAIT状态
Server接收到Client对自己的FIN的确认ACK,关闭写通道,TCP连接转化为CLOSED,也就是关闭连接
Client在TIME_WAIT状态下要等待最大数据段生存期的两倍,然后才进入CLOSED状态,TCP协议关闭连接过程彻底结束。
以上就是TCP协议关闭连接的过程
CLOSE_WAIT
发起TCP连接关闭的一方称为client,被动关闭的一方称为server。被动关闭的server收到FIN后,但未发出ACK的
TCP状态是CLOSE_WAIT。出现这种状况一般都是由于server端的代码问题,如果服务器上出现大量的CLOSE_WAIT,
应该考虑检查代码。
TIME_WAIT
根据TCP协议定义的3次握手断开连接规定,发起Socket主动关闭的一方socket将进入TIME_WAIT状态。TOME_WAIT
状态将持续2个MSL(Max Segment LifeTime),在Windows下默认为4分钟,即240秒。TIME_WAIT状态下的Socket不
能被回收利用,具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致
服务端存在大量的处于TIME_WAIT状态的socket,甚至比处于Establish状态下的socket多的多,严重影响服务器的
处理能力,甚至耗尽可用的socket,停止服务。
从上面可以看到,主动发起关闭连接的操作一方将达到TIME_WAIT状态,而且这个状态要保持Max Segment
Lifetime的两倍时间。为什么要这样做而不直接进入CLOSED状态?
原因有二:
1.保证TCP协议的全双工连接能够可靠关闭
2.保证这次连接的重复数据段从网络中消失
先说第一点:如果Client直接CLOSED了,那么由于IP协议的不可靠性或者其他网络原因,导致Server没有收到
Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于CLient已经CLOESD了,就找不到与重
发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的
情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求了。所以,Client不是直接进入CLOSED,
而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的
连接的端口号是不同的。也就是有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还
是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网
络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判
断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新数据
连接的数据包混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
相关文章推荐
- [面试系列]HTTPS交互流程
- OkHttp使用
- Http协议详解
- Android Http 助手类(麻雀虽小),实现文件上/传下载,Cookie机制
- HTTP的长连接和短连接
- Java https服务器认证问题的解决方法
- AFHTTPSessionManager
- 安卓Service组件使用系列3:使用IntentService下载网络图片
- httpd2.2.3+SVN1.4.6 (一)
- httpd2.2.3+SVN1.4.6(二)
- SvnManager1.0.5+httpd2.2.3+SVN1.4.6+PHP5.2.8+MySQL5.1.51
- TCP连接建立断开
- HttpClient 大量连接等待异常的处理
- 安卓Service组件使用系列2:使用Service下载网络图片并存储于sdCard卡上
- TCP状态学习
- HTTP Status Code [RFC]
- iOS AFN 封装POST网络请求(AFURLSessionManager)
- 下载网络文件HttpURLConnection.getContentLength()大小为 -1
- 无法访问HttpRequestBase 找不到org.apache.http.client.methods.HttpRequestBase的类文件
- 【小镇的技术天梯】理解VMware WorkStation的虚拟网络