一、全连接队列
listen 函数第二个参数 backlog 是输入全连接队列的长度,一般不会太大。那如何理解全连接队列呢?
首先三次握手建立连接的过程和服务器是否 accept 无关,accept 的本质就是把已经建立的连接以文件描述符的形式返回。
那么在服务器来不及 accept 的时候,底层的 TCP 仍然允许用户进行三次握手,建立连接成功之后就会把连接放入全连接队列,即等待服务器 accept 拿走建立好的连接。但是全连接队列不会保存太多建立好的连接,最多保存 backlog + 1 个连接。
就是生产者消费者模型
为什么全连接队列不能为空,或者不能太长?
为空会导致服务器闲置率太高,而且生产者消费者模型不能为空。
太长会导致新连接进入时要等很长时间,因为队伍太长。效率低。
二、内核级理解套接字 socket
首先服务器启动就是一个进程,是进程就会有 pcb,struct files_struct 等,我们就从这里开始。
三、Linux抓包 tcpdump
1、安装
2、常见选项
选项 | 含义 |
-i | 抓取指定网络接口数据包,-i any 表示抓取所有网络接口数据 |
-w | 后面跟文件名,把抓取结果,写入指定文件,但打开是乱码 |
-r | 后面跟文件名,把 -w 之后的文件读出来,这个可以看懂 |
-n | 把被解释成随机主机名的主机名再解释回去 |
3、常见指令
(1)tcpdump -i any tcp:指定抓取关于tcp协议的所有网络接口数据包。
(2)tcpdump src host IP地址 and tcp:抓取指定源IP的tcp数据包。
(3)tcpdump dst host IP地址 and tcp:抓取指定目的IP的tcp数据包。
(4)tcpdump port 80 and tcp:抓取指定端口80的tcp数据包。
(5)tcpdump -i eth0 port 80 -w data.pcap:把关于tcp协议的网络接口eth0数据包写入文件data.pcap。
(6)tcpdump -r data.pcap:读出文件data.pcap。