Unix網路程式設計上卷--第二章
阿新 • • 發佈:2019-02-03
TCP連線的建立:3次握手。
TCP連線的終止:4次應答。
TCP連線的終止挺難理解的。關鍵是要理解如果其中的每一步的訊息丟失了會出現什麼情況,而最關鍵的是理解TIME_WAIT狀態。
TIME_WAIT之前的所有應答,如果對方在規定時鐘時間內沒有“回信”,則重新發送訊息。但是最後一次伺服器給客戶傳送FIN後,客戶收到FIN要進入TIME_WAIT狀態,而不是關閉,這是為什麼呢?
書中給出的兩個理由:
1,如果客戶最後給伺服器的ACK N+1丟失了的話,在客戶設定的TIME_WAIT之後的2MSL時間內可能會收到伺服器端的FIN N,則客戶端重新發一下ACK N+1.
2,網路中可能殘餘的有分組沒有到達,則經過TIME_WAIT後的2MSL時間,所有這些分組消逝,從而不會影響客戶端與伺服器間新的連線的建立。
有個疑問:就是在於紅字“可能”所在的地方,如果伺服器端傳送的FIN N很不幸也丟失的話,怎TIME_WAIT後的2MSL時間後客戶關閉,但是伺服器卻依然沒有收到ACK N+1,這時候該怎麼辦呢? 是不是以後伺服器再發送FIN N時客戶端會返回“不可達”呢,還是伺服器嘗試幾次之後就認為客戶已經關閉,從而自己也關閉呢?
對read,write函式的誤解:
以前以為write就是在網路中傳送一個訊息,而read就是讀取一個訊息。
正解:從寫一個TCP套介面的write呼叫成功返回僅僅表示系統已經把程序要傳送的資料從程序的緩衝區copy到了核心的緩衝區,而並不一定傳送出去了。而read讀到的訊息,並不一定是write一次寫入的訊息(也有可能是多次),只有當read返回0的時候才認為資料傳輸結束了。