TCP連接管理的理解


TCP連接管理   

每一條 TCP 連接有兩個端點。TCP 連接到端口叫做套接字(socket)或插口。端口拼接到 IP 地址(IP地址:端口號)即構成了套接字。

每一條 TCP 連接唯一地被通信兩端的兩個端點(即兩個套接字)所確定

或者可以是這樣一種說法:一個tcp連接由一個連接四元組唯一標識。連接四元組是指<\source ip,source port,target ip,target port>。

 

 

用套接字這個概念是在網絡編程中可以直接調用socket函數創建套接字。

 

主動發起連接建立的應用進程叫做客戶機,而被動等待連接建立的應用進程叫做服務器。

 

 

客戶機的 TCP由應用程序發起,應用程序產生的進程創建一個socket(套接字、插口),創建socket的內存緩沖區(發送緩沖區和接收緩沖區),不同的應用程序有不同的socket,socket會關聯一個叫做TCP控制塊(TCB)(TCP的task control blocks)的結構,TCB包含了處理TCP連接所需的數據。包括連接狀態(LISTEN,ESTABLISHED,TIME_WAIT),接收窗口,阻塞窗口,順序號,重發計時器,等等。

 

應用程序對要發送的用戶數據封裝首部形成應用數據, 並把應用數據插入到socket的發送緩沖區末尾,這樣來保證發送的數據有序(拷貝到內存中)。之后,TCP被調用了。如果TCP 連接建立成功,當前的TCP狀態允許數據傳輸,一個新的TCP分段(TCP segment)將被創建。如果由於不能傳輸數據(由於流量控制或者其它原因),系統調用TCP會在這里結束,之后會返回到用戶態。(換句話說,控制權會交回到應用程序代碼)。

 

每一個 TCP 連接有三個階段:連接建立、數據傳送、連接釋放

 

TCP連接的建立

TCP首部標志位:

URG(urgent緊急)、

ACK(acknowledgement 確認)、

PSH(push傳送)、

RST(reset重置)、

SYN(synchronous建立聯機)、

FIN(finish結束)

 

 

第一步:

客戶機的 TCP 首先向服務器的 TCP 發送一個連接請求報文段。這個特殊的報文段不含應用層數據,其中首部中的 SYN 標志位被置為 1。

另外,客戶機會隨機選擇一個起始序號 seq=x (連接請求報文不攜帶數據,但要消耗一個序號)

 

 

第二步:

服務器的 TCP 收到連接請求報文段后,如同意建立連接,就向客戶機發回確認,並為該 TCP 連接動態調整TCP 緩存和變量。

在確認報文中,SYN 和 ACK 位都被置為1,確認號字段的值為 x+1,並且服務器隨機隨機產生起始序號 seq=y(確認報文不攜帶數據,但要消耗一個序號)。確認報文段同樣不包含應用層數據。

 

第三步:

當客戶機收到確認報文段后,還要向服務器給出確認,並且也要給該連接動態調整緩存和變量。

這個報文段的 ACK 標志位被置為1,序號字段為 x+1,確認號字段 ack=y+1。該報文段可以攜帶數據,如果不攜帶數據則不消耗序號。

以上三步以后,TCP 連接就建立了,接下來就可以傳送應用層數據。TCP 提供的是雙全工通信,因此通信雙方的應用進程在任何時候都能發送數據。

 

TCP/IP的關鍵特性

1.面向連接

首先,傳輸數據前需要在兩個終端之間建立連接(本地和遠程)。

 

2.雙向字節流

通過字節流實現雙向數據通信。

 

3.順序投遞

接收者在接收數據時與發送者發送的數據順序相同。因此,數據需要是有序的,為了表示這個順序,TCP/IP使用了32位的int數據類型。

 

4.通過ACK實現可靠性

當發送者向接收者發送數據,但沒有收到來自接收方的ACK(acknowledgement,應答)時,發送者的TCP層將重發數據。因此,發送者的TCP層會把接收者還沒有應答的數據暫存起來。

 

5.流量控制(滑動窗口機制)

發送者的發送速度與接收者的接收能力相關。接收者會把它能接收的最大字節數(未使用的緩沖區大小,又叫接收窗口,receive window)告知發送者。發送者發送的最大字節數(發送窗口)與接收者的接收窗口大小一致。

 

6.阻塞控制

阻塞窗口是不同於滑動窗口的另一個概念,它通過限制網絡中的數據流的體積來防止網絡阻塞。和流量控制不同,阻塞控制只在發送方實現。(發送者類似於通過ack時間之類的算法判斷當前網絡是否阻塞,從而調節發送速度)

TCP通過一個timer采樣了RTT並計算RTO

RTT(Round Trip Time):一個連接的往返時間,即數據發送時刻到接收到確認的時刻的差值;

RTO(Retransmission Time Out):重傳超時時間,即從數據發送時刻算起,超過這個時間便執行重傳。

阻塞控制算法主要有1)慢啟動,2)擁塞避免,3)加速遞減,4)快重傳和快恢復

 

 

TCP連接的釋放

TCP連接的釋放通常稱為“四次揮手”,參與 TCP 連接的兩個進程中的任何一個都能終止該連接。

 

 

第一步:

客戶機打算關閉連接,就像其 TCP 發送一個連接釋放的報文段,並停止發送數據,主動關閉 TCP連接,該報文段的 FIN 標志位被置為1,seq=u,它等於前面已傳送過的數據的最后一個字節的序號+1(FIN 報文段即使不攜帶數據也要消耗掉一個序號)

TCP 是雙全工的,即可以想象成是一條 TCP 連接上有兩條數據通路。當發送 FIN 報文時,發送 FIN 的一端就不能再發送數據,也就關閉了其中一條數據通路,但對方還可以發送數據。

 

第二步:

服務器收到連接釋放報文段后即發出確認,確認號是 ack=u+1,而這個報文段自己的序號是 v ,等於它前面已傳送的數據的最后一個字節的序號加1。

此時,從客戶機到服務器這個方向的連接就釋放了,TCP 連接處於半關閉狀態。但服務器若發送數據,客戶機仍要接收,即從服務器到客戶機這個方向的連接並未關閉。

 

第三步:

若服務器已經沒有向客戶機發送的數據,就通知 TCP 釋放連接,此時其發出 FIN=1 的連接釋放報文段。

 

第四步:

客戶機收到連接釋放報文段后,必須發出確認。在確認報文段中,ACK 字段被置為1,確認號 ack=w+1,序號 seq=u+1。

此時 TCP 連接還沒有釋放掉,必須經過時間等待計時器設置的時間 2MSL 后,A 才進入到連接關閉狀態。

 

TCP簡略的交互示意圖如下:

TCP攻擊分類

TCP攻擊可以簡單的分為以下三類:

 1.FLOOD類攻擊,例如發送海量的syn,syn_ack,ack,fin等報文,占用服務器資源,使之無法提供服務。

 2.連接耗盡類攻擊,如與被攻擊方,完成三次握手后不再發送報文一直維持連接,或者立刻發送FIN或RST報文,斷開連接后再次快速發起新的連接等,消耗TCP連接資源。  還有一類則比較巧妙,是在我們上述沒有做分析的數據傳輸過程中的利用TCP本身的流控,可靠性保證等機制來達到攻擊的目的。

 3. 利用協議特性攻擊:例如攻擊這建好連接之后,基於TCP的流控特性,立馬就把TCP窗口值設為0,然后斷開連接,則服務器就要等待Windows開放,造成資源不可用。或者發送異常報文,可能造成被攻擊目標奔潰


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM