大概一篇能讲完吧…
以太网帧
运行在以太网上的常见帧格式分为两种,分别是Ethenet_II帧格式、IEEE802.3帧格式(SNAP)

- ethenet II的type字段指定了上层的协议
- IEEE802.3相同位置是长度,同时对数据进行更加细粒度的控制
ETHENET_II
字段说明
DMAC是目的MAC地址。DMAC字段长度为6
个字节,标识帧的接收者。SMAC是源MAC地址。SMAC字段长度为6个字节
,标识帧的发送者。- 类型字段用于标识数据字段中包含的高层协议,该字段长
度为2个字节。类型字段取值为0x0800的帧代表IP协议帧;类型字
段取值为0x0806的帧代表ARP协议帧。 - 数据字段是网络层数据,最小长度必须为46字节以保证帧长
至少为64字节,数据字段的最大长度为1500字节。 - 循环冗余校验字段(``FCS`)提供了一种错误检测机制。该字段长度
为4个字节。
IEEE802.3

字段说明
- Length 代替ETHENET_II字段的Type字段,记录帧的字长
- LLC占用Data的3个字节
- D.SAP 目的访问服务点
- S.SAP 源服务访问点
- Control 控制字段
- SNAP 占用Data的5个字节
- Org Code机构代码,一般为0
- Type字段和Ethenet相同
DSAP和SSAP作用解释
- 当DSAP和SSAP都取特定值``0xff
时,802.3帧就变成了Netware ETHERNET`帧,用来承载NetWare类型的数据。 - 当DSAP和SSAP都取特定值``0xaa
时,802.3帧就变成了ETHERNET_SNAP帧。ETHERNET_SNAP`帧可以用于传输多
种协议 - DSAP和SSAP其他的取值均为纯``IEEE802.3`帧。
MAC地址(6字节48bit)
- 前24bit是OUI 供应商代码,后24bit是序列号
- 单播第1字节的第8bit为0;组播第1字节的第8bit为1;广播为全1
IPv4报文结构

字段解释
Version4字节,版本号Header Lenngth4字节,显示首部长度,一般首部长度为20字节DS Field8字节,区分服务,也叫TOSTotal Length16字节,报文总长度,理论上可到达65535字节identification16字节,标识,和分片有关Flags3字节 标志,和分片有关Fragment Offset13字节,片偏移,和分片有关Time To Live8字节 TTLProtocol8字节 协议,指定传输层协议Header Checksum16字节,首部校验和,只对首部进行差错检测Source IP Address32字节,源IP地址Destination IP Address32字节 目的IP地址IP OPtion可选项data有效载荷
关于区分服务
IPv4的DS Field字段提供Qos。
原先定义为TOS(RFC791),TOS中的IP Precedence字段只能将报文分成8类,在实际生活中完全不够用,如下

字段说明
IP Precedence代表了报文的优先级
D/T/RD bit代表延迟(Delay),T bit代表吞吐量(Throughput),R bit代表可靠性
(Reliability)。
后来,在RFC2474中对IPv4报文头的ToS字段进行了重新定义,称为DS(Differentiated Services)字段。

字段说明
DSCPDSCP有两种表达方式,一种是数值,范围是0~63(6个字节);一种是关键字,分为CS、EF、AF、BE

其中xy表示不同类别,数字越小丢包概率越小
- CS6和CS7默认用于协议报文,而且是大多数厂商设备的硬件队列里最高优先
级的报文,因为如果这些报文无法接收的话会引起协议中断。 - EF常用于承载语音的流量,因为语音要求低延迟,低抖动,低丢包率,是仅
次于协议报文的最重要的报文。 - AF4用来承载语音的信令流量,指电话的控制信令。
- AF3可以用来承载IPTV的直播流量,直播的实时性很强,需要连续性和大吞吐
量的保证。 - AF2可以用来承载VOD(Video on Demand:视频点播)的流量,相对于直播
流量来说,VOD对实时性要求没那么强烈,允许有时延或者缓冲。 - AF1可以用来承载普通上网业务。
- BE 是指传统IP的分组投递服务,只关注可达性,对其他方面不做要求,所有路由器必须支持BE
关于分片
IP数据报分片主要考虑以下原因:
- 数据链路层有不同的承载协议,不同协议承载的最大数据长度各不相同
使用IP分片将数据分片传输,从而使数据不会超过MTU,对此,IPv4提供了三个字段:标识、标志、片偏移
Identification:标识号,归属于同一个标识号的数据包分片具有相同的==标识号==、==源IP地址==、==目的地址== ,同时,发送主机通常为他发送的每一个数据报的标识号加1。
flag:用于判断后面是否还有片,flag分为Reserve,DF和MF三部分。Reserve是保留位;DF表示是否分片(DF=1表示不分片);MF表示是否还有后续分片。可以看出,三位同时最多只能由一个值为1
Fragment Offset:片偏移,用来分片重组时进行定位,偏移以8字节为单位
分片的缺点
分片本身的划分和重组会带来资源消耗,尤其是接收方,在接受分片时要为每个分片提供内存空间,分片过多会导致资源消耗严重
由于IP层没有重传的策略,所以当数据波中的任意分片丢失时,整个数据报都需要依赖传输层进行重传,又因为IP层的分片相对于传输层是透明的,所以往往传输层会重传整个数据包,这样会浪费资源,影响网络中的传输质量。
同时,分片的存在会对网络安全造成隐患。利用最后一个分片没有被接受,所有分片就不会重组并释放内存空间的特点,故意不向接收方发送最后一个分片,如果这样的攻击迅速,大量,就会导致接收方的内存空间占满,无法处理正常业务,达到DOS效果。同时也可以使分片的偏移量出现差错,导致接收方无法正常重组数据报
值得注意的时IP分组只有第一个分片带有四层信息,因此其余分片有可能因此逃过防火墙等的检测,从而给黑客可乘之机
在实际应用中,应尽量避免使用IP分片。事实上,IPv6协议中已经取消分片的策略。
由于TCP协议中存在MSS,限制了最大数据发送量,从而可以确保IP数据报大小不会超过数据链路层的MTU,因此,在TCP协议中不存在IP分片;但是在UDP协议下,不存在这样的保障机制,因此最好要在应用层就限定每个包的大小
关于校验
IP层只对报文头部进行校验检错,不对数据进行差错检测,网络层实质上还是属于“尽最大努力交付”
为什么链路层、IP层和传输层都需要校验?
答:链路层的差错检验是为了保证数据在链路传输的完整性,
IP层只对头部进行校验,一来是因为链路层的校验已经尽可能地降低了差错率,二来是因为IP层范围庞杂,如果每经过一个路由器都对数据进行校验,会对性能产生影响,可以但没必须。同时校验头部是为了保障IP协议自身的正确性,同时也存在对二层的不信任,以及四层协议有校验也有无校验,做一个最低限度的保障。甚至还有说法是历史遗留问题。总之算是一个complicated issue了🤣
传输层协议例如TCP协议对整个报文段进行校验,也是出于对下层的不信任的原因。(大概吧)
关于选项
选项允许IP首部被扩展,选项字段用来支持排错、测量以及安全等措施,一般较少使用