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