网络编程0x04 Listen函数

文章目录

  • 网络编程0x04 Listen函数
    • 1.套接字分类
    • 2. listen函数
    • 3. 监听过程

1.套接字分类

TCP socket分两种:

  • 监听socket
  • 传输socket

监听socket:负责处理网络上来的连接请求(客户端的SYN包到达便是连接请求来了)

传输socket:负责在网络上的两个端点之间传输TCP数据

未决socket(pending socket): 就是某客户端的SYN包到达,内核为这个SYN包对应的TCP请求生成一个socket,但是此时三次握手并没有完成,这样的socket就是pending socket,是未决连接,没有经过三次握手认证的tcp连接。

已建立连接的socket(established socket):TCP服务器利用三次握手完成对客户端的简单认证之后,未决socket就变成已连接socket,后续可以用这个socket传输数据。

内核为每个tcp服务器维护两个socket队列:未决socket队列和已建立连接的socket队列

2. listen函数

listen函数用在服务器程序中,在进行bind函数之后,调用listen()将sockfd所引用的套接字标记为被动套接字,即,该套接字将用于使用accept接受传入的连接请求。

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int listen(int sockfd, int backlog);DESCRIPTIONlisten() marks the socket referred to by sockfd as a passive socket, that is, as a socket that will be used to accept incoming connection requests using accept(2).The sockfd argument is a file descriptor that refers to a socket of type SOCK_STREAM or SOCK_SEQPACKET.The  backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.  If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at  connection succeeds.RETURN VALUEOn success, zero is returned.  On error, -1 is returned, and errno is set appropriately.

在TCP服务器端创建socket完毕,调用listen函数的时候,系统底层发生了以下动作:

  1. 将刚才创建的(fd所标示的)socket转换为此TCP服务器的监听socket,让此socket进入监听请求模式,此socket的tcp状态由CLOSE转至LISTEN.
  2. 内核为此监听socket所对应的tcp服务器建立一个未决socket队列和一个已建立连接socket队列, backlog这个参数用来决定未决socket队列的长度,有个映射关系,0表示长度可以无限大.

3. 监听过程

监听socket收到某客户端的SYN包,第一次握手完成.

然后内核为此SYN请求生成一个pending socket,例如图中的socket5,标记状态为SYN_RECV,并且将socket5加入相应的pending socket队列,并且服务器发出ACK和SYN,第二次握手完成。

后续针对此socket5有两种可能

第一种可能

过会儿客户端响应了服务器的SYN(第三个ACK到达),第三次握手结束。内核触发accept函数执行,将socket5状态标记为ESTABLISHED,并且将此socket5由pending socket queue移至establishedsocket queue

第二种可能

客户端的最后一个ACK一直没有到来,过很久,图中的socket5超时被移除

针对此listen,有两个极限情况导致的拒绝服务情况需要考虑:

backlog设置过小,pending socket队列已满,此时客户端调用connect发送SYN分节给服务器端请求连接,服务端会忽略此SYN包,客户端收不到SYN的ACK,会触发SYN超时,这个超时时间比较长,重发SYN,导致客户端长时间连接不上。

端请求连接,服务端会忽略此SYN包,客户端收不到SYN的ACK,会触发SYN超时,这个超时时间比较长,重发SYN,导致客户端长时间连接不上。

backlog设置为0或者过大,只要收到SYN包,就会在pending socket队列中增加节点,这个容易导致物理内存耗尽. Syn flood就是攻击pending socket队列的

网络编程0x04 Listen函数相关推荐

  1. C++ tcpip网络编程中listen函数和accept函数详解和区别

    listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定 ...

  2. linux网络编程中listen函数 backlog的含义

    结论: backlog 是用来指定在TCP连接时,同时进行 3次握手建立连接的客户端数量 listen函数在一般在调用bind之后-调用accept之前调用, 它的函数原型是: #include< ...

  3. C语言网络编程:listen函数详解

    文章目录 前言 函数描述 代码实例 TCP服务器为什么调用listen 前言 根据TCP编程模型中我们可以看到之前的socket和bind接口是tcp服务器在为接收客户端的链接做准备,保证tcp的面向 ...

  4. linux网络编程之Listen函数参数介绍

    1.listen()函数介绍 listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器, ...

  5. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  6. Linux C高级编程——网络编程之包裹函数

                                        Linux网络编程(六)--包裹函数                          宗旨:技术的学习是有限的,分享的精神是无 ...

  7. 网络编程socket accept函数的理解

    在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求.这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回 ...

  8. 与socket网络编程有关的函数

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 基于TCP通信的服务模式 服务端 socket函数,获取网络连接的文件描述符 bind函数,将服务器的端口.ip地址与socket函数创建的文件 ...

  9. TCP 网络编程API - listen()、accept()

    目录 listen() listen() 函数介绍 listen() 函数的例子 应用层 listen()函数和内核函数之间的关系 accept () accept ()函数介绍 accept ()函 ...

最新文章

  1. 第二期安全狗讲坛3月11日开始
  2. Python命名空间
  3. 函数基本使用-函数的定义以及调用执行线路图
  4. 基于wrapper的特征选择——递归特征消除RFE的python实现
  5. OJ1057: 素数判定(C语言经典列题,判断变量的应用)
  6. 流量卡物联网卡管理平台源码|PHP管理系统源码
  7. svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
  8. 如何安装python环境_python入门第一步:如何安装Python和搭建Python环境?
  9. 正则表达式 蛮全的!
  10. Ubunt更换阿里云镜像源
  11. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别
  12. 信息学奥赛GoC编程测试题题库
  13. 数学建模之微分方程模型详解
  14. 认知-认知水平:认知水平
  15. java 股票指标算法库_股票K线指标算法整理(Java封装工具类,K线指标算法工具类)...
  16. 一周热图|何穗俞飞鸿张翰南京出席活动;华为全球最大旗舰店开业;巴黎欧莱雅公布凯瑟琳·兰福德为全球代言人...
  17. 操作系统OS-采用分段式存储管理不会产生内部碎片
  18. Python中函数的括号
  19. java计算机毕业设计政府人才机构在线考试系统2021源码+mysql数据库+系统+lw文档+部署
  20. Java TreeSet详解

热门文章

  1. ORACLE启动模式及关闭
  2. 分享IP防封的经验技巧
  3. php风车,用源码包来实现LAMP 的详细过程
  4. Dell T430安装Redhat5.9
  5. Capital one面经
  6. php 5.3.9 + apache 2.2.17安装配置教程
  7. 为什么print和println输出java对象时会打印内存地址?
  8. 图片怎么转PDF?两个方法轻松操作
  9. 10款实用高效的网页版PS插件推荐!
  10. 智慧餐车机器人系统数据流图