TCP全连接队列与 tcpdump 抓包

🍑个人主页:Jupiter.
🚀 所属专栏:计算机网络高效通关之路
欢迎大家点赞收藏评论😊

在这里插入图片描述

在这里插入图片描述

目录

      • `listen第二个参数详解`
    • `全连接队列与半连接队列`
            • `半开放连接队列(SYN队列)`
            • `全连接队列(接受队列)`
            • `队列溢出的影响`
      • `在内核中理解套接字,连接`
        • `完整链路图`
    • `总述`
      • `使用 TCP dump 进行抓包,分析 TCP 过程`
            • `注意事项`


listen第二个参数详解

  • 注意:当客户端通过connect函数发起连接请求的时候,服务端只要在监听状态(即已经通过listen函数进入监听状态),就能接收并处理客户端的请求开始三次握手过程。但需要注意的是,虽然三次握手的过程本身与accept调用在逻辑上并不直接相关,即accept不是三次握手的一部分,但它是确认连接已完全建立并将新的连接从全连接队列中取出,返回一个文件描述符给应用层的关键步骤。
  • 没有accept调用,即使连接在三次握手后已经建立,这个连接也会在全连接队列中等待,直到被accept处理或队列满后超时被丢弃。

参数含义:

  • backlog:这个参数定义了系统内核中未完成连接(即等待服务器accept()处理的连接)队列的最大长度。当客户端发起连接请求时,如果服务器当前无法接受该连接(如正在处理其他连接),则该连接请求会被放入这个队列中等待。

常见误解:

  • 有时backlog被误解为SYN队列(半连接队列)和ACCEPT队列(全连接队列)的总大小,但实际上其含义可能因系统实现而异。在Linux系统中backlog主要影响的是全连接队列的大小,而半连接队列的大小通常由/proc/sys/net/ipv4/tcp_max_syn_backlog控制。

系统限制:

  • backlog的上限值受到系统全局设定的限制。在Linux系统中,这个上限存储在/proc/sys/net/core/somaxconn文件中。如果设置的backlog值大于系统限制,系统会自动将其调整为上限值。

全连接队列与半连接队列

在TCP/IP网络中,当一个客户端尝试与服务器建立TCP连接时,会经历三次握手(SYN-SYN/ACK-ACK)。在这个过程中,服务器需要维护两种队列来管理即将到来的连接请求:半开放连接队列(也称为SYN队列)和全连接队列(也称为接受队列)

半开放连接队列(SYN队列)

当服务器接收到一个来自客户端的SYN包时,它知道客户端想要建立一个连接,但此时服务器还未发送SYN/ACK包进行响应。服务器会将这个请求暂时存放在一个叫做半开放连接队列(SYN队列)的地方。这个队列的大小受限于系统参数,如tcp_max_syn_backlog(在Linux中)。如果SYN队列满了,服务器将无法处理更多的连接请求,这可能导致客户端超时并重新发送SYN包,或者在达到重试次数后放弃连接。

全连接队列(接受队列)

当服务器发送SYN/ACK包给客户端,并接收到客户端的ACK响应后,三次握手完成,连接建立。但此时,连接并没有被应用层接受(例如,还没有被accept()系统调用处理)。这些已建立的连接会被暂时存放在一个叫做全连接队列(接受队列)的地方。

这个队列的大小也受到系统参数的限制,如backlog参数(在调用listen()函数时指定)系统的somaxconn值(在Linux中,它限制了单个监听socket可以排队的最大连接数)。如果没有超过somaxconn的话,全连接队列的大小是backlog+1

队列溢出的影响
  • SYN队列溢出:当SYN队列满时,服务器将不再响应新的SYN包,客户端可能会超时并重试连接,这可能导致网络拥堵或连接延迟。
  • 全连接队列溢出:当全连接队列满时,服务器会丢弃新的连接请求(即使它们已经完成了三次握手),并向客户端发送RST包以终止连接。这通常表现为客户端看到“连接被拒绝”的错误。

在内核中理解套接字,连接

在这里插入图片描述
当客户端去连接服务器时,经历三次握手建立连接成功后,如果服务端特别忙,没有及时通过accept调用处理这个连接,那么这个连接(本质是一个内核数据结构,包含连接的相关属性,通常称为struct sock,在TCP中可能是struct tcp_sock的一个实例,具体取决于系统实现,后面会详细讲解)会被放在全连接队列中。将来在处理这个连接时,应用层只需调用accept将该连接从队列中取出,并返回一个文件描述符,将来可以根据该文件描述符来操作这个连接。最多能够连接的最大数量就是 backlog+1。
全连接队列的作用:可以避免server闲忙不均,提高效率。

