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包被合並了所以只有三行)

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包延遲發送


免責聲明!

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



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