大概一篇能讲完吧…
以太网帧
运行在以太网上的常见帧格式分为两种,分别是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报文结构
字段解释
Version
4字节,版本号Header Lenngth
4字节,显示首部长度,一般首部长度为20字节DS Field
8字节,区分服务,也叫TOS
Total Length
16字节,报文总长度,理论上可到达65535字节identification
16字节,标识,和分片有关Flags
3字节 标志,和分片有关Fragment Offset
13字节,片偏移,和分片有关Time To Live
8字节 TTLProtocol
8字节 协议,指定传输层协议Header Checksum
16字节,首部校验和,只对首部进行差错检测Source IP Address
32字节,源IP地址Destination IP Address
32字节 目的IP地址IP OPtion
可选项data
有效载荷
关于区分服务
IPv4的DS Field字段提供Qos。
原先定义为TOS(RFC791),TOS中的IP Precedence字段只能将报文分成8类,在实际生活中完全不够用,如下
字段说明
IP Precedence
代表了报文的优先级
D/T/R
D bit代表延迟(Delay),T bit代表吞吐量(Throughput),R bit代表可靠性
(Reliability)。
后来,在RFC2474中对IPv4报文头的ToS字段进行了重新定义,称为DS(Differentiated Services)字段。
字段说明
DSCP
DSCP有两种表达方式,一种是数值,范围是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首部被扩展,选项字段用来支持排错、测量以及安全等措施,一般较少使用