為什麼在 VPN 上使用 VIM 時我的 tcp 視窗大小變為零

為什麼在 VPN 上使用 VIM 時我的 tcp 視窗大小變為零

我在典型的(即糟糕的)無線家庭網路上使用 Mac 作業系統筆記型電腦,並透過 VPN 連線進行工作。我透過 ssh 進入辦公室的 linux (ubuntu) 桌面。 (當我說“我 ssh”時:我單擊一個按鈕,告訴我它將使用“ssh”,然後打開一個“終端”視窗並登入我的桌面。)

經常(一天最多幾次)當我使用“vim”時,“vim”將停止響應,一兩分鐘後,與我的桌面的連接將斷開,終端將告訴我連接已斷開。我經常在桌面上同時打開多個終端機窗口,只有我使用“vim”的終端機窗口才會中斷。其他視窗保持連線並可用。

最近,我使用 tcpdump 來追蹤來回的資料包,並捕獲了 vim 會話掛起和退出的追蹤。中斷前幾分鐘,來自我桌面的資料包到達時視窗大小不斷縮小,直到達到零,連線稍後中斷。

我幾乎可以理解這一點,比如說,我進入了插入模式並開始在桌面掛起時鍵入字符,並且在桌面被搞砸時通過鍵入填滿了視窗。起始視窗大小約為 12,500,我輸入的每個字元似乎都會產生一個 48 位元組的資料包,因此大約 250 個字元可能會填滿 TCP 緩衝區。

然而,當 vim 掛起時,它更像是我向下翻頁(control-f),然後進入插入模式,然後開始輸入幾個字元。我的命令和字元被回顯,表明 vim 正在接收和處理字元。

我不清楚 tpc 緩衝區位於套接字和“vim”之間的位置。據推測,tty 驅動程式實際上是從 tcp 緩衝區中拾取字符,將它們回顯給我,然後將它們交給 vim,然後將 vim 的輸出交給我。但所有這些操作都會從 tcp 緩衝區中提取字節,並且視窗大小不會變為零。

關於軟體堆疊的工作原理,我不明白什麼?

獎勵問題:

1) 為什麼我的桌面會將視窗大小設為 12,500 左右而不是 64K 左右?

2)在Mac上使用tcpdump時,如果使用“主機主機名”,“主機IP位址”或“連接埠22”表達式(其中“主機名稱”和“IP位址”被替換為名稱或IP位址),我不會得到任何輸出我的桌面)。如果我不指定這些表達式之一,我會得到大量輸出,並且輸出清楚地包含我在命令列中指定的主機名稱、IP 位址或連接埠。 Mac 上是否存在 tcpdump 不起作用的特殊情況?是否有一種搞砸命令列的標準方法,而我對我要求 tcpdump 做什麼感到困惑?

謝謝,Cs

答案1

首先,TCP 視窗大小不是緩衝區,而是確認閾值。接收流量的節點只會每 x 個封包發送一個 ACK 封包。在可靠的網路中,這個數字應該盡可能大以實現吞吐量- 權衡是,如果某些資料遺失,則必須重新傳輸整個視窗...這通常會導致TCP 堆疊逐漸減小視窗大小,以避免在未來發生資料包遺失時重新傳輸如此多的資料。有一個與可用記憶體(接收緩衝區)相關的元件,但在現代系統中這大多是無關緊要的。維基百科

此問題的根本原因可能是網路連線不良。 VPN 經常會出現高延遲和/或封包遺失的情況,無線網路也是如此。作為實驗,如果您透過硬線而不是無線連接,問題是否會改善/解決?

相關內容