加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – FIN省略,FIN-ACK发送

发布时间:2020-12-14 00:05:51 所属栏目:Linux 来源:网络整理
导读:因为它写在维基百科上,关闭TCP连接应该使用数据包FIN-(FIN,ACK) – ACK.但是当我使用close()函数关闭套接字时我没有看到FIN数据包,从服务器到客户端立即发送(FIN,ACK)数据包,然后客户端也通过发送(FIN,ACK)关闭连接,服务器响应ACK数据包.那么丢失的FIN数据包
因为它写在维基百科上,关闭TCP连接应该使用数据包FIN->(FIN,ACK) – > ACK.但是当我使用close()函数关闭套接字时我没有看到FIN数据包,从服务器到客户端立即发送(FIN,ACK)数据包,然后客户端也通过发送(FIN,ACK)关闭连接,服务器响应ACK数据包.那么丢失的FIN数据包在哪里(也许它合并到FIN,ACK)?

解决方法

关闭顺序也可以不同,不需要在同一个数据包中有FIN ACK:

> ACK只是确认收到数据(例如,收到的所有内容都是给定的序列号)
>数据包将被重新发送,直到收到一个ACK
> FIN只是说发送FIN的一方不会发送更多数据.如果它仍然会收到数据,它不会提供任何信息.
>与所有其他数据包一样,FIN将被重新发送,直到确认收据为止

像HTTP这样的协议支持单向关闭,例如客户端发送请求数据,然后发送FIN以通知服务器它将不再发送数据.但它仍然会收到服务器发送的数据.服务器将像之前的所有数据一样确认FIN.一旦服务器完成,它将发送自己的FIN,客户端确认.在这种情况下,你有

1. client: FIN  (will not send more) 
2. server: ACK (received the FIN)
.. server: sends more data...,client ACKs these data 
3. server: FIN (will not send more)
4. client: ACK (received the FIN)

请注意,您在步骤#1中看到的数据包也可能包含ACK.但是这个ACK只是确认服务器之前发送的数据.如果服务器没有更多要发送的数据,它也可能会关闭连接.在这种情况下,步骤2 3可以合并,例如,服务器发送FIN ACK,其中ACK确认客户端收到的FIN.

如果一方发送其FIN,则该连接被称为半封闭.一旦双方发送他们的FIN并收到FIN的ACK,它就会完全关闭,无论他们是在3或4个数据包中执行此操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读