
1、物理层:物理层处于OSI参考模型的最低层。物理层的主要功能是利用物理传输介质为数据链路层提供物理连接,以透明地传送比特流。
2、数据链路层:数据链路层在物理层提供比特流传输服务的基础上,在通信实体之间建立数据链路连接,传送以帧为单位的数据,通过差错控制、流量控制方法,变有差错的物理线路为无差错的数据链路。
3、网络层:网络层主要任务是通过执行路由选择算法,为报文分组通过通信子网选择最适当的路径。它是OSI参考模型七层中最复杂的一层。
4、传输层:传输层是向用户提供可靠的端到端服务,透明地传送报文。
5、会话层:会话层的主要目的是组织同步的两个会话用户之间的对话,并管理数据的交换。
6、表示层:表示层主要用于处理两个通信系统间信息交换的表示方式,它包括数据格式变换、数据加密与解密、数据压缩与恢复等功能。
7、应用层:应用层是OSI参考模型的最高层。应用层不仅要提供应用进程所需要信息交换和远程操作,而且还要作为应用进程的用户代理,完成一些为进行语义上有意义的信息交换所必须的功能。
综上所述可知,ISO/OSI开放系统互联七层参考模型中,功能最复杂的一层是网络层。
按照OSI七层协议的描述,传输层与网络层在功能上最大区别是传输层提供进程通信能力。
OSI的七层协议结构概念清晰,理论也比较完整,但它几乎在实际情况下又不适用。TCP/IP体系结构则不同,它却在实际中得以广泛运用。TCP/IP是一个四层的体系结构,它包含应用层、运输层、网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不同网络的互连问题)。不过从实际上讲,TCP/IP只有最上面的三层,因为最下面的接口层并没有什么具体内容。因此在学习计算机的原理时往往采取这种的办法,即综合OSI和TCP/IP的优点,采用一种只有五层的体系结构。

五层结构的TCP/IP与OSI模型的对应关系如图所示,每层都工作着不同的设备,比如常用的交换机在数据链路层、路由器一般工作在网际层;每层也都会实现不同的网络协议:


当引用程序利用TCP传输数据时,数据被送入协议栈中,然后逐层根据各层协议添加相应的协议头或者叫数据首部向物理层传递,最终由物理层转换成比特流送入网络。数据的封装过程如图所示:

从图中可以看出,每一层数据是由上一层数据+本层首部信息组成的,其中每一层的数据 ,称为本层的协议数据单元 ,即PDU。
应用层数据在传输层添加TCP报头后得到的PDU被称为 Segment(数据段 ),图示为TCP段。
传输层的数据(TCP段)传给网络层,网络层添加IP报头得到的PDU被称为Packet(数据包); 图示为IP数据包。
网络层数据报(IP数据包)被传递到数据链路层,封装数据链路层报头得到的PDU被称为Frame(数据帧),图示为以太网帧。
最后,帧被转换为比特,通过网络介质传输。这种协议栈逐层向下传递数据,并添加报头和报尾的过程称为封装。

