Linux C/C++ 分析网络流量(十六进制TCP数据包分析)

在分析TCP数据包时,理解TCP协议的工作原理和报文格式是关键。TCP是一种面向连接的、提供可靠的、端到端的字节流传输服务。其头部结构包括源端口、目标端口、序列号、确认应答号等字段。序列号是在建立连接时由计算机生成的随机数作为初始值,每发送一次数据,就累加一次该数据字节数的大小,而确认应答号是指下一次期望收到的数据的序列号。

抓包和分析数据包是理解TCP/IP协议的重要手段。Wireshark是最知名的网络通讯抓包分析工具,可以截取各种网络封包并显示详细信息。通过抓包和分析数据包,我们可以深入理解TCP帧格式及“TCP三次握手”,进一步提高理论联系实践的能力。

例如,我们选择一个TCP数据包进行分析,在数据包详细信息面板中,我们可以看到TCP协议的详细信息,包括TCP标志位、序号、确认号、窗口大小等信息。此外,我们还可以查看数据包的十六进制数据。

总的来说,TCP数据包的分析原理主要涉及对TCP协议的理解、使用相关工具进行数据包抓取和分析以及理解TCP头部结构等方面。处理细节则包括如何从大量的数据包中筛选出需要的信息,如何理解和解析TCP协议的各种字段等。

理解TCP协议工作原理和报文

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在互联网协议(IP)网络上通过TCP/IP协议栈进行工作。
TCP的工作原理可以概括为以下几个方面:

1.建立连接:在源主机和目标主机之间建立连接,以便进行数据传输。
2.编号和排序数据段:在连接建立后,源主机按顺序发送数据段,每个数据段都有一个编号,以便目标主机重新排序。
3.确认和重传:目标主机对接收到的数据段进行确认,如果数据段丢失或损坏,则发送请求重传的信号。
4.流量控制:TCP使用窗口机制来控制数据的流量,以避免因接收方缓冲区满而造成的数据丢失。
5.关闭连接:当数据传输完成时,连接将被关闭。

TCP的报文格式包括以下几个部分:

1.源端口和目标端口:指示数据从哪个进程来,到哪个进程去。
2.序号:表示从TCP源端向TCP目标端发送的数据字节流中的第一个数据字节。
3.确认号:包含目标端所期望收到源端的下一个数据字节的序号。
4.TCP首部长度:表示该TCP头部有多少个32位(以4个字节为单位)。
5.标志位:包括紧急标志(URG)、确认标志(ACK)、推送标志(PSH)、可重用标志(RST)、同步标志(SYN)和终止标志(FIN)等。
6.窗口大小:表示接收方可以接收的最大数据量。
7.校验和:用于校验数据的有效性。
8.紧急指针:当URG标志位为1时,表示紧急数据的位置。
9.数据部分:包含实际传输的数据。

TCP的报文格式根据不同的用途和选项可能会有所不同,但以上是基本组成部分。理解TCP报文格式对于理解TCP协议的工作原理和实现可靠传输至关重要。

TCP怎么实现可靠传输

TCP通过以下几种机制来实现可靠传输:

  1. 序列号和确认机制:每个TCP包都有一个序列号,接收方通过发送端的确认信息来确认收到的数据,并告知发送方下一个期望接收的数据序号。

  2. 超时重传:发送方在发送数据后启动一个计时器,如果在规定时间内没有收到接收方的确认信息,就会认为数据丢失,然后重新发送数据。

  3. 滑动窗口协议:接收方使用滑动窗口来控制数据的流量和接收速度。滑动窗口可以指定接收方现在能够接受的最大数据量,发送方需要确保在窗口范围内发送数据。

  4. 流量控制:TCP使用基于接收方通告的窗口大小来控制数据发送速率,确保发送方不会以过快的速度发送数据,使接收方无法处理。

  5. 拥塞控制:TCP通过调整发送方的发送速率来避免网络拥塞。通过监测网络的拥塞程度并及时降低发送速率,使得整个网络能够维持在一个合理的状态。

以上是TCP实现可靠传输的主要机制,通过这些机制,TCP可以在不可靠的网络环境下实现可靠的数据传输。

tcpflow - 分析网络流量

tcpflow是一个功能强大的、基于命令行的免费开源工具,用于在Unix之类的系统(如Linux)上分析网络流量。它可以捕获通过TCP连接接收或传输的数据,并存储在文件中供以后分析,采用的格式便于协议分析和调试。

tcpflow的工作原理是基于LBL Packet Capture Library,支持丰富的过滤条件,能够捕获网络或存储文件中的数据包,并按照正常顺序重建数据流。每一条TCP流都会被存储到独立的文件中,方便以后分析。与tcpdump相比,tcpflow会重新构建真实的数据流,并且会分开存储。

