您好,登錄后才能下訂單哦!
TCP,一個(gè)大家都熟悉的協(xié)議,對于技術(shù)人員來說,透徹的理解他,就到代表咱們的半只腳已經(jīng)踏進(jìn)了IT的大門。
TCP的特點(diǎn)
TCP提供一種面向連接的、可靠的字節(jié)流服務(wù)。面向連接意味著是一對一的連接(通常是一個(gè)客戶端連接一個(gè)服務(wù)端),在交換數(shù)據(jù)之前,需要先建立連接。在TCP的連接中,僅有一對一的雙方建立連接,多播和廣播不屬于TCP的連接。
TCP保證其可靠性的機(jī)制
應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊。由TCP傳遞給IP的信息單位稱為報(bào)文段或段(segment)。
超時(shí)重傳策略。當(dāng)TCP發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段。
當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)。這個(gè)確認(rèn)不是立即發(fā)送,通常將推遲幾分之一秒.
TCP將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化。
如果收到段的檢驗(yàn)和有差錯(cuò), TCP將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段(希望發(fā)端超時(shí)并重發(fā))。
既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來傳輸,而 IP數(shù)據(jù)報(bào)的到達(dá)可能會失序,因此 TCP報(bào)文段的到達(dá)也可能會失序。如果必要,TCP將對收到的數(shù)據(jù)進(jìn)行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層。
既然IP數(shù)據(jù)報(bào)會發(fā)生重復(fù),TCP的接收端必須丟棄重復(fù)的數(shù)據(jù)。
TCP還能提供流量控制。 TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出。
(可參見《TCP/IP詳解卷一》)
TCP一些屬性說明
端口號:
每個(gè)TCP段都包含源端和目的端的端口號,用于尋找發(fā)端和收端應(yīng)用進(jìn)程。這兩個(gè)值加
上IP首部中的源端IP地址和目的端IP地址唯一確定一個(gè)TCP連接。
網(wǎng)絡(luò)套接字(socket):
一個(gè)IP地址和一個(gè)端口號也稱為一個(gè)socket。它也作為表示伯克利版的編程接口,socket包含客戶IP地址、客戶端口號、服務(wù)器IP地址和服務(wù)器端口號的四元組,可唯一確定互聯(lián)網(wǎng)絡(luò)中每個(gè)TCP連接的雙方。
全雙工:
TCP為應(yīng)用層提供全雙工服務(wù)。這意味數(shù)據(jù)能在兩個(gè)方向上獨(dú)立地進(jìn)行傳輸。因此,連
接的每一端必須保持每個(gè)方向上的傳輸數(shù)據(jù)序號。
當(dāng)我們在Linux系統(tǒng)中使用tcpdump時(shí)可以看到一些數(shù)據(jù)的傳輸信息,這包含了TCP數(shù)據(jù)包的一些報(bào)頭信息:
# tcpdump -i eth0 '(( host 192.168.1.210) and ( port 80))' 13:30:19.078214 IP 192.168.1.106.53190 >192.168.1.210.http: Flags [S], seq 1725365454, win 8192, options [mss1460,nop,wscale 8,nop,nop,sackOK], length 0 13:30:19.078342 IP 192.168.1.210.http >192.168.1.106.53190: Flags [S.], seq 4163517334, ack 1725365455, win 14600,options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0 13:30:19.078649 IP 192.168.1.106.53190 >192.168.1.210.http: Flags [.], ack 1, win 68, length 0
上面為一次三次握手建立連接的過程。
其中,格式為: 原地址 > 目的地址 : 標(biāo)示,[S]標(biāo)示SYN, 其中win表示窗口大小,也就是數(shù)據(jù)量的大小,可以用于流量控制,默認(rèn)為4096,最大為65535,它是由一個(gè)16bit的字段表示的。
SYN: 同步序號連接標(biāo)示,用來發(fā)起一個(gè)連接。
ACK: 應(yīng)答標(biāo)示,用來確認(rèn)同步序號有效。
FIN:結(jié)束連接標(biāo)示。
TCP三次握手過程
TCP的三次握手過程其實(shí)可以用一個(gè)簡單的圖表示:
連接過程:
請求端(通常為客戶端)發(fā)送一個(gè)SYN段的請求,指明了客戶端打算連接的服務(wù)的端口以及初始序號ISN,假設(shè)這個(gè)把報(bào)文段為SYN0.
服務(wù)器發(fā)回包含服務(wù)端的初始序號的SYN報(bào)文段(SYN1)作為應(yīng)答,同時(shí)在請求端發(fā)送的SYN上加1,以ACK的方式返回進(jìn)行確認(rèn)。之所以會加1是因?yàn)橐粋€(gè)SYN將占用一個(gè)序號。
客戶端必須將確認(rèn)序號設(shè)置為服務(wù)端的ISN加1返回一個(gè)ACK,以對服務(wù)器端SYN報(bào)文進(jìn)行確認(rèn).
這樣就建立了連接。
這一個(gè)簡單的過程可以理解為,你去商店買東西.
你向服務(wù)員發(fā)起一個(gè)請求,說:我要xxx,請你把它給我(SYN0);
服務(wù)員說:好的我已經(jīng)收到你的請求(SYN1)您要的是xxx對吧(ACK=SYN0+1);
你說:是的(Ack).
然后你們就開始進(jìn)行交易。
TCP 四次斷開過程
建立一個(gè)連接需要三次握手,而終止一個(gè)連接要經(jīng)過4次握手。這由TCP的半關(guān)閉(HALF-CLOSE)造成的。既然一個(gè)TCP連接是全雙工(即數(shù)據(jù)在兩個(gè)方向上能同時(shí)傳遞),因此每個(gè)方
向必須單獨(dú)地進(jìn)行關(guān)閉。這原則就是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止
這個(gè)方向連接。當(dāng)一端收到一個(gè)FIN,它必須通知應(yīng)用層另一端幾經(jīng)終止了那個(gè)方向的數(shù)據(jù)傳
送。發(fā)送FIN通常是應(yīng)用層進(jìn)行關(guān)閉的結(jié)果。
四次斷開的圖示如下:
斷開的過程:
當(dāng)有一方要終止連接時(shí),會向?qū)Ψ桨l(fā)送一個(gè)FIN的信號n.
接受方收到信息后,會回復(fù)一個(gè)ACK(n+1)表示已經(jīng)收到請求,但此時(shí)并不會立即中斷連接,而是去嘗試關(guān)閉自身的連接。
當(dāng)響應(yīng)客戶端關(guān)閉本地的TCP連接之后,會向請求端重新發(fā)送一個(gè)新的FIN m,表示此事響應(yīng)端可以關(guān)閉。
請求端接受到FIN m的信號后,回復(fù)一個(gè)ACK,同時(shí)自己也進(jìn)入TIME_WAIT狀態(tài),而響應(yīng)端進(jìn)入close狀態(tài)。
這里應(yīng)用TCP/IP協(xié)議卷的一張圖,說明了主機(jī)在TCP交互過程中狀態(tài)的變化:
其實(shí)這些內(nèi)容只是TCP協(xié)議的冰山一角,在這個(gè)交互過程中還有很多算法和協(xié)議規(guī)則,具體的細(xì)節(jié)大家可以參考TCP/IP協(xié)議卷。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。