1. 程式人生 > >TCP的運輸連線管理

TCP的運輸連線管理

    TCP是面向連線的協議。運輸連線是用來傳送TCP報文的。TCP運輸連線的建立和釋放時每一次面向連線的通訊中必不可少的過程。因此,運輸連線就有三個階段,即:連線建立、資料傳輸和連線釋放。

    在TCP連線建立過程中要解決以下三個問題:

(1)要使每一方能夠確知對方的存在;

(2)要允許雙方協商一些引數(如最大視窗值、是否使用視窗擴大選項和時間戳選項以及服務質量等);

(3)能夠對運輸實體資源(如快取大小、連線表中的專案等)進行分配。

    TCP的連線建立:主動發起連線建立的應用程序叫做客戶(A),而被動等待連線建立的應用程序叫做伺服器(B)。

A主動開啟連線,B被動開啟連線並處於LISTEN狀態,等待客戶的連線請求。

A向B發出連線請求報文段,這是首部中的同部位SYN=1,同時選擇一個初始序號seq=x。此時A處於SYN-SENT(同步已傳送)狀態。

B收到連線請求報文段後,如同意建立連線,則向A傳送確認。在確認報文段中應將SYN和ACK位置都置1,確認號ack=x+1,同時給自己選擇一個初始序號seq=y。此時B進入SYN-RCVD(同步收到)狀態。

客戶端A收到B的確認後,還要向B給出確認。確認報文段的ACK置1,確認號ack=y+1,而自己的序號seq=x+1。這是TCP連線已經建立,A進入ESTABLISHED(已建立連線)狀態。

當B收到A的確認後,也進入ESTABLISHED(已建立連線)狀態。

    上面給出的連線建立過程叫做三次握手。

    為什麼A還要傳送一次確認呢?主要是為了防止已失效的連線請求報文段突然又傳送到了B,因而產生錯誤。

    TCP的連線釋

å次æ¥æ

資料傳輸結束後,此時A和B都處於ESTABLISHED狀態。A先向其TCP發出連線釋放報文段,並停止再發送資料,主動關閉TCP連線。終止控制位FIN=1,其序號seq=u,他等於前面傳輸過的資料的最後一個位元組的序號加1。這時A進入FIN-WAIT狀態,等待B的確認。

B接收到連線釋放報文段後立即發出確認,確認號是ack=u+1,而這個報文段自己的序號為u,等於B前面已傳輸過的資料的最後一個位元組的序號加1。然後B就進入CLOSE-WAIT(關閉等待)狀態。此時從A到B這個方向的連線就釋放了,這是的TCP連線處於半關閉狀態,即A已經沒有資料要傳送了,但B若傳送資料,A仍要接收。也就是說,從B到A這個方向的連線並未關閉,這個狀態可能會持續一段時間。

A收到來自B的確認 後,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連線釋放報文段(在這之前還需要接受伺服器傳送的最後的資料。

伺服器將最後的資料傳送完畢後,就向客戶端傳送連線釋放報文,FIN=1,ACK=1,ack=u+1;由於在半關閉狀態,伺服器可能又傳送了一些資料,假定此時的序列號為w,seq=w,此時伺服器就進入LAST-ACK狀態,等待客戶端的確認。

客戶端收到伺服器的連線釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號為seq=u+1,此時客戶端就進入TIME-WAIT狀態,注意此時TCP連線還沒有釋放,必須等待2MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。

而伺服器在收到客戶端發出的確認之後立即進入CLOSED狀態,同樣,撤銷TCB之後,就結束了這次TCP連線。可以看到,伺服器結束TCP連線的時間要比客戶端早一些。