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包發送,減少了網絡流量。
版權所有權歸杭州卿萃科技,轉載請注明出處
作者:杭州卿萃科技ALIFPGA
原文地址:杭州卿萃科技FPGA極客空間 微信公眾號
掃描二維碼關注杭州卿萃科技FPGA極客空間