服务器在操作系统中通常作为一个进程运行,它拥有自己的task_struct结构体,该结构体内部维护了一个文件描述符表struct files_struct,里面包含了一个struct file*类型的数组fd_array[ ],用于存储打开文件的引用(在UNIX/Linux系统中,套接字也被视为一种特殊的文件)。

当我们通过系统调用(如socket)创建一个套接字时(以监听套接字为例),系统会为用户程序返回一个文件描述符。与此同时,操作系统内部会创建一个struct file结构体来代表这个套接字文件。这个struct file结构体是内核中用于表示打开文件的通用结构体,套接字是其中的一种特殊情况。

在创建套接字的过程中,操作系统还会创建一个struct socket结构体来专门管理套接字相关的信息(如连接状态、IP地址、端口号等)。struct socket结构体中包含一个指向struct file的指针file,该指针指向了前面提到的与套接字相关联的struct file对象。同时,struct file结构体中有一个void* private_data字段,该字段在套接字的情况下被用来指向对应的struct socket结构体。这样的设计允许内核通过文件描述符(一个整数索引,指向fd_array[]中的某个struct file*)间接地访问到套接字的详细信息(即struct socket结构体),从而实现了文件描述符与套接字之间的关联。

struct socket结构体是网络socket的核心,它封装了网络套接字所需的各种信息和方法。我们通常需要通过socket套接字来访问网络相关信息,而struct socket结构体内部包含了一系列的方法(通常称为函数指针或操作集),这些方法用于执行套接字的各种操作,如发送数据、接收数据、绑定地址等

未来,当上层应用需要与网络进行交互时,它可以通过文件描述符来找到对应的struct socket结构体。文件描述符是一个非负整数,它作为索引指向内核中每个进程的文件描述符表中的一个条目,该条目又指向了struct file结构体,而struct file结构体中的private_data字段则指向了struct socket结构体。这样,上层应用就可以通过文件描述符间接地访问到struct socket结构体,进而调用其内部的方法族来执行网络操作。
在这里插入图片描述
一个TCP连接的本质是一个内核数据结构,当TCP三次握手完成以后,操作系统会在内核中为这个新建立的连接创建一个相应的struct tcp_sock(或相关)数据结构来管理它。这个数据结构包含了连接的状态信息、缓冲区、序列号等关键数据。在全连接队列中排队的也是它。
在这里插入图片描述
结构体的第一个成员 ,又是一个结构体,类型是 inet_connection_sock
在inet_connection_sock结构体中包含了很多跟tcp连接相关的信息,如下:
在这里插入图片描述
并且在这里面 struct request_sock_queue就是管理TCP全连接队列的

并且, 在inet_connection_sock结构体中的第一个成员,也是一个结构体,叫struct inet_sock icsk_inet里面有源ip,目的ip,源port,目的port的字段
在这里插入图片描述

在inet_sock中,第一个字段还是一个结构体,struct sock sk;里面包含的更多的是报文的信息
在这里插入图片描述
其中,struct sock在tcp_sock结构中,属于最内侧的。并且我们可以发现在前面说的struct socket对象中,还包含一个字段,struct sock *sk;指向的就是tcp_sock中的sock这个结构体。所以,当我们拿着struct socket结构体想要访问tcp_sock结构的内容,只需要进行强转即可,就可以访问tcp_sock里面的所有内容了这就是C风格的多态

其中,上面所说的是tcp套接字,那么udp呢?
udp与tcp类似,只是没有嵌套struct inet_connection_sock结构体而已,因为udp不需要连接,不需要连接队列

完整链路图

在这里插入图片描述

总述

  • 半连接状态:当客户端发送一个SYN(同步序列编号)请求到服务器时,服务器会接收到这个请求并将其放入一个称为“半连接队列”的数据结构中。此时,服务器尚未发送SYN-ACK(同步序列编号确认)响应给客户端,因此连接尚未完全建立。在这个阶段,服务器正在等待确认客户端的SYN请求是有效的,并且准备发送自己的SYN-ACK响应。

  • TCP三次握手完成后,操作系统实际上会创建tcp_sock结构体(以TCP为例),并将其放入半连接队列(而非全连接队列,通常半连接队列用于存放尚未完全完成三次握手的连接请求)。如果连接成功完成三次握手,它将被移动到全连接队列中等待被accept调用处理。

  • 需要注意的是,虽然从逻辑上看,三次握手成功完成后连接应该直接放入全连接队列,但实际上操作系统在处理这些连接时需要进行一系列的内部检查和资源分配。因此,将连接先放入半连接队列再转移到全连接队列是一种有效的管理策略,它可以帮助操作系统更好地处理并发连接请求并避免资源竞争。

