標籤:

TCP協議三次握手、揮手實現原理

TCP協議實現原理

TCP/IP協議不是TCP和IP這兩個協議的合稱,而是指網際網路整個TCP/IP協議族。

從協議分層模型方面來講,TCP/IP由四個層次組成:網路介面層、網路層、傳輸層、應用層。

TCP協議:即傳輸控制協議,它提供的是一種可靠的數據流服務。當傳送受差錯干擾的數據,或舉出網路故障,或網路負荷太重而使網際基本傳輸系統不能正常工作時,就需要通過其他的協議來保證通信的可靠。TCP就是這樣的協議。TCP採用「帶重傳的肯定確認」技術來實現傳輸的可靠性。並使用「滑動窗口」的流量控制機制來高網路的吞吐量。TCP通信建立實現了一種「虛電路」的概念。雙方通信之前,先建立一條鏈接然後雙方就可以在其上發送數據流。這種數據交換方式能提高效率,但事先建立連接和事後拆除連接需要開銷。

傳輸控制協議(Transport Control Protocol)是一種面向連接的,可靠的傳輸層協議。面向連接是指一次正常的TCP傳輸需要通過在TCP客戶端和TCP服務端建立特定的虛電路連接來完成,該過程通常被稱為「三次握手」。可靠性可以通過很多種方法來提供保證,在這裡我們關心的是數據序列和確認。TCP通過數據分段(Segment)中的序列號保證所有傳輸的數據可以在遠端按照正常的次序進行重組,而且通過確認保證數據傳輸的完整性。要通過TCP傳輸數據,必須在兩端主機之間建立連接。

TCP協議是端到端的傳輸控制協議,之所以是「端到端」的協議,是因為」路由「是由IP協議負責的,TCP協議負責為兩個通信端點提供可靠性保證,這個可靠性不是指一個端點發送的數據,另一個端點肯定能收到(這顯然是不可能的),而是指,數據的可靠投遞或者故障的可靠通知。

本文主要講述的是

1、TCP三次握手原理,以及為什麼要三次握手,兩次握手帶來的不利後果。

2、TCP四次揮手原理,為什麼要四次揮手。

TCP的可靠性通過以下方式來保證:

1.超時重傳:TCP每發送出一個報文段後,都會啟動一個定時器,對目的端傳回的確認信息進行確認計時,超時後便重傳。

2.確認信號:當TCP收到一個來自TCP的報文段後,便會發送回一個確認信號。

3.檢驗和:TCP將始終保持首部和數據的檢驗和,如果收到的報文段的檢驗和有差錯,便將其丟棄,希望發送端超時重傳。

4.重新排序:由於IP數據報的達到可能失序,因此TCP將會數據進行重新排序,以正確的順序交給應用層。

5.丟棄重複:由於IP數據報有可能重複,因此TCP將會丟棄重複的數據。

6.流量控制:TCP連接的兩端都有固定大小的緩衝區空間,TCP接受端只允許對端發送本端緩衝區能容納的數據。

TCP三次握手原理:

首先,給張圖片,建立TCP三次握手的直觀印象。

每次握手(發送數據請求或應答)時,發送的數據為TCP報文,TCP段包含了源/目的地址,埠號,初始序號,滑動窗口大小,窗口擴大因子,最大報文段長度等。還有一些標誌位:

(1)SYN(Synchronize Sequence Numbers):同步序號

(2)ACK(Acknowledgement Number):應答回復

(3)RST:複位連接,消除舊有的同步序號

(4)PSH:儘可能的將數據送往接收進程

(5)FIN:發送方完成數據發送

(6)URG

·SYN:同步標誌

同步序列編號(Synchronize Sequence Numbers)欄有效。該標誌僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號,該序列編號為TCP連接初始端(一般是客戶端)的初始序列編號。在這裡,可以把TCP序列編號看作是一個範圍從0到4,294,967,295的32位計數器。通過TCP連接交換的數據中每一個位元組都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個位元組的序列編號。

·ACK:確認標誌

確認編號(Acknowledgement Number)欄有效。大多數情況下該標誌位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1,Figure-1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有數據。

·RST:複位標誌

複位標誌有效。用於複位相應的TCP連接。

·URG:緊急標誌

緊急(The urgent pointer)標誌有效。緊急標誌置位,

·PSH:推標誌

該標誌置位時,接收端不將該數據進行隊列處理,而是儘可能快將數據轉由應用處理。在處理telnet或rlogin等交互模式的連接時,該標誌總是置位的。

