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

  • 客户端 192.168.12.37
  •  
    #实验一: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 打开分析 , 显示的时序图如下:
    一文教会实战网络抓包和分析包


    推荐阅读