listen--监听数量
listen--监听数量
#include <sys/socket.h>
int listen(int sockfd, int backlog);
/* backlog指定了该套接口排队的最大连接个数 */
调用listen导致套接口从CLOSED状态转换到LISTEN状态。
监听窗口维持两个队列(队列的大小与backlog有关):
- 未完成队列,每个这样的SYN分节对应一项;已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三次握手,此套接口处于SYN_RCVD状态。
- 完成队列,完成TCP三次握手过程的每一项;该套接口处于ESTABLISHED状态。
问题来了,如何动态的改变listen监听的个数呢?
如果指定值在源代码中是一个常值,那么增长其大小需要重新编译服务器程序。那么,我们可以为它设定一个缺省值,不过允许通过命令行选项或者环境变量来覆写该值。
void Listen(int fd, int backlog) { char *ptr; if((ptr = getenv("LISTENQ")) != NULL) backlog = atoi(ptr); if(listen(fd, backlog) < 0) printf("listen error\n"); }
队列已满的情况,如何处理?
当一个客户SYN到达时,若这个队列是满的,TCP就忽略该分节,也就是不会发送RST。
这么做的原因在于,队列已满的情况是暂时的,客户TCP如果没收收到RST,就会重发SYN,在队列有空闲的时候处理该请求。如果服务器TCP立即响应一个RST,客户的connect调用就会立即返回一个错误,强制应用进程处理这种情况,而不会再次重发SYN。而且客户端也不无区别该套接口的状态,是“队列已满”还是“该端口没有在监听”。
SYN泛滥攻击
向某一目标服务器发送大量的SYN,用以填满一个或多个TCP端口的未完成队列。每个SYN的源IP地址都置成随机数(IP欺骗),这样防止攻击服务器获悉黑客的真实IP地址。通过伪造的SYN装满未完成连接队列,使得合法的SYN不能排上队,导致针对合法用户的服务被拒绝。
防御方法:
- 针对服务器主机的方法。增加连接缓冲队列长度和缩短连接请求占用缓冲队列的超时时间。该方式最简单,被很多操作系统采用,但防御性能也最弱。
- 针对路由器过滤的方法。由于DDoS攻击,包括SYN-Flood,都使用地址伪装技术,所以在路由器上使用规则过滤掉被认为地址伪装的包,会有效的遏制攻击流量。
- 针对防火墙的方法。在SYN请求连接到真正的服务器之前,使用基于防火墙的网关来测试其合法性。它是一种被普遍采用的专门针对SYN-Flood攻击的防御机制。
参考
Unix网络编程
基于主动网的SYN攻击防御
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!