詳解TCP協議

2021-09-19 04:03:45 字數 3647 閱讀 4065

16位的源埠號:傳送源的埠號

16位的目標埠號: 目標的埠號

32位的序號:互動的初始資料段,序號值由系統生成的隨機值:isn。後續的報文段的序號為isn+所攜帶資料在整個位元組流中的偏移量。特點:1、所有的報文段序號不重複。2、後續的報文段序號值比前面的大。

32位的確認號:由接收段填充,其值為序列號+1+報文段所攜帶的資料長度。作用:1、向傳送方確認已收到的報文段。2、通知傳送端下乙個要接收的報文段的序號值為多少。

4位的頭部長度:指出tcp的報文段的資料起始位置距離tcp報文段的起始處有多遠。起始就是指tcp的頭部長度。它的單位是32位的字(4位元組),所以最大為 15 * 4 = 60 位元組 ,其中固定部分為20位元組,擴充部分40位元組。

6位的標記位:

urg :當其值為1的時候,告訴系統此報文段中有緊急資料,應該盡快傳送,不要按之前的排隊順序來傳送。和緊急指標配合使用。

ack :當其的值為1的時候,確認號才有效,tcp規定,在建立連線以後,所有傳送的報文段bout必須要把ack置為1。

psh:告訴接受方立即將緩衝區的資料交付,不要等到緩衝區滿了之後才交付。

rst:當其值為1時表示tcp連線出現了嚴重的錯誤,必須釋放連線,重新建立連線。還可以用來拒絕乙個非法的報文段或拒絕開啟乙個連線。

syn:在連線時用來同步序號,當syn=1,ack=0時,表示這個是乙個請求連線的報文段。對方若同意建立連線,則在相應報文上講syn=1,ack=1。其值置為1表示這是乙個連線請求或連線接受報文。

fin:用來釋放乙個連線,當fin=1時,表示此報文段為傳送方的資料已傳送完畢,要求釋放運輸連線。

16位的視窗:由接收方來填充,告知傳送法本段接收緩衝區的空閒的大小;

16位的校驗和:校驗不僅包括頭部還有資料段也要進行校驗。在校驗的時候要加上12位元組的偽首部。

緊急指標:當urg=1時才有效, 指出了緊急資料的末尾在報文段的位置。

每一條tcp都有兩個端點,這個端點就是套接字(socket)/插口,將埠號拼接到ip位址就構成了套接字。埠和ip位址之間用冒號或者逗號隔開。

tcp的連線就是我們常說的三次握手,關閉就是四次揮手,如下圖所示:

連線:客戶端先向伺服器傳送乙個連線請求syn,然後伺服器也傳送乙個syn報文,同時確定客戶端傳送的請求表示,同意連線。客戶端接收到伺服器傳送的確認請求的時候,也傳送自己的確認報文。這時客戶端已經連線上了。當伺服器端接收到客戶端的確認報文的時候,伺服器端也連線上了,兩端就可進行相互通訊了。

提問:

為什麼必須要是三次握手,兩次為什麼不行?

答:如果是兩次握手的話,當客戶端第一次傳送的請求報文段,因為網路延遲的原因,在超時定時器到期之前都沒有收到伺服器段的確認報文,就重發請求報文。那麼伺服器可能會收到兩份請求報文,因為伺服器不能識別是不是同乙份報文,所以伺服器會當做是兩個連線,就會傳送兩個確認報文。客戶端接收到兩個確認報文時,因為客戶端知道,它只向伺服器請求了一次連線,所以對兩個伺服器傳送的確認報文中,後到達的報文會被丟棄。由於只是兩次握手,所以此時就已經建立好了連線。那麼在伺服器看來,會維護兩個連線,而客戶端只有乙個連線,這樣伺服器就會白白浪費一次沒有用的連線的資源。

但是如果是三次握手的話,在客戶端接受到伺服器端傳送的確認報文的時候,只會傳送一條確認報文給伺服器,而不會是兩條,當伺服器接收到客戶端傳送的確認報文的時候,也只會建立一條連線而已。

為什麼伺服器不能識別相同的報文,而客戶端就可以?

答:因為對客戶端來說,它想連線的物件只有乙個,收到的訊息,只能是伺服器傳送的,所以當收到相同的報文段時,就能夠識別出來。而對於伺服器來說,它只是被動的接受連線,可以是多個客戶端同時請求和伺服器進行連線,且請求報文段是不帶資料的,所以不同的客戶端傳送的請求報文段可能是一樣的,所以伺服器不能判斷這個報文段是同乙個的。

