- 重传
- 丢包
- 延时
tcp重传
Retransmission
就是在重传
看第一条数据包,来源IP为183.10.31.88 发了个SYN给10.100.64.230 ,但是10.100.64.230 并没回复syn,ack给183.10.31.88
所以第二条数据,183.10.31.88没有收到回复,只能继续重传之前的SYN数据了
为什么会造成这种情况
机器1(IP 172.16.5.9) 机器2 (10.100.64.230)
实现1
我在机器1上面执行iptables规则,当访问机器2的时候,把来源IP改成183.10.31.88(此IP是随便填写) 就成了这个现象了
iptables -t nat -I POSTROUTING --dst10.100.64.230 -j SNAT --to-source183.10.31.88
在机器1上面执行`curl`访问机器2,会一直阻塞,最后连接超时(tcp重传也是有限制的,不会一直重传)
# curl http://10.100.64.230:9091/ping^C
实现2
通过iptables把syn,ack包丢弃
把其它机器的9091端口访问本机的SYN,ACK标志位为1的数据包都删除
iptables -I INPUT -p tcp -m tcp --tcp-flags ALL SYN,ACK --sport9091-j DROP
tcp丢包
现在使用更强大的工具,tc
控制器,基于内核netem
设置丢包率为50%
tc qdisc add dev eth0 root netem loss 50%
发了两次请求,可以看到有好些数据都重传了
删除丢包
tc qdisc del dev eth0 root netem loss 50%
延时
tc qdisc add dev eth0 root netem delay 1000ms 100ms
设置延时1000ms,上下浮动100ms,实际延时900ms~1100ms
删除延时
tc qdisc del dev eth0 root netem delay 1000ms 100ms