linux下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 在特定場景下使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章