博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP之listen&backlog
阅读量:4581 次
发布时间:2019-06-09

本文共 897 字,大约阅读时间需要 2 分钟。

1. listen函数:

#include 
int listen(int sockfd, int backlog);ret-成功返回0 失败返回-1

listen仅由服务器调用,它做两件事情:

(1) 当socket创建一个套接字的时候,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字。listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应该接受指向该套接字的连接请求;调用listen使得套接字从CLOSED状态转换到LISTEN状态;

(2) backlog规定了内核应该为相应的套接字排队的最大连接个数;

 

2. backlog含义:

内核为给定的监听套接字维护两个队列,两个队列项之和不超过backlog:

(1) 未完成连接队列,每个syn分节对应其中一项,已经由某个客户端发出并到达服务器,而服务器正在等待完成相应的tcp三次握手过程,这些套接字处于SYN_RCVD状态;

(2) 已完成连接队列,每个已经完成三次握手过程的客户对应其中的一项,这些套接字处于ESTABLISHED状态;

注:如下图,accept是从已完成队列头取一个连接进行服务,所以accept是在三次握手之后的过程;

 

3. 三次握手和两个队列:

(1) syn到达时,tcp在未完成队列中创建一个新项,然后响应三次握手的第二个分节,这项一直保留在未完成队列中,一直到三次握手的第三个分节到达或者超时为止;

(2) 当一个syn到达时,队列是满的,tcp将忽略该分节,客户端重新发送syn,期望不久就能在这些队列中找到可用空间;发送rst是不对的,因为客户端无法区分rst是无服务还是队列满;

(3) 如果三次握手正常完成,该项从未完成队列移动到已完成队列的队尾;

(4) 当进程调用accept时,已经完成连接队列中的对头项将返回给进程,或者如果该队列为空,那么进程将投入睡眠,直到tcp在该队列中放入一项才唤醒它;

 

转载于:https://www.cnblogs.com/wanpengcoder/p/5354469.html

你可能感兴趣的文章
模板 - 字符串 - Manacher
查看>>
2017.1.2
查看>>
Ice_cream's world I
查看>>
echarts中国地图散点涟漪效果
查看>>
三.NFS存储服务
查看>>
sql2008日志文件截断
查看>>
git增加远程仓库
查看>>
[POJ3162]Walking Race(DP + 单调队列)
查看>>
作业3-单元测试
查看>>
【生活日常】一切从Hello World开始
查看>>
微信分享 apicloud方式 中遇到的坎
查看>>
用例图之我见
查看>>
UVA 10972 RevolC FaeLoN(边-双连通+缩点)
查看>>
开源的Android视频播放器
查看>>
[算法]死磕二叉树专题算法
查看>>
MySQL知识点小结
查看>>
(leetcode题解)Third Maximum Number
查看>>
DOM
查看>>
Apache Qpid Broker云
查看>>
Algorithm --> 爬楼梯求最大分数
查看>>