速讀原著-TCP/IP(TCP的正常數據流)

  • 2020 年 3 月 11 日
  • 筆記

第20章 TCP的成塊數據流

20.2 正常數據流

我們以從主機s v r 4單向傳輸8 1 9 2個位元組到主機 b s d i開始。在b s d i上運行s o c k程式作為伺服器:

bsdi % sock -i -s 7777

其中,標誌- i和- s指示程式作為一個「吸收( s i n k)」伺服器運行(從網路上讀取並丟棄數據),伺服器埠指明為7 7 7 7。相應的客戶程式運行為:

svr4 % sock -i -n8 bsdi 7777

該命令指示客戶向網路發送 8個1 0 2 4位元組的數據。圖2 0 - 1顯示了這個過程的時間系列。我們在輸出的前3個報文段中顯示了每一端M S S的值。

發送方首先傳送3個數據報文段(4 ~ 6)。下一個報文段(7)僅確認了前兩個數據報文段,這可以從其確認序號為2 0 4 8而不是3 0 7 3看出來。

報文段7的A C K的序號之所以是2 0 4 8而不是3 0 7 3是由以下原因造成的:當一個分組到達時,它首先被設備中斷常式進行處理,然後放置到 I P的輸入隊列中。三個報文段 4、5和6依次到達並按接收順序放到 I P的輸入隊列。 I P將按同樣順序將它們交給 T C P。當T C P處理報文段 4時,該連接被標記為產生一個經受時延的確認。 T C P處理下一報文段(5),由於T C P現在有兩個未完成的報文段需要確認,因此產生一個序號為 2 0 4 8的A C K(報文段7),並清除該連接產生經受時延的確認標誌。 T C P處理下一個報文段( 6),而連接又被標誌為產生一個經受時延的確認。在報文段9到來之前,由於時延定時器溢出,因此產生一個序號為 3 0 7 3的A C K(報文段8)。

報文段8中的窗口大小為3 0 7 2,表明在T C P的接收快取中還有1 0 2 4個位元組的數據等待被應用程式讀取。報文段11 ~ 1 6說明了通常使用的「隔一個報文段確認」的策略。報文段 11、1 2和1 3到達並被放入I P的接收隊列。當報文段 11被處理時,連接被標記為產生一個經受時延的確認。當報文段1 2被處理時,它們的 A C K(報文段1 4)被產生且連接的經受時延的確認標誌被清除。報 文段1 3使得連接再次被標記為產生經受時延。但在時延定時器溢出之前,報文段 1 5處理完畢,因此該確認立刻被發送。

注意到報文段7、1 4和1 6中的A C K確認了兩個收到的報文段是很重要的。使用 T C P的滑動窗口協議時,接收方不必確認每一個收到的分組。在 T C P中,A C K是累積的—它們表示接收方已經正確收到了一直到確認序號減 1的所有位元組。在本例中,三個確認的數據為 2 0 4 8位元組而兩個確認的數據為1 0 2 4位元組(忽略了連接建立和終止中的確認)。 用t c p d u m p看到的是T C P的動態活動情況。我們在線路上看到的分組順序依賴於許多無法控制的因素:發送方T C P的實現、接收方T C P的實現、接收進程讀取數據(依賴於作業系統的調度)和網路的動態性(如乙太網的衝突和退避等)。對這兩個T C P而言,沒有一種單一的、 正確的方法來交換給定數量的數據。

為顯示情況可能怎樣變化,圖 2 0 - 2顯示了在同樣兩個主機之間交換同樣數據時的另一個時間系列,它們是在圖2 0 - 1所示的幾分鐘之後截獲的。

一些情況發生了變化。這一次接收方沒有發送一個序號為 3 0 7 3的A C K,而是等待並發送序號為4 0 9 7的A C K。接收方僅發送了 4個A C K(報文段7、1 0、1 2和1 5):三個確認了2 0 4 8位元組,另一個確認了 1 0 2 4位元組。最後1 0 2 4位元組數據的A C K出現在報文段1 7中,它與F I N的A C K一道發送(比較該圖中的報文段 1 7與圖2 0 - 1中的報文段1 6和1 8)。

快的發送方和慢的接收方 圖2 0 - 3顯示了另外一個時間系列。這次是從一個快的發送方(一個 S p a r c工作站)到一個慢的接收方(配有慢速乙太網卡的 8 0 3 8 6機器)。它的動態活動情況又有所不同。

發送方發送4個背靠背(b a c k - t o - b a c k)的數據報文段去填充接收方的窗口,然後停下來等待一個A C K。接收方發送 A C K(報文段8),但通告其窗口大小為 0,這說明接收方已收到所有數據,但這些數據都在接收方的 T C P緩衝區,因為應用程式還沒有機會讀取這些數據。另一個A C K(稱為窗口更新)在17.4 ms後發送,表明接收方現在可以接收另外的 4 0 9 6個位元組的數據。雖然這看起來像一個 A C K,但由於它並不確認任何新數據,只是用來增加窗口的右邊沿,因此被稱為窗口更新。

發送方發送最後4個報文段(1 0 ~ 1 3),再次填充了接收方的窗口。注意到報文段 1 3中包括兩個比特標誌:P U S H和F I N。隨後從接收方傳來另外兩個 A C K,它們確認了最後的 4 0 9 6位元組的數據(從4 0 9 7到8 1 9 2位元組)和F I N(標號為8 1 9 2)

Tags: