tcp居然會數據延遲40ms被髮送

tcpdump是很好的tcp分析工具,在此配合nc命令來學習tcpdump

  1. nc -l 8000
  2. tcpdump -S -n -i lo tcp and host 127.0.0.1 and port 8000
  3. nc localhost 8000

第一步是啟動8000端口

第二步是啟動抓包程序

第三步是建立一次握手連接,ctrl+c是退出客戶端,能看到四次揮手

紅色區域是三次握手,藍色區域是一次數據發收,綠色區域是四次揮手(有一個ack包被合併了所以只有三行)

tcp居然會數據延遲40ms被髮送

tcpdump的參數解釋

參數 解釋 -n

顯示ip

-i

抓取網卡lo

tcp and host 127.0.0.1 and port 8000

過濾表達式

tcp的標示位在[]中,[S]表示SYN,[F.]表示FIN,而.表示ACK

為什麼服務端收到數據後有時要等40ms後才會ack?

這是因為Delay ACK的原因(Linux上默認是關閉delay ack)。delay ack的累積確認讓多個報文的ack合成一個ack返回。而捎帶確認就是如服務器有返回數據,那麼會帶上上一個ack。

Nagle

它是Delay ACK的另一種相對的算法,它旨在減少網絡中的tcp報文數量,Nagle默認是開啟的。

Nagle原理

  • 一個TCP連接上最多隻有一個未確認的未完成的小分組,在它到達目的地前不能發送其它分組
  • 未收到上一個小分組ack前,tcp會收集其它小分組組成一個大分組待收到ack後發送出去

如果同時開啟Delay ACK和Nagle將會導致每次數據請求都會延遲40ms,如果對實時性有很高要求,可同時關閉delay ack和nagle,它們都會導致ack包延遲發送


分享到:


相關文章: