【计网】理解TCP全连接队列与tcpdump抓包

news2024/12/29 11:11:15

在这里插入图片描述

希望是火,失望是烟,
生活就是一边点火,一边冒烟。

理解TCP全连接队列与tcpdump抓包

  • 1 TCP 全连接队列
    • 1.1 重谈listen函数
    • 1.2 初步理解全连接队列
    • 1.3 深入理解全连接队列
  • 2 tcpdump抓包

1 TCP 全连接队列

1.1 重谈listen函数

这里我们使用之前实现的tcp_echo_server的客户端与服务端。
我们来看listen

LISTEN(2)                                    Linux Programmer's Manual                                                          
NAME
       listen - listen for connections on a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

这里的第二个参数我们之前设置的是一个const常量,但是这个到底代表什么含义呢?今天我们就来学习一下。

当我们启动客户端和服务端时,我们能够通过netstat -natp查找到建立的两个连接!
在这里插入图片描述
分别是客户端到服务端与服务端到客户端的连接!我们将服务端的的accept注释掉来看:

    void Loop()
    {
        _isrunning = true;
        while (_isrunning)
        {
            sleep(1);
            // accept接收sockfd
            // struct sockaddr_in client;
            // socklen_t len = sizeof(client);
            // int sockfd = ::accept(_listensockfd, (struct sockaddr *)&client, &len);
            // if (sockfd < 0)
            // {
            //     LOG(WARNING, "accept error\n");
            //     sleep(1);
            //     continue;
            // }
            // InetAddr addr(client);
            // // 读取数据
            // LOG(INFO, "get a new link, client info : %s, sockfd is : %d\n", addr.AddrStr().c_str(), sockfd);

            // version 4 --- 线程池版本
            // task_t t = std::bind(&TcpServer::Service , this , sockfd , addr);
            // ThreadPool<task_t>::GetInstance()->Equeue(t);
        }

这里的服务端的启动后,就只进行了初始化套接字文件,不会进行accept!
在这里插入图片描述

我们看这个结果中,服务端和客户端还是建立起了连接!也就是说三次握手建立连接的过程与服务端是否进行accept无关!
当我们启动多个客户端进程之后,会发现有一些客户端进程的连接处于SYN_SENT状态,因为在服务器来不及进行accept的时候,底层的TCP listen sock 允许用户进行三次握手建立连接,但是不能建立太多!**这个数量就是backlog + 1!**而维护的成功连接在操作系统维护的数据结构就是全连接队列!

  • listen函数中 backlog 的含义就是全连接队列中已经建立三次握手成功的个数!

这时我们就能够理解listen函数的两个参数了!

  1. int sockfd:sockfd是调用socket函数创建的套接字文件描述符。在调用listen之前,服务器应用程序必须先用socket函数创建一个套接字,一般使用bind函数将其绑定到一个本地地址和端口上。
  2. int backlog:backlog指定了在拒绝新的连接请求之前,系统应该为该套接字排队的最大连接数量。这个参数对防止过载很有用,它控制了未完成连接(SYN_RCVD状态)队列和已完成但还未被应用程序的accept调用接收的连接(ESTABLISHED状态)队列的总和的大小。

1.2 初步理解全连接队列

在操作系统中有应用层,传输层,网络层…在传输层中有一个接收队列accept_queue,建立连接时就进行三次握手。操作系统中用户访问的网站多种多样,并且会并发的运行,所以在操作系统内部一定是要通过数据结构来进行管理的!

  • 连接本质就是操作系统内核中的一批数据结构!

在传输层中将这个数据结构放入队列中进行管理!应用层会调用accept获取连接,传输层就会返回给一个文件描述符供应用层使用,通过这个文件描述符,应用层就可以进行通信!这个队列就是全连接队列

当应用层非常忙,来不及accept,那么全连接队列中会挤压连接,这个总数不能超过 backlog !这个并不代表服务端只能同时处理 backlog + 1个连接。全连接队列中的连接表示连接成功但来不及及时处理的连接!

  • 全连接队列的本质就是生产消费模型,应用层从其中获取资源,传输层向其中放入资源!这个队列保证了在应用层较忙时无法获取连接时,可以先将一些连接维护起来,等待应用层调用,这样可以大大提升效率,提高连接吞吐量!增加服务端闲置率,减少给用户提供服务的效率和体验!

1.3 深入理解全连接队列

当服务器启动时,本质上是启动一个进程,那么就会有对应的task_struct。在这个结构体中都会有struct files_struct!其中包含文件描述符表struct file*fd_array[],每个元素都指向文件结构体struct file

当创建网络套接字时,会创建一个struct socket结构体!在内核中时这样一个结构:
在这里插入图片描述
可以看到struct socket结构体内部有一个struct file结构体,但是未来我们是想通过文件描述符找到对应的套接字,然后进行读取数据。可是现在是struct socket结构体内部有一个struct file结构体,如果通过struct file结构体找到套接字呢?

struct file结构体有一个指针void* private_data,这个指针指向struct socket结构体。这样两个结构体就联系起来了!

struct socket结构体是网络Socket的入口,其内部还包含一个const struct proto_ops结构体
在这里插入图片描述
这是一个方法集,集合了bind,connect…一系列的函数指针!

虽然我们struct socket结构体是内核中的套接字结构,但建立连接时真实的数据结构是tcp_sock结构体!
在这里插入图片描述
这是TCP套接字,其中包含了慢启动算法阈值,拥塞窗口大小,关联进程…一系列TCP协议中的对应字段!这个tcp_sock就是三次握手时候建立的结构体!其中的第一个成员struct inet_connection_sock是复制连接属性的!这里就包含连接的相关信息。全连接队列就在这个结构体中!
在这里插入图片描述
这里有超时重传的触发时间,TCP 连接的状态,握手失败重试次数,全连接队列…等数据。
全连接队列中时这样的结构:
在这里插入图片描述

struct inet_connection_sock中的第一个成员是struct inet_sock结构体,这是网络层的结构体。
在这里插入图片描述
struct inet_sock结构体其中包含了目的端口号,源端口号,目的 IP 地址和源 IP 地址等数据!更重要的是其中第一个成员是struct sock结构体,里面包含着报文的一些属性。这是整个tcp_sock中最底层的结构体,其中有两个字段:接收队列和发送队列

struct sk_buff_head sk_receive_queue;
struct sk_buff_head sk_write_queue;

这两个队列对于网络通信至关重要,因为它们直接参与了数据的接收和发送过程。今天不详细讲解。

我们再回过来看struct socket,其中有一个结构体指针struct sock* sk,这个指针可以指向tcp_sock中最底层的struct sock结构体,然后可以通过类型转换,最终读取到整个tcp_sock结构体!也就是说,这个指针指向了tcp_sock结构体!这是C风格的多态!

同样的创建UDP套接字时,udp_sock的第一个成员是struct inet_sock结构体(因为udp不需要连接所以没有包含连接属性结构体)。那么最终也是一个struct sock结构体,所以也可以通过C风格的多态实现!

通过基类struct socket,我们可以进行tcp和udp的通信,所以说他是网络socket的入口。
在这里插入图片描述
此时,我们看上图,可以直观的理解套接字的结构。每当创建网络套接字时就会创建一个socket文件。这个文件中会指向通用socket,这个通用socket可以指向TCP结构体或UDP结构体。

三次握手建立一个连接时,主要是创建tcp_sockudp_sock, 两者的区别就是是否包含连接属性结构体!然后就将这个结构体放入到全连接队列中去!获取连接时,会通过sock_map_fd方法,将sock套接字转换为文件描述符!

2 tcpdump抓包

现在我们已经学习完毕了TCP协议的内容,熟悉了TCP报头结构中各个字段的意义,了解了三次握手和四次挥手的过程。接下来我们落实一下动手能力—进行抓包。
Linux系统中我们使用TCPDump :TCPDump 是一款强大的网络分析工具, 主要用于捕获和分析网络上传输的数据包。
tcpdump 通常已经预装在大多数 Linux 发行版中。 如果没有安装, 可以使用包管理器进行安装。 例如 Ubuntu系统可以使用以下命令安装:

sudo apt-get update
sudo apt-get install tcpdump

我们接下来在我们的云服务器进行一些抓包!
在这里插入图片描述
通过 sudo tcpdump -i any tcp命令,我们可以看到实时传输的数据包!

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

我们如果想要捕获特定源或目的源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.200 and tcp

我们如果想要捕获特定端口的TCP报文呢?

使用 port 关键字可以指定端口号。 例如, 要捕获端口号为 80 的 TCP 报文(通常是HTTP 请求), 可以使用以下命令:

$ sudo tcpdump port 80 and tcp

保存捕获的数据包到文件与读取

使用 -w 选项可以将捕获的数据包保存到文件中, 以便后续分析。 例如:

$ sudo tcpdump -i eth0 port 80 -w data.pcap

这将把捕获到的 HTTP 流量保存到名为 data.pcap 的文件中。
• 了解: pcap 后缀的文件通常与 PCAP(Packet Capture) 文件格式相关, 这是一种用于捕获网络数据包的文件格式,不能通过直接的cat读取!

使用 -r 选项可以从文件中读取数据包进行分析。 例如:

sudo tcpdump -r data.pcap

注意事项

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

通过抓包我们可以验证三次握手和四次挥手的过程:
在这里插入图片描述
可以看到是第一次是SYN请求,第二次是SYN+ACK,第三次是ACK!通信过程中也把窗口大小确定了!
在这里插入图片描述
可以看到四次会受到过程!这里因为服务端和客户端同时断开连接,所以中间两次的挥手合并为一次通信,通过ACK序号和确认序号可以确定!!!我们可以通过sleep将服务端和客户端断开的时间错开
在这里插入图片描述
这样就是完整的四次挥手!

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

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

相关文章

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;可用于开发各种编程语言&#xff0c;包括Java、C、Python等。它最初由IBM公司开发&#xff0c;后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…

IDEA如何查看所有的断点(Breakpoints)并关闭

前言 我们在使用IDEA开发Java应用时&#xff0c;基本上都需要进行打断点的操作&#xff0c;这方便我们排查BUG&#xff0c;也方便我们查看设计的是否正确。 不过有时候&#xff0c;我们不希望进入断点&#xff0c;这时候除了点击断点关闭外&#xff0c;有没有更快速的方便关闭…

深度解析机器学习的四大核心功能:分类、回归、聚类与降维

深度解析机器学习的四大核心功能&#xff1a;分类、回归、聚类与降维 前言分类&#xff08;Classification&#xff09;&#xff1a;预测离散标签的艺术关键算法与代码示例逻辑回归支持向量机&#xff08;SVM&#xff09; 回归&#xff08;Regression&#xff09;&#xff1a;预…

HarmonyOS Next应用开发——图像PixelMap变换

【高心星出品】 图像变换 图片处理指对PixelMap进行相关的操作&#xff0c;如获取图片信息、裁剪、缩放、偏移、旋转、翻转、设置透明度、读写像素数据等。图片处理主要包括图像变换、位图操作&#xff0c;本文介绍图像变换。 图形裁剪 // 裁剪图片 x&#xff0c;y为裁剪的起…

impdp+remap_schema导入后登录报ORA-01017: Invalid Username/password

环境说明&#xff1a;有个11.2.0.4的rac数据库&#xff0c;现需要把USR_OA克隆一份出来做测试&#xff0c;新用户名是TEST_OA&#xff0c;直接是expdp导出用户&#xff0c;再用impdpremap_schema生成TEST_OA&#xff0c; 业务人员使用PLSQL(版本12.0.1.1814) 登录TEST_OA时总…

Python程序设计 内置函数 日志模块

logging(日志) 日志记录是程序员工具箱中非常有用的工具。它可以帮助您更好地理解程序的流程&#xff0c;并发现您在开发过程中可能没有想到的场景。 日志为开发人员提供了额外的一组眼睛&#xff0c;这些眼睛不断关注应用程序正在经历的流程。它们可以存储信息&#xff0c;例…

ShardingProxy服务端分库分表

目录 一、为什么要有服务端分库分表&#xff1f; 二、ShardingProxy基础使用 1、部署ShardingProxy 2、配置常用分库分表策略 三、ShardingSphere中的分布式事务机制 1、什么是XA事务&#xff1f; 2、实战理解XA事务 3、如何在ShardingProxy中使用另外两种事务管理器&a…

【不要离开你的舒适圈】:猛兽才希望你落单,亲人总让你回家,4个维度全面构建舒适圈矩阵

单打独斗的英雄时代已经落幕 抱团取暖才是社会寒冬的良策 自然界中&#xff0c;每个物种都占据着自己的领地和生存空间。 生态位的差异决定了它们的生存方式&#xff0c;一旦离开领地&#xff0c;失去群体的庇护&#xff0c;就会沦为野兽的美餐。 人类社会同样存在隐形圈层…

数仓建模:金字塔原理在数仓建模分析中的应用

目录 1 金字塔原理 1.1 金子塔原理基本原理 1.2 金字塔内部结构 2 如何构建金字塔 2.1 金字塔塔尖构建 2.2 金字塔纵向层次构建 2.3 金字塔横向关系构建 2.3.1 归类分组 2.3.2 逻辑递进 2.4 小结 3 金字塔原理应用 3.1 数仓建模 3.1.1 数仓建模分析方法-自上而下…

OBOO鸥柏:液晶拼接大屏搭载节点盒分布式集中管控控制系统新技术

近年来&#xff0c;随着视频监控、会议系统及展示需求的快速增长&#xff0c;KVM分布式输入输出节点控制系统在各大行业中逐渐成为核心技术。OBOO鸥柏的液晶拼接大屏分布式输入输出节点控制系统&#xff08;WControl&#xff09;&#xff0c;以其创新的技术和卓越的用户体验&am…

在线刷题系统测试报告

一、项目背景 1. 本项目是一个在线刷题系统&#xff0c;灵感来源于力扣和牛客等刷题平台&#xff0c;旨在锻炼自己的代码能力和剖析系统整体结构与各模块之间关系的能力。系统支持用户注册与登录&#xff0c;查看题目列表与题目详情&#xff0c;在线提交代码并提供反馈。 2. 该…

【命令操作】信创终端系统上timedatectl命令详解 _ 统信 _ 麒麟 _ 方德

原文链接&#xff1a;【命令操作】信创终端系统上timedatectl命令详解 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何在信创终端系统上使用timedatectl命令的详细介绍。timedatectl 是Linux系统中非常实用的时间管理工具&#xff0c;…

JMeter模拟并发请求

PostMan不是严格意义上的并发请求工具&#xff0c;实际是串行的&#xff0c;如果需要测试后台接口并发时程序的准确性&#xff0c;建议采用JMeter工具。 案例&#xff1a;JMeter设置20个并发卖票请求&#xff0c;查看后台是否存在超卖的情况 方式一&#xff1a;一共10张票&…

大数据-177 Elasticsearch Query DSL - 聚合分析 指标聚合 桶聚合

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Excel重新踩坑3:条件格式;基本公式运算符;公式中的单元格引用方式;公式菜单栏其他有用的功能说明;

0、前言&#xff1a;以下内容是学习excel公式的基础内容。 1、需求&#xff1a;将表格特定区域中数值大小大于等于30&#xff0c;小于等于80的单元格&#xff0c;颜色填充为红色&#xff0c;大于80的&#xff0c;颜色填充为黄色。 新建规则之后也可以通过该功能清除规则。 2、基…

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不多说…

【重学 MySQL】六十六、外键约束的使用

【重学 MySQL】六十六、外键约束的使用 外键约束的概念关键字主表和从表/父表和子表外键约束的创建条件外键约束的特点外键约束的创建方式外键约束的删除外键约束的约束等级外键约束的级联操作外键约束的示例外键约束的作用开发场景阿里开发规范 在MySQL中&#xff0c;外键约束…

免费开源的微信开发框架

近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;聊天机器人在各个领域得到了广泛的应用。在社交媒体中&#xff0c;自动回复成为了一个流行的功能&#xff0c;让用户可以方便地与机器人进行互动。gewe框架&#xff0c;一个开源的微信聊天机器人框架&#xff0c;实现…

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

银行数字化转型导师坚鹏:2025年银行开门红8大思考

2025年银行开门红8大思考&#xff1a;与2024年相比有哪些新的变化与不同&#xff1f; 1. ‌员工&#xff1a;从认清现实到重塑信心‌ 经济下行周期开启&#xff0c;叠加外部不稳定、不确定因素增加&#xff0c;让很多员工不适应、不习惯&#xff0c;甚至产生躺平心态。2025年…