TCP的ACK原理和延遲確認機制


某天晚上睡覺前突然想到 tcp的ACK確認是單獨發的還是和報文一起發的,下面看一下別人的解答

一、ACK定義
TCP協議中,接收方成功接收到數據后,會回復一個ACK數據包,表示已經確認接收到ACK確認號前面的所有數據。
ACK字段長度為32位,能表示0~2^32-1之間的值。

二、ACK作用
發送方在一定時間內沒有收到服務端的ACK確認包后,就會重新發送TCP數據包。發送方收到了ACK,表明接收方已經接收到數據,保證了數據的可靠達到。

三、ACK機制
接收方在接收到數據后,不是立即會給發送方發送ACK的。這可能由以下原因導致:
1、收到數據包的序號前面還有需要接收的數據包。因為發送方發送數據時,並不是需要等上次發送數據被Ack就可以繼續發送TCP包,而這些TCP數據包達到的順序是不保證的,這樣接收方可能先接收到后發送的TCP包(注意提交給應用層時是保證順序的)。
2、為了降低網絡流量,ACK有延遲確認機制。
3、ACK的值到達最大值后,又會從0開始。

四、ACK延遲確認機制
接收方在收到數據后,並不會立即回復ACK,而是延遲一定時間。一般ACK延遲發送的時間為200ms,但這個200ms並非收到數據后需要延遲的時間。系統有一個固定的定時器每隔200ms會來檢查是否需要發送ACK包。這樣做有兩個目的。
1、這樣做的目的是ACK是可以合並的,也就是指如果連續收到兩個TCP包,並不一定需要ACK兩次,只要回復最終的ACK就可以了,可以降低網絡流量。
2、如果接收方有數據要發送,那么就會在發送數據的TCP數據包里,帶上ACK信息。這樣做,可以避免大量的ACK以一個單獨的TCP包發送,減少了網絡流量。

延遲確認(Delayed Ack)

 setsockopt(fd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int))
一般與nagle 在特定場景下使用


免責聲明!

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



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