TCP--三次握手(建立連接)與四次揮手(關閉連接)

1、TCP(Transmission Control Protocol) 傳輸控制協議

三次握手
TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立一個連接:
位碼即tcp標誌位,有6種標示:
SYN(synchronous建立聯機)
ACK(acknowledgement 確認)
PSH(push傳送)
FIN(finish結束)
RST(reset重置)
URG(urgent緊急)
Sequence number(順序號碼)
Acknowledge number(確認號碼)


各個狀態的意義如下: 
LISTEN - 偵聽來自遠方TCP端口的連接請求; 
SYN-SENT -在發送連接請求後等待匹配的連接請求; 
SYN-RECEIVED - 在收到和發送一個連接請求後等待對連接請求的確認; 
ESTABLISHED- 代表一個打開的連接,數據可以傳送給用戶; 
FIN-WAIT-1 - 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認;
FIN-WAIT-2 - 從遠程TCP等待連接中斷請求; 
CLOSE-WAIT - 等待從本地用戶發來的連接中斷請求; 
CLOSING -等待遠程TCP對連接中斷的確認; 
LAST-ACK - 等待原來發向遠程TCP的連接中斷請求的確認; 
TIME-WAIT -等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認; 
CLOSED - 沒有任何連接狀態;

2、建立連接(三次握手)

TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接,如圖1所示。
(1)第一次握手:建立連接時,客戶端A發送SYN包(SYN=j)到服務器B,並進入SYN_SEND狀態,等待服務器B確認。
(2)第二次握手:服務器B收到SYN包,必須確認客戶A的SYN(ACK=j+1),同時自己也發送一個SYN包(SYN=k),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。
(3)第三次握手:客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK(ACK=k+1),此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據。




3、關閉連接(四次揮手

由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
 CP的連接的拆除需要發送四個包,因此稱爲四次揮手(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連接的釋放: 

由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
TCP協議的連接是全雙工連接,一個TCP連接存在雙向的讀寫通道。 
簡單說來是 “先關讀,後關寫”,一共需要四個階段。以客戶機發起關閉連接爲例:
1.服務器讀通道關閉
2.客戶機寫通道關閉
3.客戶機讀通道關閉
4.服務器寫通道關閉
關閉行爲是在發起方數據發送完畢之後,給對方發出一個FIN(finish)數據段。直到接收到對方發送的FIN,且對方收到了接收確認ACK之後,雙方的數據通信完全結束,過程中每次接收都需要返回確認數據段ACK。
詳細過程:
    第一階段   客戶機發送完數據之後,向服務器發送一個FIN數據段,序列號爲i;
    1.服務器收到FIN(i)後,返回確認段ACK,序列號爲i+1,關閉服務器讀通道;
    2.客戶機收到ACK(i+1)後,關閉客戶機寫通道;
   (此時,客戶機仍能通過讀通道讀取服務器的數據,服務器仍能通過寫通道寫數據)
    第二階段 服務器發送完數據之後,向客戶機發送一個FIN數據段,序列號爲j;
    3.客戶機收到FIN(j)後,返回確認段ACK,序列號爲j+1,關閉客戶機讀通道;
    4.服務器收到ACK(j+1)後,關閉服務器寫通道。
這是標準的TCP關閉兩個階段,服務器和客戶機都可以發起關閉,完全對稱。
FIN標識是通過發送最後一塊數據時設置的,標準的例子中,服務器還在發送數據,所以要等到發送完的時候,設置FIN(此時可稱爲TCP連接處於半關閉狀態,因爲數據仍可從被動關閉一方向主動關閉方傳送)。如果在服務器收到FIN(i)時,已經沒有數據需要發送,可以在返回ACK(i+1)的時候就設置FIN(j)標識,這樣就相當於可以合併第二步和第三步。

4、理解:窗口和滑動窗口
TCP的流量控制:TCP使用窗口機制進行流量控制
1、什麼是窗口?
連接建立時,各端分配一塊緩衝區用來存儲接收的數據,並將緩衝區的尺寸發送給另一端
接收方發送的確認信息中包含了自己剩餘的緩衝區尺寸
剩餘緩衝區空間的數量叫做窗口
2. TCP的流控過程(滑動窗口



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章