通过实验二的实验结果 , 我们可以得知 , 当 TCP 第二次握手 SYN、ACK 包丢了后 , 客户端 SYN 包会发生超时重传 , 服务端 SYN、ACK 也会发生超时重传 。
客户端 SYN 包超时重传的最大次数 , 是由 tcp_syn_retries 决定的 , 默认值是 5 次;服务端 SYN、ACK 包时重传的最大次数 , 是由 tcp_synack_retries 决定的 , 默认值是 5 次 。
#实验三:TCP 第三次握手 ACK 丢包
为了模拟 TCP 第三次握手 ACK 包丢 , 我的实验方法是在服务端配置防火墙 , 屏蔽客户端 TCP 报文中标志位是 ACK 的包 , 也就是当服务端收到客户端的 TCP ACK 的报文时就会丢弃 。
iptables 配置命令如下:
文章插图
接着 , 在客户端执行如下 tcpdump 命令:
文章插图
然后 , 客户端向服务端发起 telnet , 因为 telnet 命令是会发起 TCP 连接 , 所以用此命令做测试:
文章插图
此时 , 由于服务端收不到第三次握手的 ACK 包 , 所以一直处于 SYN_RECV 状态:
文章插图
而客户端是已完成 TCP 连接建立 , 处于 ESTABLISHED 状态:
文章插图
过了 1 分钟后 , 观察发现服务端的 TCP 连接不见了:
文章插图
过了 30 分钟 , 客户端依然还是处于 ESTABLISHED 状态:
文章插图
接着 , 在刚才客户端建立的 telnet 会话 , 输入 123456 字符 , 进行发送:
文章插图
持续「好长」一段时间 , 客户端的 telnet 才断开连接:
文章插图
以上就是本次的实现三的现象 , 这里存在两个疑点:
- 为什么服务端原本处于 SYN_RECV 状态的连接 , 过 1 分钟后就消失了?
- 为什么客户端 telnet 输入 123456 字符后 , 过了好长一段时间 , telnet 才断开连接?
不着急 , 我们把刚抓的数据包 , 用 Wireshark 打开分析 , 显示的时序图如下:
文章插图
上图的流程:
- 客户端发送 SYN 包给服务端 , 服务端收到后 , 回了个 SYN、ACK 包给客户端 , 此时服务端的 TCP 连接处于 SYN_RECV 状态;
- 客户端收到服务端的 SYN、ACK 包后 , 给服务端回了个 ACK 包 , 此时客户端的 TCP 连接处于 ESTABLISHED 状态;
推荐阅读
- 一文说清“保障房” 保障房是什么?
- 坏男孩教会我的17件事 那些坏男人教我的事
- 一文了解高岭土加工技术及特点 高岭土成分
- 教你一文看懂股票涨幅榜 股票涨幅怎么算
- |一文读懂办公室工作忌讳!
- 一文带你了解什么是Quora广告
- 私域实战|5000字精华,讲透私域社群运营!
- 一文读懂IP地址和MAC地址有什么区别和联系 mac地址是什么
- 如何教会孩子认识钟表 认识钟表课件
- 如何带领“钢铁直男”,教会他成为你心中的暖男!