2011-06-17 61 views
0

我看到內部網上兩臺主機之間連接失敗(稱爲客戶端和服務器)。TCP在傳輸中丟失時可以重新傳輸握手嗎?

在兩臺機器上使用netstat,我看到相應的端口號,其中服務器端處於SYN_RECV狀態,並且客戶端處於SYN_SENT中。

我的理解是服務器已經用SYN,ACK響應客戶端的SYN,但是這個數據包已經丟失。握手中斷,套接字連接處於未完成狀態,並在20-45秒後看到客戶端超時。

我的問題是,TCP是否爲服務器提供了一段時間後重傳SYN,ACK的方法?這是個好主意還是壞主意?

更多有關係統詳情:兩端RHEL5,ssh成功,ping失敗100%,traceroute成功。客戶端建立在OpenOrb(Java)上,服務器是Mico(C++)。

回答

2

SYN和FIN標誌被認爲是序列空間的一部分,並且可靠地傳輸(所以,對你的直接問題的答案是「是的,它默認是這樣」)。

不過,我覺得你真的要挖一個深一點,因爲:

如果你有大量的Intranet上的主機連接失敗的,這點在網絡中的問題 - 通常你應該有一個低的,如果有的話,在這些狀態下停留的連接。重傳將意味着你的連接會打嗝2,4,8,..秒(雖然不是必須的 - 取決於TCP堆棧,但對用戶來說沒有什麼好處)。

我會建議在兩臺主機上運行tcpdump或wireshark,並跟蹤發生數據包丟失的位置並進行修復。

在較舊的硬件上,頻繁的原因可能是路徑中某對設備上的雙工不匹配(錯誤自動檢測或錯誤硬編碼)。一些其他原因可能是驅動程序出現問題,或者是電纜不良(電纜不足以導致完全中斷,但足以導致定期停電)。