listen--监听数量

news/2024/7/4 9:33:21 标签: 网络, java, 操作系统

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攻击防御


http://www.niftyadmin.cn/n/1383223.html

相关文章

Spring Cloud 微服务框架使用快速掌握及源码分析

2019独角兽企业重金招聘Python工程师标准>>> 一.Spring Cloud 简介 SpringCloud是一个机遇SpringBoot实现的微服务框架开发工具,它为微服务架构中涉及的配置管理,服务治理,断路器,智能路由,微代理,控制总线,全局锁,决策竞选,分布式会话和集群状态管理等操作提供了一…

突破R内存限制的企业级大数据挖掘利器:Microsoft R Server 快速上手

R语言是一款非常优秀的数据挖掘工具&#xff0c;拥有顶尖的数据处理、数据挖掘课数据可视化。是数据从业者必备的一把利器。但是其基于内存的诟病也一直被人所嫌弃&#xff0c;虽然这几年很多优秀的扩展包极大提升了R语言的性能&#xff0c;但是在面对企业级大数据挖掘面前&…

081 关于微信支付的回调Notify_url

一、你一定要有毅力&#xff01;心平气和&#xff0c;慢慢来&#xff01;&#xff08;微信扫码支付PC端&#xff0c;模式二&#xff09; 二、ri&#xff0c;这个一点要仔细读一下&#xff0c;好不好&#xff0c;大胸弟&#xff01;&#xff01;&#xff01;https的改成http&am…

web性能优化指南

1、精简你的资源 构建高性能应用程序的有效方法是审核发送给用户的资源。虽然Chrome开发人员工具中的网络面板可以很好地总结给定页面上使用的所有资源&#xff0c;但如果您到目前为止尚未考虑性能&#xff0c;那么知道从哪里开始是很重要的。以下是一些建议&#xff1a; 如果您…

My Interface

一、创建Myinterface接口 public interface Myinterface {static final String MyifName"我的接口";static final String MyifPrice"价格";public double getprice(); } 二、创建引用接口的类 public class UseMyinterface {public static void main(Strin…

157 TP5报错Fatal error: require(): Failed opening required '/home/www/xx/public/../thinkphp/start.php

https://jingyan.baidu.com/article/afd8f4deb784fe34e386e97b.html https://www.cnblogs.com/300js/p/9224567.html 搜一下百度经验就行了&#xff01;

vIDC v2.0 强大的端口转发神器使用总结-开放内网tfs代码服务

vIDC2.0 端口映射工具,最近在公司闲来无事,想自己整个tfs来管理自己的研究代码. 本来是想用微软Visual Studio提供的免费tfs,但是无奈速度太慢.他们的服务器在美国,中国也没有代理.签入签出一个东西要老命了 .那怎么办呢. 后来想想自己家里有台牛B的机器,我为什么不自己搭一个呢…

Android设计模式(七)--原型模式

1、定义&#xff1a; 用原型实例指定创建对象种类&#xff0c;并通过拷贝这些原型创建新的对象。2、目的&#xff1a; 从一个对象创建另外一个可定制的对象&#xff0c;而不须要知道不论什么创建细节。 3、作用&#xff1a; 3.1、简化对象的创建。 3.2 、对于处理大对象。性能上…