·FIN:結束標誌

帶有該標誌置位的數據包用來結束一個TCP回話,但對應埠仍處於開放狀態,準備接收後續數據。

從圖中,可以看出三次握手的基本步驟是:

第一次握手:客戶端向伺服器端發送連接請求包SYN(syn=j),等待伺服器回應;

第二次握手:伺服器端收到客戶端連接請求包SYN(syn=j)後,將客戶端的請求包SYN(syn=j)放入到自己的未連接隊列,此時伺服器需要發送兩個包給客戶端;

(1)向客戶端發送確認自己收到其連接請求的確認包ACK(ack=j+1),向客戶端表明已知道了其連接請求

(2)向客戶端發送連接詢問請求包SYN(syn=k),詢問客戶端是否已經準備好建立連接,進行數據通信;

即在第二次握手時伺服器向客戶端發送ACK(ack=j+1)和SYN(syn=k)包,此時伺服器進入SYN_RECV狀態。

第三次握手:客戶端收到伺服器的ACK(ack=j+1)和SYN(syn=k)包後,知道了伺服器同意建立連接,此時需要發送連接已建立的消息給伺服器;

向伺服器發送連接建立的確認包ACK(ack=k+1),回應伺服器的SYN(syn=k)告訴伺服器,我們之間已經建立了連接,可以進行數據通信。

ACK(ack=k+1)包發送完畢,伺服器收到後,此時伺服器與客戶端進入ESTABLISHED狀態,開始進行數據傳送。

為什麼不能只兩次握手?

有了三次握手的詳細步驟,就可以分析為什麼需要三次握手而不是兩次握手了。

三次握手的目的:消除舊有連接請求的SYN消息對新連接的干擾,同步連接雙方的序列號和確認號並交換TCP窗口大小信息。

設想:如果只有兩次握手,那麼第二次握手後伺服器只向客戶端發送ACK包,此時客戶端與伺服器端建立連接。在這種握手規則下:

假設:如果發送網路阻塞,由於TCP/IP協議定時重傳機制,B向A發送了兩次SYN請求,分別是x1和x2,且因為阻塞原因,導致x1連接請求和x2連接請求的TCP窗口大小和數據報文長度不一致,如果最終x1達到A,x2丟失,此時A同B建立了x1的連接,這個時候,因為AB已經連接,B無法知道是請求x1還是請求x2同B連接,如果B默認是最近的請求x2同A建立了連接,此時B開始向A發送數據,數據報文長度為x2定義的長度,窗口大小為x2定義的大小,而A建立的連接是x1,其數據包長度大小為x1,TCP窗口大小為x1定義,這就會導致A處理數據時出錯。

很顯然,如果A接收到B的請求後,A向B發送SYN請求y3(y3的窗口大小和數據報長度等信息為x1所定義),確認了連接建立的窗口大小和數據報長度為x1所定義,A再次確認回答建立x1連接,然後開始相互傳送數據,那麼就不會導致數據處理出錯了。

TCP釋放連接需四次揮手

先看圖,直觀的了解下:

需四次揮手原因:由於TCP的半關閉特性,TCP連接時雙全工(即數據在兩個方向上能同時傳遞),因此,每個方向必須單獨的進行關閉。這個原則就是:當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向上的連接。當一端收到一個FIN後,它必須通知應用層另一端已經終止了那個方向的數據傳送。即收到一個FIN意味著在這一方向上沒有數據流動了。

目的:保證伺服器與客戶端都能完全的接受對方發送的數據。

假設客戶機A向伺服器B請求釋放TCP連接,則:

第一次揮手:主機A向主機B發送FIN包;A告訴B,我(A)發送給你(B)的數據大小是N,我發送完畢,請求斷開A->B的連接。

第二次揮手:主機B收到了A發送的FIN包,並向主機A發送ACK包;B回答A,是的,我總共收到了你發給我N大小的數據,A->B的連接關閉。

第三次揮手:主機B向主機A發送FIN包;B告訴A,我(B)發送給你(A)的數據大小是M,我發送完畢,請求斷開B->A的連接。

第四次揮手:主機A收到了B發送的FIN包,並向主機B發送ACK包;A回答B,是的,我收到了你發送給我的M大小的數據,B->A的連接關閉。

推薦閱讀:

計算機網路基礎
密碼漫遊記
網工必備的四款軟體
新年培訓計劃

TAG:計算機網路 |