当accept函数被调用时,操作系统会执行以下操作

  • 从全连接队列中取出一个连接(即tcp_sock结构体)。
  • 创建一个新的struct socket结构体和struct file结构体,并初始化它们。这两个结构体会互相指向,形成关联。
  • 在文件描述符表中申请一个新的文件描述符,并将这个新的文件描述符与刚创建的struct file结构体关联起来。
  • 将这个新的文件描述符返回给上层应用程序,以便应用程序可以使用这个描述符来读写数据。
  • 更新struct socket结构体中的字段,使其指向从全连接队列中取出的tcp_sock结构体,从而建立起socket与TCP连接之间的关联。

这样,通过accept函数,应用程序就获得了一个可以用来与远程主机进行通信的文件描述符。”


使用 TCP dump 进行抓包,分析 TCP 过程

TCPDump 是一款强大的网络分析工具,主要用于捕获和分析网络上传输的数据包。

安装 tcpdump

  • tcpdump 通常已经预装在大多数 Linux 发行版中。如果没有安装,可以使用包管理器
    进行安装。例如 Ubuntu,可以使用以下命令安装:
sudo apt-get update
sudo apt-get install tcpdump
  • 在 Red Hat 或 CentOS 系统中,可以使用以下命令:
sudo yum install tcpdump

常见使用

  1. 捕获所有网络接口上的 TCP 报文
    使用以下命令可以捕获所有网络接口上传输的 TCP 报文:
sudo tcpdump -i any tcp

注意:-i any指定捕获所有网络接口上的数据包,tcp指定捕获 TCP协议的数据包。i可以理解成为 interface的意思

  1. 捕获指定网络接口上的 TCP报文,如果你只想捕获某个特定网络接口(如 eth0)上的 TCP报文,可以使用以下命令:
sudo tcpdump -i eth0 tcp
ifconfig

在这里插入图片描述
3. 捕获特定源或目的 IP地址的 TCP报文
使用 host关键字可以指定源或目的 IP地址。例如,要捕获源 IP地址为192.168.1.100的 TCP报文,可以使用以下命令:

sudo tcpdump src host 192.168.1.100 and tcp

要捕获目的 IP地址为 192.168.1.200的 TCP报文,可以使用以下命令:

sudo tcpdump dst host 192.168.1.200 and tcp

同时指定源和目的 IP地址,可以使用 and关键字连接两个条件:

sudo tcpdump src host 192.168.1.100 and dst host 192.168.1.200and tcp
  1. 捕获特定端口的 TCP报文使用 port关键字可以指定端口号。例如,要捕获端口号为 80的 TCP报文(通常是HTTP请求),可以使用以下命令:
sudo tcpdump port 80 and tcp
  1. 保存捕获的数据包到文件使用 -w选项可以将捕获的数据包保存到文件中,以便后续分析。例如:
sudo tcpdump -i eth0 port 80 -w data.pcap

这将把捕获到的 HTTP流量保存到名为 data.pcap的文件中。

  • pcap后缀的文件通常与 PCAP(Packet Capture)文件格式相关,这是一种用于捕获网络数据包的文件格式
  1. 从文件中读取数据包进行分析使用 -r 选项可以从文件中读取数据包进行分析。例如:
tcpdump -r data.pcap

这将读取 data.pcap文件中的数据包并进行分析。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456106.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】C语言连接MySQL数据库3——事务操作和错误处理API

目录 1.MySQL事务处理机制 1.1.autocommit 1.2.autocommit的设置与查看 1.3.使用示例 2.事务操作API 2.1.设置事务提交模式——mysql_autocommit() 2.2.提交事务——mysql_commit() 2.3.事务回滚——mysql_rollback() 3.错误处理的API 3.1.返回错误的描述——mysql_er…

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录,还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录,还可以更新…

关于移动硬盘复制文件0x80071AC3错误解决方法

一、问题详情 新入手的西部数据移动硬盘在复制文件到手机是没有问题的,但是在电脑复制文件的时候,电脑弹出0x80071AC3错误,没办法复制文件,也没办法新建文件夹。 二、原因 因为卷有问题,请运行chkdsk并重试。 三、解…

使用Vue.js构建响应式Web应用

💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用Vue.js构建响应式Web应用 1 引言 2 Vue.js简介 3 安装Vue CLI 4 创建Vue项目 5 设计应用结构 6 创建组件 7 使用…

SLAM|1. 相机投影及相机畸变