(1)以太网帧格式(数据链路层)
目前有四种不同格式的以太网帧在使用:
●Ethernet II即DIX 2.0:Xerox与DEC、Intel在1982年制定的以太网标准帧格式。Cisco名称为:ARPA。
●Ethernet 802.3 raw:Novell在1983年公布的专用以太网标准帧格式。Cisco名称为:Novell-Ether。
●Ethernet 802.3 SAP:IEEE在1985年公布的Ethernet 802.3的SAP版本以太网帧格式。Cisco名称为:SAP。
●Ethernet 802.3 SNAP:IEEE在1985年公布的Ethernet 802.3的SNAP版本以太网帧格式。Cisco名称为:SNAP。
在进行数据封装时,会在帧的数据部分加上又不和尾部,构成一个完整的帧。因此帧长定于数据部分的长度加上帧首部和帧尾部的长度,而首部和尾部的一个作用就是进行帧定界(即确定帧的界限)。此外,首部和尾部还包括许多必要的控制信息。在发送帧时,从帧首部发送。
以太网帧说明
以太网帧大小必须在64( 6 + 6 + 2 + 46+ 4 )至1518( 6 + 6 + 2 + 1500 + 4)字节(不包含前导码和定界符),即包括目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)在内,其中数据段大小在46~1500(MTU)字节之间。
以太网帧结构
以太网由前导码(7B)、定界符(1B)、目的地址(6B)、源地址(6B)、类型(2B)、数据、FCS(4B)。
Ethernet II是由8个8‘b构成,IEEE802.3由7个8‘b+1个字节SFD(Start of Frame Delimiter)(b’’)
(2)IP数据包格式(网际层)
IP数据包的首部固定部分长度为20字节:
- 版本:占4位,指IP协议版本。IP报文版本号 IPV4:4,IPV6:6
- 首部长度:占4位,表示的最大十进制数是15(注意:首部长度字段所表示的单位是32位子,一个32位字长是4字节),因此首部长度的最小值为5(即:0101),相当于5 * 4=20字节,最大值为15(即:1111),相当于15 * 4=60字节,切记当首部长度不是4的整数倍时,必须利用最后的填充字段填充
- 8位服务类型:占 8位,用来获得更好的服务,一般情况下不怎么使用这个字段,只有在区分服务时使用这个字段
- 总长度:指首部和数据之和的长度,单位为字节,总长度字段为16位,因此数据报的最大长度为2^16 - 1 = 65535 : header+数据 总长度
- 16位标识:占16位,IP软件在存储器中维持一个计数器,每产生一个数据包,计数器加1,并将此值赋给标识字段,当数据包长度超过网络的MTU时,就要采用分片处理,分片时,这个标识字段的值就会被复制到所有的数据报切片中。最后相同的数据报标识字段的分片就会重装成为原来的数据报。
- 3位标志:占3位,但目前只有两位有意义
- 标志字段中最低位记,表示后面还有分片的数据报,,表示这是若干数据报中的最后一个
- 中间的一位为,意思是不能分片,只有当时才允许分片
- 13位片偏移:参考下图。如果是第一片取值为0,第二片取值175,以此类推。
- TTL:占8位,生存时间常用的字段是TTL(Time To Live),表示数据报在网络中的寿命,由发出的源站点设置,目的就是防止无法交付的数据报在因特网中无限制的兜圈子,白白消耗资源。TTL字段是以跳数限制的,每经过一个路由器,在转发之前就把跳数减为1,当TTL减为0时就会丢弃这个数据报,因为数据报在因特网中最大经过的路由器是255
- 8位协议:占8位,协议字段指数据报携带的数据是使用何种协议的,以便使目的主机的IP层知道将数据部分上交给那个处理过程
- 首部校验和:占16位,这个字段只检验数据报的首部,不包括数据部分。这是因为数据报没经过一次路由器,都要重新计算一下首部校验和(因为,一些字段如生存时间、标志、片偏移等可能发生变化)
- 源IP地址:无须解释
- 目的IP地址:无须解释
- 可选字段:占25位,该字段大小长度可变,从一字节到40字节不等
- 填充:占7位,前面字段加起来不是4的整数倍时,该字段填充全0补齐为4字节的倍数
- 数据:上层的报文,如TCP 报文、UDP报文等。

IP协议在协议栈中位于网络层,网络数据传输封装方式如下:
(3)TCP/UDP数据端格式(传输层)
1>TCP数据包格式
TCP数据段首部的固定部分长度为:20字节
- 源端口和目的端口:各占2个字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口实现
- 序号字段:占4字节。TCP连接中传送到数据流中的每一个字节都编上一个序号。序号字段的值则是指的是本报文段所发送的数据的数据的第一个字节的序号
- 确认号字段:占4字节。是期望收到对方下一个报文段的数据的第一个字节的序号
- 数据偏移:占4位。它指出数据的起始位置处距离 TCP报文段的起始处有多远,实际就是TCP报文段的首部长度。
- 保留字段:占6位。保留为今后使用,但目前应置为0
- 紧急比特URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
- 确认比特ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效
- 推送比特 PSH (Push):当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付
- 复位比特RST(Rest):只有当RST=1时,表明TCP连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接
- 同步比特SYN:同步比特SYN设置为1,就表示这是一个连接请求或连接接收报文。
- 终止比特FIN(Final):用来释放一个连接。当FIN=1时,表明此报文的发送端的数据已发送完毕,并要求释放运输连接
- 窗口字段:占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确认自己的接收窗口大小,然后通知对方确定发送窗口的上限
- 校验和:占2字节。校验和字段检验的范围包括首部和数据这两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部
- 紧急指针字段:占2字节。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号
- 选项字段:长度可变。TCP首部可以有多达40字节的可选消息,用于把附加信息传递给终点,或用来对齐其他选项
- 填充字段:这是为了使整个首部长度是4字节的整数倍
2>UDP数据包格式
UDP数据包的头部较为简单:共计8字节
- 源端口:端口号0-65535,1-1024保留端口号,为标准的服务端口
- 目的端口:无须多解释
- UDP长度:header+data 总长度
- UDP校验和:伪头部,头部,data 三部分校验和
- 数据:上层应用层的数据。
UDP协议和TCP协议同位于传输层,介于网络层(IP)和应用层之间:UDP数据部分为应用层报文,而UDP报文在IP中承载。如下图:

