开发者社区> ghost丶桃子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

listen--监听数量

简介:
+关注继续查看

#include <sys/socket.h>

int listen(int sockfd, int backlog);

/* backlog指定了该套接口排队的最大连接个数 */

 

调用listen导致套接口从CLOSED状态转换到LISTEN状态。

 

监听窗口维持两个队列(队列的大小与backlog有关):

  1. 未完成队列,每个这样的SYN分节对应一项;已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三次握手,此套接口处于SYN_RCVD状态。
  2. 完成队列,完成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不能排上队,导致针对合法用户的服务被拒绝。

 

  防御方法:

  1. 针对服务器主机的方法。增加连接缓冲队列长度和缩短连接请求占用缓冲队列的超时时间。该方式最简单,被很多操作系统采用,但防御性能也最弱。
  2. 针对路由器过滤的方法。由于DDoS攻击,包括SYN-Flood,都使用地址伪装技术,所以在路由器上使用规则过滤掉被认为地址伪装的包,会有效的遏制攻击流量。
  3. 针对防火墙的方法。在SYN请求连接到真正的服务器之前,使用基于防火墙的网关来测试其合法性。它是一种被普遍采用的专门针对SYN-Flood攻击的防御机制。

参考

Unix网络编程

基于主动网的SYN攻击防御

知识共享许可协议
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ETL(三):汇总转换器组件(聚合)和表达式组件的合用(一)
ETL(三):汇总转换器组件(聚合)和表达式组件的合用(一)
34 0
ETL(三):汇总转换器组件(聚合)和表达式组件的合用(二)
ETL(三):汇总转换器组件(聚合)和表达式组件的合用(二)
19 0
ETL(三):汇总转换器组件(聚合)和表达式组件的合用(三)
ETL(三):汇总转换器组件(聚合)和表达式组件的合用(三)
29 0
包容审慎:数字经济时代的监管原则
尼采说:有力量的地方,就有数字—她更有力量。《易传》则有“极数知来之谓占”的表述。这些关于数据的先知,是否早已洞察了数据时代的到来。 数据,作为意志的选择和力量的留痕,越来越被在线化的应用场景适时记录并结构化,被算法以及不断优化的机器学习作为驱动能源,被与大数据匹配的云计算进行加工,被不断降低成本的数据智能商业化。
1547 0
Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问。xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数据库可以利用SQLite,android中提供了几个类来管理SQLite数据库,对数据进行增删改查 直接调用Asp.net Web API对数据进行增删改查 这两种方式到底选择哪一种方式好一点呢?哪一种方式好不好我不敢确定,市场上大部分app都是调用api来clud的。
1161 0
C#(WIN FORM)两个窗体间LISTVIEW值的修改
有两个窗体(frmMain,frmChild) frmMain中有一LISTVIEW控件,在双击LISTVIEW后弹出frmChild. 在frmChild修改数据后关闭frmChild frmMain中LISTVIEW的数据也同时更新.
644 0
1955
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载