【Linux】从内核角度理解 TCP 的 全连接队列(以及什么是 TCP 抓包)

news2024/12/23 19:07:46

文章目录

  • 概念引入
  • 理解全连接队列
  • 内核方面理解
  • Tcp抓包
    • 方法
    • 注意事项


概念引入

我们知道,TCP的三次握手是由TCP协议 自动处理的,建立连接的过程与用户是否进行accept无关accept()的作用主要是为当前连接创建一个套接字,用于进行后续的通信;

当服务器来不及进行accept时,底层的TCP listen sock依然允许建立三次握手,建立连接成功,但这个建立连接的数量是有限的:backlog + 1,这个长度就是全连接队列的长度


理解全连接队列

在这里插入图片描述
我们根据上图得出几个结论:

  1. 如图中所述:连接本质是内核中的一种结构体对象,当客户端向服务器发送连接请求时,会先进行三次握手,随后加入到全连接队列中去,如果此时服务器闲置,则会将全连接队列中的连接拿去一部分进行处理
  2. 全连接队列的最大值是Backlog+1,不代表服务器只能同时处理Backlog+1个请求每次服务器会一次处理n个请求(全连接队列拿取)
  3. 全连接队列既不能为空,也不能太长
    • 为空:增加服务的闲置率,减少给用户提供的效率
    • 太长:增加用户等待时间(如果全连接队列本就有连接,证明服务器已经来不及处理连接);且增加空间浪费(需要给每个客户端连接创建额外的空间)

内核方面理解

在这里插入图片描述

上面的图片基本揭示了当创建一个文件描述符后,是如何建立连接读取数据的

当创建文件描述符后,会经历以下过程:

  1. 创建 struct file

    • 当一个进程请求创建一个 socket 时,内核首先分配一个 struct file 结构体,这个结构体代表打开的文件或 socket,包含文件的类型、状态和指向实际数据的指针。
  2. 创建 struct socket

    • 接下来,内核会为该 socket 创建一个 struct socket 结构体。这个结构体包含了 socket 的相关信息,如协议类型(TCP、UDP等)和相关的操作函数指针。
  3. 创建 struct tcp_socket

    • 如果是 TCP socket,内核会在 struct socket 中创建一个 struct tcp_socket 结构体。这一结构体专门处理 TCP 协议的特定信息和操作。
  4. 创建 struct inet_connection_sock

    • struct tcp_socket 还包含一个 struct inet_connection_sock,它负责处理 TCP 连接的状态,包括全连接队列(accept queue)和半连接队列(syn queue)。
  5. 包含 struct sock

    • inet_connection_sock 中有一个 struct sock,这是网络协议栈的核心结构之一。struct sock 包含了许多关键信息,包括:
      • 读写缓冲区:用于存储接收到的数据和待发送的数据。
      • 状态信息:例如连接的状态(监听、已连接、关闭等)。

全连接队列与缓冲区

  • 全连接队列

    • 一旦 TCP 三次握手完成,连接会被加入到全连接队列中,这样服务器就可以处理这些连接。
  • 读写缓冲区

    • 当数据通过网络接收时,它会被存储在 struct sock 中的读缓冲区中,进程可以通过系统调用(如 recv)读取这些数据。
    • 类似地,待发送的数据会放入写缓冲区,直到发送完成。

Tcp抓包

方法

Linux下的TCP抓包可以使用TCPDumpTCPDump 是一款强大的网络分析工具, 主要用于捕获和分析网络上传输的数据包

  1. 捕获所有网络接口上的 TCP 报文

使用以下命令可以捕获所有网络接口上传输的 TCP 报文:

sudo tcpdump -i any tcp
  1. 捕获指定网络接口上的 TCP 报文

只想捕获某个特定网络接口上的 TCP 报文, 可以使用以下命令:

sudo tcpdump -i <interface> tcp

interface部分的网络接口可以通过ifconfig命令查看

  1. 捕获特定源或目的 IP 地址的 TCP 报文

使用 host 关键字可以指定源或目的 IP 地址。 例如:

  • 要捕获源 IP 地址为 192.168.0.8 的 TCP 报文, 可以使用以下命令:
sudo tcpdump src host 192.168.0.8 and tcp
  • 要捕获目的 IP 地址为 192.168.0.9 的 TCP 报文, 可以使用以下命令:
sudo tcpdump dst host 192.168.0.9 and tcp
  • 同时指定源和目的 IP 地址, 可以使用 and 关键字连接两个条件:
sudo tcpdump src host 192.168.0.8 and dst host 192.168.0.9 and 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 时, 需要确保有足够的权限来捕获网络接口上的数据包。
  • 使用 tcpdump 的时候, 有些主机名会被云服务器解释成为随机的主机名, 可以使用 -n 选项避免

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring】Spring Boot 日志(8)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 目录 本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 …

ElementUI学习笔记

一、ElementUI概述 官网&#xff1a;https://element.eleme.cn/#/zh-CN &#xff08;一&#xff09;定义 Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。是基于Vue的一个UI框架&#xff0c;该框架基于Vue开发了很多相关组件&#xf…

Ubuntu如何创建一个子用户并赋与管理员权限

在Ubuntu操作系统中,如何创建一个子用户并赋与管理员权限 一、创建用户 sudo useradd -m -s /bin/bash test详细解释: sudo:以超级用户(root)权限执行该命令。useradd 命令通常需要管理员权限,因此需要加上 sudo。 useradd:创建新用户的命令。 -m:指示系统为新用户创建…

Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着工程教…

18 实战:基于Tkinter和OpenCV的视频编码器:实现MPEG4矩形帧编码器

