天天看點

TCP三向交握和四次斷開

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資料包的一些報頭資訊:

1

2

3

4

<code># tcpdump -i eth0 '(( host 192.168.1.210) and ( port 80))'</code>

<code>13:30:19.078214 IP 192.168.1.106.53190 &gt;192.168.1.210.http: Flags [S], </code><code>seq</code> <code>1725365454, win 8192, options [mss1460,nop,wscale 8,nop,nop,sackOK], length 0</code>

<code>13:30:19.078342 IP 192.168.1.210.http &gt;192.168.1.106.53190: Flags [S.], </code><code>seq</code> <code>4163517334, ack 1725365455, win 14600,options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0</code>

<code>13:30:19.078649 IP 192.168.1.106.53190 &gt;192.168.1.210.http: Flags [.], ack 1, win 68, length 0</code>

上面為一次三次握手建立連接配接的過程。

其中,格式為: 原位址 &gt; 目的位址 : 标示,[S]标示SYN, 其中win表示視窗大小,也就是資料量的大小,可以用于流量控制,預設為4096,最大為65535,它是由一個16bit的字段表示的。

SYN: 同步序号連接配接标示,用來發起一個連接配接。

ACK: 應答标示,用來确認同步序号有效。

FIN:結束連接配接标示。

TCP三向交握過程

TCP的三次握手過程其實可以用一個簡單的圖表示:

<a href="http://s1.51cto.com/wyfs02/M00/83/9C/wKioL1d36NjSl8QZAABnWE_I3B4738.jpg-wh_500x0-wm_3-wmp_4-s_3904652823.jpg" target="_blank"></a>

連接配接過程:

請求端(通常為用戶端)發送一個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通常是應用層進行關閉的結果。

四次斷開的圖示如下:

<a href="http://s5.51cto.com/wyfs02/M00/83/A4/wKiom1d5NPDhJkEYAADm1N_loes166.jpg" target="_blank"></a>

斷開的過程:

當有一方要終止連接配接時,會向對方發送一個FIN的信号n.

接受方收到資訊後,會回複一個ACK(n+1)表示已經收到請求,但此時并不會立即中斷連接配接,而是去嘗試關閉自身的連接配接。

當響應用戶端關閉本地的TCP連接配接之後,會向請求端重新發送一個新的FIN m,表示此事響應端可以關閉。

請求端接受到FIN m的信号後,回複一個ACK,同時自己也進入TIME_WAIT狀态,而響應端進入close狀态。

這裡應用TCP/IP協定卷的一張圖,說明了主機在TCP互動過程中狀态的變化:

<a href="http://s4.51cto.com/wyfs02/M01/83/A3/wKioL1d5OfXjrel7AACtNzWU-M8554.jpg" target="_blank"></a>

其實這些内容隻是TCP協定的冰山一角,在這個互動過程中還有很多算法和協定規則,具體的細節大家可以參考TCP/IP協定卷。

 本文轉自 酥心糖 51CTO部落格,原文連結:http://blog.51cto.com/tryingstuff/1795450

繼續閱讀