TCP旨在適應(yīng)支持多網(wǎng)絡(luò)應(yīng)用的分層協(xié)議層次結(jié)構(gòu)。 連接到不同但互連的計算機通信網(wǎng)絡(luò)的主計算機中的成對進程之間依靠TCP提供可靠的通信服務(wù)。TCP假設(shè)它可以從較低級別的協(xié)議獲得簡單的,可能不可靠的數(shù)據(jù)報服務(wù)。 原則上,TCP應(yīng)該能夠在從硬線連接到分組交換或電路交換網(wǎng)絡(luò)的各種通信系統(tǒng)之上操作。
TCP是因特網(wǎng)中的傳輸層協(xié)議,使用三次握手協(xié)議建立連接。當(dāng)主動方發(fā)出SYN連接請求后,等待對方回答SYN+ACK,并最終對對方的 SYN 執(zhí)行 ACK 確認(rèn)。這種建立連接的方法可以防止產(chǎn)生錯誤的連接,TCP使用的流量控制協(xié)議是可變大小的滑動窗口協(xié)議。
TCP三次握手的過程如下:
客戶端發(fā)送SYN(SEQ=x)報文給服務(wù)器端,進入SYN_SEND狀態(tài)。
服務(wù)器端收到SYN報文,回應(yīng)一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態(tài)。
客戶端收到服務(wù)器端的SYN報文,回應(yīng)一個ACK(ACK=y+1)報文,進入Established狀態(tài)。
三次握手完成,TCP客戶端和服務(wù)器端成功地建立連接,可以開始傳輸數(shù)據(jù)了。
建立一個連接需要三次握手,而終止一個連接要經(jīng)過四次握手,這是由TCP的半關(guān)閉(half-close)造成的。
(1) 某個應(yīng)用進程首先調(diào)用close,稱該端執(zhí)行“主動關(guān)閉”(active close)。該端的TCP于是發(fā)送一個FIN分節(jié),表示數(shù)據(jù)發(fā)送完畢。(2) 接收到這個FIN的對端執(zhí)行 “被動關(guān)閉”(passive close),這個FIN由TCP確認(rèn)。注意:FIN的接收也作為一個文件結(jié)束符(end-of-file)傳遞給接收端應(yīng)用進程,放在已排隊等候該應(yīng)用進程接收的任何其他數(shù)據(jù)之后,因為,F(xiàn)IN的接收意味著接收端應(yīng)用進程在相應(yīng)連接上再無額外數(shù)據(jù)可接收。(3) 一段時間后,接收到這個文件結(jié)束符的應(yīng)用進程將調(diào)用close關(guān)閉它的套接字。這導(dǎo)致它的TCP也發(fā)送一個FIN。(4) 接收這個最終FIN的原發(fā)送端TCP(即執(zhí)行主動關(guān)閉的那一端)確認(rèn)這個FIN。 [3] 既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節(jié)。注意:(1) “通?!笔侵?,某些情況下,步驟1的FIN隨數(shù)據(jù)一起發(fā)送,另外,步驟2和步驟3發(fā)送的分節(jié)都出自執(zhí)行被動關(guān)閉那一端,有可能被合并成一個分節(jié)。(2) 在步驟2與步驟3之間,從執(zhí)行被動關(guān)閉一端到執(zhí)行主動關(guān)閉一端流動數(shù)據(jù)是可能的,這稱為“半關(guān)閉”(half-close)。(3) 當(dāng)一個Unix進程無論自愿地(調(diào)用exit或從main函數(shù)返回)還是非自愿地(收到一個終止本進程的信號)終止時,所有打開的描述符都被關(guān)閉,這也導(dǎo)致仍然打開的任何TCP連接上也發(fā)出一個FIN。無論是客戶還是服務(wù)器,任何一端都可以執(zhí)行主動關(guān)閉。通常情況是,客戶執(zhí)行主動關(guān)閉,但是某些協(xié)議,例如,HTTP/1.0卻由服務(wù)器執(zhí)行主動關(guān)閉。