tcp是提供客戶和伺服器之間的連線,tcp客戶端首先要先與某個給定的伺服器建立乙個連線,再通過該連線與那個伺服器交換資料,最後終止這個連線。
此外,tcp提供了可靠性:當tcp向另一端傳送資料時,要求對端必須返回一次確認,如果沒有收到確認,tcp會自動的重新傳輸一次資料並等待更長的時間,在數次重傳結束後tcp才放棄。
注意:tcp提供的是資料的可靠傳遞或則故障的可靠通知,但是並不保證資料一定會被對端接收到。
再者,tcp提供流量控制tcp總是告知對端在任何時刻在任何時刻它一次能夠從對端接收多少位元組的資料。
最後tcp連線是全雙工的這意味著在乙個給定的連線上應用可以在任何時刻在進出兩個方向上即傳送資料又接收資料。
tcp的頭部中ack、syn、fin、序號這四部分在下面的內容中將會用到;下面先給出乙個tcp報文的資料格式圖:
下面先解釋一下上面四個概念:
ack:tcp協議規定,只有ack=1時有效,即對syn的響應必須是1.。也規定連線建立後所有傳送的報文的ack必須為1。
syn:在連線建立時用來同步序號。當syn=1而ack=0時,表明這是乙個連線請求報文。對方若同意建立連線,則應在響應報文中使syn=1和ack=1. 因此, syn置1就表示這是乙個連線請求或連線接受報文。
fin:即finish,終結的意思,用來釋放乙個連線。當fin = 1 時,表明此報文段的傳送方的資料已經傳送完畢,並要求釋放連線。
序號:佔4個位元組。序號範圍是[0, 2^32-1],共2^32個序號。序號增加到2^32-1之後,下乙個序號就回到0.tcp是面向位元組流的,在乙個tcp連線中傳送的位元組流中的每乙個位元組都按順序編號。整個要傳送的位元組流的起始序號必須在連線建立時設定。首部中的序號字段值則指的是本報文段所傳送資料的第乙個位元組的序號。
建立乙個tcp連線通常會發生如下的過程:
1. 伺服器呼叫socket、bind和listen等函式,做好準備接收外來連線;這被稱為被動開啟。
2. 客戶端通過呼叫connect發起主動開啟。這會導致客戶端的tcp會傳送乙個syn(同步)分節,它告訴伺服器客戶端將在(待建立的)連線中傳送資料的初始序列號。通常syn分節不攜帶資料,其所在的ip資料報只含有乙個ip首部、乙個tcp首部及可能有的tcp選項。
3. 伺服器必須確認(ack)客戶端的syn,同時自己也得傳送乙個syn分節,它含有伺服器將在同一連線中傳送的資料的初始序列號。伺服器在單個分節中傳送syn和對客戶端syn的確認的ack。
4. 最後客戶端必須確認伺服器的syn,傳送ack給伺服器。
(注:分節是tcp傳遞給ip的資料單元)
這個交換至少需要3個分組,因此因為成為tcp/ip的三次握手。
下圖展示了tcp/ip的三路握手所交換的3個分節:
由於tcp連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向的連線。收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
tcp的連線的終止需要傳送四個包,因此稱為四次手(four-way handshake)。客戶端或伺服器均可主動發起揮手動作在socket程式設計中,任何一方執行close()操作即可產生揮手操作。
1. 客戶端a傳送乙個fin,用來關閉客戶a到伺服器b的資料傳送。
2. 伺服器b收到這個fin,它發回乙個ack,確認序號為收到的序號加1。和syn一樣,乙個fin將占用乙個序號。
3. 伺服器b關閉與客戶端a的連線,傳送乙個fin給客戶端a。
4. 客戶端a發回ack報文確認,並將確認序號設定為收到序號加1。
下面有乙個圖來展示這個過程:
計網 問題1 TCP三次握手和四次揮手
1 第一次握手 首先client給server傳送連線請求報文,在這個報文中,包含了syn 1,client seq 任意值i,傳送之後處於syn sent狀態,這是第一次握手 2 第二次握手 server端接收到了這個請求,並分配資源,同時給client返回乙個ack報文,這個報文中呢包含了這些字...
tcp 四次揮手 TCP的三次握手和四次揮手
三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...
TCP三次握手和四次揮手
一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...