本文首次发布于 Mlin Blog、简书、CSDN,作者 @木林(Mlin) ,转载请保留原文链接。
OSI模型,即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems InterconnectionReference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。
应用层主要功能是为操作系统或网络应用程序提供访问网络服务的接口,也就是提供给用户的接口。
通过应用程序来完成网络用户的应用需求。该层的数据放在TCP数据包的数据部分,该层定义了一个很重要的协议——http协议。
示例: Telnet(远程登录协议)、FTP (File Transfer Protocol)、HTTP (Hyperrext Transfer Protocol)、SNMP(simple Mail Transfer Protocol)、 BOOTP(Boot trap.Protocol) 、AFP(Apple Talk文件协议–Apple公司的网络协议族,用于交换文件)、 SNMP (Simple Network Management Protoco1)、
NCP (NetWare Core Protoco1) 、NFS (Network File System)。
数据解封装过程和封装过程相反。
字段 | 长度 | 含义 |
---|---|---|
DMAC | 6字节 | 目的MAC地址,IPv4为6字节,该字段确定帧的接收者。 |
SMAC | 6字节 | 源MAC地址,IPv4为6字节,该字段确定帧的接受者。 |
Type | 2字节 | 协议类型,表明外层协议。 |
Data | 变长 | 数据字段,最小长度必须为46字节,最大长度为1500字节。 如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。 |
CRC | 4字节 | 用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。 |
- 各Type值对应的协议
Type值 | 对应协议 |
---|---|
0x0800 | IP |
0x0806 | ARP |
0x8000 | IS-IS |
0x8035 | RARP |
0x86DD | IPv6 |
0x880B | PPP |
0x8847 | MPLS-unicast |
0x8848 | MPLS-multicast |
字段 | 长度 | 含义 |
---|---|---|
DMAC | 6字节 | 目的MAC地址。 |
SMAC | 6字节 | 源MAC地址。 |
Length | 2字节 | 指后续数据的字节长度,但不包括CRC检验码。 |
DSAP | 1字节 | 目的服务访问点,若后面类型为IP帧值设为0x06。 |
SSAP | 1字节 | 源服务访问点,若后面类型为IP帧值设为0x06。 |
Ctrl | 1字节 | 该字段值通常设为0x03,表示无连接服务的IEEE 802.2无编号数据格式。 |
SNAP-ID | 5字节 | 由OUI和Type两部分组成。 |
OUI | 3字节 | 3字节的组织唯一标识符(Organizationally Unique Identifier),其值通常等于MAC地址的前3字节,即网络适配器厂商代码。 |
Type | 2字节 | 标识以太网帧所携带的上层数据类型。 |
Data | 44-1498字节 | 负载。 |
CRC | 4字节 | 用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。 |
字段 | 长度 | 含义 |
---|---|---|
Destination address | 6字节 | 目的MAC地址。 |
Source address | 6字节 | 源MAC地址。 |
Type | 2字节 | 表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。 |
PRI | 3bit | Priority,表示帧的优先级,取值范围为0~7,值越大优先级越高。用于当阻塞时,优先发送优先级高的数据包。 如果设置用户优先级,但是没有VLANID,则VLANID必须设置为0x000。 |
CFI | 1bit | CFI (Canonical Format Indicator),表示MAC地址是否是经典格式。CFI为0说明是标准格式,CFI为1表示为非标准格式。用于区分以太网帧、FDDI(Fiber Distributed Digital Interface)帧和令牌环网帧。在以太网中,CFI的值为0。 |
VID | 12bit | VLAN ID,表示该帧所属的VLAN。在VRP中,可配置的VLAN ID取值范围为1~4094。0和4095协议中规定为保留的VLAN ID。 三种类型: Untagged帧:VID不计 Priority-tagged帧:VID为0x000 VLAN-tagged帧:VID范围0~4095 三个特殊的VID: 0x000:设置优先级但无VID 0x001:缺省VID 0xFFF:预留VID |
Length/Type | 2字节 | 指后续数据的字节长度,但不包括CRC检验码。 |
Data | 40-1500字节 | 负载(可能包含填充位)。 |
CRC | 4字节 | 用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。 |
PPP帧的内容是指Address、Control、Protocol和Information四个域的内容。各字段的含义如下。
字段 | 长度 | 含义 |
---|---|---|
Flag | 1字节 | Flag域标识了一个物理帧的起始和结束,该字节为0x7E。 |
Address | 1字节 | PPP协议是被运用在点对点的链路上,它可唯一标识对方,因此无须知道对方数据链路层地址。所以该字节无任何意义,按协议规定填充为全1广播地址。 |
Control | 1字节 | 同Address域一样,PPP数据帧的Control域也没实际意义,规定值为0x03,该域与Address域一起标识了PPP报文,即PPP报文头为FF03。 |
Protocol | 1字节或 2字节 | 协议域,可用来区分PPP数据帧中信息域所承载的数据报文的内容。协议域的内容必须依据ISO 3309的地址扩展机制所给出的规定。该机制规定协议域所填充的内容必须为奇数,也就是要求低字节的最低位为“1”,高字节的最低位为“0”。如果当发送端发送的PPP数据帧的协议域字段不符合上述规定,接收端则会认为此数据帧是不可识别的。接收端向发送端发送一个Protocol-Reject报文,在该报文尾部将填充被拒绝报文的协议号。 |
Information | 0-1500字节 | 信息域最大长度是1500字节,其中包括填充域的内容。信息域的最大长度等于PPP协议中MRU(Maximum Receive Unit)的缺省值。在实际应用当中可根据实际需要进行信息域最大封装长度选项的协商。 如果信息域长度不足1500字节,可被填充,但不是必须的。如果填充则需通信双方的两端能辨认出有用与无用的信息方可正常通信。 |
FCS | 0/1/2字节 | FCS域计算范围是除了flag域的其他域。 校验域的功能主要对PPP数据帧传输的正确性进行检测。 在数据帧中引入了一些传输的保证机制,会引入更多的开销,这样可能会增加应用层交互的延迟。 |
Code | 1字节 | 代码域,主要是用来标识LCP数据报文的类型。在链路建立阶段,接收方接收到LCP数据报文。当其代码域的值无效时,就会向对端发送一个LCP的代码拒绝报文(Code-Reject报文)。如果是IP报文,则不存在此域,取而代之的是IP报文内容。 |
Identifier | 1字节 | 标识域的值表示进行协商报文的匹配关系。 标识域目的是用来匹配请求和响应报文。 一般而言,在进入链路建立阶段时,通信双方任何一端都会连续发送几个配置请求报文(Configure-Request报文)。这几个请求报文的数据域的值可能是完全一样的,只是它们的标志域不同。 通常一个配置请求报文的ID是从0x01开始逐步加1的。 当对端接收到该配置请求报文后,无论使用何种报文回应对方,但必须要求回应报文中的ID要与接收报文中的ID一致。当通信设备收到回应后就可以将该回应与发送时的进行比较来决定下一步的操作。 |
Length | 2字节 | 长度域表示此协商报文长度,它包含Code域及Identifier域的长度。长度域的值就是该LCP报文的总字节数据。它是代码域、标志域、长度域和数据域四个域长度的总和。 长度域所指示字节数之外的字节将被当作填充字节而忽略掉,而且该域的内容不能超过MRU的值。 |
Data | 变长 | 数据域所包含的是协商报文的内容。 |
在HDLC中,数据和控制报文均以帧的标准格式传送。HDLC中的帧类似于BSC的字符块,但不是独立传输的。HDLC的完整的帧由标志字段(F)、地址字段(A)、控制字段(C)、信息字段(I)、帧校验序列字段(FCS)等组成:
字段 | 长度 | 含义 |
---|---|---|
Flag | 1字节 | 标志字段,为01111110(0x7e)的比特模式,用以标志帧的开始与结束,也可以作为帧与帧之间的填充字符。 |
Address | 1字节 | 地址字段,内容取决于所采用的操作方式,有主节点、从节点、组合节点之分。 |
Control | 1字节 | 控制字段,用于构成各种命令及响应,以便对链路进行监视与控制。 由于Control字段的构成不同,可以把HDLC帧分为三种类型:信息帧、监控帧、无编号帧,分别简称I帧(Information)、S帧(Supervisory)、U帧(Unnumbered)。在控制字段中,第1位是“0”为I帧,第1、2 位是“1 ”为S帧,第1、2位是“11”为U帧。 |
Protocol | 2字节 | 协议字段。表示Information域中的数据封装的协议类型。 |
Information | 0-N字节 | 信息字段。可以是任意的二进制比特串,长度未作限定。其上限由FCS字段或通信节点的缓冲容量来决定,目前国际上用得较多的是1000~2000比特,而下限可以是0,即无信息字段。但是监控帧中不可有信息字段。 |
FCS | 2字节 | FCS(Frame Check Sequence):帧检验序列字段,可以使用16位CRC,对两个标志字段之间的整个帧的内容进行校验。 |
IPv4报文格式
字段 | 长度 | 含义 |
---|---|---|
Version | 4bit | **版本。**4:表示为IPV4; 6:表示为IPV6。 |
IHL | 4比特 | 首部长度。如果不带Option字段,则为20,最长为60,该值限制了记录路由选项。以4字节为一个单位。 |
Type of Service | 8bit | 服务类型。只有在有QoS差分服务要求时这个字段才起作用。 |
Total Length | 16bit | 总长度。整个IP数据报的长度,包括首部和数据之和,单位为字节,最长65535,总长度必须不超过最大传输单元MTU。 |
Flags | 3bit | 标志位。标识数据包分片或最后一个分片。 Bit 0: 保留位,必须为0。 Bit 1: DF(Don’t Fragment),能否分片位,0表示可以分片,1表示不能分片。 Bit 2: MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。 |
Fragment Offset | 12bit | 片偏移。分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。 |
Time to Live | 8bit | 生存时间。可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。主要用于放环(三层),超过255次丢弃。 |
Protocol | 8bit | 协议。标识上一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。 常见值见下表。 |
Header Checksum | 16bit | 首部检验和。只检验数据包的首部,不检验数据部分。这里不采用CRC检验码,而采用简单的计算方法。 |
Source Address | 32bit | 源IP地址。 |
Destination Address | 32bit | 目的IP地址。 |
Options | 可变 | 选项字段。用来支持排错,测量以及安全等措施,内容丰富(请参见下表)。选项字段长度可变,从1字节到40字节不等,取决于所选项的功能。 |
Padding | 可变 | 填充字段。全填0。 |
- IP报头协议号常见值
协议号 | 协议名称 |
---|---|
0 | 保留 |
1 | ICMP |
2 | IGMP |
6 | TCP |
17 | UDP |
47 | GRE |
58 | IPv6-ICMP |
89 | OSPF |
112 | VRRP |
124 | IS-IS |
137 | MPLS |
88 | EIGRP(思科独有) |
IPv6的基本报头在IPv4报头的基础上,增加了流标签域,去除了一些冗余字段,使报文头的处理更为简单、高效。
字段 | 长度 | 含义 |
---|---|---|
Version | 4bit | 版本号。 4:表示为IPV4; 6:表示为IPV6。 |
Traffic class | 8bit | 流量类别。该字段及其功能类似于IPv4的业务类型字段。该字段以区分业务编码点(DSCP)标记一个IPv6数据包,以此指明数据包应当如何处理。 |
Flow Label | 20bit | 流标签。该字段用来标记IP数据包的一个流,当前的标准中没有定义如何管理和处理流标签的细节。 |
Payload length | 16bit | 有效载荷的长度。有效载荷是指紧跟IPv6基本报头的数据包,包含IPv6扩展报头。 |
Next header | 8bit | 下一报头。该字段指明了跟随在IPv6基本报头后的扩展报头的信息类型。 |
Hop limit | 8bit | 跳数限制。该字段定义了IPv6数据包所能经过的最大跳数,这个字段和IPv4中的TTL字段非常相似。 |
Source Address | 128bit | 该报文的源IP地址。 |
Destination Address | 128bit | 该报文的目的IP地址。 |
Extension Headers | 可变 | **扩展报头。**IPv6取消了IPv4报头中的选项字段,并引入了多种扩展报文头,在提高处理效率的同时还增强了IPv6的灵活性,为IP协议提供了良好的扩展能力。当超过一种扩展报头被用在同一个分组里时,报头必须按照下列顺序出现: IPv6基本报头 1.逐跳选项扩展报头 2.目的选项扩展报头 3.路由扩展报头 4.分片扩展报头 5.授权扩展报头 6.封装安全有效载荷扩展报头 7.目的选项扩展报头(指那些将被分组报文的最终目的地处理的选项。) 8.上层扩展报头 不是所有的扩展报头都需要被转发路由设备查看和处理的。路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头。 除了目的选项扩展报头出现两次(一次在路由扩展报头之前,另一次在上层扩展报头之前),其余扩展报头只出现一次。 |
字段 | 长度 | 含义 |
---|---|---|
Source Port | 16bit | 源端口。标识哪个应用程序发送。 |
Destination Port | 16bit | 目的端口。标识哪个应用程序接收。 |
Sequence Number | 32bit | **序列号。**TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 |
Acknowledgment Number | 32bit | 确认号。是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。 |
Data Offset | 4bit | 数据偏移。即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。 |
Reserved | 6bit | 保留。必须填0。 |
URG | 1bit | 紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 |
ACK | 1bit | 确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 |
PSH | 1bit | 标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。 |
RST | 1bit | 重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。 |
SYN | 1bit | 同步序号标识。用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。 |
FIN | 1bit | 发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 |
Window | 16bit | **窗口。**TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端正期望接收的字节数。窗口最大为65535字节。 |
Checksum | 16bit | 校验字段。包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。 |
Urgent Pointer | 16bit | 紧急指针。只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。 |
Options | 可变 | **选项字段。**TCP协议最初只规定了一种选项,即最长报文段长度(数据字段加上TCP首部),又称为MSS。MSS告诉对方TCP“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。 新的RFC规定有以下几种选型:选项表结束,无操作,最大报文段长度,窗口扩大因子,时间戳。 窗口扩大因子:3字节,其中一个字节表示偏移值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。 时间戳:10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)。 选项确认选项: |
Padding | 可变 | 填充字段,用来补位,使整个首部长度是4字节的整数倍。 |
Data | 可变 | TCP负载。 |
之所以设置两边都发起断开连接,是因为有可能是一方数据发送完成,而另一方数据为发送完成,两边分别断开连接确保两边的数据都完成了发送。
字段 | 长度 | 含义 |
---|---|---|
Source Port | 2字节 | 标识哪个应用程序发送(发送进程)。 |
Destination Port | 2字节 | 标识哪个应用程序接收(接收进程)。 |
Length | 2字节 | UDP首部加上UDP数据的字节数,最小为8。 |
Checksum | 2字节 | 覆盖UDP首部和UDP数据,是可选的。 |
data octets | 可变 | UDP负载,可选的。 |
如果不带Tag,则打上入接口的PVID值再进一步处理。
比较该接口是否允许该VLAN通过,如果允许通过则进接收,如果不允许通过则丢弃。
和Trunk接口类似。
和Trunk接口类似。
接口 类型 | 对接收不带Tag的 报文处理 | 对接收带Tag的 报文处理 | 发送帧处理过程 |
---|---|---|---|
Access接口 | 接收该报文,并打上缺省的VLAN ID。 | 1.当VLAN ID与缺省VLAN ID相同时,接收该报文。 2.当VLAN ID与缺省VLAN ID不同时,丢弃该报文。 | 先剥离帧的PVID Tag,然后再发送。 |
Trunk接口 | 1.打上缺省的VLAN ID,当缺省VLAN ID在允许通过的VLAN ID列表里时,接收该报文。 2.打上缺省的VLAN ID,当缺省VLAN ID不在允许通过的VLAN ID列表里时,丢弃该报文。 | 1.当VLAN ID在接口允许通过的VLAN ID列表里时,接收该报文。 2.当VLAN ID不在接口允许通过的VLAN ID列表里时,丢弃该报文。 | 1.当VLAN ID与缺省VLAN ID相同,且是该接口允许通过的VLAN ID时,去掉Tag,发送该报文。 2.当VLAN ID与缺省VLAN ID不同,且是该接口允许通过的VLAN ID时,保持原有Tag,发送该报文。 |
Hybrid接口 | 1.打上缺省的VLAN ID,当缺省VLAN ID在允许通过的VLAN ID列表里时,接收该报文。 2.打上缺省的VLAN ID,当缺省VLAN ID不在允许通过的VLAN ID列表里时,丢弃该报文。 | 1.当VLAN ID在接口允许通过的VLAN ID列表里时,接收该报文。 2.当VLAN ID不在接口允许通过的VLAN ID列表里时,丢弃该报文。 | 当VLAN ID是该接口允许通过的VLAN ID时,发送该报文。可以通过命令设置发送时是否携带Tag。 |
由上面各类接口添加或剥除VLAN标签的处理过程可见:
当接收到不带VLAN标签的数据帧时,Access接口、Trunk接口、Hybrid接口都会给数据帧打上VLAN标签,但Trunk接口、Hybrid接口会根据数据帧的VID是否为其允许通过的VLAN来判断是否接收,而Access接口则无条件接收。
当接收到带VLAN标签的数据帧时,Access接口、Trunk接口、Hybrid接口都会根据数据帧的VID是否为其允许通过的VLAN(Access接口允许通过的VLAN就是缺省VLAN)来判断是否接收。
当发送数据帧时:
因此,Access接口发出的数据帧肯定不带Tag,Trunk接口发出的数据帧只有一个VLAN的数据帧不带Tag,其他都带VLAN标签,Hybrid接口发出的数据帧可根据需要设置某些VLAN的数据帧带Tag,某些VLAN的数据帧不带Tag。