当前位置: 首页 > 网络应用技术

如何处理SYN

时间:2023-03-05 20:40:10 网络应用技术

  SYN是TCP三个时间握手的一部分。它通常在开发网络应用程序时不会注意,但与偶尔在请求中发出的潜伏期密切相关。这是服务器维护过程的重要组成部分,如果在发送过程中丢失了SYN,则客户通常在1秒,3s,7s,15s,31s之后进行重量,这是长延迟的来源之一。游戏公司困扰的流动攻击也使用SYN的特征。

  检查原始文字

  如下TCP状态图的上面部分所示,应用Listen()后,您可以接收SYN并发送SYN+ACK,输入SYN接收状态;等待ACK进入既定状态。在使用后,您可以使用Accept()。

  这意味着在建立TCP连接期间,有两个等待:1正在等待ACK,2正在等待Access().linux使用两个队列实现这两个等待,并保存struct Inet_request_sock结构在队列中。我们不考虑特殊情况,例如tcp_saved_syn,tcp_defer_accept,tcp_fast_open。

  第一个队列是syn队列(也称为未完成的队列)。当您收到SYN并返回SYN+ACK时,连接将保存在此队列中,并等待ACK连接到SYN接收状态。ACK超时的等待将被传输。这个队列不是很重要。

  第二个队列是接受队列(也称为完成队列)。接收ACK后,将连接从SYN队列中删除,保存到访问队列,输入已建立的状态,等待申请呼叫。如果队列已满,则将发送。

  控制SYN队列的长度。访问队列的第二个参数限制是有限的,不能大于Linux 5.4之前的默认值为128、5.4和4096。

  这个问题经常提出:应该设定多少积压?

  答案是查看情况。在大多数情况下,此参数并不重要。在Golang 1.11之前,无法更改此参数。如果新连接非常频繁,或者设置了TCP_DEFER_ACCEPT,则可以设置更大的设置。但是设置过多是错误的,一个占256个字节。

  一些系统管理员会建议设置一个非常大的积压库并使其变得非常大。这实际上涵盖了应用程序的应用。如果该应用程序为时已晚,则排队并不那么重要,但会导致客户端扩展。最好设置一个简短的队列并尽早告诉客户以解决某些问题。可能需要重新连接。如果设置了合适的负载平衡设备,则重新连接时可能很好。

  我通常将其设置,然后根据情况修改值。

  使用以下命令查看特定端口中的SYN队列元素的数量:

  使用以下命令查看特定端口中访问队列元素的数量。其中,RECV-Q是接受队列元素的数量,而Send-Q是积压参数。

  有几个变量可以查看队列数:

  可以根据实际需求调整SomaxConn。

  在1996年之前,Syn队列一直在不断发送SYN队列以停止服务,直到Syn Cookie出现为止。这种攻击是Syn flodd。它仅需要少量的带宽。发送不多的数据包可以使SYN队列充分,简单且有效:

  由于ACK的ACK值是SYN+ACK的SEQ值,因此可以将其保存在SYN的HASH值中,然后在接收ACK时进行验证。这将不再需要SYN队列:

  打开Syn Cookie(默认情况下)后,SYN队列将在已满时启用此功能以防止Syn Flood。更麻烦的问题是,这将向网络发送大量无用的SYN+ACK。

  在Linux 4.4之前,SYN的处理非常慢,然后他们删除了内核锁。现在,他们基本上不需要太担心Syn Flood。

  原始:https://juejin.cn/post/709490690708986399