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