關閉:

在關閉階段,就不分伺服器端和客戶端了,不管是哪方都可以請求關閉連線。所以我們分為主動斷開方和被動斷開方。主動斷開方先是傳送乙個fin報文段,表示它已經沒有資料要傳送了,希望關閉連線,此時主動方處於fin_wait_1狀態。當被動方接受到該報文段時,會傳送乙個確認報文段,此時被動方處於close_wait狀態。主動方接收到被動方傳送的確認報文,就會處於fin_wait_2狀態。這時,被動方還是可以傳送資料給主動方,當被動方也也沒有資料要傳送的時候,就會傳送fin報文段給主動方。被動方進入last_ack狀態。 這時,當主動方接收到fin報文段時,會傳送乙個確認報文段給被動方,表示知道它也要關閉連線。之後主動方並沒有直接關閉連線,而是進入乙個叫time_wait狀態,經過2msl(max segment life 報文段最大生存時間經過這段時間之後,表示在網路中沒有這兩方傳送的資料),才關閉連線。而被動方接收到主動方傳送的確認報文的時候,就處於關閉狀態。

特殊情況:兩方同時傳送fin報文段,那麼當他麼都傳送了確認對方的fin報文段的確認報文段之後,都會進入closing狀態。之後再收到對方傳送的確認報文段就進入time_wait狀態。等到2msl時間到了之後,就關閉連線。

提問:

三次揮手行不行?

答:是可以的。當被動方接受到主動方傳送的fin報文段,傳送確認報文段的同時,也加上fin標誌,表示被動方也沒有資料要傳送了。這時,主動方接收到的帶fin標誌的確認報文段,給被動方傳送確認報文段之後,就會直接從fin_wait_1進入time_wait狀態。這時,就只是三次揮手了。

time_wait狀態:

存在的原因:

①可靠地關閉連線

當確定報文段6的報文段7丟失之後,被動方會在傳送乙個報文段6,隻時如果主動方處於關閉狀態,這誰來處理這個重發的報文段6,所以需要乙個狀態在處理這種情況,否則主動方重複收到結束報文段會返回乙個ret報文段來處理,這是被動方會認為這是乙個錯誤,因為,它期望的是報文段7。

②用來處理遲來的報文段,識別,並丟棄。

time_wait狀態時,我們無法使用當前連線占用的埠號來建立乙個新的連線,因為linux核心會維護這個埠號,且在linux系統上,乙個tcp埠號不能同時開啟兩次以上。如果沒有這個轉態的話,我們可以用這個埠號,重新建立乙個和之前相似的連線(相同的ip位址、和埠號)。這時,遲來的報文段,可能會會被新的連線所接收,這是我們都不希望看到的。

tcp的可靠性傳輸:

1、資料能夠到達接受端 (由確認機制和超時重傳機制保證)

2、資料不能亂序(由32位的序號保證)

3、資料不能被損壞,無差錯(由16位的校驗和 crc冗餘校驗保證)

停止等待協議:

1、無差錯的情況:

如下圖所示:

TCP協議詳解

參考部落格 在可靠的tcp網路通訊中,客戶端和伺服器端通訊建立連線的過程可簡單表述為三次握手 建立連線的階段 和四次揮手 釋放連線階段 下圖是這兩個階段的乙個完整的表述 其狀態圖可以表示為,在tcp連線建立的時候,存在乙個如下的有限狀態機 在狀態轉化圖中,其中客戶端的狀態轉移用帶箭頭的粗實線表示,伺...

TCP協議詳解

首先tcp是一種可靠的面向位元組流的協議,流指的是流入到程序或從程序流出的位元組序列。tcp的可靠性主要是由其首部的複雜結構結合可靠性傳輸原理 比如停止等待協議 arq 協議實現,可以說,tcp的首部是tcp能可靠傳輸的必要保障,了解tcp的首部很有必要 1.tcp首部 2.可靠傳輸基本原理 停止等...

TCP協議詳解

傳輸控制協議 tcp,transmission control protocol 是一種面向連線的 可靠的 基於位元組流的傳輸層通訊協議。tcp旨在適應支援多網路應用的分層協議層次結構。連線到不同但互連的計算機通訊網路的主計算機中的成對程序之間依靠tcp提供可靠的通訊服務。tcp假設它可以從較低階別...