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

时间: 2024-10-28 07:50:24

listen--监听数量的相关文章

telephonymanager-android调用电话监听TelephonyManager.listen()如何关闭

问题描述 android调用电话监听TelephonyManager.listen()如何关闭 现在出现的问题是我在一个Service里面调用了TelephonyManager.listen()方法,但是在stopService的时候,电话监听仍然没有关. 解决方案 我的 也是 出现了这样的问题 楼主怎么解决的 ??? 解决方案二: 在service销毁时,要停止监听..... @Override public void onDestroy() { super.onDestroy();// 停止

socket-刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗?

问题描述 刚学linux网络编程,有个问题,listen( )函数可以用来监听其他电脑的端口吗? 如果可以是不是可以用这样的流程,先socket()创建描述符, 然后再bind()绑定一个IP地址跟端口? 解决方案 实在是没看懂你的需求 解决方案二: listen是侦听本机的端口,只有服务器端才需要这么做,你想监听其他主机,就需要在局域网路由器等上面做流量监控 解决方案三: 可以,基于socket的编程,只要绑定对IP地址就可以了.

我写的socket监听过一段时间就需要重新启动一下程序是什么原因

问题描述 我写的socket监听过一段时间就需要重新启动一下程序是什么原因 private void StartReceive() { string msg = null; IPEndPoint iep = new IPEndPoint(IPAddress.Parse(PublicVariables.BJIP), PublicVariables.PORT); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, Pr

如何指定MySQL只监听某个特定地址

在my.cnf之mysqld节,添加bind-address=127.0.0.1.可以使MySQL只监听某个特定地址. 问:怎样才能指定MySQL只监听某个特定地址? 答:比较常见的办法是,在my.cnf之mysqld节,添加bind-address=127.0.0.1.但是也有人按照下面 的办法来做. 为了数据的安全,可以考虑让MySQL只守候在127.0.0.1上,这样从Internet上就无法直接访问数据库 了.修改/etc/init.d/mysql文件,在start部分找到类似下面这行:

android如何使用BroadcastReceiver后台实现来电通话记录的监听

android如何使用BroadcastReceiver后台实现来电通话记录的监听并存取到sqllite数据库通过Contentprovilder实现接口 BroadcastReceiver 是android四大组件的一个,本质上是一种全局的监听器 ,用于监听全局的广播消息.下面实现了后台监听android手机通话记录.本demo 分两个程序,第一个程序是设置监听器,然后模拟器重启后就会有一个全局的 service在后台监听你的来电显示,大多数通话管理软件都是这么干的,第二个项 目是获取通话记录

NodeJS Web应用监听sock文件实例

 这篇文章主要介绍了NodeJS Web应用监听sock文件实例,本文讲解 NodeJS 的 TCP 和 HTTP 监听 Domain Socket 文件例子,需要的朋友可以参考下     像 NodeJS 写的 TCP 服务可以监听在某个 sock 文件(Domain Socket) 上,它的 HTTP 服务也能这么干.虽然作为 HTTP 服务连接某个 sock 文件的意义不大,所以这里只算是一个纯粹的尝试. TCP 服务是这样写 代码如下: var net = require('net');

android音乐播放器监听电话状态实现代码_Android

如下代码是监听电话的状态,代码简单不做介绍直接看代码: 复制代码 代码如下:  private boolean mResumeAfterCall = false; private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {  @Override  public void onCallStateChanged(int state, String incomingNumber) {   if (state =

NodeJs——(1)封装,调用,执行,访问路径,http,函数编程,等待函数,事件监听

(1)如何封装一个模块: 首先,我们建立一个js文件,例如命名为test.js: 然后在里面写一个函数,函数名任意: 然后通过exports.变量名,将函数赋值给这个变量: 如代码: function test(){    //请注意这个函数名     console.log("1"); }exports.testBegin= test;   //等号后面的test,指的是上面的函数名.等号前面的testBegin,是调用时的函数名(注意区别)   这个test.js的文件就写完了,这

Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时,实际上是由ASP.NET管道解决了这两个问题.具体来说,ASP.NET自身的URL路由系统借助于HttpControllerHandler这个自定义的HttpHandler实现了ASP.NET管道和ASP.NET Web API管道之间的"连通",但是在Self Host寄宿模式下,请求的