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

WireShark抓包报文结构分析

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

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载荷大小相同。

相关推荐

OKHttp原理解析(okhttp的作用)

Okhttp应该是Android目前非常流行的第三方网络库,尝试讲解他的使用以及原理分析,分成几个部分:...

快速教会你优雅的解决TCP客户端端口耗尽的问题

Hello,我是Henry,相信各位开发老爷在使用大并发网络连接的时候,可能都遇到过TCP客户端端口耗尽的问题,这是一个常见问题,以下是系统性的解决方案及技术细节:1.理解端口限制的本质...

这3个接口基础知识,产品经理需要知道

产品经理在工作中,避免不了要阅读接口文档,希望本文能够帮助大家更好的了解接口。接口,即客户端(浏览器)向服务器提交请求,服务器向客户端返回响应。本质就是数据的传输与接收。本文主要介绍接口相关的基础知识...

Java 11新特性对开发者的影响:让编程更高效、更自由

Java11新特性对开发者的影响:让编程更高效、更自由在这个瞬息万变的编程世界里,每一代Java的更新都承载着无数开发者对性能优化、生产力提升以及代码美感追求的期望。作为继Java8之后的首个长期...

干货-okHttp的优点-收藏了(okhttp的好处)

OkHttp相较于其它的实现有以下的优点.支持SPDY,允许连接同一主机的所有请求分享一个socket。如果SPDY不可用,会使用连接池减少请求延迟。使用GZIP压缩下载内容,且压缩操作对用...

如何在 Java 项目中集成 DeepSeek

一、使用官方SDK基础集成1.添加依赖(Maven)<dependency><groupId>com.deepseek</groupId>...

spring cloud gateway 性能优化思路

SpringCloudGateway是一个高性能的API网关,但在实际的生产环境中,可能会遇到一些性能瓶颈。以下是一些SpringCloudGateway的性能优化方面:调整线程池...

你对Android中的okHttp的使用真的了解吗

框架下载地址:https://github.com/square/okhttp今天给大家讲解下网络框架okhttp的使用,这个框架非常强大,很多框架都用它来加载网络资源,目前很多开发者还在用As...

京东大佬问我,Nginx并发连接如何设置?详细说明

京东大佬问我,Nginx并发连接如何设置?详细说明首先,我需要回忆一下Nginx的并发模型。Nginx是基于事件驱动的异步架构,所以它的并发处理能力和配置参数有很大关系。主要的参数应该包括worker...

如何实现一个连接池?一文带你深入浅出,彻底搞懂

-前言-【2w1h】是技术领域中一种非常有效的思考和学习方式,即What、Why和How;坚持【2w1h】,可以快速提升我们的深度思考能力。...

Golang 网络编程(golang 系统编程)

TCP网络编程存在的问题:拆包:对发送端来说应用程序写入的数据远大于socket缓冲区大小,不能一次性将这些数据发送到server端就会出现拆包的情况。通过网络传输的数据包最大是1500字节,当TCP...

Spring6|Spring Boot3有哪些HTTP客户端可以选择

个人博客:无奈何杨(wnhyang)个人语雀:wnhyang...

10. 常用标准库(标准库有哪些)

本章深入解析Go语言核心标准库的关键功能与生产级应用技巧,结合性能优化与安全实践,提供高效开发指南。10.1fmt/io/os10.1.1fmt高级格式化...

Nginx之连接池(nginx 长连接 连接复用)

我们知道Nginx利用连接池来增加它对资源的利用率。下面我们一起来看看Nginx是如何使用连接池的。从上一节模块开始已经慢慢会接触一些Nginx的源码部分来。每个worker进程都有一个独立的ngx...

开发者必备的Android开发资源之OkHttp

小编在这里给各位Android开发者介绍的资源包括工具、库和网站等。有效地利用它们,将有助于减轻我们的工作量,提高我们的工作效率。为什么需要一个HTTP库Android系统提供了两种HTTP通信类,H...