#实验一:TCP 第一次握手 SYN 丢包
为了模拟 TCP 第一次握手 SYN 丢包的情况 , 我是在拔掉服务器的网线后 , 立刻在客户端执行 curl 命令:
文章插图
其间 tcpdump 抓包的命令如下:
文章插图
过了一会 , curl 返回了超时连接的错误:
文章插图
从 date 返回的时间 , 可以发现在超时接近 1 分钟的时间后 , curl 返回了错误 。
接着 , 把 tcp_sys_timeout.pcap 文件用 Wireshark 打开分析 , 显示如下图:
文章插图
从上图可以发现 , 客户端发起了 SYN 包后 , 一直没有收到服务端的 ACK , 所以一直超时重传了 5 次 , 并且每次 RTO 超时时间是不同的:
- 第一次是在 1 秒超时重传
- 第二次是在 3 秒超时重传
- 第三次是在 7 秒超时重传
- 第四次是在 15 秒超时重传
- 第五次是在 31 秒超时重传
可以发现 , 每次超时时间 RTO 是指数(翻倍)上涨的 , 当超过最大重传次数后 , 客户端不再发送 SYN 包 。
在 Linux 中 , 第一次握手的 SYN 超时重传次数 , 是如下内核参数指定的:
tcp_syn_retries 默认值为 5 , 也就是 SYN 最大重传次数是 5 次 。
接下来 , 我们继续做实验 , 把 tcp_syn_retries 设置为 2 次:
$ echo 2 > /proc/sys.NET/ipv4/tcp_syn_retries
重传抓包后 , 用 Wireshark 打开分析 , 显示如下图:
文章插图
实验一的实验小结
通过实验一的实验结果 , 我们可以得知 , 当客户端发起的 TCP 第一次握手 SYN 包 , 在超时时间内没收到服务端的 ACK , 就会在超时重传 SYN 数据包 , 每次超时重传的 RTO 是翻倍上涨的 , 直到 SYN 包的重传次数到达 tcp_syn_retries 值后 , 客户端不再发送 SYN 包 。
文章插图
#实验二:TCP 第二次握手 SYN、ACK 丢包
为了模拟客户端收不到服务端第二次握手 SYN、ACK 包 , 我的做法是在客户端加上防火墙限制 , 直接粗暴的把来自服务端的数据都丢弃 , 防火墙的配置如下:
文章插图
接着 , 在客户端执行 curl 命令:
文章插图
从 date 返回的时间前后 , 可以算出大概 1 分钟后 , curl 报错退出了 。
客户端在这其间抓取的数据包 , 用 Wireshark 打开分析 , 显示的时序图如下:
推荐阅读
- 一文说清“保障房” 保障房是什么?
- 坏男孩教会我的17件事 那些坏男人教我的事
- 一文了解高岭土加工技术及特点 高岭土成分
- 教你一文看懂股票涨幅榜 股票涨幅怎么算
- |一文读懂办公室工作忌讳!
- 一文带你了解什么是Quora广告
- 私域实战|5000字精华,讲透私域社群运营!
- 一文读懂IP地址和MAC地址有什么区别和联系 mac地址是什么
- 如何教会孩子认识钟表 认识钟表课件
- 如何带领“钢铁直男”,教会他成为你心中的暖男!