tcpdump是很好的tcp分析工具,在此配合nc命令來學習tcpdump
- nc -l 8000
- tcpdump -S -n -i lo tcp and host 127.0.0.1 and port 8000
- 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包延遲發送