1. 程式人生 > >探祕TCP資料包中的PSH標誌

探祕TCP資料包中的PSH標誌

今天在用wireshark分析TCP資料包的時候,發現一個特別的標誌,PSH,和ACK一塊使用的,不太瞭解,所以查了一下,發現大部分的解釋都是不外乎表示這個包是帶資料的,傳送端告訴接收端,這個資料包以及以前接收到的資料包需要交給應用層立即進行處理。但是是什麼樣一種契機促使傳送端添加了PSH標誌呢?新增這個標誌時傳送端是怎樣一種心情呢?(^_^)
查了一些材料,最終在《TCP/IP詳解卷1:協議》這本書中找到了答案(第20章,第5節,中文版P215頁,可以去看下大師的解釋,如果感覺我理解的有問題,歡迎拍磚~)。
PSH在接收端的處理方式和網上查到的是一樣的,就是交給應用層立即處理,但是在傳送方,這個標誌是在TCP層清空傳送快取,並將報文段交給IP層的時候設定的(相當於表示一次TCP層的傳送操作)。(還有一點需要注意:大多數的API沒有嚮應用層提供通知TCP層設定PUSH標誌的方法,據說是因為很多實現程式認為PUSH標誌已經過時,而一個好的TCP實現能夠自行決定何時設定這個標誌。另外,由於源於伯克利的實現一般從不將接收到的資料推遲交付給應用程式,因此它們忽略所接收的PUSH標誌。至於為什麼會推遲交付給應用程式,應該跟接收端的快取佇列是有關係的。)
舉個栗子吧,拿書上的栗子來看~
P212 圖20-3

傳送方傳送 4個背靠背(back-to-back)的資料報文段去填充接收方的視窗,然後停下來
等待一個ACK。接收方傳送 ACK(報文段 8) ,但通告其視窗大小為0,這說明接收方已收到
所有資料,但這些資料都在接收方的TCP緩衝區,因為應用程式還沒有機會讀取這些資料。
另一個ACK(稱為視窗更新)在17.4 ms後傳送,表明接收方現在可以接收另外的4096個位元組
的資料。

在此圖中前4個報文段(4~7)的PSH標誌被設定,因為這4個是背靠背報文段,每一個報文段被TCP產生之後直接交給了IP層,也就是說每次產生報文段之後就立刻提交給IP層,然後清空TCP層的傳送快取,並給該報文段新增PSH標誌。當第9個數據包到來的時候,傳送端視窗張開成4096,傳送端有4個可以立即傳送的報文段,這4個報文段應該是同時給了TCP層,TCP層把這4個報文段同時提交給了IP層,且清空快取,這裡只清空了一次快取,所以只有最後一個報文段帶了PSH標誌。

當然,上述僅是個人理解,不一定完全正確,歡迎回復討論,無討論不進步~