pcap文件由三部分组成:
Pcap Header:24字节
Packet Header:16字节
Packet Data:数据包内容

- Magic(4B):标记文件开始,并用来识别文件和字节顺序。值可以为0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原来的顺序一个字节一个字节的读,如果是0xd4c3b2a1表示小端模式,下面的字节都要交换顺序。现在的电脑大部分是小端模式。
- Major(2B):当前文件的主要版本号,一般为0x0200
- Minor(2B):当前文件的次要版本号,一般为0x0400
- ThisZone(4B):当地的标准时间,如果用的是GMT则全零,一般全零
- SigFigs(4B):时间戳的精度,一般为全零
- SnapLen(4B):最大的存储长度,设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将值设置为65535
- LinkType(4B):链路类型。解析数据包首先要判断它的LinkType,所以这个值很重要。一般的值为1,即以太网
数据包头可以有多个,每个数据包头后面都跟着真正的数据包。以下是Packet Header的4个字段含义:
- Timestamp(4B):时间戳高位,精确到seconds,这是Unix时间戳。捕获数据包的时间一般是根据这个值
- Timestamp(4B):时间戳低位,能够精确到microseconds
- Caplen(4B):当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
- Len(4B):离线数据长度,网路中实际数据帧的长度,一般不大于Caplen,多数情况下和Caplen值一样
Packet是链路层的数据帧,长度就是Packet Header中定义的Caplen值,所以每个Packet Header后面都跟着Caplen长度的Packet Data。也就是说pcap文件并没有规定捕获的数据帧之间有什么间隔字符串。Packet数据帧部分的格式就是标准的网络协议格式了。
别分使用wireshark和winhex打开一个pcap文件,可以看到wireshak解析方式:
Pcaket Data = wireshark一个数据包
第一个数据包格式如下:

第二个数据包对应关系如下:

这个pcap文件的Pacp Header为:
D4C3B2A1 0 00000000 00000000 00000400 0

B44D4F5B A
对照wireshark解析的格式,Packet Header解析到Frame里面的Arrival Time字段、Frame Length、Capture Length


(1).以太网帧首部
1>.以太网帧首部基础1
常见的以太网MAC帧格式有两种标准,一种是DIX Ethernet V2(即以太网V2标准),另一种是IEEE的802.3标准。这里只介绍使用得最多的以太网V2的MAC帧格式。这里假定网络层使用的是IP协议,实际三其他协议也行:
以太网MAC帧头部
帧首部主要有三个字段:
目的地址:占6字节,主要标识目标MAC地址
源地址:占6字节,主要标识源MAC地址
类型: 用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议
数据:占46到1500字节, 正式名称是 MAC 客户数据字段最小长度 64 字节 -18 字节的首部和尾部 = 数据字段的最小长度
FCS 字段 ( 4 字节):当数据字段的长度小于 46 字节时,应在数据字段的后面加入整数字节的填充字段,以保证以太网的 MAC 帧长不小于 64 字节;
前导码:在帧的前面插入的 8 字节中的第一个字段共 7 个字节,是前同步码,用来迅速实现 MAC 帧的比特同步。第二个字段是帧开始定界符,表示后面的信息就是 MAC 帧。

