
从零构建通讯器--5.4listen()队列剖析、阻塞非阻塞、同步异步
发布日期:2021-05-04 18:23:28
浏览次数:17
分类:技术文章
本文共 3066 字,大约阅读时间需要 10 分钟。
(1)listen()队列剖析
(1.0)listen():监听端口,用在 TCP连接 中的 服务器端 角色; listen()函数调用格式: int listen(int sockfd, int backlog); //要理解好backlog这个参数,我们需要先谈一谈 “监听套接字 队列”的话题; (1.1)监听套接字的队列 ①对于一个调用listen()进行监听的套接字,操作系统会给这个套接字 维护两个队列; ② a)未完成连接队列 【保存连接用的】当客户端 发送tcp连接三次握手的第一次【syn包】给服务器的时候,服务器就会在未完成队列中创建一个 跟这个 syn包对应的一项,其实,我们可以把这项看成是一个半连接【因为连接还没建立起来呢】,这个半连接的状态会从LISTEN变成SYN_RCVD状态,同时给客户端返回第二次握手包【syn,ack】,这个时候,其实服务器是在等待完成第三次握手; 客户端-》》服务端(LISTEN变成SYN_RCVD状态) 客户端《《-服务端(返回第二次握手包【syn,ack】) b)已完成连接队列 【保存连接用的】当第三次握手完成了,这个连接就变成了ESTABLISHED状态,每个已经完成三次握手的客户端 都放在这个队列中作为一项; 客户端connect(第三次握手,完成连接队列 ) c)backlog曾经的含义:已完成队列和未完成队列里边条目之和 不能超过 backlog; (面试重点) //(1)客户端这个connect()什么时候返回(返回就是客户端发送请求去服务端),其实是收到三次握手的第二次握手包(也就是收到服务器发回来的syn/ack)之后就返回了; //(2)RTT是未完成队列中任意一项在未完成队列中留存的时间,这个时间取决于客户端和服务器; 对于客户端,这个RTT时间是第一次和第二次握手加起来的时间; 对于服务器,这个RTT时间实际上是第二次和第三次握手加起来的时间; 如果这三次握手包传递速度特别快的话,大概187毫秒能够建立起来这个连接;这个时间挺慢,所以感觉建立TCP连接的成本挺高;【短连接游戏-挺恶心的】 //(3)如果一个恶意客户,迟迟不发送三次握手的第三个包。那么这个连接就建立不起来,那么这个处于SYN_RCVD的这一项【服务器端的未完成队列中】, //就会一致停留在服务器的未完成队列中,这个停留时间大概是75秒,如果超过这个时间,这一项会被操作系统干掉; (面试重点)(3)同步和异步I/O
a)异步I/O:调用一个异步I/O函数时,我门要给这个函数指定一个接收缓冲区,我还要给定一个回调函数;调用完一个异步I/O函数后,该函数会立即返回。 其余判断交给操作系统,操作系统会判断数据是否到来,如果数据到来了,操作系统会把数据拷贝到你所提供的缓冲区里,然后调用你所指定的这个回调函数来通知你; ******************************************区别你 很容易区别非阻塞和异步I/O的差别: //(1)非阻塞I/O要不停的调用I/O函数来检查数据是否来,如果数据来了,就得卡在I/O函数这里把数据从内核缓冲区复制到用户缓冲区,然后这个函数才能返回; //(2)异步I/O根本不需要不停的调用I/O函数来检查数据是否到来,只需要调用一次,然后就可以干别的事情去了;内核判断数据到来,拷贝数据到你提供的缓冲区,调用你的回调函数来通知你,你并没有被卡在那里的情况; ******************************************************* b)同步I/O //select/poll。epoll。 //1)调用select()判断有没有数据,有数据,走下来,没数据卡在那里; //2)select()返回之后,用recvfrom()去取数据;当然取数据的时候也会卡那么一下; //同步I/O感觉更麻烦,要调用两个函数才能把数据拿到手; //但是同步I/O和阻塞式I/O比,就是所谓的 I/O复用【用两个函数来收数据的优势】 能力; (3.1)I/O复用 所谓I/O复用,就是我多个socket【多个TCP连接】可以弄成一捆【一堆】,我可以用select这种同步I/O函数在这等数据;/所以,这种调用一个函数能够判断一堆TCP连接是否来数据的这种能力,叫I/O复用,英文I/O multiplexing【I/O多路复用】 (3.2)思考题 什么叫 用 异步的方法 去使用 非阻塞调用 ? 捕捉信号异步拉起同步,使进程结束回收资源发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月29日 09时22分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
jQuery练习t130,从0到1
2019-03-03
jQuery练习t167,从0到1
2019-03-03
jQuery练习t203,从0到1
2019-03-03
jQuery练习t248,从0到1
2019-03-03
jQuery练习t249,从0到1
2019-03-03
jQuery练习t250,从0到1
2019-03-03
jQuery练习t256,从0到1
2019-03-03
jQuery练习t270,从0到1
2019-03-03
jQuery练习t271,从0到1
2019-03-03
jQuery练习t272,从0到1
2019-03-03
jQuery练习t277,从0到1
2019-03-03
jQuery练习t288,从0到1
2019-03-03
jQuery练习t309,从0到1
2019-03-03
jQuery练习t310,从0到1
2019-03-03
jQuery练习t313,从0到1
2019-03-03
asp.net4.5练习~test4-2
2019-03-03