【12】TCP/IP協議族詳解-TCP(1)

聲明:本博客參考自《TCP/IP詳解卷一:協議》

1.初識TCP

TCP提供一種面向連接的,可靠的字節流服務。對比UDP不可靠的數據報服務。

TCP通過以下方式來保證其傳輸的可靠性

(1)應用數據被分割成T C P認爲最適合發送的數據塊。在IP層TCP數據一般不會被分片。

(2)當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。

(3)當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒。

(4)TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯, TCP將丟棄這個報文段和不確認收到此報文段(希望發端超時並重發)。

(5)TCP報文通過IP傳輸可能會失序,TCP會對收到的數據重新排序,交給應用程序。

(6)TCP的接收端會丟棄重複的報文。

(7)TCP還能提供流量控制。 TCP連接的每一方都有固定大小的緩衝空間。 TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。這將防止較快主機致使較慢主機的緩衝區溢出。

TCP的字節流體現在數據像流一樣被傳輸,中間不會添加任何的標識。如果一方的應用程序先傳10字節,又傳20字節,再傳50字節,連接的另一方將無法瞭解發方每次發送了多少字節。收方可以分4次接收這80個字節,每次接收 20字節。一端將字節流放到T CP連接上,同樣的字節流將出現在TCP連接的另一端。

2.TCP報文格式

TCP報文被封裝在IP數據報中,格式如下

TCP首部的格式如下所示:

①源端口和目的端口號:和IP首部的源IP地址和目的IP地址唯一確定一個TCP連接。

②序號:用來標識從TCP發端到接收端的數據字節流,它表示在這個報文段中的第一個數據字節。如果將字節流看作在兩個應用程序間的單向流動,則 TCP用序號對每個字節進行計數。

③確認序號:既然每個傳輸的字節都被計數,確認序號包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當是上次已成功收到數據字節序號加 1。只有ACK標誌爲 1時確認序號字段纔有效。

④首部長度:首部長度給出首部中32bit字的數目。15*32/8 = 60字節,TCP首部最多60字節。

⑤6個標誌比特:

    URG 緊急指針(u rgent pointer)有效。
    ACK 確認序號有效。
    PSH 接收方應該儘快將這個報文段交給應用層。
    RST 重建連接。
    SYN 同步序號用來發起一個連接。
    FIN 發端完成發送任務。

    當建立一個新的連接時, SYN標誌變1。序號字段包含由這個主機選擇的該連接的初始序號ISN(Initial Sequence Number)。該主機要發送數據的第一個字節序號爲這個ISN加1,因爲SYN標誌消耗了一個序號。

     發送ACK無需任何代價,因爲32 bit的確認序號字段和ACK標誌一樣,總是TCP首部的一部分。因此,我們看到一旦一個連接建立起來,這個字段總是被設置, ACK標誌也總是被設置爲1。

⑥窗口大小:窗口大小爲字節數,最大爲65535字節。

⑦檢驗和:TCP首部和TCP數據。這是一個強制字段,必須由發送端就算接收端驗證。

⑧緊急指針:只有當URG標誌置1時緊急指針纔有效。緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。 TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。

⑨可選字段:最常見的可選字段是最長報文長度,又稱MSS(Maximum Segment Size)。它指明本端所能接收的最大長度的報文。這通常在同步連接報文中設置(設置SYN的第一個報文)。

3.TCP連接的建立和終止

3.1 連接

TCP的連接要經歷三次握手的過程

其中SYN爲前面TCP首部中的SYN字段,ACK爲TCP首部中的ACK字段。seq爲TCP首部中的32位序號,ack爲32位的確認序號。開始連接的seq值是由系統決定的具體的值未知,同理y的值也是未知的,但是各個值之間的關係是如圖中所示的。

從圖中可以看出SYN佔了一個序號,上圖還有一個東西沒有說明,在連接的時候會通知對端本端可接受數據的窗口大小,可通過下面的例子瞭解,下面是客戶端通過telnet連接服務器在抓包軟件中抓取的結果

其中svr4是客戶端的主機名,bsdi是服務器的主機名。S後面是序號,ack後面是確認序號。win是本端的窗口大小,mss是最大報文段長度,是指一個TCP報文的最大長度。前面的小數是時間相關的信息。

TCP在連接的時候會通告對端本段的窗口和其它信息,保證數據的流動性。

3.2 終止

TCP的終止需要經歷四次揮手的過程,這是由TCP的半關閉造成的。TCP連接是全雙工的,因此每一方都必須單獨關閉。

四次揮手的過程可以由客戶端或者服務器端發起,在第一次FIN被確認之後,被動關閉端可以繼續發送數據,然後才發送FIN。

通過下面的例子來看TCP關閉的過程

結合連接和斷開來看,SYN和FIN個自會消耗一個序號,而ack卻不會去消耗序號。

3.3 狀態圖變遷

前面的圖中已經說明過TCP連接和斷開過程中的狀態遷移了。上圖中左下角的虛線框中標註了主動關閉,這是服務器或者客戶端都可以進入的狀態。同理被動關閉的虛線框。

TIME_WAIT狀態也稱爲2MSL等待狀態。每個具體TCP實現必須選擇一個報文段最大生存時間MSL(Maximum Segment Lifetime)。它是任何報文段被丟棄前在網絡內的最長時間。

3.3 復位報文段

前面TCP的首部中有一個RST比特,這個比特主要用於“復位”。一般來說,無論何時一個報文發往別的機器的連接出現錯誤,都會出現這個報文段。RST報文在另一端不會產生任何響應,另一端不進行確認,一般以下情況會出現復位報文字段

(1)連接到不存在的端口。

(2)異常終止一個連接。

(3)檢測半打開連接。TCP中一方已經關閉或異常終止而另一方不知道的連接。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章