TCP半连接队列和全连接队列

什么是TCP半连接队列和全连接队列?

在TCP进行三次握手时,Liunx会为其维护两个队列:

  • 半连接队列,也叫syn队列
  • 全连接队列,也叫accept队列

在客户端发起第一次连接时,服务端会将其加入到syn队列中,并且响应客户端syn+ack报文,等到客户端发送ack应答报文时,服务端将该连接从半连接队列中取出,并新建一个新的连接,加入到accept队列当中。等待进程调用accept请求时,将该连接取出来
在这里插入图片描述
不管是半连接队列还是全连接队列,都有最大长度限制,超过限制时,内核会直接丢弃,或返回 RST 包。

半连接队列(syn队列)

如何查看半连接队列的长度呢??

我们可以抓住半连接队列的特点,处于syn_recv状态的tcp连接,就是我们的半连接队列

于是,我们使用如下命令查看处于syn_recv状态的tcp连接

 netstat -natp | grep SYN_RECV | wc -l

在这里插入图片描述

如何模拟tcp半连接队列溢出场景

我们只需要一直对服务端发送syn包,但是不回ack回应包,这样就会使得服务端有大量请求处于syn_recv状态,这就是所谓的syn洪泛,syn攻击,DDos攻击

如何抵御syn攻击

  1. 增大半连接队列
    不能只增大tcp_max_syn_backlog,还需要一同增大somaconn和backlog,也就是增大全连接队列

  2. 开启tcp_syncookies功能
    开启tcp_syncookies就可以在不使用syn半连接队列的情况下建立连接
    syncookies在接收到客户端的syn报文时,计算出一个值,放到syn+ack报文中发出。当客户端返回ack报文时,取出该值验证,成功则建立连接,如下图:
    在这里插入图片描述

  3. 减少ack+syn报文的重传次数
    因为我们在收到syn攻击时,服务端会重传syn+ack报文到最大次数,才会断开连接。针对syn攻击的场景,我们可以减少ack+syn报文的重传次数,使处于syn_recv状态的它们更快断开连接
    修改重传次数:/proc/sys/net/ipv4/tcp_synack_retries

全连接队列

如何知道TCP全连接队列的大小

可以使用ss命令,来查看TCP全连接队列的情况
在这里插入图片描述

全连接队列溢出

当服务端的全连接队列过小时,容易发生全连接队列溢出。发生全连接队列溢出,后续的请求就会别丢弃。
在这里插入图片描述
Linux有个参数可以指定TCP全连接队列满了,会使用什么策略来回应客户端
丢弃连接只是liunx的默认行为,我们还可以向客户端发送RST报文终止连接,告诉客户端连接失败
在这里插入图片描述
tcp_abort_on_overflow共有两个值分别是0和1

  • 0:如果全连接队列满了,那么服务端丢弃ack报文
  • 1:如果全连接队列满了,那么服务端会想客户端发送RST报文,终止这个握手连接

通常情况下设置为0更好,可以提高效率
如果设置为0的话,此时服务端全连接队列满了,客户端发送过来的ack报文,服务端丢弃。而此时客户端还会继续重传,如果此时服务端的全连接队列有空闲,那么就会接受重传的ack包,这样就能直接建立连接了。而设置为1的话,还需要重新连接

如何增大全连接队列呢?

当全连接队列溢出后,我们需要增大全连接队列的长度,以提高请求容量
TCP 全连接队列的最大值取决于 somaxconn 和 backlog 之间的最小值,也就是 min(somaxconn, backlog),所以我们需要提高这两个参数的大小才能拿增大全连接队列

本文大都是直接给出结论知识,你也可以通过一些网上博文,尝试自我分析Linux源码来探究这些结论

TCP (Transmission Control Protocol) 连接全连接是建立两个进程间通信的两种状态,它们的主要区别在于网络连接的状态和数据传输的过程: **连接(三次握手):** - 在客户端发起连接请求之前,首先发送一个SYN(同步序号)包给服务器。 - 服务器接收到SYN包后,会回应一个SYN+ACK(同步确认)包,同时设置期望序列号。 - 客户端再次回应一个ACK(确认)包,表示收到了服务器的响应并且同意连接条件。 在这个阶段,双方已经交换了必要的控制信息,但是还没有正式的数据传输,因此还不是一个完全的连接状态。 **全连接(四次挥手):** - 当服务器和客户端都准备好开始数据传输时,他们各自维护一个完整的连接(即双方都有SYN+ACK包来回交互)。 - 数据传输结束后,一方希望关闭连接,通常由发起方发送FIN(结束)包,请求释放连接。 - 对方收到FIN包后,发送ACK作为应答,并在完成数据发送后也发送FIN包结束本方向的连接。 - 最后,双方互相发送ACK确认对方已接收FIN,完成断开连接的所有步骤。 总的来说,连接是在连接建立前的试探阶段,而全连接则是实际数据传输的稳定状态。连接节省了资源,因为它不需要立即创建一个全双工连接,但在数据传输开始前需要更多交互。全连接更高效,一旦建立就可以直接传输数据,直到双方协商关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值