关闭tcp服务器_Tcp的拆链

本文深入探讨了TCP协议中的四次挥手(Fin拆链)和三次握手(Syn建链)过程,解释了为何Fin拆链需要四次交互,而Syn建链只需三次。在四次挥手过程中,TCP协议栈接收到Fin报文后通知应用程序,并等待应用程序的确认。而三次握手则因为服务器在收到Syn报文后可以直接响应Syn+Ack,无需应用程序介入。此外,还介绍了半关闭状态和同时关闭的情况,以及可能出现的问题及解决方案。
摘要由CSDN通过智能技术生成

本次讨论以下三点:

1、 fin拆链为啥4次握手,而syn建链只需要3次

2、 四次握手中,tcp协议栈和应用程序都做了什么?

3、 半关闭、同时关闭。

Fin拆链需要4次握手,如下图:

d3c341b3da055941ceb7da9d025d32a2.png

Fin拆链为啥需要四次握手

讨论fin为啥4次握手,这个要把tcp协议栈和应用程序结合起来看,下图是fin拆链过程应用程序的动作。

3ca4d0884b72b5250d54913086eb42b0.png

Fin报文是由自己的应用层进行“写操作close”动作触发的,而不是tcp协议栈自发的发送fin报文。

比如上图,当服务器B收到对方的Fin报文,仅仅意味着服务器A的应用不再发送数据(应用程序的写操作close),但是并不意味着服务器B的应用也不发送数据了。

Tcp收到fin后,给应用程序发送EOF(end of file),并响应ack。服务器B的应用程序也写close,tcp再发送fin。

Fin报文的响应(ack)不受应用层影响,所以这个ack一般不会延迟。而发送fin报文则需要应用程序写close触发。所以这两个报文一般不合并。

Syn报文为啥三次握手

8ede88c21b554ed43481f704534f4b5b.png

假如,如上图,把第二个syn ack报文拆开(红色的,现实和协议中规定这两个红色合为一个syn ack报文发送),拆成一个ack(响应服务器A的syn)和一个syn(服务器B的syn)

服务器B应用程序启动后,它的tcp协议栈就处于listen状态(等待对方建链),由于tcp链接又是全双工的,当服务器B收到syn报文后,syn和ack都不需要应用层参与,所以可以将将ack和syn合并一个报文

半关闭

Tcp链接的一端(的应用程序)不再发送数据(通知自己的tcp发送了fin),而另一端继续发送数据,这种状态为半关闭。

以下是半关闭场景的tcp协议栈和应用程序的动作示意。

a3963ce31926fa282ced38836a17aa56.png

fin关闭分类

主动关闭(最先发起fin的一端为主动关闭,一般客户端)

被动关闭(后发起fin的一端为被动关闭,一般服务器)

同时关闭(同时发起fin,比较少见,但是tcp协议支持)

022069588eea2b8bc58eb1149f6d2b35.png

遗留问题:

1、 主动关闭发送fin并收到ack后,但是一直没有收到对方的fin,(比如对方应用挂了,或者这时候网络突然断了),怎么办?

2、 主动关闭,收到了对方的ack,也收到了对方的fin,并且也对对方的fin发送了ACK,但是这个最后的ACK在网络传输中丢了,怎么办?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值