借助wireshark深入分析 tcp傳輸視窗

2021-09-22 20:21:08 字數 2891 閱讀 7312

tcp傳輸報文時,會有「往返」的需要。因為發包之後並不知道對方能否收到,要一直等到確認包到達,這樣就花費了乙個往返時間。假如每發乙個包就停下來等確認,

乙個往返時間裡就只能傳乙個包,這樣的傳輸效率太低了。最快的方式應該是一口氣把所有包發出去,然後一起確認。但現實中也存在一些限制:接收方的快取(接收視窗)可能一下子接受不了這麼多資料;網路的頻寬也不一定足夠大,一口氣發太多會導致丟包事故。所以,傳送方要知道接收方的接收視窗和網路這兩個限制因素中哪乙個更嚴格,然後在其限制範圍內盡可能多發包。這個一口氣能傳送的資料量就是傳說中的 tcp傳送視窗。傳送視窗對效能的影響有多大?一圖勝千言,下圖顯示了傳送視窗為 1個 mss(即每個 tcp包所能攜帶的最大資料量)和 2個 mss時的差別。在相同的往返時間裡,右邊比左邊多發了兩倍的資料量。而在真實環境中,傳送視窗常常可以達到數十個 mss。

1.每個包的 tcp層都含有「 window size:」(也就是 win =)的資訊。這個值表示傳送視窗的大小嗎?

這不是傳送視窗,而是在向對方宣告自己的接收視窗。

從下截圖中可以看到, 61.135.169.121 向 192.168.1.121 宣告自己的接收視窗是 772位元組。 192.168.1.121 收到之後,就會把自己的傳送視窗限制在 772位元組之內。很多教科書上提到的滑動視窗機制,說的就是這兩個視窗的關係,本文就不再贅述了。假如接收方處理資料的速度跟不上接收資料的速度,快取就會被佔滿,從而導致接收視窗為 0。接收方持續向 傳送方 宣告自己的接收視窗是 win = 0,所以 傳送方的傳送視窗就被限制為 0,意味著那段時間發不出資料。

其中在截圖中看到的win size 和 calculated windows size ,可以看到這兩個值是不一樣的。

再關注一下下面的那個字段值:「window size scalling factor」,

會有乙個這樣的算術關係:

win size * win size scalling factor = calculated win size

這裡也就是 772 * 32 = 24704

window size value表示報文的值,calculated window size表示放大後的值,也就是實際可用的值,而 scalling factor 就相當於放大的倍數,具體這個字段代表的含義,可以往下看(第5點有寫)。

2.在包裡看出傳送視窗的大小呢?

很遺憾,沒有簡單的方法,有時候甚至完全沒有辦法。因為,當傳送視窗是由接收視窗決定的時候,我們還可以通過「 window size:」的值來判斷。而當它由網路因素決定的時候,事情就會變得非常複雜,今天這裡暫時不涉及,後面會單獨拿出來討論。大多數時候,我們甚至不確定哪個因素在起作用,只能大概推理。比如,如果接收方宣告它的接收視窗等於 0,那接收視窗肯定起了限制作用(因為不可能再小了),因此可以大膽地判斷傳送視窗就是 0。還可以觀察如果傳送方傳送了2個包就需要等待確認,那可能傳送視窗就是這兩個包的長度。

3.傳送視窗和 mss有什麼關係?

傳送視窗決定了一口氣能發多少位元組,而 mss決定了這些位元組要分多少個包發完。舉個例子,在傳送視窗為 16000位元組的情況下,如果 mss是 1000位元組,那就需要傳送 16000/ 1000 = 16個包;而如果 mss等於 8000,那要傳送的包數就是 16000/ 8000 = 2了。

4.傳送方在乙個視窗裡發出 n個包,是不是就能收到 n個確認包?

不一定,確認包一般會少一些。由於 tcp可以累積起來確認,所以當收到多個包的時候,只需要確認最後乙個就可以了。可能會存在客戶端用乙個包確認了它收到的 10個包。這個就需要根據ack報文的num 進行確定了。

比如如下截圖可以看到ack num = seq num + len

分別用絕對 seq num 和相對 seq num 看一下:

這樣就可以確定這個ack報文是確認的哪個seq報文,乙個ack報文確認多個請求報文的場景,實在是沒有合適的場景報文。

5.經常聽說「 tcp window scale」這個概念,它究竟和接收視窗有何關係?

在 tcp剛被發明的時候,全世界的網路頻寬都很小,所以最大接收視窗被定義成 65535位元組。隨著硬體的革命性進步, 65535位元組已經成為效能瓶頸了,怎麼樣才能擴充套件呢? tcp頭中只給接收視窗值留了 16 bit,肯定是無法突破 65535 (216 − 1)的。 2023年的 rfc 1323中提出了乙個解決方案,就是在三次握手時,把自己的 window scale資訊告知對方。由於 window scale放在 tcp頭之外的 options中,所以不需要修改 tcp頭的設計。 window scale的作用是向對方宣告乙個 shift count,我們把它作為 2的指數,再乘以 tcp頭中定義的接收視窗,就得到真正的 tcp接收視窗了。如下圖,這是乙個很久版本的wireshark截圖了,從底部可以看到 10. 32. 106. 159告訴 10. 32. 106. 103說它的 shift count是 5。 25等於 32,這就意味著以後 10. 32. 106. 159宣告的接收視窗要乘以 32才是真正的接收視窗值。

如果使用新版的wireshark,就是前面的那張圖,顯示上已經有所不同了,不過字段含義還是一樣的。

IsPostBack深入分析

1 ispostback 介紹 ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback true時表示非第一次請求,我們稱為 postback,當 ispostback false時表示第一次請求。在 asp....

深入分析ConcurrentHashMap

再多執行緒的情況下,如果使用hashmap,就會導致死迴圈,導致cpu利用率接近100 所以如果是併發的情況不要使用hashmap 導致死迴圈主要是這段 當在多執行緒的情況由於沒有同步導致,著段 在擴容的時候會執行 do while e null 執行緒安全的hashtable 容器 hashtab...

深入分析malloc

本文大量參考了如何實現乙個malloc這篇文章。任何乙個用過或學過c的人對malloc都不會陌生。大家都知道malloc可以分配一段連續的記憶體空間,並且在不再使用時可以通過free釋放掉。但是,許多程式設計師對malloc背後的事情並不熟悉,許多人甚至把malloc當做作業系統所提供的系統呼叫或c...