Bootstrap

以太网帧、IP包及TCP与UDP的报文格式

一.以太网数据帧格式

1.以太网帧格式及各层数据结构关系

    

   

2.以太网帧格式       

上图中数据链路层以太网链路传输的数据包称做以太帧,或者以太网数据帧。在以太网中,网络访问层的软件必须把数据转换成能够通过网络适配器硬件进行传输的格式。

以太网帧的整体大小必须在 64~1518 字节之间(不包含前导码)。有些系统支持更大的帧,最大可以支持 9000 字节。有些系统支持更大的帧,最大可以支持 9000 字节。            

说明:数据段即为IP包。

前导码(Preamble)

为了实现底层数据的正确阐述,物理层使用7个字节同步码(7 个 0x55),二进制表现为 0 和 1 交替,其作用是使发送方和接收方的时钟同步。

帧起始界定符(SFD,Start Frame Delimiter)

使用 1 个字节的SFD(0xd5),二进制表现为“10101011”,用来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。

以太网帧头

目的MAC地址

即接收端物理MAC地址,占用 6 个字节。MAC地址从应用上可分为单播地址、组播地址和广播地址。

单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用于标志唯一的设备;

组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;

广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。

源MAC地址

即发送端物理MAC地址,占用6个字节。

长度/类型

当这两个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;

如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议(网际协议)、0x0806代表ARP协议(地址解析协议)等。

数据段

长度最小46个字节,最大1500个字节。

