TCP連接的建立與終止,TCP連接的建立采用三次握手的方式,如圖1所示。
圖1 TCP連接的建立
首先,需要建立連接的雙方(如客戶/服務器)的一方的接收端(服務器)能夠被動地等待,另一方的請求端(客戶)發送一個初始(SYN)的數據包到接收端,以指明其打算連接到的服務器的IP地址和端口號,以及雙方建立連接的初始序列號;并設置其能夠接收的TCP段的上限和一些可選項(如口令)。
接著,接收端會檢查請求端發送來的數據包,看是否包含以上所提到的內容。如果沒有上述內容,則會發送一個應答數據包,以指明拒絕該連接的建立。如果包含必需的內容且某個應用程序正在對所含的端口進行偵聽,接收端會發回包含接收端初始序列號的SYN數據包作為應答。同時將確認序列號設置為“請求端發送來的初始序列號+1”,從而對請求端的SYN數據包進行確認。
最后,請求端必須對接收端的SYN數據包進行確認,即將確認序號設置為“接收端的初始序列號加1”,以對服務器的SYN數據包進行確認。
通過以上步驟,TCP建立過程中的請求端和接收端分別向對方發送了用于同步的SYN數據包,并且分別為對方的SYN數據包進行了確認。雙方都確認可以與對方進行正常的數據連接,從而在雙方之間的TCP會話被建立,數據可以得到可靠的傳輸。
TCP建立一個連接需要三次握手,而終止一個連接需要經過四次握手,如圖2所示(省略序列號說明)。
圖2 TCP連接的終止
TCP連接終止的四次握手是由于TCP工作方式中的半關閉造成的。因為一個TCP連接是全雙工的(即數據在兩個方向上能同時向對方傳遞),因此在數據傳輸的每個方向必須單獨地進行關閉。這種原則就是當一方完成它的數據發送任務后發送一個FIN來終止這個方向的連接。
當一端收到一個FIN時,它必須通知應用層中相應的應用程序:另一端已經終止了那個方向的數據傳送。發送FIN通常是應用層進行關閉的結果。收到一個FIN信息只意味著在這一方向上沒有數據流動。一個TCP連接在收到一個FIN后仍能發送數據。而這對于利用半關閉的應用來說是可能的,盡管在實際應用中只有很少的TCP應用程序這樣做。
首先進行關閉的一方(即發送第一個FIN的)將執行主動關閉,而另一方(收到這個FIN的)執行被動關閉。通常一方完成主動關閉而另一方完成被動關閉。
發送FIN數據包的一方發起終止連接,它由客戶端應用程序在關閉連接時發出。它將導致TCP客戶端發送一個FIN,用來關閉從客戶到服務器的數據傳送。
當服務器收到這個FIN時,它發回一個ACK,確認序號為收到的序號加1的數據包。和SYN一樣,一個FIN將占用一個序號。同時TCP服務器還向應用程序傳送一個文件結束符。
接著這個服務器程序就關閉它的連接,導致它向TCP請求端發送一個FIN數據包,客戶必須發回一個確認,并將確認序號設置為收到序號加1。
至此,終止連接過程結束,連接完全被終止。