行健网络

?找回密码
?立即注册
查看: 2445|回复: 0
打印 上一主题 下一主题

[TCP/IP协议] TCP连接的释放:四次“挥手”

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-20 17:47:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

TCP建立连接需要三次握手,而释放却四次握手,这是由于TCP的半关闭(half-close)造成的。依然结合双方状态的改变来阐明TCP连接释放的过程。

A、B在双方建立连接后都处于ESTABLISHED状态,当数据传输完毕后,A的应用进程通过TCP首先向B发送连接释放报文段,并停止再发送数据,主动关闭TCP连接,A在发送的TCP连接释放报文段中将控制字段的FIN位置1,并且要消耗掉一个序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态。等待B的确认。


B收到A的连接释放报文段后,即发出确认,确认号当然是ack=u+1,而它的序号v也自然是它已发送数据的最后一个字节的序号加1,然后B进入CLOSE-WAIT(关闭等待)状态。同时TCP服务进程通知高层应用进程,因此,从A到B这个方向的连接就释放了,即A没有数据要发送了,但对于B发送的数据A仍然要接收,也就是说从B到A方向的连接还没有关闭。所以TCP连接处于半关闭状态。

A收到B的确认报文后,进入FIN-WAIT-2(终止等待2)状态,等待B发出连接释放报文段。

若B已经没有要向A发送的报文段,其应用进程就通知TCP释放连接,这时B向A发出连接释放报文,将FIN置1,序号为W(在半关闭状态下B又可能发送了一些数据),同时还重复上次已发送过的确认号ack=u+1。这时B进入LAST-ACK(最后确认)状态。等待A的确认。

A在收到B的释放报文后,要对此发出确认,ACK置1,确认号ack=w+1,而自己的序号是seq=u+1,然后进入TIME-WAIT(时间等待)状态。这时的TCP连接还并没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命(Maximum Segment Lifetime)RFC 793建议设为2分钟。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|网站地图|行健网络

GMT+8, 2019-10-16 11:14 , Processed in 0.064211 second(s), 14 queries .

Powered by Discuz! X3.2

? 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表