一文教会实战网络抓包和分析包( 六 )

 
通过实验二的实验结果 , 我们可以得知 , 当 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 打开分析 , 显示的时序图如下:
一文教会实战网络抓包和分析包

文章插图
 
上图的流程: