扁平风格企业网站源码,免费视频网站素材,做rom网站,wordpress ajax 加载文章内容1. 理解 int listen(int sockfd, int backlog) 第二个参数的作用
backlog#xff1a;表示tcp全连接队列的连接个数1。
如果连接个数等于backlog1#xff0c;后续连接就会失败#xff0c;假设tcp连接个数为0#xff0c;最大连接个数就为1#xff0c;并且不accept获取连接…1. 理解 int listen(int sockfd, int backlog) 第二个参数的作用
backlog表示tcp全连接队列的连接个数1。
如果连接个数等于backlog1后续连接就会失败假设tcp连接个数为0最大连接个数就为1并且不accept获取连接。 先来的连接三次握手成功后来的连接则处于SYN_SENT即三次握手失败不管是否accpet三次握手和accpet无关如果没有即使accpettcp允许客户端继续三次握手但连接个数不能超过backlog1否则处于SYN_SENt状态即半连接队列。
2. 理解全连接队列(原理)
tcp内部会维护一个全连接队列用来管理一个一个的连接。 有人向全连接队列放数据有人向全连接队列拿数据这不就是生产消费者模型吗
假设没有全连接队列/或者backlog为空当上层很忙来不及appcet则在忙的期间可能有很多新的连接但被服务器直接拒接了当不忙的时候之前的新连接就没了忙的时候很忙不忙的时候没有连接处理也就是提高了服务器闲置率和减少给用户服务和体验的效率但如果有全连接队列不忙的时候就可以向里面获取连接。
假设全连接队列长度很大比如长度为1000当全连接队列有连接说明服务器已经很忙了处于末端的连接注定要等待更久的时间来被拿走也减少给用户的体验和效率长度更大空间也会有一定的浪费。
2. 理解全连接队列(内核) 假如一个新连接到来并且三次握手成功则会链入到listen文件描述符里面的tcp_socket里面的全连接队列里将来给连接分配文件描述符该文件描述符通过struct file找到struct socket在让listen里面的全连接队列分配一个连接也就是tcp_socket结构新连接用struct_socket里面的struct_sock来和tcp_socket关联起来。