百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

WireShark抓包报文结构分析

csdh11 2025-03-02 16:52 11 浏览

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。由IETF的RFC 793定义TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接。

(图片来源于网络)

为了解报文结构,我就把上次抓的Telnet的报文拿出来分析了一下。具体如下:

物理链路层中数据用电信号传输,对应0和1,一个信号为1 bit;报文中为16进制(0x表示),一个占4位(bit),一组占8 bit。

最外层(Ethernet II,数据链路层封装)占用14*8=112 bit。

其中6*8=48 bit(1-48 bit)为目的MAC地址;

6*8=48 bit(49-96 bit)为源MAC地址;

2*8=16 bit(97-112 bit)表示封装协议为IPv4。

第二层(IP,网络层)占用20*8=160 bit。

其中113-116 bit表示IP协议版本号为4,即IPv4;

117-120 bit表示报文头长度共20字节(byte,1 byte=8 bit),占用80 bit长度;

121-128 bit表示DS Field(区分服务域),占用8 bit,前6 bit为DSCP(区分服务代码点,即DS标记值),后2 bit为CU或ECN(显示拥塞通知),这两部分共同组成一个可扩展性相对较强的方法以此来保证IP的服务质量;

129-144 bit表示总长度,此处为60,

145-160 bit表示标识符

161-176 bit表示标志和片移位,如果报文有分片相关属性,此处标志会变化;

177-184 bit表示TTL值;

185-192 bit表示内层封装协议,本报文中为TCP协议;

193-208 bit表示头部校验和;

209-240 bit表示源IP地址,转换为点分10进制即为10.1.1.2;

241-272 bit表示目的IP地址,转换为点分10 进制即为10.1.1.2。

第三层(TCP,传输层)占用剩余位。

273-288 bit为源端口号;

288-304 bit为目的端口号;

305-336 bit为序列号,即TCP三次握手中的seq;

337-368 bit为应答码,即TCP三次握手中的ack;

369-384 bit为SYN标志位,即TCP三次握手中的SYN;

385-400 bit为窗口大小;

401-416 bit为校验和;

417-432 bit为URG位,urgent机制,是用于通知应用层需要接收urgent data,在urgent data接收完成后,通知应用层urgent data数据接收完毕;

433-592 bit为20bytes的各类options,其中:

433-464 bit为MMS相关项,包含8 bit的类型(2为Maxium Segment Size,TCP一次传输发送的最大数据段长度),8 bit的长度,16bit的MMS值;

465-472 bit为MOP相关项;

473-496 bit为滑动窗口项;

497-512 bit为允许SACK项(选择确认,TCP收到乱序数据后,会将其放入乱序队列中,然后发送重复ACK给对端。对端收到多个重复的ACK后,就会推测到可能发生了数据丢失,再重传数据。如果乱序的数据比较零散,则这种机制的效率会很低。使用SACK选项可以告知发包方收到了哪些数据,发包方收到这些信息后就会知道哪些数据丢失,然后立即重传缺失部分即可。这就大大提高了数据重传的速度。)

513-592 bit为时间戳项,包含报文发送时间TSvla和接收端接收时间TSecr。(当发送端收到ACK Segment后,取出TSscr,和当前时间做算术差,即可完成一次RTT的测量。若非通过Timestamp Option来计算RTT,大部分TCP实现只会以"每个Window采样一次"的频率来测算RTT。因此通过Timestamp Option,可以实现更密集的RTT采样,使RTT的测算更精确。)


然后我抓了一个本地访问远程主机的报文来对比一些关键位的信息,如下:

可以看到是请求远程桌面的回包,由目的主机的3389回包。个别关键字段如下:

最外层,因为跨三层转发,所有目的MAC地址为网关设备MAC地址,源MAC地址为服务器网卡信息,此处用的是一台安装VMWare ESXI的服务器上的虚拟机。

网络层,可以看到我的电脑IP地址为172.2.105.16,服务器IP地址为172.2.216.70;协议为TCP,TTL值为64,报文不允许分片,报文长度为1500 bytes。数了一下,报文共5e0行,缺6个,转换为10进制,就是95行,一行16组,为16*94-4=1514,1组8 bit为1个byte,去掉数据链路层的14 bytes,正好1500 bytes。

传输层,可以看到源端口为3389(远程桌面端口号),目的端口为53672;TCP分片长度为1460,此报文序列号为25588,下一个报文序列号为27048,窗口大小为254,TCP载荷为1460 bytes。

数据段内容主要是长度,为1460 bytes,与传输层中TCP载荷大小相同。

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...