1. 程式人生 > >TCP報文送達確認ACK

TCP報文送達確認ACK

        TCP資料包中的序列號(Sequence Number)不是以報文段來進行編號的,而是將連線生存週期內傳輸的所有資料當作一個位元組流,序列號就是整個位元組流中每個位元組的編號。一個TCP資料包中包含多個位元組流的資料(即資料段),而且每個TCP資料包中的資料大小不一定相同。在建立TCP連線的三次握手過程中,通訊雙方各自已確定了初始的序號x和y,TCP每次傳送的報文段中的序號欄位值表示所要傳送本報文中的第一個位元組的序號。
        TCP的報文到達確認(ACK),是對接收到的資料的最高序列號的確認,並向傳送端返回一個下次接收時期望的TCP資料包的序列號(Ack Number)。例如,主機A傳送的當前資料序號是400,資料長度是100,則接收端收到後會返回一個確認號是501的確認號給主機A。

        TCP提供的確認機制,可以在通訊過程中可以不對每一個TCP資料包發出單獨的確認包(Delayed ACK機制),而是在傳送資料時,順便把確認資訊傳出,這樣可以大大提高網路的利用率和傳輸效率。同時,TCP的確認機制,也可以一次確認多個數據報,例如,接收方收到了201,301,401的資料報,則只需要對401的資料包進行確認即可,對401的資料包的確認也意味著401之前的所有資料包都已經確認,這樣也可以提高系統的效率。
        若傳送方在規定時間內沒有收到接收方的確認資訊,就要將未被確認的資料包重新發送。接收方如果收到一個有差錯的報文,則丟棄此報文,並不向傳送方傳送確認資訊。因此,TCP報文的重傳機制是由設定的超時定時器來決定的,在定時的時間內沒有收到確認資訊,則進行重傳。這個定時的時間值的設定非常重要,太大會使包重傳的延時比較大,太小則可能沒有來得及收到對方的確認包傳送方就再次重傳,會使網路陷入無休止的重傳過程中。接收方如果收到了重複的報文,將會丟棄重複的報文,但是必須發回確認資訊,否則對方會再次傳送。

 TCP協議應當保證資料報按序到達接收方。如果接收方收到的資料報文沒有錯誤,只是未按序號,這種現象如何處理呢?TCP協議本身沒有規定,而是由TCP協議的實現者自己去確定。通常有兩種方法進行處理:一是對沒有按序號到達的報文直接丟棄,二是將未按序號到達的資料包先放於緩衝區內,等待它前面的序號包到達後,再將它交給應用程序。後一種方法將會提高系統的效率。例如,傳送方連續傳送了每個報文中100個位元組的TCP資料報,其序號分別是1,101,201,…,701。假如其它7個數據報都收到了,而201這個資料報沒有收到,則接收端應當對1和101這兩個資料報進行確認,並將資料遞交給相關的應用程序,301至701這5個數據報則應當放於緩衝區,等到201這個資料報到達後,然後按序將201至701這些資料報遞交給相關應用程序,並對701資料報進行確認,確保了應用程序級的TCP資料的按序到達。

 TCP協議中,接收方成功接收到資料後,會回覆一個ACK資料包,表示已經確認接收到ACK確認號前面的所有資料。ACK欄位長度為32位,能表示0~2^32-1之間的值。

傳送方在一定時間內沒有收到服務端的ACK確認包後,就會重新發送TCP資料包。傳送方收到了ACK,表明接收方已經接收到資料,保證了資料的可靠達到。

接收方在接收到資料後,不是立即會給傳送方傳送ACK的。這可能由以下原因導致:

1、收到資料包的序號前面還有需要接收的資料包。因為傳送方傳送資料時,並不是需要等上次傳送資料被Ack就可以繼續傳送TCP包,而這些TCP資料包達到的順序是不保證的,這樣接收方可能先接收到後傳送的TCP包(注意提交給應用層時是保證順序的)。

2、為了降低網路流量,ACK有延遲確認機制。

3、ACK的值到達最大值後,又會從0開始。

接收方在收到資料後,並不會立即回覆ACK,而是延遲一定時間。一般ACK延遲傳送的時間為200ms,但這個200ms並非收到資料後需要延遲的時間。系統有一個固定的定時器每隔200ms會來檢查是否需要傳送ACK包。這樣做有兩個目的。

1、這樣做的目的是ACK是可以合併的,也就是指如果連續收到兩個TCP包,並不一定需要ACK兩次,只要回覆最終的ACK就可以了,可以降低網路流量。

2、如果接收方有資料要傳送,那麼就會在傳送資料的TCP資料包裡,帶上ACK資訊。這樣做,可以避免大量的ACK以一個單獨的TCP包傳送,減少了網路流量。

 版權所有權歸杭州卿萃科技,轉載請註明出處  

原文地址:杭州卿萃科技FPGA極客空間 微信公眾號

 掃描二維碼關注杭州卿萃科技FPGA極客空間