当你想要使用tcpflow命令来捕获和输出TCP流量时,以下是一些相关的例子:

  1. 基本使用:
    tcpflow -r pcap_file.pcap
    
    这个命令将读取一个PCAP文件(例如Wireshark捕获到的网络数据包),并将TCP流量保存到相应的文件或屏幕上。

默认情况下,tcpflow将所有捕获的数据存储在表单中具有名称的文件中(如果使用某些选项(如时间戳 ),这可能会有所不同)。现在让我们做一个目录列表,看看是否在任何文件中捕获了tcp流。

还生成了一个XML报告,含有关于该程序的信息,比如它是如何编译的、它在哪台计算机上运行以及每条TCP连接的记录。

  1. 指定输出目录:

    tcpflow -o output_directory -r pcap_file.pcap
    

    这个命令将指定TCP流量的输出目录。每个流将被保存为单独的文件,文件名由IP地址和端口组成。

  2. 只显示请求或响应:

    tcpflow -r pcap_file.pcap 'src host X.X.X.X'
    tcpflow -r pcap_file.pcap 'dst host X.X.X.X'
    

    这两个命令将只捕获某个特定源IP地址或目标IP地址的请求或响应流量。

  3. 过滤特定端口:

    tcpflow -r pcap_file.pcap 'tcp port 80'
    

    这个命令将只捕获TCP端口为80的流量。

  4. 高亮显示输出:

    tcpflow -C -r pcap_file.pcap
    

    这个命令将以彩色高亮的方式显示输出结果,以便更容易阅读和理解。

  5. 指定接口名称
    要从特定网络接口捕获数据包,请使用-i标志指定接口名称。

    tcpflow -i eth0 port 80
    

有关更多信息和用法选项,请参见tcpflow手册页。

man tcpflow

Linux C/C++ 分析网络流量(十六进制TCP数据包分析)

编写主要目的是旧的tcpflow不提供十六进制控制台输出。Simson L.Garfinkel的新tcpflow需要一个libcairo-dev,这需要对我的服务器系统有很大的x11依赖性。我认为tcpflow是一个命令行工具,我真的不需要pdf报告。编译新的tcpflow很困难,而且根本不能禁用libcairo。

...
void hexdump(const char *buffer, size_t size)
{
...for (;;) {const char *line_end = line_start + LINE_CHAR_COUNT > buffer_end? buffer_end: line_start + LINE_CHAR_COUNT;if (line_start == line_end) {break;}   
...// hex part
...// blankcount += snprintf(output + count, sizeof(output), "    ");// acsii partfor (const char *p = line_start; p < line_end; ++p) {count += snprintf(output + count, sizeof(output), "%c",isprint(*p) ? *p : '.');}   printf("%s\n", output);line_start = line_end;}   
}void process_ip_packet(const struct timeval *ts,const char *buffer, size_t size)
{if (size < sizeof(struct ip)) {die("invalid ip packet length");}...process_tcp_packet(ts,ntohl(ip_header->ip_src.s_addr),ntohl(ip_header->ip_dst.s_addr),buffer + ip_header_len,ip_len - ip_header_len);
}void process_tcp_packet(const struct timeval *ts,u_int32_t src_addr, u_int32_t dst_addr,const char *buffer, size_t size)
{
...if (size < sizeof(struct tcphdr)) {die("invalid tcp packet length");}...if (tcp_header_len >= size) {return;}if (g_option_color) {if (src_addr != last_src_addr || dst_addr != last_dst_addr ||src_port != last_src_port || dst_port != last_dst_port) {last_src_addr = src_addr;last_dst_addr = dst_addr;last_src_port = src_port;last_dst_port = dst_port;current_color = !current_color;}printf("%s", colors[current_color]);}if (g_option_display_header) {
...strftime(format_time, sizeof(format_time), "%Y-%m-%d %H:%M:%S", &tm);printf("%s.%ld %d.%d.%d.%d:%d => %d.%d.%d.%d:%d\n",format_time, ts->tv_usec / 1000,(src_addr & 0xff000000) >> 24,(src_addr & 0x00ff0000) >> 16,(src_addr & 0x0000ff00) >> 8,src_addr & 0x000000ff,src_port,(dst_addr & 0xff000000) >> 24,(dst_addr & 0x00ff0000) >> 16,(dst_addr & 0x0000ff00) >> 8,dst_addr & 0x000000ff,dst_port);}// print hex datahexdump(buffer + tcp_header_len, size - tcp_header_len);if (g_option_color) {printf("%s", "\033[0m");}printf("\n");
}...
void print_usage(const char *prog_name)
{fprintf(stderr, "usage: %s [-Ce] <pcap_file> \n", prog_name);fprintf(stderr, "   -C do not display packet description\n");fprintf(stderr, "   -e output in alternating colors\n");
}void packet_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes)
{if (h->len <= g_datalink_header_length) {die("invalid datalink packet length");}process_ip_packet(&h->ts, (const char *)bytes + g_datalink_header_length,h->len - g_datalink_header_length);
}int main(int argc, char *argv[])
{
...while ((opt = getopt(argc, argv, "Ce")) != -1) {switch (opt) {case 'C':g_option_display_header = false;break;case 'e':g_option_color = true;break;default:print_usage(argv[0]);exit(1);}}if (optind >= argc) {print_usage(argv[0]);exit(1);}const char *pcap_file_name = argv[optind];pcap_t *pd = pcap_open_offline(pcap_file_name, errbuf);if (NULL == pd) {die("%s", errbuf);}int dlt = pcap_datalink(pd);if (DLT_NULL == dlt) {g_datalink_header_length = 4;} else if (DLT_RAW == dlt) {g_datalink_header_length = 0;} else if (DLT_EN10MB == dlt || DLT_IEEE802 == dlt) {g_datalink_header_length = 14;} else if (DLT_PPP == dlt) {g_datalink_header_length = 4;} else if (DLT_LINUX_SLL == dlt) {g_datalink_header_length = 16;} else {fprintf(stderr, "unknown datalink type\n");return -1;}struct bpf_program filter;if (pcap_compile(pd, &filter, "tcp", 1, 0) != 0) {die("%s", pcap_geterr(pd));}if (pcap_setfilter(pd, &filter) != 0) {die("%s", pcap_geterr(pd));}if (pcap_loop(pd, -1, packet_handler, NULL) != 0) {die("%s", pcap_geterr(pd));}...
}

