天天看點

什麼是TCP Window

TCP Window可能是需要了解的資料傳輸過程裡最重要的部分了, 尤其是對于資料中心而言, 因為備份工作是每天都要進行的. 在今天的資料中心中, 高帶寬的高可用性和高速連接配接使得提供應用程式伺服器和備份伺服器之間的幾個G吞吐量變得更容易了. 随着WAN(wide area network)連接配接增大, 更快, 更高效, 終端使用者比從前能通路到更大的吞吐量.

随着所有這些尖端科技的可用, 很多人不了解為什麼應用程式還是看起來那麼緩慢. 甚至用10G的備份連接配接還是要花費很多小時. 資料遷移應用程式的延遲的衆多原因之一是TCP Window. 有些用用程式還在使用陳舊的TCP Stack, 它們是為了八十年代的網絡而寫的, 當時2400bps的撥接上網看起來還是快速的哩. 有些今天的應用程式忽略掉了TCP Window在資料轉移過程中的影響, 網絡工程師在排查備份緩慢和應用程式延遲的時候也許會跳過傳輸層. 在這篇文章裡, 我們會清晰的定義TCP Window, 看看它是如何影響性能的, 并且展示如何使用Wireshark監控它.

什麼是TCP Window?

在讨論TCP Window的時候, 我們幾乎總是指的是TCP Receive Window. 簡單來說, TCP Receive Window是在TCP連接配接兩端都有的緩沖區, 用于暫時儲存到來的資料. 在這個緩沖區中的資料會被發送到應用程式中, 為新到來的資料騰出空間. 如果這個緩沖滿了, 那麼資料的接收方會警告發送方在緩沖去清空之前已經不能在收取更多的資料了. 這其中涉及到一些細節, 但那都是很基本的東西. 一般, 裝置會在TCP Header資訊中通知對方目前它的TCPWindows的大小.

什麼是TCP Window

在上面的截屏裡, 這個包的發送方告訴連接配接的另一端: 他的TCP Receive Buffer是65535個位元組. 這是标準TCP Window Size的最大值. TCP中有選項可以是這個數值更大, 但是現在我們就認為這個是最大值吧.

TCP連接配接的任意一段都有自己的TCP Receive Window. 是以在任何時候, 這兩個window的大小都可能會不一樣. 比如說一個Web Server通常發送資料給使用者, 而不是從使用者那裡獲得資料. 基于這個原因, Web Server不需要像普通使用者需要那麼大的TCP Window. 是以Web Server會告知它的receive window是8192位元組, 而用戶端的window卻是65535位元組.

TCP Window如何影響性能?

在一個檔案傳輸的時候, 資料從一台機器流向另一台. 資料接收方需要阻止它的TCP Window降為0, 意味着window填滿了. 如果一個TCP Window變為0了, 或者接近0了, 這就會警告資料發送方沒有更多空間來接受更多資料了.檔案傳輸會停止, 直到收到一個update說buffer已經清空了.

在原文的例子檔案中, 有一個TCP Window不斷下降, 最後終止檔案傳輸的封包.

什麼是TCP Window

如果這種情況發生了, 并且應用程式已經使用了window的最大尺寸, 而且還不夠, 那麼從分析的角度來說沒什麼可以做的. 建議對應用程式的代碼進行修改.

TCP Window是基于連接配接的, 即如果兩台機器間的其他的TCP連接配接正在進行中, 那麼一個連接配接的中斷window不會停止其他連接配接. 是以在多線程的應用程式裡, 資料還是可以在一個連接配接正在恢複的時候在其他連接配接上進行傳輸.

下面一段就不翻譯了, 有興趣或有需要的朋友可以自己看看.

========================================

Using Wireshark, how can I monitor the TCP Window?

During large file transfers, keep an eye on the TCP Window being advertised in the TCP ACK packets of the receiver. There are a few ways to do this with Wireshark. By default, the TCP window of the packet sender is displayed in the info summary view for each ACK packet.

Another way to show this is by using the I/O Graphs looking for the TCP Window Size to drop. To do this, use the tcp.analysis.window_update filter. Try it with the sample trace file using these settings.

什麼是TCP Window

繼續閱讀