1. 程式人生 > >TCP連線的建立和終止

TCP連線的建立和終止

1.TCP連線的建立

        三路握手如下圖所示:

建立一個TCP連線情形如下:

        (1)伺服器程序必須準備好接受外來的連線。通過呼叫socket,bind,listen這三個函式來完成,也可以稱為被動開啟。

        (2)客戶程序通過connect函式發起連線(可以稱為主動開啟),客戶端TCP會發送一個SYN(建立連線)分節,這個分節告訴伺服器客戶在連線中傳送的資料的初始序列號。通常情況下SYN分節不攜帶資料,其所在的IP資料報只含有一個IP首部,一個TCP首部及可能的TCP選項。

        (3)伺服器必須確認(ACK)客戶的SYN,同時自己也得傳送一個SYN分節,它含有伺服器將在同一個連線中傳送的資料的初始序列號,伺服器在單個分節中傳送SYN和對客戶SYN的ACK(確認)。

        (4)客戶必須確認客戶的SYN

         TCP選項(每個SYN可以含有多個TCP選項):

        (1)MSS選項,傳送SYN的TCP一端使用本選項通告對端它的組大分節大小(即MSS),也就是它在本連線的每個TCP分節中願意接受的最大資料量。傳送端TCP使用接收端的MSS值作為傳送分節的最大大小。TCP_MAXSEG套接字選項提取和設定這個TCP選項。

        (2)視窗規模選項。TCP連線任何一端能夠通告對端的最大視窗大小是65535,因為在TCP首部中相應的欄位佔16位。然而在高速網路連結(45Mbit/s或更快)或長延遲路徑(衛星鏈路)要求有更大的視窗以獲得儘可能大的吞吐量。這個新選項指定TCP首部中的通告視窗必須擴大(即左移)的位數(0-14),因此提供的最大視窗接近1GB。在一個TCP連線上使用視窗規模的前提是它的兩個端系統必須都支援這個選項。SO_RCVBUF套接字選項影響這個TCP選項。

         (3)時間戳選項。這個選項對於高速網路連線是必要的,它可以防止由失而復現的分組可能造成的資料損壞。這是一個較新的選項,也是以類似於視窗規模選項的方式協商處理。但是對於網路程式設計人員來說,無需考慮它。

2.TCP連線的終止

         TCP連線關閉時的分組交換如下圖所示:

TCP連線關閉(4個分節)步驟:

        (1)某個應用程序首先呼叫close函式(稱為主動關閉),該端的TCP於是傳送一個FIN分節,表示資料傳送完畢。

        (2)接收到這個FIN的對端執行被動關閉,這個FIN由TCP確認。它的接受也作為一個檔案結束符傳遞給接收端應用程序(它會被放在已排隊等候該應用程序接收的任何其它資料之後),因為FIN的接收意味著接收端應用程序在相應連線上再無額外資料可以接收。

        (3)一段時間後,接收到這個檔案結束符的應用程序將呼叫close關閉它的套接字。這導致它的TCP也傳送一個FIN。

        (4)接收這個最終FIN的原發送端TCP確認這個FIN。

         總結:每個方向都需要一個FIN和一個ACK,通常關閉一個TCP連線需要4個分節。但是某些情形下步驟1的FIN隨資料一起傳送;步驟2和步驟3傳送的分節都出自執行被動關閉的一端,有可能被合併成一個分節。

         注意:在步驟2和步驟3之間,從執行被動關閉一端到執行主動關閉一端流動資料是有可能的,稱為半關閉。在應用程序終止時(無論主動退出還是非自願退出),所有的開啟的描述符都被關閉。