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數據的按序到達。

 

http://blog.csdn.net/wjtxt/article/details/6606022


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM