TCP傳輸連接管理
一、傳輸連接的三個階段
1.1.概述
-
傳輸連接就有三個階段,即:連接建立、數據傳送和連接釋放。
-
連接建立過程中要解決以下三個問題:
- 要使每一方能夠確知對方的存在。
- 要允許雙方協商一些參數(如最大報文段長度,最大窗口大小,服務質量等)。
- 能夠對運輸實體資源(如緩存大小,連接表中的項目等)進行分配。
-
TCP 連接的建立都是采用客戶服務器方式。
-
主動發起連接建立的應用進程叫做客戶(client)。
-
被動等待連接建立的應用進程叫做服務器(server)。
二、TCP 的連接建立
2.1.用三次握手建立 TCP 連接
當客戶端A想要訪問服務器B上的服務,需要與B建立連接了,就要經歷如下三次握手過程:
-
第一次握手:A先向B發送一個同步數據包(報文)。
在報文的TCP首部中:標志位:同步SYN為1,表示這是一個請求建立連接的數據包;確認標記位ACK為0,說明該數據包的確認號無效,所以該標志位可省略;序號
Seq=x
,x
為所傳送數據的第一個字節的序號。 -
第二次握手:B收到A發送的第一個數據包后,根據標志位SYN=1與ACK=1,判斷出為主動建立連接的數據包。若B同意連接,則B發送一個數據包進行回應。
在數據包的TCP首部中:標志位:同步SYN=1;標志位:確認ACK=1;序號seq=y,y的值由B指定表示B發送數據時的第一個數據字節的序號;確認號ack=x+1,表示已經收到A發送的x個字節數據,並告訴A下次應從數據的第x+1個字節開始發送。
注意區分ACK和ack:在TCP首部中前者為標志位確認 ACK ——占 1 字節,只有當 ACK = 1 時確認號字段才有效。當 ACK = 0 時,確認號無效。;后者為確認號字段——占 4 字節,是期望收到對方的下一個報文段的數據的第一個字節的序號。
-
第三次握手:A收到B的確認之后,再給A發送一個數據包。
在數據包的TCP首部中:已經沒有有效的標志位:同步SYN了(即SYN=0),表示雙方已同意建立連接;標志位確認ACK=1,表示收到B的確認數據包;序號seq=x+1,表示發出的數據包就是數據的第x+1個字節;確認號ack=y+1,表示收到了B發送y字節數據,並告訴B下次應從數據的第y+1個字節開始發送。
2.2.為何有第三次握手?
客戶端向服務器發出建立連接的請求以及服務器向客戶端確認這個請求,這兩個數據包(前兩次握手)足以證明客戶端與服務器之間的網絡是暢通的,並且協商數據通信所需要的參數。比如協商接收窗口大小,所支持的數據包最大字節數等。
如果沒有最后一個數據包確認(第三次握手),A先發出一個建立連接的請求數據包,由於網絡原因繞遠路了。A經過設定的超時時間后還未收到B的確認數據包,於是發出第二個建立連接的請求數據包,這次網路通暢,數據包很快到達B,B的確認數據包也很快就到達A。於是A與B開始傳輸數據,過了一會A第一次發出的建立連接的請求數據包到達了B,B以為是再次建立連接,所以又發出一個確認數據包。由於A已經收到了一個確認數據包,所以會忽略B發來的第二個確認數據包,但是B發出確認數據包之后就要一直等待A的回復,而A永遠也不會回復。由此造成服務器資源浪費,這種情況多了B計算機可能就停止響應了。
第三次握手(第三個數據包)作用在於,告訴B計算機,B第二次握手發給A的確認數據包A收到了,是有效的。避免B計算機等待造成資源浪費。隨后A與B可進行下一步的通信。
2.3.三次握手建立TCP連接過程的各狀態
-
A發出請求建立連接的數據包之后進入SYN-SENT狀態,表示發送了請求建立連接的同步數據包。
-
B收到A發出的請求建立連接的數據包之后,結束LISTEN狀態,進入SYN-RCVD狀態並向A發出確認數據包。
-
A收到確認數據包之后,結束SYN-SENT狀態,進入ESTABLISHED狀態,並向B發送確認數據包。
-
B收到A的確認數據包之后,結束SYN-RCVD狀態,進入ESTABLISHED狀態。
A與B都進入ESTABLISHED狀態之后,開始傳輸數據,由此完成三次握手。
查看這些狀態
可通過:
netstat -n
在命令行窗口查看計算機建立的會話的裝態。由於建立TCP連接的三次握手過程非常快,我們可以通過訪問一個不存在的網址來查看:比如http://192.168.80.200
可以看到建立TCP連接時,本計算機訪問了該地址的80端口(對應Web服務),並且TCP連接狀態為SYN-SENT。此外本計算機還有其他已經建立的TCP連接,狀態為ESTABLISHED。
如何查看SYN-RCVD狀態呢?可通過模擬SYN攻擊(大量模擬虛構地址與本計算機建立會話)即可查看該狀態:
框內為SYN攻擊虛構的地址,可看到建立TCP連接的會話都處於SYN-RECEIVED狀態。
那么平常如果看到計算機有大量處於SYN-RECEIVED狀態的會話說明有人利用SYN攻擊器在攻擊你的電腦。
三、TCP的連接釋放
3.1.使用四次揮手釋放TCP連接
數據傳輸結束后,通信的雙方都可主動釋放連接。下為A主動釋放TCP連接。
-
第一次揮手:首先A向B發送連接釋放請求報文(數據包),並停止發送數據。
在連接釋放報文(數據包)的TCP首部中:標志位:終止FIN=1,意味着A要主動釋放A—>B的TCP連接;序號位seq為u,u值由A指定。隨后等待B的確認。
-
第二次揮手:B收到連接釋放報文之后,給A發送確認報文,此時TCP服務器進程通知高層應用進程,這樣從A到B這個方向上的連接就釋放了,TCP連接處於半關閉狀態。此時A沒有數據要發給B了,但是B還有數據要發送給A,A仍可以接收。
在確認報文的TCP首部中:標志位:確認ACK=1,表示收到了A發送的數據包,同意A釋放連接;序號位seq=v,v值由B指定;確認號ack=u+1,表示已經收到A發送的u個字節數據,並告訴A下次應從數據的第u+1個字節開始發送,下面同理;此時B還可以向A傳輸數據。
-
第三次握手:若B已經沒有向A發送的數據了,其應用進程就通知TCP釋放連接,並向A發送確認報文。
在確認報文的TCP首部中:標志位:確認ACK=1,表示B已經把需要發給A的數據發完了;標志位:終止FIN=1,意味着B要釋放B—>A的TCP連接;序號seq=w,w值由B指定;確認號ack=u+1;此后B不再向A發送數據,但能接收數據。
-
第四次揮手:A收到B的連接釋放報文段后,向B發出確認報文。
在確認報文的TCP首部中:標志位:確認ACK=1,表示收到B的確認報文,並同意B釋放連接;序號seq=u+1;確認號ack=w+1;
由此通過四次揮手釋放了TCP連接。