22-1-tcp连接释放(三次挥手)

  有时候,我们在抓包时会看到FIN+ACK这种数据包,即三次挥手的连接释放的数据包,这是因为现在大多数实现都允许连接终止时使用三次挥手(但是大部分情况下,都是以四次挥手的连接释放为主),因此在这里,我们对tcp连接释放三次挥手简单了解下。

center

  1. 正常情况下,客户端tcp在收到客户端进程发来的关闭tcp连接命令后,就会发送一个FIN报文段把FIN标志位置为1。
  注意:这个FIN报文段可以携带客户端的最后一块数据,如果没有携带数据,那么这个FIN报文段也要消耗一个序号。


  2. 服务器收到客户端的FIN报文段后,会通知服务端进程,并发送第二个FIN + ACK报文段,用于确认服务器已经收到客户端的FIN报文段。其中ACK表示客户端到服务端方向的tcp连接关闭,FIN表示服务端到客户端方向的tcp连接将要关闭。

  注意:这个报文段也可以携带服务端最后的一块数据,如果没有携带数据,那么这个FIN + ACK报文段也要消耗一个序号


  3.客户端在收到服务端发送的FIN + ACK报文段后,客户端将发送最后一个ACK报文段,用于确认客户端已经收到服务端发送的FIN + ACK报文段,这个报文段包括了一个确认号。这个确认号是在服务端的FIN + ACK报文段的序号(seq = y)基础上+1,即(seq = y + 1)。
  注意:这个报文段不能携带数据,也不消耗一个序号。

最后一个ACK丢失

  这里可能会有小伙伴会有疑问,如果客户端最后一个ACK报文段丢失了怎么办,tcp连接还能正常关闭吗?

  前面说过,这个报文段不能携带数据,而tcp规定:对没有携带数据的报文段不会进行超时重传的(客户端最后一个ACK报文段丢失了不会重传),但是我们知道tcp规定对SYN和FIN标志位都被设计成占用一个字节的编号,所以当最后一个ACK报文段丢失了,服务端会超时重传自己的FIN报文段,直到收到客户端最后一个ACK确认。

  不知道大家有没有发现,tcp三次握手和tcp三次挥手道理其实是一样的。平时我们讨论tcp连接释放也都是以四次挥手为主,而三次挥手适合在双方都没有数据要发送的情况下

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值