由於它在維基百科上撰寫關閉TCP連接應該使用數據包FIN - >(FIN,ACK) - > ACK。但是,當我使用close()函數關閉套接字時,我看不到FIN數據包,從服務器到客戶端立即發送(FIN,ACK)數據包,然後客戶端通過發送(FIN,ACK)關閉連接,服務器響應ACK分組。那麼丟失的FIN數據包在哪裏(也許它合併到FIN,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個數據包的形式進行傳輸,它都會被完全關閉。
+1理解「ACK」的關鍵是它將**應用於指定的確認號碼**。 'FIN' +'ACK'不是特殊**,除非**確認號碼是_lastdatabyte + 1_(因爲'FIN'按順序號計數,就像'SYN'一樣)。 –
我猜RFC1122第4.2.3.2節是關鍵。我錯了嗎? – hek2mgl
不是。這涉及延遲ACK等優化。關鍵是RFC793(例如RFC for TCP)部分3.5。但RFC不是一個容易閱讀:) –
- 1. Python socketserver發送FIN-Flag
- 2. 客戶端爲什麼不發送FIN?
- 3. 發送FIN的TCP端點是否仍然發送Keepalive?
- 4. 帶省略元素的CSS省略號?
- 5. 從谷歌電子表格發送電子郵件省略
- 6. Eclipse - 省略extenisons
- 7. DATE_FORMAT省略秒
- 8. 省略號
- 9. 省略圖案?
- 10. 省略部分
- 11. 在發佈版本中省略代碼
- 12. tcp應用程序退出將始終發送FIN?
- 13. 客戶端發送延遲的FIN ACK(〜500ms)到服務器
- 14. 如何通過scapy發送FIN數據包來關閉連接?
- 15. 如何使用python套接字發送TCP FIN
- 16. Websocket客戶端在握手後立即發送[FIN,ACK]
- 17. IOS 8.0.2不會在套接字關閉發送TCP FIN
- 18. 如何在C#中的HTTP GET請求後發送FIN + ACK?
- 19. 服務器發送復位信號而不是FIN
- 20. HTML/CSS省略號
- 21. 如何省略MenuItem?
- 22. 省略不工作
- 23. 省略循環值
- 24. Java可以省略在HTTP請求中發送一些頭文件嗎?
- 25. 在哪些情況下SSL服務器可以省略發送證書?
- 26. 策略發送延遲推
- 27. 忽略發送的事件
- 28. C#省略節點XML
- 29. DOMXPath對象值被省略
- 30. 添加省略?到URL
您確定服務器之前沒有關閉連接嗎?它看起來像服務器關閉連接 – hek2mgl
我沒有看到這樣的過渡:http://blog.zhuzhaoyuan.com/wp-content/uploads/2009/03/tcp-states1.png 創建一個最小的tcpdump示例。 –
當我使用close()函數關閉套接字時,我發現客戶端發送FIN,ACK,然後服務器以ACK響應 – scdmb