引言 在视频处理领域,视频编码器的设计与实现一直是研究的热点。本文将深入解析一段基于Python的代码,该代码利用Tkinter、OpenCV和NumPy库构建了一个MPEG4矩形帧编码器的图形用户界面(GUI)。通过详尽的代码讲解,帮助读者全面理解视频编码的基本原理及其在实际应用中的实…

SmartX 在新能源:支撑多家头部企业 MES 等核心系统稳定运行与 VMware 替换

在过去几年中&#xff0c;中国新能源企业经历了迅猛的增长。随着电池技术、光伏发电和风电等领域的不断进步&#xff0c;新能源企业不仅面临生产能力的提升需求&#xff0c;还需要优化运营效率和管理复杂度&#xff0c;其基础设施建设则需要不断升级以适应这种快速扩展的需求&a…

ELK配置转存redis缓存,采集nginx访问日志

在136服务器上部署mysql 启动mysql服务 可通过以下命令查找安装的软件包 怎么查找安装软件的日志文件位置rpm -qc mysql-server&#xff0c;即可显示mysql.log位置 也可通过查找配置文件中的log关键字来查找log文件日志位置 用awk命令&#xff0c;以切割&#xff0c;输出第二个…

诱骗取电快充协议芯片,支持与其它 MCU 共用 D+D-网络和电脑传输数据

前言 在科技日新月异的今天&#xff0c;快充技术已成为智能手机、平板电脑乃至笔记本电脑等电子设备不可或缺的一部分。各大厂商为了提升用户体验&#xff0c;纷纷推出了自家的快充协议&#xff0c;这些协议不仅让充电速度大幅提升&#xff0c;还带来了更加智能、安全的充电体验…

ubuntu20.04 加固方案-设置用户缺省UMASK

一、编辑/etc/profile配置文件 打开终端。 查看当前umask 使用文本编辑器&#xff08;如vim&#xff09;编辑/etc/profile文件。 sudo vim /etc/profile 二、添加配置参数 在打开的配置文件的末尾中&#xff0c;添加或修改以下参数&#xff1a; umask 027 三、保存并退出…

高阶数据结构--图(graph)

图&#xff08;graph&#xff09; 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…

全渠道供应链打造中企业定制开发2+1链动模式S2B2C商城小程序的策略与影响

摘要&#xff1a;本文探讨了全渠道供应链打造对于零售企业的重要性及面临的挑战&#xff0c;着重分析了物流环节整合的难点&#xff0c;并以家电行业为例说明了节假日期间物流对企业经营的影响。同时&#xff0c;引入“企业定制开发21链动模式S2B2C商城小程序”这一关键因素&am…

Oracle视频基础1.3.3练习

1.3.3 检查数据库启动情况 ps -ef | grep oracle启动数据库 sqlplus /nolog conn / as sysdba修改 fast_start_mttr_target 参数为初始值-50&#xff0c;缺省 scope 和 sid&#xff0c;查看修改结果 show parameter fast; alter system set parameter 250; show parameter fa…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要&#xff1a;本文涵盖了GIS软件操作的多方面内容&#xff0c;包括地图文档的新建、打开、保存及版本兼容性处理&#xff1b;错误与警告的查阅及帮助文档的使用技巧&#xff1b;地图打印比例尺的调整与地图信息的完善&#xff1b;图层操作的撤销与恢复&#xff0c;界面元素的…

电商预售是时候“消亡”了

淘天反复横跳在预售里。 作者|周立青 编辑|杨舟 “明知道搞复杂的预售规则会给用户体验带来伤害&#xff0c;弊大于利&#xff0c;甚至内网就有很多人在骂在批评&#xff0c;还要在今年双11这么玩&#xff0c;算是见识到了公司的组织惯性和路径依赖是多么可怕”&#xff0c;淘…

关于游戏加加不可以在cs2中显示的解决方案

输入的代码如下 -allow_third_party_software 1.打开steam 右键cs2&#xff0c;打开属性。 然后再这里填上这个代码就可以了

Codeforces Global Round 27 D.Yet Another Real Number Problem

题目 题解&#xff1a; #include <bits/stdc.h> using namespace std; // #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 #define ll long long #define pii pair<int, i…

Spring Boot中解决BeanDefinitionStoreException问题的实战分享

目录 前言1. 问题背景2. 问题分析2.1 异常分析2.2 常见的错误原因2.3 排查过程 3. 解决方案3.1 清理缓存和重建项目3.1.1 清理IDEA缓存3.1.2 使用Maven清理并重建项目 3.2 升级Maven版本3.2.1 下载最新Maven版本3.2.2 IDEA配置新的Maven版本3.2.3 清理缓存并重新构建 3.3 验证问…

新160个crackme - 088-[KFC]fish‘s CrackMe

运行分析 需破解用户名和RegKey PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida函数窗口逐个查看&#xff0c;找到关键函数sub_401440 ida无法动调&#xff0c;需使用OD&#xff0c;启用StrongOD插件才可以动调ida静态分析&#xff0c;逻辑如下&…

淘宝/天猫获得淘宝商品评论 API 返回值说明

淘宝/天猫获得淘宝商品评论 API 返回值说明 item_review-获得淘宝商品评论API注册测试 taobao.item_review 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包…

Rust精简核心笔记:第三波,基础语法完结篇

今天是Rust精简核心笔记第三波&#xff0c;也是完结篇。之前已经介绍了二波&#xff0c;Rust精简核心笔记&#xff1a;第一波&#xff0c;深入浅出语法精华-CSDN博客&#xff0c;Rust精简核心笔记&#xff1a;第二波&#xff0c;语法精髓部分解锁-CSDN博客&#xff0c;通过三波…