TCP協議詳解

TCP/IP詳解

網絡協議一般分不一樣層次進行開發,每一層分別負責不一樣的通訊功能
一個協議族,好比TCP/IP,是一組不一樣層次上多個協議的組合
TCP/IP一般被認爲是一個四層組織協議
TCP/IP服務器

  1. 鏈路層,有時也稱做數據鏈路層和網絡接口層,一般包括操做系統中的設備驅動程序和計算機中對應的網絡接口卡
  2. 網絡層,有時也稱做互聯網層,處理分組在網絡中的活動。在TCP/IP協議族中,網絡層協議包括IP協議(網際協議),ICMP協議(Internet互聯網控制報文協議),IGMP協議(Internet組管理協議)
  3. 運輸層主要爲兩臺主機上的應用程序提供端到端的通訊。TCP和UDP
  4. 應用層負責處理特定的應用程序細節
    TCP/IP

TCP:傳輸控制協議

TCP提供一種面向鏈接的、可靠地字節流服務
TCP經過下列方式來提供可靠性網絡

  • 應用數據被分割成TCP認爲最適合發送的數據塊
  • 自適應的超時及重傳
  • 當TCP收到發自TCP鏈接另外一端的數據,它將發送一個確認(這個確認一般會推遲幾分之一秒)
  • TCP將保持它首部和數據的檢驗和
  • TCP報文段是做爲IP數據包來傳輸的,所以到達可能會失序。若是必要,TCP將對收到的數據進行從新排序
  • 接收端丟棄重複的數據
  • 提供流量控制

TCP的首部

TCP數據被封裝在一個IP數據報中
IP數據報
TCP首部的數據格式。若是不計任何字段,它一般是20個字節
首部數據格式
一個IP地址和一個端口號也稱爲一個socket,socket pair可惟一肯定互聯網絡中每一個TCP鏈接的雙方。
序號用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的第一個數據字節。
當創建一個新的鏈接時,SYN標誌變爲1。併發

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

TCP鏈接的創建和終止

三次握手
1 請求短髮送一個SYN段指明客戶打算鏈接的服務器端口,以及初始序號(ISN)
2 服務器發回包含服務器的初始序號的SYN報文段做爲應答。同時,將確認序號設置爲客戶的ISN+1以對客戶的SYN報文段進行確認。一個SYN將佔用一個序號
3 客戶必須將確認序號設置爲服務器的ISN+1以對服務器的SYN報文段進行確認
三次握手socket

鏈接終止
1 進行關閉的一方發送第一個FIN
2 服務器收到FIN,發回一個ACK,確認序號爲收到的序號+1。和SYN同樣,一個FIN將佔用一個序號。
3 同時TCP服務器還向應用程序傳送一個文件結束符。接着這個服務器就關閉它的鏈接,致使它的TCP端發送一個FIN。
4 客戶必須發回一個FIN,並將確認序號設置爲收到序號+1。tcp

最大報文長度

最大報文長度(MSS)表示TCP傳往另外一端的最大數據塊的長度。
MSS讓主機限制另外一端發送數據報的長度。加上主機也能控制它發送數據報的長度,這將使以較小MTU鏈接到一個網絡上的主機避免分段。大數據

TCP的半關閉

TCP提供了鏈接的一端在結束它的發送後還能接收來自另外一端數據的能力,這就是所謂的半關閉。操作系統

TCP的狀態變遷圖

狀態變遷圖

2MSL等待狀態

TIME_WAIT狀態也稱爲2MSL等待狀態。
對一個具體實現所給定的MSL值,處理的原則是:當TCP執行一個主動關閉,併發回最後一個ACK,該鏈接必須在TIME_WAIT狀態停留的時間爲2倍的MSL。
這種2MSL等待的另外一個結果是這個TCP鏈接在2MSL等待期間,定義這個鏈接的插口不能再被使用。這個鏈接只能在2MSL結束後才能再被使用。3d

平靜時間的概念

TCP在重啓後的MSL秒內不能創建任何鏈接指針

FIN_WAIT_2

只有當另外一端的進程完成這個關閉,咱們這端纔會從FIN_WAIT_2狀態進入TIME_WAIT狀態。blog

復位報文段

TCP首部中的RST是用於復位的。通常來講,不管什麼時候一個報文段發往基準的鏈接出現錯誤,TCP都會發出一個復位報文段。

  1. 到不存在的端口的鏈接請求
  2. 異常終止一個鏈接
  3. 檢測版打開鏈接

