一个潦草的报文头简介, 遇到多少写多少, 图片来自网络
简介
一个网络报文的结构大概如下:
这里主要是介绍各个头的长度及包头内容.
以太网报头14字节
太网报头长度为14个字节。主要包括:目的地址占6个字节,源地址6个字节,类型2个字节。
抓包可以看14字节的头
以太网帧结构
以太网传输中的冲突和帧大小关系
以太网帧大小必须在64-1518字节(不包含前导码和定界符),即包括目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)在内,其中数据段大小在46~1500字节之间。
以太网由前导码(7B)、定界符(1B)、目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)。
-
前导码(preamble):交替的0和1,设备从静默状态变成有信号状态标志以太网帧的开始。IEEE802.3 由 7 个 8‘b10101010 (8’haa)构成,由于数据从低比特开始传送(LSB),代码中的前导码数值为 8’b01010101,即8‘h55。
-
帧开始符(SFD, Start frame delimiter):值为8’b10101011(8’hab),最后两个1表示接收端适配器:“帧信息来了,准备接收”。数据从低比特开始传送(LSB),因此代码中的 SFD 值为8’hd5。
-
目的地址(DA, Destination Address):包含一个 48bit 的值,LSB 优先。目标地址可以是单播地址、广播地址(48‘hffff_ffff_ffff)、组播地址。当网卡收到一个数据帧时,首先检查该帧的目的地址是否与当前适配器的物理地址相同,如果相同,则进一步处理,如果不同则直接丢弃。
-
源地址(SA, Source Address):一个 48bit 的值,发送帧的网络适配器的物理地址,用于标识传输设备,LSB 格式。
-
长度/类型(Length/Type):字段值小于或等于1500,则指示帧的有效数据长度。Length 标识有效载荷的数据长度,不包含填充的长度。16‘h0800 代表IP 报文;16‘h0806 标识 ARP 请求/应答报文;16’h8035 标识RARP请求/应答报文。
-
数据及填充(data and pading):该段数据长度需在46~1500字节之间,填充数据不会改变Length 的值。
-
帧校验序列(FCS):用于存储 CRC 结果的校验结果。以 preamble、SFD、DA、SA、Length/Type、DATA and Pading作为输入数据进行计算,从"目标MAC地址"字段到"数据"字段的数据进行校验。
-
最小帧长度
定义最小帧长度是为了使发送方能在一个帧的传输时间内检测到此帧是否在链路上产生冲突,如发生冲突,退避重发,若帧长小于最小帧,则无法检测帧传输中是否发生冲突。
以太网最小帧64B =(7字节前导同步码+1字节帧开始定界符+)6字节的目的MAC+6字节的源MAC+2字节的帧类型+46数据+4字节的FCS
- 最大帧长
在最小帧长度内没发生冲突后,此帧就不再会发生冲突,在随后的发送中链路中其他节点都可检测到此链路上的信号。即发送方占据此信道,为了避免单一主机占用信道过长,则规定了以太网的最大帧长:1526字节
以太网最大帧1518B= (7字节前导同步码+1字节帧开始定界符+)6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500数据+4字节的FCS
抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是6+6+2+1500=1514
IP头20字节
-
版本(4位):用来标识IP协议的版本,最常见的就是4和6,分别代表IPv4和IPv6。
-
首部长度(4位):长度4位。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(84),因此,一个IP包头的长度最长为“1111”,即154=60个字节。IP包头最小长度为20字节。
-
服务类型(8位):长度8比特。8位 按位被如下定义 PPP DTRC0PPP:定义包的优先级,取值越大数据越重
000 普通 (Routine)
001 优先的 (Priority)
010 立即的发送 (Immediate)011 闪电式的 (Flash)100 比闪电还闪电式的 (Flash Override)101 CRI/TIC/ECP(找不到这个词的翻译)110 网间控制 (Internetwork Control
111 网络控制 (Network ControlD 时延: 0:普通 1:延迟尽量小T 吞吐量: 0:普通 1:流量尽量大R 可靠性: 0:普通 1:可靠性尽量大M 传输成本: 0:普通 1:成本尽量小0 最后一位被保留,恒定为0 -
总长度(16位):此处的总长度是指首部长度和数据长度之和,单位仍然是字节。16bit可以表示的最大值为65535,所以IP数据报的最大长度可以到达65535字节。但由于以太网的MTU(Maximum Transmission Unit)最大为1500字节,所以如果IP协议是运行在以太网的话,就会遇到需要分片的情况。
-
标志(3位):这3位中只有前2位有用,中间一位表示DF(don’t fragment),而最低位(最右侧的bit)表示MF(more fragment)。DF等于1的话,表示此IP数据报“不能分片”。只有在DF等于0时,才允许对其进行分片。MF等于1的话,表示此IP数据报后面还有分片的数据报,而MF等于0时,则表示当前的IP数据报是这一组中最后一个数据报。
-
片偏移(13位):此域表示当IP数据报超过MTU而被分拆成多片后,每一片在原IP数据报中的位置。此偏移量的参照起点是原数据报的数据部分的起点。
-
生存时间(8位):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
-
协议(8位):标识了上层所使用的协议,以下是比较常用的协议号:
1 ICMP 2 IGMP 6 TCP 17 UDP 88 IGRP 89 OSPF -
头部校验(16位):用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
-
源IP地址(16位):
-
目的IP地址(16位):
总共20个字节,构成了IP数据报的头部。 -
可选: 最大四十字节
可以知道IP头的最短长度为20字节, 还有40个字节的可选长度, 最长为60字节
IP头抓包
TCP数据报头20字节
下面我们介绍TCP协议的数据报头的解析,其长度为20个字节。详细解析:
- 源端口(16位)
- 目的端口(16位)
- 顺序号(32位),表明了发送的数据报的顺序
- 确认号(32位),希望收到的下一个数据报的序列号
- TCP协议数据报头头长(4位),表明TCP头中包含多少个32位字。
下面6位目前未用,- ACK:ACK位置1表明确认号是合法的。如果ACK为0,那么数据报不包含确认信息,确认字段被省略。
- PSH:表示是带有PUSH标志的数据。接收方因此请求数据报一到便可送往应用程序而不必等到缓冲区装满时才传送。
- RST:用于复位由于主机崩溃或其它原因而出现的错误的连接。还可以用于拒绝非法的数据报或拒绝连接请求。
- SYN:用于建立连接。
- FIN:用于释放连接。
- 窗口大小(16位),表示在确认了字节之后还可以发送多少个字节。
- 检验和(16位),是为了确保高可靠性而设置的。它校验头部、数据和伪TCP头部之和。
- 紧急指针(16位),它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
以上20个字节组成了TCP协议的基本报头。
由此我们可以得出一个算法:普通TCP协议的总报头长度=以太网数据报头+IP数据报头+TCP协议数据报头。
TCP传输头
UDP报头8字节
下面我们介绍UDP协议的数据报头。其共占8个字节。其中包括:
- 源端口(2个字节)
- 目的端口(2个字节)
- 长度(2个字节),UDP用户数据报的总长度,以字节为单位
- 检验和(2个字节)
由此我们可以得出结论,UDP协议的数据报总长度=以太网数据报长度+IP数据报头+UDP数据报头。
UDP头