一个能思考的人,才真是一个力量无边的人。——巴尔扎克 本章主要内容: 1.针孔相机模型 2.相机成像的几个坐标系图像 3.畸变及相机标定 本节主要介绍在照相机拍摄过程中,现实物体如何跟照片上的像素关联起来,具体涉及相机成像的物…

LabVIEW换流变换器智能巡检系统

基于LabVIEW的换流变换器智能巡检系统通过自动化检测和数据分析,提高换流变换器的运行效率和可靠性,降低人工维护成本。 项目背景: 换流变压器作为电力系统的重要组成部分,其性能的可靠性直接影响到整个电网的稳定运行。然而&…

Spring Boot:植物健康的智能守护者

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

Python基于amazon/chronos-t5-base的预训练模型离线对时间系列数据的未来进行预测

Python基于预训练模型对时间系列数据的未来进行预测 导入库 %matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd import torch from chronos import ChronosPipeline from tqdm.auto import tqdm from autogluon.timeseries import…

【Java】使用iText依赖生成PDF文件

文章目录 使用iText实现PDF文件生成1. 需求2 . 添加依赖3. 核心4. 实战案例:生成录用通知书4.1 整体架构4.2 初始化PDF文档4.3 配置中文字体4.4 添加背景图片4.5 添加文本内容4.6 处理文档生成 5. 关键技巧与注意事项5.1 字体处理5.2 图片处理5.3 布局控制5.4 异常处…

探索人工智能在自然语言处理中的应用

探索人工智能在自然语言处理中的应用 前言1. 机器翻译2. 情感分析3. 智能客服4. 文本生成未来展望 结语 前言 在信息爆炸的时代,自然语言处理(NLP)作为人工智能(AI)的一个重要分支,正以前所未有的速度改变着…

LabVIEW提高开发效率技巧----节省内存

在LabVIEW开发过程中,内存管理是保障程序稳定性和性能的关键。本文将详细介绍如何通过队列处理来节省内存,尤其是如何通过解耦释放不再需要的数据,防止内存泄漏。通过多个实际例子,从不同角度探讨队列处理在大数据量或长时间运行的…

苹果瑕疵数据集苹果质量数据集YOLO格式VOC格式 深度学习 目标检测 数据集

一、数据集概述 数据集名称:2类苹果图像数据集 数据集包含两类样本:正常苹果和有瑕疵的苹果。正常苹果样本代表完好的苹果,而有瑕疵的苹果样本代表苹果表面可能存在的损伤、瑕疵或病害。每个样本都经过详细标记和描述,以便训练模…

大语言模型数据类型与环境配置

文章目录 前言一、环境安装二、大语言模型数据类型1、基本文本指令数据类型2、数学指令数据类型3、几何图形指令数据类型4、多模态指令数据类型5、翻译指令数据类型 三、vscode配置 前言 简单给出环境安装与数据类型及vscode运行配置,其中vscode运行配置是便于我们…

专业135+总分400+西安交通大学815869(原909)信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

经过将近一年的考研复习,终于梦圆西安交大,今年专业课815(和专硕869(原909)差不多)信号与系统135,总分400,回想这一年的复习还有很多经验和大家分享,希望可以对大家复习有所帮助,少走…

3.cpp基本数据类型

cpp基本数据类型 1.cpp基本数据类型 1.cpp基本数据类型 C基本数据类型和C语言的基本数据类型差不多 注意bool类型&#xff1a;存储真值 true 或假值 false&#xff0c;C语言编译器C99以上支持。 C语言的bool类型&#xff1a;要添加 #include <stdbool.h>头文件 #includ…

数据库相关知识点

1. 数据库分片与分区 分片&#xff08;Sharding&#xff09;&#xff1a;这是一种将数据水平分割的技术&#xff0c;每个分片包含数据的一个子集。分片通常用于提高数据库的扩展性和性能&#xff0c;特别是在处理大量数据时。通过将数据分布在多个分片上&#xff0c;可以并行处…

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…

Maven基础知识

一、Maven的概述 maven 是什么&#xff1f; 是一个项目管理工具&#xff0c;它包含了一个项目对象模型&#xff0c;一组标准集合&#xff0c;一个项目的生命周期&#xff0c;一个依赖管理系统&#xff0c;和用来运行定义在生命周期阶段和插件目标的逻辑。 二、Maven的依赖管理…

【331】基于Springboot的“有光”摄影分享网站系统

“有光”摄影分享网站设计与实现 摘 要 自互联网的发展至今&#xff0c;其基础理论与技术都已完善&#xff0c;并积极参与了整个社会各个领域。它容许信息根据媒体传播&#xff0c;并和信息可视化工具一起为大家提供优质的服务。对于信息多头管理、差错率高、信息安全系数差、…

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…