文章目录
抓包
Linux 可以用 tcpdump 抓包,保存为 .pcap 格式
然后使用 WireShark 可视化和分析(WireShark 可直接抓包 Windows)
# 客户端 终端一 执行 tcpdump 抓包
$ tcpdump -i any tcp and host 192.168.3.200 and port 80 -w http.pcap
# 客户端 终端二 执行 curl 命令
$ curl http://192.168.3.200
# 客户端 终端一 停止 tcpdump 抓包 Ctrl+C 并导出 http.pcap
HTTP 是基于 TCP 协议进行传输的:
- 最开始的 3 个包就是 TCP 三次握手建立连接的包
- 中间是 HTTP 请求和响应的包
- 最后的 3 个包则是 TCP 断开连接的挥手包 (有时服务器在收到客户端的FIN后也直接关闭连接,所以 ACK + FIN 是同时发送的,但通常是分开的标准四次挥手)
超时重传
第一次握手的 SYN 丢包
当客户端发起的 TCP 第一次握手 SYN 包,在超时时间内没收到服务端的 ACK,就会超时重传 SYN 数据包,每次超时重传的间隔RTO是翻倍上涨的(比如1s,2s,4s,8s,16s…),直到 SYN 包的重传次数到达 tcp_syn_retries 值后 (默认为5),客户端不再发送 SYN 包。
第二次握手的 SYN+ACK 丢包
当第二次握手的 SYN、ACK 丢包时,客户端会超时重发 SYN 包,服务端也会超时重传 SYN、ACK 包。客户端 SYN 包超时重传的最大次数,是由 tcp_syn_retries 决定的,默认值是 5 次;服务端 SYN、ACK 包时重传的最大次数,是由 tcp_synack_ret