TCP的成塊數據流

TCP使用滑動窗口協議來進行流量控制。該協議容許發送方在中止並等待確認前能夠連續發送多個分組。因爲發送方沒必要每發一個分組就停下來等待確認,所以該協議能夠加速數據的傳輸。
數據塊傳輸
1 發送方沒必要發送一個全窗口大小的數據
2 來自接收方的一個報文段確認數據並把窗口向右滑動。由於窗口的大小是相對於確認序號的。
3 窗口的大小能夠減少,可是窗口的右邊沿卻不能向左滑動。
4 接受方在發送一個ACK前沒必要等待窗口被填滿。
滑動窗口

PUSH標誌

使用API通知TCP設置正在接收數據的PUSH標誌或獲得該數據是否被設置PUSH標誌的信息是不可能的。

慢啓動

慢啓動爲發送方的TCP增長了一個窗口:擁塞窗口,記爲cwnd。
當與另外一個網絡的主機創建TCP鏈接時,擁塞窗口被初始化爲1個報文段。沒收到一個ACK,擁塞窗口就增長一個報文段。
發送方取擁塞窗口與通告窗口中的最小值做爲發送上限。
擁塞窗口是發送方使用的流量控制,而通告窗口則是接收方使用的流量控制。

寬帶時延乘積

通道容量: capatity(bit)=bandwidth(b/s)*round-trip time(s)

擁塞

當數據到達一個大的管道並向一個較小的管道發送時
當多個輸入流到達一個路由器,而路由器的輸出流小於這些輸入流的總和時

TCP的超時與重傳

TCP經過在發送時設置一個定時器來解決數據和確認丟失的問題。若是當定時器溢出時尚未收到確認,它就重傳該數據。
對每一個鏈接,TCP管理4個不一樣的定時器:
1 重傳定時器使用於當但願收到另外一端的確認。
2 堅持(persist)定時器使窗口大小信息保持不斷流動,即便另外一端關閉了其接收窗口。
3 保活(keepalive)定時器能夠檢測到一個空閒鏈接的另外一端什麼時候崩潰或重啓。
4 2MSL定時器測量一個鏈接處於TIME_WAIT狀態的時間。

往返時間(RTT)

$$ R\leftarrow \alpha R+\left( 1-d\right)M $$
$$ Err=M-A $$
$$ A\leftarrow A+gErr $$
$$ D\leftarrow D+h\left(|Err| -D\right) $$
$$ RTO = A+4D $$

M表示測量獲得的RTT
\(\alpha\)是一個推薦值爲0.9的平滑因子
A是被平滑的RTT
D是被平滑的均值方差
Err是剛獲得的測量結果與當前的RTT估計器之差
增量g起平均做用,取爲0.125
誤差的增益是h,取值爲0.25

具體計算實例參考TCP-IP詳解卷一第21章

TCP的堅持定時器

ACK的傳輸並不可靠,TCP不對ACK報文段進行確認,TCP只確認那些包含有數據的ACK報文段。
若是一個確認丟失了,則雙方就有可能由於等待對方而是鏈接終止:接收方等待接收數據,而發送方在等待容許它繼續發送數據的窗口更新。爲防止這種死鎖狀況的發生,發送方使用一個堅持定時器來週期性的向接收方查詢,以便發現窗口是否已增大。這些從發送方發出的報文段稱爲窗口探查。

TCP的保活定時器

若是一個給定的鏈接在兩個小時以內沒有任何動做,則服務器就向客戶發送一個探查報文段。客戶主機必須處於如下4個狀態之一: 1 客戶主機依然正常運行,並從服務器可達。客戶的TCP響應正常,而服務器也知道對方是正常工做的。服務器在2個小時之後將保活定時器復位。若是在兩個小時定時器到時間以前有應用程序的通訊量經過此鏈接,則定時器在交換數據後的將來2小時再復位 2 客戶主機已經崩潰,而且關閉或者常在重啓。在任何一種狀況下,客戶的TCP都沒有響應。服務器將不可以收到對方的探查,並在75秒後超時。服務器總共發送10個這樣的探查,每一個間隔75秒。若是服務器沒有收到一個響應,它就認爲客戶主機已經關閉並終止鏈接。 3 客戶主機崩潰並已經從新啓動。這時服務器將收到一個對其保活探查的響應,可是這個響應是一個復位,使得服務器終止這個鏈接。 4 客戶主機正常運行,可是服務器不可達。與狀態2相同

相關文章
相關標籤/搜索