lesson3 簡單網路連線-網路資料的收發

三月踏雪發表於2020-11-07

這節課,我們簡述下網路中的資料收發過程。

1.網路包的形成

在完成網路連線後,就進入到資料收發階段。

使用Socket中的Write(…)介面將資料寫到傳送緩衝區中。寫進緩衝區的資料並不會立即被髮送出去。而是等到緩衝區資料到達一定的長度或者傳送時間限制後才將包轉交給IP層。這樣做的原因是因為應用程式一次寫入的資料是無法確定長度的,如果每次都直接封裝成包傳送出去,就會造成網路上有大量的小包,導致網路效率下降,但如果一直因為資料不夠而不傳送,又會造成較大的延遲。所以協議棧就規定了一個稱為MTU的標準來確定發包的大小。

MTU表示一個網路包的最大長度,在乙太網中一般為1500位元組。MTU是包含所有頭部和資料的總長度。其中,資料的最大長度叫做MSS。如下圖:
在這裡插入圖片描述
所以,緩衝區一般到達MSS規定的長度就會被髮送出去。

但如果緩衝區資料過長,就需要進行資料拆分。在拆分出來的各個資料的前面加上各種頭部。見下圖:

在這裡插入圖片描述

2.使用ACK號確認網路包已收到

TCP是一種可靠的資料傳送,發出去的包要收到響應進行確認,丟包後會重新傳送。這個確認原理分為幾個步驟:

  • 首先,TCP模組在拆分資料時,會先計算好每一塊資料相當於頭部開始的第幾個位元組(累加),接下來在傳送這一塊資料時,將計算好的位元組數寫在TCP頭部中,“序號”這個欄位就是用來幹這個的。
  • 然後,傳送資料的長度也需要告知對方,不過這個並不是放在TCP頭部裡面的,因為用這個網路包的長度減去頭部的長度就可以得到資料的長度,所以接收方可以用這種方式來進行計算。
    在這裡插入圖片描述

假設上次收到第1460位元組(接收方計算),那麼接下來如果收到的是序號(ACK序號)為1461的包,說明中間沒有遺漏;但如果收到的包序號為2921,那就說明中間有包遺漏了。

在實際過程中,ACK號並不是從1開始的(隨機正整數),在連線階段傳送的ACK號就是這裡的起始序號。

同理,伺服器向客戶端傳送資料包的時候也是使用ACK號進行確認的。

在這裡插入圖片描述

3.TCP包的一些控制

TCP傳輸除了具體可靠性外,還可以調節傳送包的平均時間。

當網路傳輸繁忙時就會發生阻塞,ACK號的返回就會變慢,我們需要將等待時間(Timeout指標)設定得稍微長些,否則可能因為ACK號的姍姍來遲導致包重發的浪費。TCP採用了動態調整等待時間的方法,這個等待時間是根據ACK號返回所需的時間來判斷的。具體來說,TCP會在傳送資料包的過程中持續測量ACK號的返回時間,如果ACK號返回變慢,則相應延長等待時間;相應地,如果ACK號馬上就能返回,則相應縮短等待時間。

多包的同時傳送:如果發出了TCP包後只是在等待ACK包的返回,這樣就浪費了很多網路資源。為了避免這種情況,TCP採用了滑動視窗方式進行發包操作。

在這裡插入圖片描述
使用視窗滑動方式傳送資料包要注意傳送包的個數限制,如果傳送包比接收方處理包的速度快,在將資料儲存到接收緩衝時,造成緩衝區溢位。緩衝區溢位後,後面的資料就進不來了,因此接收方就收不到後面的資料了。

可以通過以下方式解決:

  • 首先,接收方需要告訴傳送方自己最多能接收多少位元組資料。
  • 然後,傳送方根據這個值對資料傳送操作進行控制。

這也就是TCP頭中視窗欄位的作用。

在這裡插入圖片描述

傳送方的資料到達接收方,在接收完成後就需要向傳送方返回ACK號,再經過一段時間,當資料傳遞給應用程式之後才需要更新視窗大小。這樣,時間上就有一定的間隔。所以,接收方收到包後不會立馬返回ACK包給到傳送方,而是要等待一段時間,在這個過程中很有可能會出現其他的通知操作,這樣就可以把兩個值寫在同一個ACK包裡了。

4.接收HTTP響應訊息

傳送HTTP請求訊息後,接下來還需要等待Web伺服器返回響應訊息。之後的操作分為以下幾個步驟:

  • 瀏覽器在傳送訊息後,會呼叫read(…)介面來獲取響應訊息。這個過程是阻塞的,直到接收緩衝區有資料後,通過系統中斷方式通知到瀏覽器進行資料讀取。
  • 控制流程會通過read轉移到協議棧,然後協議棧執行接下來的操作。

相關文章