最大值 1500 称为以太网的最大传输单元(MTU,Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素,因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置,通常以太网的有效数据字段小于1500个字节,现在电脑的配置都很高了,很多都支持巨型帧,巨型帧可以超过 1500 个字节。但是,要成功使用巨型帧,网络中的所有设备(包括交换机、路由器和主机)都必须支持巨型帧,并且MTU的大小必须一致。如果网络中的任何设备不支持巨型帧,或者MTU的大小不一致,那么数据包可能会被丢弃或者分片,从而影响网络性能。

帧检验序列(FCS,Frame Check Sequence)

为了确保数据的正确传输,在数据的尾部加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始即不包含前导码和帧起始界定符。通用的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。

帧间隙(IFG,Interpacket Gap)

帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间,IFG的最小值是96 bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。不管10M/100M/1000M的以太网,两帧之间最少要有96bit time,IFG的最少间隔时间计算方法如下:

10Mbit/s最小时间为:96*100ns = 9600ns;

100Mbit/s最小时间为:96*10ns = 960ns;

1000Mbit/s最小时间为:96*1ns = 96ns;

二.IP包格式

1.IP包头简介

  固定部分大小共20字节;选项字段长度可变一般为32bit的整数倍,最小无,最大为40字节,当有可选项字段且不足32bit时,余下部分用无用数据来填充;所以一个完整的IP包头最小为20字节,最大为60字节。

2.IP包头部格式

版本号(4bit):

告知IP地址是ipv4地址还是ipv6地址

首部长度(4bit):

告知这个数据包头的长度,由此推断出有无可选项

服务类型(8bit):

按位被定义为 PPP DTRM0

PPP:定义包的优先级,取值越大数据越重要

 000 普通 (Routine)

   001 优先的 (Priority)

 010 立即的发送 (Immediate)

 011 闪电式的 (Flash)

   100 比闪电还闪电式的 (Flash Override)

 101 CRI/TIC/ECP(找不到这个词的翻译)

 110 网间控制 (Internetwork Control)

 111 网络控制 (Network Control)

D 时延: 0:普通 1:延迟尽量小

T 吞吐量: 0:普通 1:流量尽量大

R 可靠性: 0:普通 1:可靠性尽量大

M 传输成本: 0:普通 1:成本尽量小

0 最后一位被保留,恒定为0

总长度(16bit):

告知IP数据报文的总长度(包括被分片数据在内),最大承载量为1500字节,超过将进行数据分片

片偏移量(13bit):

决定IP分片数据的先后顺序,只能是0或1480的倍数,第一个分片数据发送时偏移量为0,第二个为1480,第三个为2960,以此类推。

目的端重组数据包时靠偏移量来按顺序组合分片数据

标志位(3bit):

第一位bit未启用为0               

第二位bit如果需要分片第二位为0,不需要分片第二位为1               

第三位比特为1代表还有后续分片,为0代表为最后一个分片

共有三种情况:

001(需要分片且还有后续分片)

000(需要分片且当前为最后一个分片)

010(不需要分片)

标识符(16bit):

区分不同的IP数据包的分片数据,在目的端重组分片数据时能快速找到同一数据包的分片数据

生存时间TTL(8bit):

范围为1-255;

单位为跳数,数据包每经过一台路由器即为一跳,TTL值减一;当TTL为0时,丢弃数据包。

作用是防止数据包在网络中永久的循环

Windows系统TTL一般为128,Linux系统TTL为1-128之间,通常为56,64。

注:跳点跟踪命令:tracert IP地址

协议(8bit):

区分上层协议;6代表TCP协议,17代表UDP协议

首部校验和(16bit):

校验三层IP包头是否有误

源IP地址(32bit):

指发送数据包的主机地址

目标IP地址(32bit):

指接收数据包的目标主机地址

选项字段(长度可变,0-40Byte):

通常不会使用到,因为IP包头部分的长度单位为32bit,因此可选项字段的长度必须为32bit的整数倍,

当使用时且剩余部分不足32bit会自动填充无用数据来补足32bit。

.TCP报文格式

    TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20 Byte格式固定,后40 Byte为可选。

  因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20 Byte,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495 Byte

TCP报文中数据部分是可选的,即TCP报文可以不包含数据(同理IP包也可以不包含数据)。不含数据的TCP报文通常是一些确认和控制信息类的报文,如TCP建立连接时的三次握手和TCP终止时的四次挥手等。

1.源端口号(Source Port)

长度为16位,指明发送数据的进程。

2.目的端口号(Destination Port)

长度为16位,指明目的主机接收数据的进程。

3.序号(Sequence Number)记录发送次数

也称为序列号,长度为32位,序号用来标识从TCP发送端向接入端发送的数据字节流进行编号,可以理解成对字节流的计数。

4.确认号(Acknowledgement Number)

长度为32位,确认号包含发送确认的一端所期望收到的下一个序号。确认号只有在ACK标志为1时才有效。

5.首部长度(数据偏移)

长度为4位,用于表示TCP报文首部的长度。用4位(bit)表示,十进制值就是[0,15],一个TCP报文前20个字节是必有的,后40个字节根据情况可能有可能没有。如果TCP报文首部是20个字节,则该位应是20/4=5。

6.保留位(Reserved)

长度为6位,必须是0,它是为将来定义新用途保留的。给QOS预留用的。

7.标志(Code Bits)

长度为6位,在TCP报文中不管是握手还是挥手还是传数据等,这6位标志都很重要。6位从左到右依次为:

   URG:紧急标志位,说明紧急指针有效;

   ACK:确认标志位,一般都为1,说明确认序号有效;

   PSH:推标志位,置位时表示接收方应立即请求将报文交给应用层;PSH置1的数据包优先确认,其余的数据包等待

   RST:复位标志,用于重建一个已经混乱的连接;

   SYN:同步标志,该标志仅在三次握手建立TCP连接时有效

   FIN:结束标志,带该标志位的数据包用于结束一个TCP会话。

8.窗口大小(Window Size

长度为16位,TCP流量控制由连接的每一端通过声明的窗口大小来提供。

9.检验和(Checksum)

 长度为16位,该字段覆盖整个TCP报文端,是个强制性的字段,是由发送端计算和存储,到接收端后,由接收端进行验证。

   其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。

 TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据。

 TCP的校验和是必需的,而UDP的校验和是可选的。

 TCP和UDP计算校验和时,都要加上一个12字节的伪首部。

 伪首部共有12字节,包含如下信息:源IP地址、目的IP地址、保留字节(置0)、传输层协议号(TCP是6)、TCP报文长度(报头+数据)。

 伪首部是为了增加TCP校验和的检错能力:如检查TCP报文是否收错了(目的IP地址)、传输层协议是否选对了(传输层协议号)等。

10.紧急指针(Urgent Pointer)

  长度为16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。

11.选项(Options)

  长度为0-40B(字节),必须以4B为单位变化,必要时可以填充0。通常包含:最长报文大小(MaximumSegment Size,MSS)、窗口扩大选项、时间戳选项、选择性确认(Selective ACKnowlegement,SACK)等。

12.数据

Tcp可靠依赖于:确认,重传,排序,流控(滑动窗口)。

13.TCP数据包大小设置说明

TCP数据包的最大长度通常受限于IP数据包的最大传输单元(MTU)。在以太网中,MTU通常为1500字节。因此,TCP数据包的最大长度通常也为1500字节,减去IP和TCP头部的大小。超过1500后协议栈会自动进行分包处理。

IP头部通常为20字节,TCP头部通常也为20字节。因此,在没有使用TCP选项的情况下,TCP数据包的最大有效载荷长度为1460字节(1500 - 20 - 20)。

拓展:

某些情况下,可以通过启用巨型帧(Jumbo Frames)来增大MTU的大小。巨型帧是指MTU大小超过默认值的数据包。通常,巨型帧的MTU大小可以设置为9000字节。

但是,要成功使用巨型帧,网络中的所有设备(包括交换机、路由器和主机)都必须支持巨型帧,并且MTU的大小必须一致。如果网络中的任何设备不支持巨型帧,或者MTU的大小不一致,那么数据包可能会被丢弃或者分片,从而影响网络性能。

    

四.UDP报文格式

1.UDP头部组成

(1).源端口号与目的端口号

源IP和源端口表明了数据是从哪里来的,目的IP和目的端口表明了数据要到哪里去.

每个端口号在UDP报文里占2个字节,取值范围为0-65535(2^16-1).

注意:端口号<1024[1-1023]为知名端口号,通常情况下我们是不应该使用的.例如(http:80).

(2).报文长度

UDP报头中,UDP长度为16位,即最长UDP报文时64KB(包含报头),如果长度超过64KB,需要应用层手动分包,多次发送,并在接收方手动拼接。

(3).校验和

UDP用户数据报首部中的校验和的计算方法较为特殊。在计算校验和前,要在UDP用户数据报之前增加12字节的伪首部。伪首部不是UDP报文的真正首部,只是在计算校验和时,临时添加的字段。伪首部既不向下传送也不向上递交,只是为了计算校验和。下图给出伪首部字段内容

UDP的校验和是把首部和数据部分一起检验。

发送方:首先将全零放入首部的校验和字段,再把伪首部以及UDP报文看成是由许多16位的字串拼接起来的。若UDP报文的数据部分不是偶数个字节,还要填入一个全零字节(但此字节不发送)。然后按照二进制反码计算出这些16位字的和。将此和的二进制反码写入校验和字段

接收方:将收到的UDP报文(添加伪首部和可能填充的全零字节)一起按照二进制反码求这些16位字的和。当无差错时其结果应为全1。否则就表明有差错出现,接收方就丢弃这个UDP报文(也可以上交给应用层,但附上差错警告)

2.UDP的主要特点

UDP是无连接的。即发送数据前不需要建立连接,发送数据结束也没有连接释放,因此减少了开销和发送数据前的时延

UDP使用尽最大努力交付。即不保证可靠交付,因此不需要维护复杂的连接状态表(有许多参数)

UDP是面向数据报的。发送方的UDP对应用层交付的报文,在添加首部后直接交付给IP层。UDP对应用层交付的报文,既不合并,也不拆分,而是保留这些报文的边界。

在接收方的UDP,对于IP层交付的UDP用户数据报,在去除UDP首部后也直接交付应用层,不作任何处理,一次交付一个完整的报文。

UDP没有拥塞控制。因此网络出现的拥塞不会使源主机的发送速率降低。

UDP支持一对一,一对多,多对一和多对多的交互通信。

UDP的首部开销小,只有8字节,比TCP的20字节的首部短。

;