我很困惑的TCP使用的應用程序的行爲。當在Internet上的TCP連接的一端的應用程序在套接字上調用close()時,close()返回。然而,在另一端,套接字上的write()並不表示TCP連接已關閉。 AFAIK,這種行爲與TCP規範不一致:除非和直到它從TCP連接的另一端收到確認(具體地說,活動端的TCP狀態不能轉出),否則活動的close()不應該返回TIME_WAIT_1,除非它從另一端收到適當的響應 - 此時write()在另一端應該錯誤返回)。什麼會導致活動TCP關閉返回而不通知被動端?
我在TCP連接的兩端之間發現故障的入侵防禦系統(IPS)時就已經看到了這種行爲。 IPS的製造商正在解決這個問題。
是否有其他可能發生此行爲的情況?
我的環境是Unix,C,ONC RPC和套接字。
你確定連接沒有被關閉,應用程序只是不知道它,直到它執行'read()'/'write()'嗎?由於OS內核最終管理連接,'close()'實際上可以正常工作,在返回之前等待來自遠程的響應。但是,然後,遠程內核知道連接已關閉,但無法通知應用程序,直到稍後嘗試訪問該連接...您必須跟蹤數據包才能確定,我認爲... – twalberg 2013-03-01 18:01:12
@twalberg TCP連接的被動關閉端在write()系統調用中,或者將很快調用write()。 – 2013-03-01 20:15:51