If you need the complete source code, please add the WeChat number (c17865354792)

运行结果:

在这里插入图片描述Wireshark抓包展示效果:

总结

在进行十六进制TCP数据包分析时,我们首先需要捕获网络流量,获取TCP数据包。这可以通过网络抓包工具(如Wireshark)实现。然后,对捕获到的数据包进行解析,提取出TCP头部的各个字段和数据部分。

Welcome to follow WeChat official account【程序猿编码

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

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

相关文章

使用Pytorch从零开始实现BERT

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…

前端食堂技术周刊第 107 期:技术播客节、Deno Cron、FEDAY、XState v5、Electron 2023 生态系统回顾

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;烤椰拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

图论与网络优化3

CSDN 有字数限制&#xff0c;因此笔记分别发布&#xff0c;目前&#xff1a; 【笔记1】概念与计算、树及其算法【笔记2】容量网络模型、遍历性及其算法【笔记3】独立集及其算法 6 独立集及其算法 6.1 独立集和覆盖 6.1.1 独立数和覆盖数 独立集&#xff1a;设 S ⊆ V ( G …

PaddleDetection系列2--NCCL安装及测试

NCCL安装及测试 1 系统信息查看1.1 查看本机的操作系统和位数信息&#xff1a;1.2 确认处理器架构1.3 确认cuda版本 2 NCCL安装2.1 根据上面的系统架构以及CUDA版本&#xff0c;进入[官网](https://developer.nvidia.com/nccl/nccl-download)下载匹配的nccl&#xff0c;若想获取…

力扣44题通配符匹配题解

44. 通配符匹配 - 力扣&#xff08;LeetCode&#xff09; 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 …

【ITK库学习】使用itk库进行图像滤波ImageFilter:梯度Gradient

目录 1、itkGradientImageFilter2、itkGradientMagnitudeImageFilter 梯度强度3、itkGradientMagnitudeRecursiveGaussianImageFilter 带滤波的梯度强度4、itkDerivativeImageFilter 不带滤波的导函数 1、itkGradientImageFilter 该类是一个基类&#xff0c;用于使用方向导数计…

C++笔试题之回文数的判断

“回文”是指正读反读都能读通的句子&#xff0c;它是古今中外都有的一种修辞方式和文字游戏&#xff0c;如“我为人人&#xff0c;人人为我”等。在数学中也有这样一类数字有这样的特征&#xff0c;成为回文数&#xff08;palindrome number&#xff09;。 设n是一任意自然数…

MSSQL 程序集使用方法

1.C# 写一个程序 1.1新建一个项目【类库【.Net FrameWork】 1.2编写代码 删除 namespace ApiSQLClass { } 代码如下&#xff1a;【具体调用API模式根据具体编写】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.…

1. 使用poll或epoll创建echo服务器

