实验准备与介绍

阿里云服务器(IP:106.14.165.89)
虚拟机客户端(IP:192.168.163.134)

TCP三次握手和四次挥手

演示TCP的连接的建立与关闭

参考游双3.3TCP连接的建立与关闭,用telnet远程登陆演示,tcpdump抓包。
客户端:
在这里插入图片描述客户端:
在这里插入图片描述
参考小林coding的图解网络。演示登录HTTP服务, Wireshark ⼯具进行可视化分析。

在这里插入图片描述
最开始的 3 个包就是 TCP 三次握⼿建⽴连接的包

中间是 HTTP 请求和响应的包

⽽最后的 4 个包则是 TCP 断开连接的挥⼿包

在这里插入图片描述
在这里插入图片描述

TCP 三次握⼿异常情况分析

TCP 第⼀次握⼿的 SYN 丢包了,会发⽣什么?

服务器端模拟:(参考游双3.3.3连接超时)

iptables -F
iptables -I INPUT -p tcp --syn -i eth0 -j DROP

服务器端处于LISTEN状态
在这里插入图片描述

客户端:

tcpdump -n -i ens33 port 23 -w tcp_sys_timeout.pcap
date;telnet 106.14.165.89 23;date    

客户端处于SYN_SENT状态
在这里插入图片描述

客户端:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述从上图可以发现, 客户端发起了 SYN 包后,⼀直没有收到服务端的 ACK ,所以⼀直超时重传了 4次,并且每次
RTO 超时时间是不同的:
第⼀次是在 1 秒超时重传
第⼆次是在 3 秒超时重传
第三次是在 7 秒超时重传
第四次是在 15 秒超时重传

可以发现,TCP报文段被发送的时间间隔是1s、2s、4s、8s,当超过最⼤重传次数后,客户端不再发送 SYN 包。
在 Linux 中,第⼀次握⼿的 SYN 超时重传次数,是如下内核参数指定的:
客户端:
在这里插入图片描述

问题1:我的测试结果是重连了4次,但是内核定义为6,这是为什么呢?

实验一小结

通过实验⼀的实验结果,我们可以得知,当客户端发起的 TCP 第⼀次握⼿ SYN 包,在超时时间内没收到服务端的
ACK,就会在超时重传 SYN 数据包,每次超时重传的 RTO 是翻倍上涨的,直到 SYN 包的重传次数到达
tcp_syn_retries 值后(这个我没测出来???)
,客户端不再发送 SYN 包。

TCP 第⼆次握⼿的 SYN、ACK 丢包了,会发⽣什么?

# 客户端配置防火墙规则
iptables -I INPUT -s 106.14.165.89 -j DROP
tcpdump -n -i ens33 port 8888 -w tcp_synack_timeout.pcap

客户端:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

问题2:我的测试结果是重连了3次,但是内核定义为2,这是为什么呢?

阿里云服务器:
在这里插入图片描述

实验二小结

通过实验⼆的实验结果,我们可以得知,当 TCP 第⼆次握⼿ SYN、ACK 包丢了后,客户端 SYN 包会发⽣超时重
传,服务端 SYN、ACK 也会发⽣超时重传。
客户端 SYN 包超时重传的最⼤次数,是由 tcp_syn_retries 决定的;服务端 SYN、ACK 包时重传的最⼤次数,是由 tcp_synack_retries 决定的。

TCP 第三次握⼿的 ACK 包丢了,会发⽣什么?

# 服务端配置防火墙规则
iptables -I INPUT -s 192.168.163.134 -p tcp --tcp-flag ACK ACK -j DROP

客户端:

tcpdump -i ens33 tcp and host 106.14.165.89 and port 8888 -w tcp_3_ack_timeout.pcap

客户端:
在这里插入图片描述
TCP 第⼀次握⼿的 SYN 包超时᯿传最⼤次数是由 tcp_syn_retries 指定,TCP 第⼆次握⼿的 SYN、ACK 包超时᯿传
最⼤次数是由 tcp_synack_retries 指定,那 TCP 建⽴连接后的数据包最⼤超时᯿传次数是由什么参数指定呢?

TCP 建⽴连接后的数据包传输,最⼤超时᯿传次数是由 tcp_retries2 指定,默认值是 15 次,如下:
在这里插入图片描述

实验三小结

在建⽴ TCP 连接时,如果第三次握⼿的 ACK,服务端⽆法收到,则服务端就会短暂处于 SYN_RECV 状态,⽽
客户端会处于 ESTABLISHED 状态。

由于服务端⼀直收不到 TCP 第三次握⼿的 ACK,则会⼀直᯿传 SYN、ACK 包,直到重传次数超过
tcp_synack_retries 值(默认值 5 次)后,服务端就会断开 TCP 连接。

⽽客户端则会有两种情况:

如果客户端没发送数据包,⼀直处于 ESTABLISHED 状态,然后经过 2 ⼩时 11 分 15 秒才可以发现⼀个
「死亡」连接,于是客户端连接就会断开连接。

如果客户端发送了数据包,⼀直没有收到服务端对该数据包的确认报⽂,则会⼀直重传该数据包,直到᯿传
次数超过 tcp_retries2 值(默认值 15 次)后,客户端就会断开 TCP 连接。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