一文了解pcap网络数据包如何分析
0x00 基础知识
1.OSI七层模型每层的作用
1、物理层:物理层处于OSI参考模型的最低层。物理层的主要功能是利用物理传输介质为数据链路层提供物理连接,以透明地传送比特流。
2、数据链路层:数据链路层在物理层提供比特流传输服务的基础上,在通信实体之间建立数据链路连接,传送以帧为单位的数据,通过差错控制、流量控制方法,变有差错的物理线路为无差错的数据链路。
3、网络层:网络层主要任务是通过执行路由选择算法,为报文分组通过通信子网选择最适当的路径。它是OSI参考模型七层中最复杂的一层。
4、传输层:传输层是向用户提供可靠的端到端服务,透明地传送报文。
5、会话层:会话层的主要目的是组织同步的两个会话用户之间的对话,并管理数据的交换。
6、表示层:表示层主要用于处理两个通信系统间信息交换的表示方式,它包括数据格式变换、数据加密与解密、数据压缩与恢复等功能。
7、应用层:应用层是OSI参考模型的最高层。应用层不仅要提供应用进程所需要信息交换和远程操作,而且还要作为应用进程的用户代理,完成一些为进行语义上有意义的信息交换所必须的功能。
综上所述可知,ISO/OSI开放系统互联七层参考模型中,功能最复杂的一层是网络层。
按照OSI七层协议的描述,传输层与网络层在功能上最大区别是传输层提供进程通信能力。
2.TCP/IP 结构及具有五层协议的结构体系
OSI的七层协议结构概念清晰,理论也比较完整,但它几乎在实际情况下又不适用。TCP/IP体系结构则不同,它却在实际中得以广泛运用。TCP/IP是一个四层的体系结构,它包含应用层、运输层、网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不同网络的互连问题)。不过从实际上讲,TCP/IP只有最上面的三层,因为最下面的接口层并没有什么具体内容。因此在学习计算机的原理时往往采取这种的办法,即综合OSI和TCP/IP的优点,采用一种只有五层的体系结构。
五层结构的TCP/IP与OSI模型的对应关系如图所示,每层都工作着不同的设备,比如常用的交换机在数据链路层、路由器一般工作在网际层;每层也都会实现不同的网络协议:
0x01 数据是如何在各层次间传输的
1.数据帧的封装
当引用程序利用TCP传输数据时,数据被送入协议栈中,然后逐层根据各层协议添加相应的协议头或者叫数据首部向物理层传递,最终由物理层转换成比特流送入网络。数据的封装过程如图所示:
从图中可以看出,每一层数据是由上一层数据+本层首部信息组成的,其中每一层的数据 ,称为本层的协议数据单元 ,即PDU。
应用层数据在传输层添加TCP报头后得到的PDU被称为 Segment(数据段 ),图示为TCP段。
传输层的数据(TCP段)传给网络层,网络层添加IP报头得到的PDU被称为Packet(数据包); 图示为IP数据包。
网络层数据报(IP数据包)被传递到数据链路层,封装数据链路层报头得到的PDU被称为Frame(数据帧),图示为以太网帧。
最后,帧被转换为比特,通过网络介质传输。这种协议栈逐层向下传递数据,并添加报头和报尾的过程称为封装。
2.数据格式
(1)以太网帧格式(数据链路层)
目前有四种不同格式的以太网帧在使用:
●Ethernet II即DIX 2.0:Xerox与DEC、Intel在1982年制定的以太网标准帧格式。Cisco名称为:ARPA。
●Ethernet 802.3 raw:Novell在1983年公布的专用以太网标准帧格式。Cisco名称为:Novell-Ether。
●Ethernet 802.3 SAP:IEEE在1985年公布的Ethernet 802.3的SAP版本以太网帧格式。Cisco名称为:SAP。
●Ethernet 802.3 SNAP:IEEE在1985年公布的Ethernet 802.3的SNAP版本以太网帧格式。Cisco名称为:SNAP。
在进行数据封装时,会在帧的数据部分加上又不和尾部,构成一个完整的帧。因此帧长定于数据部分的长度加上帧首部和帧尾部的长度,而首部和尾部的一个作用就是进行帧定界(即确定帧的界限)。此外,首部和尾部还包括许多必要的控制信息。在发送帧时,从帧首部发送。
以太网帧说明
以太网帧大小必须在64( 6 + 6 + 2 + 46+ 4 )至1518( 6 + 6 + 2 + 1500 + 4)字节(不包含前导码和定界符),即包括目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)在内,其中数据段大小在46~1500(MTU)字节之间。
以太网帧结构
以太网由前导码(7B)、定界符(1B)、目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)。
Ethernet II是由8个8‘b10101010构成,IEEE802.3由7个8‘b10101010+1个字节SFD(Start of Frame Delimiter)(b’10101011’)
(2)IP数据包格式(网际层)
IP数据包的首部固定部分长度为20字节:
-
版本:占4位,指IP协议版本。IP报文版本号 IPV4:4,IPV6:6
-
首部长度:占4位,表示的最大十进制数是15(注意:首部长度字段所表示的单位是32位子,一个32位字长是4字节),因此首部长度的最小值为5(即:0101),相当于5 * 4=20字节,最大值为15(即:1111),相当于15 * 4=60字节,切记当首部长度不是4的整数倍时,必须利用最后的填充字段填充
-
8位服务类型:占 8位,用来获得更好的服务,一般情况下不怎么使用这个字段,只有在区分服务时使用这个字段
-
总长度:指首部和数据之和的长度,单位为字节,总长度字段为16位,因此数据报的最大长度为2^16 - 1 = 65535 : header+数据 总长度
-
16位标识:占16位,IP软件在存储器中维持一个计数器,每产生一个数据包,计数器加1,并将此值赋给标识字段,当数据包长度超过网络的MTU时,就要采用分片处理,分片时,这个标识字段的值就会被复制到所有的数据报切片中。最后相同的数据报标识字段的分片就会重装成为原来的数据报。
-
3位标志:占3位,但目前只有两位有意义
- 标志字段中最低位记 M F ( M o r e F r a g m e n t ) \color{red} {MF(More Fragment)} MF(MoreFragment), M F = 1 \color{red} {MF = 1} MF=1表示后面还有分片的数据报, M F = 0 \color{red} {MF = 0} MF=0,表示这是若干数据报中的最后一个
- 中间的一位为 D F ( D o n ’ t F r a g m e n t ) \color{red} {DF (Don’t Fragment)} DF(Don’tFragment),意思是不能分片,只有当 D F = 0 \color{red} {DF = 0} DF=0时才允许分片
-
13位片偏移:参考下图。如果是第一片取值为0,第二片取值175,以此类推。
-
TTL:占8位,生存时间常用的字段是TTL(Time To Live),表示数据报在网络中的寿命,由发出的源站点设置,目的就是防止无法交付的数据报在因特网中无限制的兜圈子,白白消耗资源。TTL字段是以跳数限制的,每经过一个路由器,在转发之前就把跳数减为1,当TTL减为0时就会丢弃这个数据报,因为数据报在因特网中最大经过的路由器是255
-
8位协议:占8位,协议字段指数据报携带的数据是使用何种协议的,以便使目的主机的IP层知道将数据部分上交给那个处理过程
-
首部校验和:占16位,这个字段只检验数据报的首部,不包括数据部分。这是因为数据报没经过一次路由器,都要重新计算一下首部校验和(因为,一些字段如生存时间、标志、片偏移等可能发生变化)
-
源IP地址:无须解释
-
目的IP地址:无须解释
-
可选字段:占25位,该字段大小长度可变,从一字节到40字节不等
-
填充:占7位,前面字段加起来不是4的整数倍时,该字段填充全0补齐为4字节的倍数
-
数据:上层的报文,如TCP 报文、UDP报文等。
IP协议在协议栈中位于网络层,网络数据传输封装方式如下:
(3)TCP/UDP数据端格式(传输层)
1>TCP数据包格式
TCP数据段首部的固定部分长度为:20字节
-
源端口和目的端口:各占2个字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口实现
-
序号字段:占4字节。TCP连接中传送到数据流中的每一个字节都编上一个序号。序号字段的值则是指的是本报文段所发送的数据的数据的第一个字节的序号
-
确认号字段:占4字节。是期望收到对方下一个报文段的数据的第一个字节的序号
-
数据偏移:占4位。它指出数据的起始位置处距离 TCP报文段的起始处有多远,实际就是TCP报文段的首部长度。
-
保留字段:占6位。保留为今后使用,但目前应置为0
-
紧急比特URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
-
确认比特ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效
-
推送比特 PSH (Push):当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付
-
复位比特RST(Rest):只有当RST=1时,表明TCP连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接
-
同步比特SYN:同步比特SYN设置为1,就表示这是一个连接请求或连接接收报文。
-
终止比特FIN(Final):用来释放一个连接。当FIN=1时,表明此报文的发送端的数据已发送完毕,并要求释放运输连接
-
窗口字段:占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确认自己的接收窗口大小,然后通知对方确定发送窗口的上限
-
校验和:占2字节。校验和字段检验的范围包括首部和数据这两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部
-
紧急指针字段:占2字节。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号
-
选项字段:长度可变。TCP首部可以有多达40字节的可选消息,用于把附加信息传递给终点,或用来对齐其他选项
-
填充字段:这是为了使整个首部长度是4字节的整数倍
2>UDP数据包格式
UDP数据包的头部较为简单:共计8字节
-
源端口:端口号0-65535,1-1024保留端口号,为标准的服务端口
-
目的端口:无须多解释
-
UDP长度:header+data 总长度
-
UDP校验和:伪头部,头部,data 三部分校验和
-
数据:上层应用层的数据。
UDP协议和TCP协议同位于传输层,介于网络层(IP)和应用层之间:UDP数据部分为应用层报文,而UDP报文在IP中承载。如下图:
0x02 pcap格式
1.pcap文件的格式
pcap文件由三部分组成:
Pcap Header:24字节
Packet Header:16字节
Packet Data:数据包内容
2.Pcap Header
-
Magic(4B):标记文件开始,并用来识别文件和字节顺序。值可以为0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原来的顺序一个字节一个字节的读,如果是0xd4c3b2a1表示小端模式,下面的字节都要交换顺序。现在的电脑大部分是小端模式。
-
Major(2B):当前文件的主要版本号,一般为0x0200
-
Minor(2B):当前文件的次要版本号,一般为0x0400
-
ThisZone(4B):当地的标准时间,如果用的是GMT则全零,一般全零
-
SigFigs(4B):时间戳的精度,一般为全零
-
SnapLen(4B):最大的存储长度,设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将值设置为65535
-
LinkType(4B):链路类型。解析数据包首先要判断它的LinkType,所以这个值很重要。一般的值为1,即以太网
常用的LinkType(链路类型): 0 BSD loopback devices, except for later OpenBSD 1 Ethernet, and Linux loopback devices 6 802.5 Token Ring 7 ARCnet 8 SLIP 9 PPP 10 FDDI 100 LLC/SNAP-encapsulated ATM 101 "raw IP", with no link 102 BSD/OS SLIP 103 BSD/OS PPP 104 Cisco HDLC 105 802.11 108 later OpenBSD loopback devices (with the AF_value in network byte order) 113 special Linux "cooked" capture 114 LocalTalk
3.Packet Header
数据包头可以有多个,每个数据包头后面都跟着真正的数据包。以下是Packet Header的4个字段含义:
-
Timestamp(4B):时间戳高位,精确到seconds,这是Unix时间戳。捕获数据包的时间一般是根据这个值
-
Timestamp(4B):时间戳低位,能够精确到microseconds
-
Caplen(4B):当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
-
Len(4B):离线数据长度,网路中实际数据帧的长度,一般不大于Caplen,多数情况下和Caplen值一样
4.Packet Data
Packet是链路层的数据帧,长度就是Packet Header中定义的Caplen值,所以每个Packet Header后面都跟着Caplen长度的Packet Data。也就是说pcap文件并没有规定捕获的数据帧之间有什么间隔字符串。Packet数据帧部分的格式就是标准的网络协议格式了。
0x03 pcap文件分析
1.整体结构
别分使用wireshark和winhex打开一个pcap文件,可以看到wireshak解析方式:
Pcaket Data = wireshark一个数据包
第一个数据包格式如下:
第二个数据包对应关系如下:
2.Pcap Header分析
这个pcap文件的Pacp Header为:
D4C3B2A1 02000400 00000000 00000000 00000400 01000000
D4C3B2A1 | 02000400 | 00000000 | 00000000 | 00000400 | 01000000 |
---|---|---|---|---|---|
小端模式(4B) | 主版本号:0x0200 | ThisZone(4B) | SigFigs(4B) | 最大的存储长度(4B) | 链路类型(4B) |
此版本号:0x0400 | 00004000->16384 | 0000001->1 |
3.Packet Header分析
B44D4F5B A6940500 36000000 36000000
B44D4F5B | A6940500 | 36000000 | 36000000 |
---|---|---|---|
时间戳高位(4B) | 时间戳地位(4B) | Caplen(4B) | Len(4B) |
5B4F4DB4->1531923892->2018-07-18 22:24:52 | 000594A6->365734 | 00000036->54 | 00000036->54 |
对照wireshark解析的格式,Packet Header解析到Frame里面的Arrival Time字段、Frame Length、Capture Length
4.Pcap Data分析
(1).以太网帧首部
1>.以太网帧首部基础1
常见的以太网MAC帧格式有两种标准,一种是DIX Ethernet V2(即以太网V2标准),另一种是IEEE的802.3标准。这里只介绍使用得最多的以太网V2的MAC帧格式。这里假定网络层使用的是IP协议,实际三其他协议也行:
以太网MAC帧头部
帧首部主要有三个字段:
目的地址:占6字节,主要标识目标MAC地址
源地址:占6字节,主要标识源MAC地址
类型: 用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议
数据:占46到1500字节, 正式名称是 MAC 客户数据字段最小长度 64 字节 -18 字节的首部和尾部 = 数据字段的最小长度
FCS 字段 ( 4 字节):当数据字段的长度小于 46 字节时,应在数据字段的后面加入整数字节的填充字段,以保证以太网的 MAC 帧长不小于 64 字节;
前导码:在帧的前面插入的 8 字节中的第一个字段共 7 个字节,是前同步码,用来迅速实现 MAC 帧的比特同步。第二个字段是帧开始定界符,表示后面的信息就是 MAC 帧。
2>.以太网帧首部基础2
常用的以太网MAC帧格式有两种标准 :DIX Ethernet II标准,IEEE 的 802.3 标准。
Ethernet II和IEEE802.3的帧格式比较类似,主要的不同点在于前者定义的2字节为包类型,而后者定义的2字节为的长度;所幸的是,后者定义的有效长度值与前者定义的有效类型值无一相同,这样就容易区分两种帧格式了。如果值大于 1500(0x05DC),说明是以太网类型字段,EthernetII 帧格式。如果值小于等于1500,说明是长度字段,IEEE802.3 帧格式。因此类型字段值最小的是 0x0600。而长度最大为 1500。
MAC层要求定界字符之后的内容要在64字节到1518个字节之间,其中包括14字节的目标和源MAC,4字节的CRC32值。并且报文帧之间的传递间隔要大于9.6us。
最
常
用
的
M
A
C
帧
是
以
太
网
V
2
的
格
式
:
\color {red} {最常用的 MAC 帧是以太网V2的格式:}
最常用的MAC帧是以太网V2的格式:
I
E
E
E
的
802.3
标
准
:
\color {red} {IEEE 的 802.3 标准:}
IEEE的802.3标准:
3>.Pcap MAC Header分析
首先,在wireshark中可以很直观的看到,这里使用的帧类型为Ethernet II型:
MAC帧首部长度为14字节,它近跟在Packet Header之后:**目的MAC(6字节) + 源MAC(6字节) + 类型(2字节) **
从图中可以看出,这里的类型为0x0800,表示上层协议采用了IP协议
协议类型字段取值如下:
以太类型值(16进制) | 对应协议 |
---|---|
0x0000 - 0x05DC | IEEE 802.3 长度 |
0x0101 – 0x01FF | 实验 |
0x0600 | XEROX NS IDP |
0x0660 | |
0x0661 | DLOG |
0x0800 | 网际协议(IP) |
0x0801 | X.75 Internet |
0x0802 | NBS Internet |
0x0803 | ECMA Internet |
0x0804 | Chaosnet |
0x0805 | X.25 Level 3 |
0x0806 | 地址解析协议(ARP : Address Resolution Protocol) |
0x0808 | 帧中继 ARP (Frame Relay ARP) [RFC1701] |
0x6559 | 原始帧中继(Raw Frame Relay) [RFC1701] |
0x8035 | 动态 DARP (DRARP:Dynamic RARP)反向地址解析协议(RARP:Reverse Address Resolution Protocol) |
0x8037 | Novell Netware IPX |
0x809B | EtherTalk |
0x80D5 | IBM SNA Services over Ethernet |
0x80F3 | AppleTalk 地址解析协议(AARP:AppleTalk Address Resolution Protocol) |
0x8100 | 以太网自动保护开关(EAPS:Ethernet Automatic Protection Switching) |
0x8137 | 因特网包交换(IPX:Internet Packet Exchange) |
0x814C | 简单网络管理协议(SNMP:Simple Network Management Protocol) |
0x86DD | 网际协议v6(IPv6,Internet Protocol version 6) |
0x8809 | OAM |
0x880B | 点对点协议(PPP:Point-to-Point Protocol) |
0x880C | 通用交换管理协议(GSMP:General Switch Management Protocol) |
0x8847 | 多协议标签交换(单播) MPLS:Multi-Protocol Label Switching ) |
0x8848 | 多协议标签交换(组播)(MPLS, Multi-Protocol Label Switching ) |
0x8863 | 以太网上的 PPP(发现阶段)(PPPoE:PPP Over Ethernet ) |
0x8864 | 以太网上的 PPP(PPP 会话阶段) (PPPoE,PPP Over Ethernet) |
0x88BB | 轻量级访问点协议(LWAPP:Light Weight Access Point Protocol) |
0x88CC | 链接层发现协议(LLDP:Link Layer Discovery Protocol) |
0x8E88 | 局域网上的 EAP(EAPOL:EAP over LAN) |
0x9000 | 配置测试协议(Loopback) |
0x9100 | VLAN 标签协议标识符(VLAN Tag Protocol Identifier) |
0x9200 | VLAN 标签协议标识符(VLAN Tag Protocol Identifier) |
0xFFFF | 保留 |
(2).IP数据包首部
1>.IP Header基础
IP数据包首部结构已在上文进行过解析,具体可见0x01
2>.IP Header分析
IP Header首部固定部分长度:共计20字节
4 + 4 + 8 + 16 +16 + 3 + 13 + 8 + 8 + 32 + 32 = 160 bits = 20 Bytes
3>.字段分析
十
六
进
制
\color {red} {十六进制}
十六进制
45 00 00 28 68 8e 40 00 80 06 d2 91 c0 a8 2b 9e
6f 0d 64 5c
二
进
制
\color {red} {二进制}
二进制
字节序号 | 十六进制 | 二进制 |
---|---|---|
1 | 45 | 01000101 |
2 | 00 | 00000000 |
3 | 00 | 00000000 |
4 | 28 | 00101000 |
5 | 68 | 01101000 |
6 | 8E | 10001110 |
7 | 40 | 01000000 |
8 | 00 | 00000000 |
9 | 80 | 10000000 |
10 | 06 | 00000110 |
11 | D2 | 11010010 |
12 | 91 | 10010001 |
13 | C0 | 11000000 |
14 | A8 | 10101000 |
15 | 2B | 00101011 |
16 | 9E | 10011110 |
17 | 6F | 01101111 |
18 | 0D | 00001101 |
19 | 64 | 01100100 |
20 | 5C | 01011100 |
<1>.第一字节
45 --> 01000101
第一字节的八个bit:
十六进制 | 二进制 |
---|---|
45 | 01000101 |
-
版本:前4bits:0100
-
首部长度:后四bits:0101
二进制 | 备注 |
---|---|
0100 | 指IP协议版本,为IPv4 |
0101 | 占4位,表示的最大十进制数是15(注意:首部长度字段所表示的单位是32位子,一个32位字长是4字节),因此首部长度的最小值为5(即:0101),相当于54=20字节,最大值为15(即:1111),相当于154=60字节,切记当首部长度不是4的整数倍时,必须利用最后的填充字段填充 |
<2>.第二字节
-
区分服务:00 --> 0000 0000
-
功能:占 8位,用来获得更好的服务,一般情况下不怎么使用这个字段,只有在区分服务时使用这个字段
<3>.第三、四字节
00 28 --> 00000000 00101000 --> 40
-
首部长度: 00 28 --> 00000000 00101000 --> 40
-
解释: IP数据包总长度:40字节
-
功能:指首部和数据之和的长度,单位为字节,总长度字段为16位,因此数据报的最大长度为2^16 - 1 = 65535
<4>.第五、六字节
68 8E --> 01101000 10001110
-
标识: 68 8E --> 01101000 10001110
-
功能:占16位,IP软件在存储器中维持一个计数器,每产生一个数据包,计数器加1,并将此值赋给标识字段,当数据包长度超过网络的MTU时,就要采用分片处理,分片时,这个标识字段的值就会被复制到所有的数据报切片中。最后相同的数据报标识字段的分片就会重装成为原来的数据报。
<5>.第七、八字节
40 00 --> 01000000 00000000
-
标志:前三bits:010
- 标志字段中最低位记 M F \color{red} {MF} MF, M F = 1 \color{red} {MF = 1} MF=1表示后面还有分片的数据报, M F = 0 \color{red} {MF = 0} MF=0,表示这是若干数据报中的最后一个
- 中间的一位为 D F \color{red} {DF} DF,意思是不能分片,只有当 D F = 0 \color{red} {DF = 0} DF=0时才允许分片
-
片偏移:后十三bits:0000000000000
- 占13位,表示相对于用户数据的起点,该片从何处开始,片偏移以8字节为偏移量,也就是说每一个分片的长度一定是8字节的整数倍
<6>.第九字节
80 --> 10000000
- 生存时间:占8位,生存时间常用的字段是TTL(Time To Live),表示数据报在网络中的寿命,由发出的源站点设置,目的就是防止无法交付的数据报在因特网中无限制的兜圈子,白白消耗资源。TTL字段是以跳数限制的,每经过一个路由器,在转发之前就把跳数减为1,当TTL减为0时就会丢弃这个数据报,因为数据报在因特网中最大经过的路由器是255
<7>.第十字节
06 --> 00000110 --> 6
- 协议:占8位,协议字段指数据报携带的数据是使用何种协议的,以便使目的主机的IP层知道将数据部分上交给那个处理过程。
<8>.第十一、十二字节
D2 91 --> 11010010 10010001
- 首部检验和:占16位,这个字段只检验数据报的首部,不包括数据部分。这是因为数据报没经过一次路由器,都要重新计算一下首部校验和(因为,一些字段如生存时间、标志、片偏移等可能发生变化)
<9>.第十三、十四、十五、十六字节
C0 A8 2B 9E --> 11000000 10101000 00101011 10011110 --> 192 168 43 158
- 源IP地址:192 168 43 158
<10>.第十七、十八、十九、二十字节
6F 0D 64 5C --> 01101111 00001101 01100100 01011100 --> 111 13 100 92
- 目的IP地址:111.13.100.92
(3).TCP数据段首部
1>.TCP Header基础
TCP数据段首部结构已在上文进行过解析,具体可见0x01
2>.TCP Header分析
TCP Header首部固定部分长度:共计20字节
16 + 16 +32 +32 + 4 + 6 + 1 + 1 + 1 + 1 + 1 + 1 + 16 + 16 + 16 = 160 bits = 20 Bytes
3>.字段分析
十
六
进
制
\color {red} {十六进制}
十六进制
fb 3c 01 bb ca d5 4c 3d 86 f5 cc f1 50 11 04 00 84 31 00 00
二
进
制
\color {red} {二进制}
二进制
字节序号 | 十六进制 | 二进制 |
---|---|---|
1 | FB | 11111011 |
2 | 3C | 00111100 |
3 | 01 | 00000001 |
4 | BB | 10111011 |
5 | CA | 11001010 |
6 | D5 | 11010101 |
7 | 4C | 01001100 |
8 | 3D | 00111101 |
9 | 86 | 10000110 |
10 | F5 | 11110101 |
11 | CC | 11001100 |
12 | F1 | 11110001 |
13 | 50 | 01010000 |
14 | 11 | 00010001 |
15 | 04 | 00000100 |
16 | 00 | 00000000 |
17 | 84 | 10000100 |
18 | 31 | 00110001 |
19 | 00 | 00000000 |
20 | 00 | 00000000 |
<1>.第一、二字节
FB 3C --> 11111011 00111100 --> 64316
- 源端口:64316
<2>.第三、四字节
01 BB --> 00000001 10111011 --> 443
- 目的端口:443
<3>.第五、六、七、八字节
CA D5 4C 3D --> 11001010 11010101 01001100 00111101 --> 3402976317
- 序号:3402976317
这 里 建 议 查 看 : 理 解 T C P 序 列 号 ( S e q u e n c e N u m b e r ) 和 确 认 号 ( A c k n o w l e d g m e n t N u m b e r ) \color {red} {这里建议查看:理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)} 这里建议查看:理解TCP序列号(SequenceNumber)和确认号(AcknowledgmentNumber)
https://blog.csdn.net/a19881029/article/details/38091243?locationNum=3&fps=1
https://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/
<4>.第九、十、十一、十二字节
86 F5 CC F1 --> 10000110 11110101 11001100 11110001 --> 2264255729
- 确认号:2264255729
<5>.第十三、十四字节
50 11 --> 01010000 00010001
-
偏移字段:前4bits,即0101。即Header Length:它指出数据的起始位置处距离 TCP报文段的起始处有多远,实际就是TCP报文段的首部长度。表示的最大十进制数是15(注意:首部长度字段所表示的单位是32位子,一个32位字长是4字节),因此首部长度的最小值为5(即:0101),相当于54=20字节,最大值为15(即:1111),相当于154=60字节,切记当首部长度不是4的整数倍时,必须利用最后的填充字段填充
-
保留字段:占6位,即00 00 00。保留为今后使用,但目前应置为0
-
紧急比特URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。这里URG=0
-
确认比特ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。这里ACK=1
-
推送比特 PSH (Push):当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付。这里PUSH = 0
-
复位比特RST(Rest):只有当RST=1时,表明TCP连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接。这里RST = 0
-
同步比特SYN:同步比特SYN设置为1,就表示这是一个连接请求或连接接收报文。这里SYN=0
-
终止比特FIN(Final):用来释放一个连接。当FIN=1时,表明此报文的发送端的数据已发送完毕,并要求释放运输连接。这里FIN = 0
T C P 状 态 建 议 查 看 : \color {red} {TCP状态建议查看:} TCP状态建议查看:
https://blog.csdn.net/lamb7758/article/details/89145453
https://blog.csdn.net/lamb7758/article/details/89147474
<6>.第十五、十六字节
04 00 --> 00000100 00000000
- 窗口字段:占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确认自己的接收窗口大小,然后通知对方确定发送窗口的上限
滑 动 窗 口 机 制 建 议 查 看 : \color {red} {滑动窗口机制建议查看:} 滑动窗口机制建议查看:
https://www.fujieace.com/jingyan/tcp-window-protocol.html
http://c.biancheng.net/view/6427.html
https://www.cnblogs.com/hongdada/p/11171068.html
https://blog.csdn.net/qq_33314107/article/details/81607630
<7>.第十七、十八字节
84 31 --> 10000100 00110001
- 首部校验和:占2字节。校验和字段检验的范围包括首部和数据这两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部
<8>.第十九、二十字节
00 00 --> 00000000 00000000
- 紧急指针字段:占2字节。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号
<9>.首部其他字节
TCP数据段首部除了包括20字节固定长度,还存在选项字段、填充字段:
- 选项字段:长度可变。TCP首部可以有多达40字节的可选消息,用于把附加信息传递给终点,或用来对齐其他选项
- 填充字段:这是为了使整个首部长度是4字节的整数倍
0x04 C语言定义的以太网首部
以下为C语言对以太网首部的声明:来源于:https://blog.csdn.net/I_FU_LE_YOU11/article/details/8112491
typedef struct _ETHeader //以太网数据帧头部结构
{
UCHAR dhost[6]; //目的MAC地址
UCHAR shost[6]; //源MAC地址
USHORT type; //下层协议类型,如IP(ETHERTYPE_IP),ARP(ETHERTYPE_ARP)等
}ETHeader,*PETHeader;
typedef struct _IPHeaer //20个字节
{
UCHAR iphVerLen; //版本号和头长度(各占4位)
UCHAR ipTOS; //服务类型
USHORT ipLength; //封包总长度,即整个IP报的长度
USHORT ipID; //封包标识,惟一标识发送的每一个数据报
USHORT ipFlags; //标志
UCHAR ipTTL; //生存时间,就是TTL
UCHAR ipProtocol; //协议,可能是TCP、UDP、ICMP等
USHORT ipChecksum; //校验和
ULONG ipSource; //源IP地址
ULONG ipDestination; //目标IP地址
}IPHeader,*PIPHeader;
typedef struct _TCPHeader //20个字节
{
USHORT sourcePort; //16位源端口号
USHORT destinationPort;//16位目的端口号
ULONG sequenceNumber; //32位序列号
ULONG acknowledgeNumber;//32位确认号
UCHAR dataoffset; //4位首部长度/4位保留字
UCHAR flags; //6位标志位
USHORT windows; //16位窗口大小
USHORT checksum; //16位校验和
USHORT urgentPointer; //16位紧急数据偏移量
}TCPHeader,*PTCPHeader;
typedef struct _UDPHeader
{
USHORT sourcePort; //源端口号
USHORT destinationPort;//目的端口号
USHORT len; //封包长度
USHORT checksum; //校验和
}UDPHeader,*PUDPHeader;
typedef struct _ICMPHeader
{
UCHAR icmp_type; //消息类型
UCHAR icmp_code; //代码
USHORT icmp_checksum; //校验和
//下面是回显头
USHORT icmp_id; //用来惟一标识此请求的ID号,通常设置为进程ID
USHORT icmp_sequence; //序列号
ULONG icmp_timestamp; //时间戳
}ICMPHeader,*PICMPHeader;
typedef struct _IGMPHeader //8字节
{
UCHAR hVerType; //版本号和类型(各4位)
UCHAR uReserved; //未用
USHORT uCheckSum; //校验和
ULONG dwGroupAddress;//32为组地址(D类IP地址)
}IGMPHeader,*PIGMPHeader;
typedef struct _ARPHeader //28字节的ARP头
{
USHORT hrd; //硬件地址空间,以太网中为ARPHRD_EHER
USHORT eth_type; //以太网类型,ETHERTYPE_IP
UCHAR maclen; //MAC地址的长度,为6
UCHAR iplen; //IP地址的长度,为4
USHORT opcode; //操作代码,ARPOP_REWUEST为请求,ARPOP_REPLY为响应
UCHAR smac[6]; //源MAC地址
UCHAR saddr[4]; //源IP地址
UCHAR dmac[6]; //目的MAC地址
UCHAR daddr[4]; //目的IP地址
}ARPHeader,*PARPHeader;
0x05 参考链接
https://blog.51cto.com/287840567/1896857
https://www.cnblogs.com/qishui/p/5428938.html
https://www.cnblogs.com/qishui/p/5437301.html
https://wenku.baidu.com/view/cbe07ff7f68a6529647d27284b73f242326c3146.html
https://blog.csdn.net/marywang56/article/details/78052357
https://blog.csdn.net/triorwy/article/details/81182361
https://blog.csdn.net/I_FU_LE_YOU11/article/details/8112491
https://blog.csdn.net/hhpingyear/article/details/80216680
https://www.cnblogs.com/turbosha/p/13232694.html
https://blog.csdn.net/jiejiemcu/article/details/100355953
https://blog.csdn.net/a19881029/article/details/38091243?locationNum=3&fps=1
https://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/