2>.以太网帧首部基础2
常用的以太网MAC帧格式有两种标准 :DIX Ethernet II标准,IEEE 的 802.3 标准。
Ethernet II和IEEE802.3的帧格式比较类似,主要的不同点在于前者定义的2字节为包类型,而后者定义的2字节为的长度;所幸的是,后者定义的有效长度值与前者定义的有效类型值无一相同,这样就容易区分两种帧格式了。如果值大于 1500(0x05DC),说明是以太网类型字段,EthernetII 帧格式。如果值小于等于1500,说明是长度字段,IEEE802.3 帧格式。因此类型字段值最小的是 0x0600。而长度最大为 1500。
MAC层要求定界字符之后的内容要在64字节到1518个字节之间,其中包括14字节的目标和源MAC,4字节的CRC32值。并且报文帧之间的传递间隔要大于9.6us。




3>.Pcap MAC Header分析
首先,在wireshark中可以很直观的看到,这里使用的帧类型为Ethernet II型:

MAC帧首部长度为14字节,它近跟在Packet Header之后:目的MAC(6字节) + 源MAC(6字节) + 类型(2字节)
从图中可以看出,这里的类型为0x0800,表示上层协议采用了IP协议

协议类型字段取值如下:
(2).IP数据包首部
1>.IP Header基础
IP数据包首部结构已在上文进行过解析,具体可见0x01
2>.IP Header分析
IP Header首部固定部分长度:共计20字节
4 + 4 + 8 + 16 +16 + 3 + 13 + 8 + 8 + 32 + 32 = 160 bits = 20 Bytes

3>.字段分析
45 00 00 28 68 8e 40 00 80 06 d2 91 c0 a8 2b 9e
6f 0d 64 5c
<1>.第一字节
45 --> 0
第一字节的八个bit:
- 版本:前4bits:0100
- 首部长度:后四bits:0101
<2>.第二字节
- 区分服务:00 --> 0000 0000
- 功能:占 8位,用来获得更好的服务,一般情况下不怎么使用这个字段,只有在区分服务时使用这个字段
<3>.第三、四字节
00 28 --> 00000000 00 --> 40
- 首部长度: 00 28 --> 00000000 00 --> 40
- 解释: IP数据包总长度:40字节
- 功能:指首部和数据之和的长度,单位为字节,总长度字段为16位,因此数据报的最大长度为2^16 - 1 = 65535
<4>.第五、六字节
68 8E --> 0
- 标识: 68 8E --> 0
- 功能:占16位,IP软件在存储器中维持一个计数器,每产生一个数据包,计数器加1,并将此值赋给标识字段,当数据包长度超过网络的MTU时,就要采用分片处理,分片时,这个标识字段的值就会被复制到所有的数据报切片中。最后相同的数据报标识字段的分片就会重装成为原来的数据报。
<5>.第七、八字节
40 00 --> 0 00000000
- 标志:前三bits:010
- 标志字段中最低位记,表示后面还有分片的数据报,,表示这是若干数据报中的最后一个
- 中间的一位为,意思是不能分片,只有当时才允许分片
- 片偏移:后十三bits:0000000000000
- 占13位,表示相对于用户数据的起点,该片从何处开始,片偏移以8字节为偏移量,也就是说每一个分片的长度一定是8字节的整数倍
<6>.第九字节
80 -->
- 生存时间:占8位,生存时间常用的字段是TTL(Time To Live),表示数据报在网络中的寿命,由发出的源站点设置,目的就是防止无法交付的数据报在因特网中无限制的兜圈子,白白消耗资源。TTL字段是以跳数限制的,每经过一个路由器,在转发之前就把跳数减为1,当TTL减为0时就会丢弃这个数据报,因为数据报在因特网中最大经过的路由器是255
<7>.第十字节
06 --> 00000110 --> 6
- 协议:占8位,协议字段指数据报携带的数据是使用何种协议的,以便使目的主机的IP层知道将数据部分上交给那个处理过程。
<8>.第十一、十二字节
D2 91 -->
- 首部检验和:占16位,这个字段只检验数据报的首部,不包括数据部分。这是因为数据报没经过一次路由器,都要重新计算一下首部校验和(因为,一些字段如生存时间、标志、片偏移等可能发生变化)
<9>.第十三、十四、十五、十六字节
C0 A8 2B 9E --> 00 --> 192 168 43 158
- 源IP地址:192 168 43 158
<10>.第十七、十八、十九、二十字节
6F 0D 64 5C --> 0 00001101 0 0 --> 111 13 100 92
- 目的IP地址:111.13.100.92
(3).TCP数据段首部
1>.TCP Header基础
TCP数据段首部结构已在上文进行过解析,具体可见0x01
2>.TCP Header分析
TCP Header首部固定部分长度:共计20字节
16 + 16 +32 +32 + 4 + 6 + 1 + 1 + 1 + 1 + 1 + 1 + 16 + 16 + 16 = 160 bits = 20 Bytes

