您的位置:首页 > 理论基础 > 计算机网络

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,这样可以保证本次连接的所有数据都从网络中消失。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: