天天看點

TCP報頭中的URG 與 PSH标志不同之處與作用TCP報頭特殊辨別位The PSH FlagThe URG Flag

TCP報頭

衆所周知TCP 是面向連接配接的、可靠的、基于位元組流的傳輸層通信協。那麼TCP是用什麼來支援保證資料的可靠呢?答案就是它頭部包含衆多格式字段分别表示不同的含義,通信雙方通過約定好的方式去解讀和設定這些字段,進而保證TCP 的可靠性。

TCP頭部格式圖:

TCP報頭中的URG 與 PSH标志不同之處與作用TCP報頭特殊辨別位The PSH FlagThe URG Flag

本文忽略RFC 3168為擁塞通知添加的CWR和ECE标志

特殊辨別位

TCP 頭部包含有幾個一比特(ont-bit)的布爾字段,用來影響TCP 連接配接資料流。其中四個标志位用于控制TCP 連接配接的建立、維護和拆除。

  • SYN 啟動連接配接
  • ACK 确認收到
  • FIN 關閉連接配接
  • RST 中止連接配接

詳述:

  1. 同步SYN(SYNchronization)标志:當 SYN 被置為 1,而 ACK 為0時, 說明這是一個連接配接請求封包段,若對方同意建立連接配接,則應在應答封包中将 SYN 和 ACK 都置為 1。
  2. 确認ACK(ACKnowlegment):僅當 ACK 被置為 1 時,确認号字段才有效。 TCP 規定在連接配接建立後的所有傳輸封包都必須把 ACK 置 1。
  3. 終止FIN(Finish):用來釋放一個連接配接。 當 FIN 被置 1 時,說明此封包的發送方的資料已經發送完畢,要求釋放連接配接。
  4. 複位RST(Reset):當該位有效時,表面 TCP 連接配接中出現嚴重錯誤,比如一方中途崩潰,或者網絡極度擁塞,導緻大面積丢包,資料長時間無法到達對方,則接下來的傳輸必須重建立立。該位還可以用來拒絕一個非法的封包段。

除了以上标志位,還有兩個不是很“出名”的标志位。它們就是 PSH(Push) 和 URG(Urgent)。

The PSH Flag

了解 PSH 标志之前,首先要知道 TCP 緩沖區的是如何工作的。TCP工作在在 OSI 模型中的第四次傳輸層,它對上層提供讀取和寫入的簡單套接字,隐藏的資料之間通信分組的複雜性。為了允許應用程式随時從該套接字讀取和寫入,在接收方和發送方都有對應的緩沖區。

發送方和接受方:

TCP報頭中的URG 與 PSH标志不同之處與作用TCP報頭特殊辨別位The PSH FlagThe URG Flag

當發送多個最大段大小(MSS)的資料(例如,傳輸大檔案)時,緩沖器允許更有效地傳輸資料。然而,在處理一些要盡可能快地傳輸的實時應用程式時,大型緩沖區會帶來危害。比如,我們在使用 ssh協定遠端登入到伺服器時。如果 TCP 一直等待,直到所輸入的資料填滿整個資料包才發送的話,發送一個兩個字元的資料包,必須要先輸入一千字元。太糟糕。

PSH 标志的作用就在這裡,當PSH 被置為1 時, 會被立即推出,不會等待其他資料進入緩沖區。當接受端收到 PSH 被置 1 的資料包時,立即将該分段上交到對應的應用程式。即有如下作用:

  • 通知發送方立即發送資料。
  • 接收方立即将資料推送到應用程式。

這個标志是怎麼被設定的?

這個标志是在TCP層清空發送緩存,并将封包段交給IP層的時候設定的(相當于表示一次TCP層的發送操作)。(還有一點需要注意:大多數的API沒有向應用層提供通知TCP層設定PUSH标志的方法,據說是因為很多實作程式認為PUSH标志已經過時,而一個好的TCP實作能夠自行決定何時設定這個标志。

下圖是我在使用XShell遠端登入到虛拟機中的伺服器時所抓的包并過濾出ssh協定的資料:

TCP報頭中的URG 與 PSH标志不同之處與作用TCP報頭特殊辨別位The PSH FlagThe URG Flag

我觀察本次抓包所有的使用shh協定的資料包,PSH都有效,防止被緩沖。是以這也是為什麼 SSH 協定基于 TCP 的同時又可以對使用者輸入的短小指令可以快速響應的原因。

The URG Flag

URG 标志用于通知接收方,資料段内某些資料是需要緊急處理的,應該被優先考慮。接收方收到 URH标志有效的資料報時,回去檢測 TCP 報頭中的16 位字段 緊急指針。 該字段訓示從第一個位元組計數的段中的資料時多少緊急處理的。

TCP報頭中的URG 與 PSH标志不同之處與作用TCP報頭特殊辨別位The PSH FlagThe URG Flag

跟上網上所述,此标志位逐漸被淘汰。原因是定義和實作上的混亂。

想詳細了解 URG 的實作可閱讀下面我在網上看到的這篇文章。我覺得很(看)高(不)深(懂)。

TCP的URG标志和核心實作

繼續閱讀