3>.字段分析
fb 3c 01 bb ca d5 4c 3d 86 f5 cc f1 50 11 04 00 84 31 00 00
<1>.第一、二字节
FB 3C --> 00 --> 64316
- 源端口:64316
<2>.第三、四字节
01 BB --> 00000001 --> 443
- 目的端口:443
<3>.第五、六、七、八字节
CA D5 4C 3D --> 0 00 -->
- 序号:
https://blog.csdn.net/a/article/details/?locationNum=3&fps=1
https://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/
<4>.第九、十、十一、十二字节
86 F5 CC F1 --> -->
- 确认号:
<5>.第十三、十四字节
50 11 --> 0 00010001
- 偏移字段:前4bits,即0101。即Header Length:它指出数据的起始位置处距离 TCP报文段的起始处有多远,实际就是TCP报文段的首部长度。表示的最大十进制数是15(注意:首部长度字段所表示的单位是32位子,一个32位字长是4字节),因此首部长度的最小值为5(即:0101),相当于54=20字节,最大值为15(即:1111),相当于154=60字节,切记当首部长度不是4的整数倍时,必须利用最后的填充字段填充
- 保留字段:占6位,即00 00 00。保留为今后使用,但目前应置为0
- 紧急比特URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。这里URG=0
- 确认比特ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。这里ACK=1
- 推送比特 PSH (Push):当 PSH = 1 的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个 TCP 缓存都填满了后再交付。这里PUSH = 0
- 复位比特RST(Rest):只有当RST=1时,表明TCP连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后再重新建立运输连接。这里RST = 0
- 同步比特SYN:同步比特SYN设置为1,就表示这是一个连接请求或连接接收报文。这里SYN=0
- 终止比特FIN(Final):用来释放一个连接。当FIN=1时,表明此报文的发送端的数据已发送完毕,并要求释放运输连接。这里FIN = 0
<6>.第十五、十六字节
04 00 --> 00000100 00000000
- 窗口字段:占2字节。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确认自己的接收窗口大小,然后通知对方确定发送窗口的上限
https://www.fujieace.com/jingyan/tcp-window-protocol.html
http://c.biancheng.net/view/6427.html
https://www.cnblogs.com/hongdada/p/11171068.html
https://blog.csdn.net/_/article/details/
<7>.第十七、十八字节
84 31 --> 00
- 首部校验和:占2字节。校验和字段检验的范围包括首部和数据这两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部
<8>.第十九、二十字节
00 00 --> 00000000 00000000
- 紧急指针字段:占2字节。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号
<9>.首部其他字节
TCP数据段首部除了包括20字节固定长度,还存在选项字段、填充字段:
- 选项字段:长度可变。TCP首部可以有多达40字节的可选消息,用于把附加信息传递给终点,或用来对齐其他选项
- 填充字段:这是为了使整个首部长度是4字节的整数倍
以下为C语言对以太网首部的声明:来源于:https://blog.csdn.net/I_FU_LE_YOU11/article/details/
https://blog.51cto.com//
https://www.cnblogs.com/qishui/p/5428938.html
https://www.cnblogs.com/qishui/p/5437301.html
https://wenku.baidu.com/view/cbe07ff7f68a6529647d27284b73f242326c3146.html
https://blog.csdn.net/marywang56/article/details/
https://blog.csdn.net/triorwy/article/details/
https://blog.csdn.net/I_FU_LE_YOU11/article/details/
https://blog.csdn.net/hhpingyear/article/details/
https://www.cnblogs.com/turbosha/p/13232694.html
https://blog.csdn.net/jiejiemcu/article/details/
https://blog.csdn.net/a/article/details/?locationNum=3&fps=1
https://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/14780.html