引言:
tcp是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。tcp位於網路層之上,應用層之下的傳輸層。開啟tcp的socket只需要指定目的ip位址和本地埠號。
具體的tcp協議圖如下所示:
tcp連線的開啟:
tcp是可靠的傳輸層協議,所以tcp連線的開啟和終止也是要保證可靠的。因此,tcp通過三次握手來保證連線開啟的可靠性,通過四次握手來保證連線關閉的可靠性。
那麼首先是三次握手。如圖所示,用一種對話方式來表示三次握手,很有意思。
實際上,三次握手的資料報收發是下面這樣的:
第一次,客戶端傳送syn(syn=j)到伺服器,並進入syn_send狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=j+1),同時自己也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器進入syn_recv狀態;
第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack( ack=k+1),此包傳送完畢,客戶端和伺服器進入established狀態,完成三次握手。
在上述過程中,還有一些重要的概念:
未連線佇列:在三次握手協議中,伺服器維護乙個未連線佇列,該隊列為每個客戶端的syn包(syn=j)開設乙個條目,該條目表明伺服器收到syn包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連線在伺服器處於syn_recv狀態,當伺服器收到客戶端的確認包時,刪除該條目,伺服器進入established狀態。
syn-ack:重傳次數。伺服器傳送完syn-ack包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連線資訊從半連線佇列中刪除。注意,每次重傳等待時間不一定相同。
tcp連線的終止:
下面介紹四次揮手。首先上圖:
客戶端發起結束連線,伺服器收到後馬上確認,伺服器準備好了之後再傳送訊息通知客戶端,客戶端傳送確認然後連線終止。
實際的通訊過程是下面這樣的:
第一次揮手:主動方傳送fin+ack報文,fin=1,傳送序號seq=x。
第二次揮手:被動方傳送ack報文,確認序號ack=x+1.
第三次揮手:應用程序關閉或,被動方傳送fin報文再揮手一次。fin=1,順序號seq=y.
第四次揮手:主動放傳送ack報文。ack=y+1;
如下圖所示是完整的tcp傳輸
TCP連線建立過程和TCP連線終止過程
1 當客戶端想要與伺服器端進行tcp通訊時,會首先傳送乙個syn同步包 tcp包頭的syn位被置位 並指明要連線的伺服器端口號。2 如果伺服器端同意連線,就會向客戶端傳送乙個ack確認包 tcp包頭的ack被置位 表示同意客戶端的請求,同時將該包的syn位置位,表示伺服器也想與客戶端通訊。3 客戶端...
TCP的連線與終止
t c p將使用者資料打包構成報文段 它傳送資料後啟動乙個定時器 另一端對收到的資料進行確認,對失序的資料重新排序,丟棄重複資料 t c p提供端到端的流量控制,並計算和驗證乙個強制性的端到端檢驗和。導致兩個進入established狀態的變遷對應開啟乙個連線,而兩個導致從established狀態...
TCP的連線與終止
一 三次握手 1 伺服器必須準備好接受外來的連線。這通常通過呼叫socket bind和listen這三個函式來完成,我們稱之為被動開啟。2 客戶端通過呼叫connect發起主動開啟。這導致客戶tcp傳送乙個syn 同步 位元組,它告訴伺服器客戶將在 待建立 連線傳送的資料的初始序列號。通常syn分...