SYN报文什么时候会被丢弃?

开启tcp_tw_recycle参数,并且在NAT环境下,造成syn包丢弃

tcp最后挥手时,需要发起关闭方等待2MSL时间后才能关闭,Linux提供了两个系统参数可以快速回收time_wait状态的连接,这两个参数都是默认关闭的。

  • net.ipv4.tcp_tw_reuse:如果开启该选项的话,tcp在新建连接时,会自动选择time_wait状态超过1s的连接来进行复用,该选项只适用于连接方
  • net.ipv4_tcp_tw_recycle:如果开启该选项的话,允许处于time_wait状态的连接快速回收

如果要使这两个选项生效,必须开启timestamps时间戳,timestamps默认为1

注意:tcp_tw_recycle在NAT环境下是不安全的!!!如果同时开启了tcp_tw_recycle和timestapms的话,就会开启「 per-host 的 PAWS 机制」

什么叫per-host的PAWS机制??
当开启时间戳后,就会启动PAWS(防止序列号绕回,前面已经讲解过了)。
per-host是对端ip做PAWS检查,而非对ip+端口做PAWS检查。
当多台主机使用一个NAT网关时,它们使用的都是同一个ip地址,所以相当于是服务器在跟一台主机通信一样。

当一台主机A通过NAT断开后,服务器主动关闭并回收time_wait状态的连接;此时,另一台主机B也通过NAT与服务器建立连接,如果B的时间戳是小于A的时间戳的,那么服务端就会丢弃主机B发来的SYN包。这就是在NAT环境下使用recycle的缺点。如果他是对ip+端口做PAWS的话,就不会存在这个问题。。这个recycle参数在Linux 4.12版本后就被取消了

半连接队列满了,造成syn包丢弃

当服务端遭遇syn攻击时,就有可能导致半连接队列满了,半连接队列满了就会导致后面发送的syn报文丢弃。
我们有三种解决办法解决这种情况:

  • 增大半连接队列,增加tcp_max_syn_backlog,同时还需要增加全连接队列somacon和backlog

  • 启用syncookie选项:当接受到syn请求时,服务端计算出当前状态,加到syn+ack里,当客户端返回ack时,验证该值的合法性,从而建立连接。这样的话就不需要占用半连接队列
    在这里插入图片描述

  • 减少ack+syn报文重传的次数,使得半连接队列的连接快速释放

全连接队列满了,造成syn包丢弃

当服务端调用accept不及时,或者accept队列过小,则会导致全连接队列过满,这样后续的连接就会丢失;我们可以通过增加somaconn和backlob参数来增加全连接队列
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/small_engineer/article/details/124312088
今日推荐