TCP全队列连接,tcpdum抓包

打印 上一主题 下一主题

主题 648|帖子 648|积分 1944

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,可以使用以下命令安装:
  1. Bash
  2. sudo apt-get update
  3. sudo apt-get install tcpdump
复制代码
在 Red Hat 或 CentOS 系统中,可以使用以下命令:
  1. Bash
  2. sudo yum install tcpdump
复制代码
4.2常见使用


  • 捕获全部网络接口上的TCP报文
  1. Bash
  2. $ sudo tcpdump -i any tcp
复制代码
注意:-i any 指定捕获全部网络接口上的数据包,tcp 指定捕获 TCP 协议的数据包。i 可以理解成为 interface 的意思

  • 捕获指定网络接口上的 TCP 报文
  1. Bash
  2. $ sudo tcpdump -i enh0(虚拟机的话就是ens33) tcp
复制代码

  • 捕获特定源或目的 IP 地址的 TCP 报文
使用 host 关键字可以指定源或目的 IP 地址。例如,要捕获源 IP 地址为 xxx.xxx.xxx.xxx 的 TCP 报文,可以使用以下命令:
  1. Bash
  2. $ sudo tcpdump src host xxx.xxx.xxx.xxx and tcp
复制代码
要捕获目的 IP 地址为 xxx.xxx.xxx.xxx 的 TCP 报文,可以使用以下命令:
  1. Bash
  2. $ sudo tcpdump dst host xxx.xxx.xxx.xxx and tcp
复制代码
同时指定源和目的 IP 地址,可以使用 and 关键字连接两个条件:
  1. Bash
  2. $ sudo tcpdump src host xxx.xxx.xxx.xxx and dst host yyy.yyy.yyy.yyy
  3. and tcp
复制代码

  • 捕获特定端口的 TCP 报文
使用 port 关键字可以指定端标语。例如,要捕获端标语为 80 的 TCP 报文(通常是HTTP 请求),可以使用以下命令:
Bash
$ sudo tcpdump port 80 and tcp

  • 保存捕获的数据包到文件
使用 -w 选项可以将捕获的数据包保存到文件中,以便后续分析。例如:
  1. Bash
  2. $ sudo tcpdump -i eth0 port 80 -w data.pcap
复制代码
这将把捕获到的 HTTP 流量保存到名为 data.pcap 的文件中。
相识:pcap 后缀的文件通常与 PCAP(Packet Capture)文件格式相关,这是一种用于捕获网络数据包的文件格式

  • 从文件中读取数据包进行分析
使用 -r 选项可以从文件中读取数据包进行分析。例如:
  1. Bash
  2. tcpdump -r data.pcap
复制代码
这将读取 data.pcap 文件中的数据包并进行分析。
注意事项


  • 使用 tcpdump 时,请确保你有足够的权限来捕获网络接口上的数据包。通常,你需要以 root 用户身份运行 tcpdump。
  • 使用 tcpdump 的时候,有些主机名会被云服务器解释成为随机的主机名,如果不想要,就用-n 选项
  • 主机观察三次握手的第三次握手,不占序号
4.3测试


  • 三次握手和四次挥手

上面的是三次握手,下面的是四次挥手。但是我们会发现四次挥手怎么变成了三次挥手呢?我们之前也是讲过了原理的,虽然客户端立马就关闭了,如果服务端也立马进行关闭了,也就是说客户端关闭的刹时,服务端响应ACK报文的同时也发送了断开连接的请求,这个时候就可以进行捎带应答了。如果我们要看到全过程,只需要控制客户端和用户端断开连接的时机差别即可。

这个时候就可以看到四次挥手的过程了

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表