TCP三次握手和四次挥手------抓包实验
这里写目录标题实验准备与介绍TCP三次握手和四次挥手演示TCP的连接的建立与关闭TCP 三次握⼿异常情况分析TCP 第⼀次握⼿的 SYN 丢包了,会发⽣什么?问题1:我的测试结果是重连了4次,但是内核定义为6,这是为什么呢?实验一小结TCP 第⼆次握⼿的 SYN、ACK 丢包了,会发⽣什么?问题2:我的测试结果是重连了3次,但是内核定义为2,这是为什么呢?实验二小结TCP 第三次握⼿的 ACK 包
这里写目录标题
实验准备与介绍
阿里云服务器(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 连接。
更多推荐
所有评论(0)