作爲網絡工程師,我非常熟悉TCP操作。作爲程序員,我涉足套接字編程,但從未寫過任何生產服務。TCP半開連接,Winsock,監聽/接受行爲
我們有一個與PTZ(平移/傾斜/變焦)相機集成的供應商系統。照相機看病人。相機數據被傳送到供應商服務器。供應商服務器將攝像機數據傳送給客戶端。 (它更多,但這是簡單的情況。)如果客戶想調整攝像頭,客戶端會將自定義命令發送到供應商服務器上的自定義服務。服務器解釋命令並將其發送到相機。相機移動。
我們遇到了服務器上的PTZ服務崩潰的問題。在測試過程中,通過網絡捕獲,我們發現服務在nmap
執行半開(初始)連接時崩潰 - nmap發送SYN,服務器使用SYN/ACK回覆,nmap未發送最終ACK。服務器發送重複的SYN/ACK嘗試完成會話並失敗。
我想了解的:服務使用listen
來監視TCP連接,然後使用accept
接受連接。 listen
在什麼時候告訴服務有一個新的連接,準備好accept
ed?在listen
將服務傳遞給服務之前,TCP連接是否需要完成?accept
ed?或者服務器只需要在listen
告知服務之前返回SYN/ACK?
如果握手需要完成 - SYN,SYN/ACK,ACK - 在listen
之前告訴服務,那麼我可能會走錯了路。如果套接字只需要達到SYN/ACK,那麼服務處理不完整的會話可能會有問題。其他測試,我們完成TCP會話併發送虛假數據,試圖讓服務崩潰 - 並未導致服務失敗。但重複nmap
測試非常可靠地崩潰,所以我傾向於半開連接問題。
我想我已經得到了。因此,想象一下供應商系統的黑盒子,供應商可能坐在'select()'而不是'listen()'上。 所以在第2點,當連接「準備就緒並等待」時。 。 。這是否意味着握手已完成?客戶端發送了TCP ACK?還是可以等待最終客戶端的ACK? –
正如我在我的回答中所述:「*只有**完全建立**連接可用於'accept()',... *」。所以是的,在代碼看到連接之前,連接的握手必須完成。 –
謝謝雷米。非常感謝。這將表明半開連接不會破壞服務,所以它必須被髮送到服務。但我們無法確定它是什麼。現在我明白了listen(),select()和accept()與協議棧是如何協同工作的,我會繼續研究。再次感謝! –