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。 tcp

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

Nagle原理學習

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

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

相關文章
相關標籤/搜索