TCP全队列连接,tcpdum抓包
- 1. listen的第二个参数作用
- 2. 理解全连接队列(原理)
- 3. 为什么要有全连接队列并且队列长度要适当
- 4. 使用不tcpdump 进行抓包,分析TCP过程(三次握手,四次挥手)
- 4.1安装tcpdump
- 4.2常见使用
- 4.3测试
1. listen的第二个参数作用
-
准备工作
我们把这个测试tcp
实验的代码中的server端中的accept
关闭,也就说现在服务器只是做listen
监听工作。并且把listen
中的的第二个参数设置为1。观察现象。 -
当我们启动两台客户端的时候,使用netstat -natp查看是没有什么问题的。
-
但是当我们增加客户端的时候,就出现问题了
除了刚开始的两个连接时处于Established
状态下(也就是三次握手成功了),后面的两个客户端的状态却是处于SYN_SENT
状态(也就是三次握手没有成功) -
所以上面的实验也验证了,建立连接的过程和用户是否
accept
无关。也就是说在服务器来不及进行accept
的时候,底层TCP listen sock
允许用户进行三次握手,并构建连接。但是构建成功连接的数量是有限的。而这个数量就是listen
中的第二个参数backlog + 1
2. 理解全连接队列(原理)
- 服务器在一定事件内肯定会同时受到众多的客户端发起的请求,这些请求可能是申请建立新连接,也可能是申请发数据。大那是不管是什么申请,终究可以归咎到申请一个连接。那么这么多的连接,服务器要不要进行管理,操作系统要不要进行管理呢?答案是肯定的,也就说操作系统要对连接进行管理,说到管理我们就要想起之前提到的六字真言"先描述,再组织",所以说其实操作系统底层是使用数据结构来管理好一个一个的结构化的连接的。而这个数据结构就是全连接队列。
- 但是这并不是说服务器只能处理backlog + 1个连接,而是再accept忙不过来去对列中拿走连接时,全连接队列所能装下的连接个数。所以其实我们也不难发现,这其实是一个生产者消费者模型。
3. 为什么要有全连接队列并且队列长度要适当
- 这个全连接对队列其实类似于缓冲区的样子,既然是服务器那么必然在某个时间段是服务高峰期,同时也有服务低峰期。如果是在高峰期的话,假设全连接队列为空了,也就是说来了一个连接直接对接引用层让服务器直接处理,但是啊服务器的处理能里是有限的啊,如果同时来了多个请求连接那么必然会有很多的请求连接被拒绝了,这非常降低用户的体验感,并且势必会造成同一个服务器会发起多次请求,也间接的导致加重了服务器的处理工作量,降低服务器的处理效率。
- 那么是不是将全连接队列的空间设置的很大呢?这样的话,就算有很多的连接到来了,也可直接添加到全连接队列中了,这样不久解决了服务器拒绝用户请求的问题吗?看似解决了,但是归根结底服务器的处理能力是有限的,服务器也是从全连接队列中取出数据,如果队列太大了,也就说明用户排队人数就变多了,那么就势必会有用户排在很后面,也就是该用户可能要等待很长一段事件才能进行业务处理。那么这样也有问题,设想一下,如果你在请求一个连接时他就一直转圈圈不给你处理请求你会怎么想,如果是耐心好的可能会等一会,要是没有耐心的是不是直接退出找其他的服务器申请了啊。所以如果队列太长了的话,可能排再更后后面的用户会直接退出,也就将全连接队列开辟好的空间闲置下来的,这不就是一种浪费内核内存资源吗!
- 所以综合上述来讲,为什么要有全队列连接呢:主要是讲全连接队列当作一个缓冲区,在服务器处理不过来过多连接时进行一定的缓存,减少服务器的闲置率,提高用户的体验感。同时开辟的队列大小要适中,减少不必要的内核空间浪费。
4. 使用不tcpdump 进行抓包,分析TCP过程(三次握手,四次挥手)
4.1安装tcpdump
tcpdump 通常已经预装在大多数 Linux 发行版中。如果没有安装,可以使用包管理器进行安装。例如 Ubuntu,可以使用以下命令安装:
Bash
sudo apt-get update
sudo apt-get install tcpdump
在 Red Hat 或 CentOS 系统中,可以使用以下命令:
Bash
sudo yum install tcpdump
4.2常见使用
- 捕获所有网络接口上的TCP报文
Bash
$ sudo tcpdump -i any tcp
注意:-i any 指定捕获所有网络接口上的数据包,tcp 指定捕获 TCP 协议的数据包。i 可以理解成为 interface 的意思
- 捕获指定网络接口上的 TCP 报文
Bash
$ sudo tcpdump -i enh0(虚拟机的话就是ens33) tcp
- 捕获特定源或目的 IP 地址的 TCP 报文
使用 host 关键字可以指定源或目的 IP 地址。例如,要捕获源 IP 地址为 xxx.xxx.xxx.xxx 的 TCP 报文,可以使用以下命令:
Bash
$ sudo tcpdump src host xxx.xxx.xxx.xxx and tcp
要捕获目的 IP 地址为 xxx.xxx.xxx.xxx 的 TCP 报文,可以使用以下命令:
Bash
$ sudo tcpdump dst host xxx.xxx.xxx.xxx and tcp
同时指定源和目的 IP 地址,可以使用 and 关键字连接两个条件:
Bash
$ sudo tcpdump src host xxx.xxx.xxx.xxx and dst host yyy.yyy.yyy.yyy
and tcp
- 捕获特定端口的 TCP 报文
使用 port 关键字可以指定端口号。例如,要捕获端口号为 80 的 TCP 报文(通常是HTTP 请求),可以使用以下命令:
Bash
$ sudo tcpdump port 80 and tcp
- 保存捕获的数据包到文件
使用 -w 选项可以将捕获的数据包保存到文件中,以便后续分析。例如:
Bash
$ sudo tcpdump -i eth0 port 80 -w data.pcap
这将把捕获到的 HTTP 流量保存到名为 data.pcap 的文件中。
了解:pcap 后缀的文件通常与 PCAP(Packet Capture)文件格式相关,这是一种用于捕获网络数据包的文件格式
- 从文件中读取数据包进行分析
使用 -r 选项可以从文件中读取数据包进行分析。例如:
Bash
tcpdump -r data.pcap
这将读取 data.pcap 文件中的数据包并进行分析。
注意事项
- 使用 tcpdump 时,请确保你有足够的权限来捕获网络接口上的数据包。通常,你需要以 root 用户身份运行 tcpdump。
- 使用 tcpdump 的时候,有些主机名会被云服务器解释成为随机的主机名,如果不想要,就用-n 选项
- 主机观察三次握手的第三次握手,不占序号
4.3测试
- 三次握手和四次挥手
上面的是三次握手,下面的是四次挥手。但是我们会发现四次挥手怎么变成了三次挥手呢?我们之前也是讲过了原理的,虽然客户端立马就关闭了,如果服务端也立马进行关闭了,也就是说客户端关闭的瞬间,服务端响应ACK报文的同时也发送了断开连接的请求,这个时候就可以进行捎带应答了。如果我们要看到全过程,只需要控制客户端和用户端断开连接的时机不同即可。
这个时候就可以看到四次挥手的过程了