1. 说明&#xff1a; 此篇博客主要记录一种客户端实现方式&#xff0c;和两种使用poll或者epoll分别创建echo服务器的方式&#xff0c;具体可看代码注释&#xff1a; 2. 相关代码&#xff1a; 2.1 echoClient.cpp #include <iostream> #include <cstdio> #incl…

C语言中的 sizeof 运算符

在 C 语言中&#xff0c;sizeof 是一个运算符&#xff0c;用于获取给定类型或变量的字节大小。它返回一个 size_t 类型的值&#xff0c;表示以字节为单位的对象大小。 sizeof 运算符有以下特点&#xff1a; 用法&#xff1a;sizeof 运算符可以应用于数据类型或表达式。计算静…

酷开科技以创新为动力用大数据提升品牌认知

在21世纪的今天&#xff0c;我们生活在一个被互联网深深改变的世界。互联网不仅改变了我们的生活方式&#xff0c;也正在改变我们的思维方式和工作方式。而互联网作为一种新的发展趋势&#xff0c;更是为我们提供了无数的机会和无限可能性&#xff0c;从电子商务时代到社交网络…

CSP-何以包邮?

题目描述 新学期伊始&#xff0c;适逢顿顿书城有购书满 x 元包邮的活动&#xff0c;小 P 同学欣然前往准备买些参考书。 一番浏览后&#xff0c;小 P 初步筛选出 n 本书加入购物车中&#xff0c;其中第 i 本&#xff08;1≤i≤n&#xff09;的价格为 ai 元。 考虑到预算有限&am…

scala编码

1、Scala高级语言 Scala简介 Scala是一门类Java的多范式语言&#xff0c;它整合了面向对象编程和函数式编程的最佳特性。具体来讲Scala运行于Java虚拟机&#xff08;JVM)之上&#xff0c;井且兼容现有的Java程序&#xff0c;同样具有跨平台、可移植性好、方便的垃圾回收等特性…

ubuntu server 20.04 备份和恢复 系统 LTS

ubuntu server 20.04 备份和恢复 系统 LTS tar命令系统备份与恢复&#xff08;还原or新装&#xff09; 备份系统 cd / su root tar cvpzf backup.tgz --exclude/tmp --exclude/run --exclude/dev --exclude/snap --exclude/proc --exclude/lostfound --exclude/backup.tgz …

启动游戏出现concrt140.dll错误的8种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到concrt140.dll文件。这个错误通常会导致程序无法正常运行&#xff0c;给用户带来困扰。本文将介绍找不到concrt140.dll无法继续执行代码的8个方法&#xff0c;同时探讨concrt140.dll丢…

LinuxBasicsForHackers笔记 -- 文件系统和存储设备管理

设备目录/dev Linux 有一个特殊的目录&#xff0c;其中包含代表每个连接设备的文件&#xff1a;相应命名的 /dev 目录。 /dev中有很多设备列表。 特别令人感兴趣的是设备 sda1、sda2、sda3、sdb 和 sdb1&#xff0c;它们通常是硬盘驱动器及其分区以及 USB 闪存驱动器及其分区…

理解基于 Hadoop 生态的大数据技术架构

转眼间&#xff0c;一年又悄然而逝&#xff0c;时光荏苒&#xff0c;岁月如梭。当回首这段光阴&#xff0c;不禁感叹时间的匆匆&#xff0c;仿佛只是一个眨眼的瞬间&#xff0c;一年的旅程已成为过去&#xff0c;而如今又到了画饼的时刻了 &#xff01; 基于 Hadoop 生态的大数…

固态硬盘SSD

目录 1.2 组成1.3 读写性能特性1.4 与机械硬盘相比的特点1.5 磨损均衡技术 \quad \quad SSD基于闪存技术Flash Memory, 属于电可擦除ROM, 即EEPROM \quad 1.2 组成 \quad \quad \quad 系统对固态硬盘的读写是以页为单位的 固态硬盘里的块相当于机械硬盘里的磁道 固态硬盘里的页…

Redis基础系列-持久化

Redis基础系列-持久化 文章目录 Redis基础系列-持久化1. 什么是持久化2. 为什么要持久化3. 持久化的两种方式3.1 持久化方式1&#xff1a;RDB(redis默认持久化方式)3.11 配置步骤-自动触发3.12 配置步骤-手动触发3.12 优点3.13 缺点3.14 检查和修复RDB快照文件3.15 哪些情况会触…

每天一个Linux命令 -- (7)more命令

欢迎阅读《每天一个Linux命令》系列&#xff01;在本篇文章中&#xff0c;将介绍Linux系统下的more命令&#xff0c;它用于逐屏显示文件的内容。 概念 more命令是Linux系统下的文件逐屏显示命令&#xff0c;用于逐屏显示文件的内容。 命令操作 more命令的语法如下&#xff1…