Linux内核中连接的组织形式与全连接队列
文章目录
- 1.前言
- 2.Linux内核中连接的组织形式
-
- 2.1套接字和文件描述符
- 2.2创建连接 & 获取连接
- 3.全连接队列
-
- 3.1为什么有全连接队列?
- 3.2全连接队列的长度
1.前言
TCP是面向连接的,TCP的各种可靠性机制实际都不是从主机到主机的,而是基于连接的。
比如一台服务器启动后可能有多个客户端前来访问,如果TCP不是基于连接的,也就意味着服务器端只有一个接收缓冲区,此时各个客户端发来的数据都会拷贝到这个接收缓冲区当中,此时这些数据就可能会互相干扰。
而我们在进行TCP通信之前需要先建立连接,就是因为TCP的各种可靠性保证都是基于连接的,要保证传输数据的可靠性的前提就是先建立好连接。
而一台机器上可能会存在大量的连接,此时操作系统就不得不对这些连接进行管理。
- 操作系统在管理这些连接时需要“先描述,再组织”,在操作系统中一定有一个描述连接的结构体,该结构体当中包含了连接的各种属性字段,所有定义出来的连接结构体最终都会以某种数据结构组织起来,此时操作系统对连接的管理就变成了对该数据结构的增删查改。
- 建立连接,实际就是在操作系统中用该结构体定义一个结构体变量,然后填充连接的各种属性字段,最后将其插入到管理连接的数据结构当中即可。
- 断开连接,实际就是将某个连接从管理连接的数据结构当中删除,释放该连接曾经占用的各种资源。
以上都是理论层次的理解,那我们今天就具体地探究Linux源码中连接是如何组织起来的:
2.Linux内核中连接的组织形式
2.1套接字和文件描述符
网络通信本质上也是IO的过程,而且之前我们也说过调用send、recv等函数本质上是向Tcp维护的发送缓冲区、接收缓冲区写入和读出数据,既然是IO操作,所以一个套接字的本质其实就是一个文件描述符对应的文件。Linux下一切皆文件。
一个服务器本质上就是一个进程,而进程到文件的关系我们早已经在系统部分学习过:
当我们创建套接字时,Linux系统还会为我们创建一个新的结构体对象struct socket:
我们观察到这个结构体内部包含了一个struct file类型的指针,该指针指向的就是该套接字对应的文件对象,所以我们此时可以通过该套接字找到对应的文件了,但是更重要的是我们需要通过文件描述符找到对应的套接字呢呀,现在只有一个单向的指针,即我现在需要从文件找到对应的套接字对象。
<
评论前必须登录!
注册