第02章_网络参考模型
数字化时代,各种信息以数据的形式充斥着我们的生活。什么是数据?数据又是如何传递的?
本章我们将通过网络参考模型去简单了解数据的“一生”。
1.应用和数据
1.1故事的起源 - 应用
应用的存在,是为了满足人们的各种需求,比如访问网页,在线游戏,在线视频等。
伴随着应用会有信息的产生。比如文本,图片,视频等都是信息的不同呈现方式。
1.2应用的实现 - 数据
- 数据的产生
- 在计算机领域,数据是各种信息的载体。
- 数据传输
- 大部分应用程序所产生的数据需要在不同的设备之间传递。
- 计算机只能识别0和1的组成的电子数据(digital data)。它不具备读取各种信息的能力,所以信息需要通过一定的规则翻译成数据。
- 而对人来说,我们不具备读取电子数据的能力,所以在读取信息的时候,需要将数据转成人能理解的信息。
- 对于一名网络工程师来说,需要更关注数据的端到端传递的过程。
2.网络参考模型与标准协议
2.1OSI参考模型
OSI 模型(Open Systems Interconnection Model),由国际化标准组织ISO (The International Organization for Standardization ) 收录在ISO 7489标准中并于1984年发布。
OSI参考模型又被称为七层模型,由下至上依次为:
- 物理层:在设备之间传输比特流,规定了电平、速度和电缆针脚等物理特性。
- 数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址(以太网使用MAC地址)来访问介质,并进行差错检测。
- 网络层:定义逻辑地址,供路由器确定路径,负责将数据从源网络传输到目的网络。
- 传输层:提供面向连接或非面向连接的数据传递以及进行重传前的差错检测。
- 会话层:负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
- 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。
- 应用层:OSI参考模型中最靠近用户的一层,为应用程序提供网络服务。
2.2TCP/IP参考模型
因为OSI协议栈比较复杂,且TCP和IP两大协议在业界被广泛使用,所以TCP/IP参考模型成为了互联网的主流参考模型。
TCP/IP模型在结构上与OSI模型类似,采用分层架构,同时层与层之间联系紧密。
TCP/IP标准参考模型将OSI中的数据链路层和物理层合并为网络接入层,这种划分方式其实是有悖于现实协议制定情况的,故融合了TCP/IP标准模型和OSI模型的TCP/IP对等模型被提出,后面的讲解也都将基于这种模型。
2.3TCP/IP常见协议
TCP/IP协议栈定义了一系列的标准协议。
应用层
- HTTP(Hypertext Transfer Protocol,超文本传输协议):用来访问在网页服务器上的各种页面。
- FTP(File Transfer Protocol,文件传输协议):为文件传输提供了途径,它允许数据从一台主机传送到另一台主机上。
- DNS(Domain Name Service,域名称解析服务):用于实现从主机域名到IP地址之间的转换。
传输层
- TCP (Transmission Control Protocol,传输控制协议) :为应用程序提供可靠的面向连接的通信服务。目前,许多流行的应用程序都使用TCP。
- UDP(User Datagram Protocol,用户数据报协议):提供了无连接通信,且不对传送数据包进行可靠性的保证。
网络层
- IP(Internet Protocol,互联网协议):将传输层的数据封装成数据包并完成源站点到目的站点的转发,提供无连接的、不可靠的服务。
- IGMP(Internet Group Management Protocol,因特网组管理协议):负责IP组播成员管理的协议。它用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。
- ICMP(Internet Control Message Protocol,网际报文控制协议):基于IP协议在网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈。通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。
数据链路层
- PPP(Point-to-Point Protocol,点对点协议):一种点对点模式的数据链路层协议,多用于广域网。
- Ethernet( 以太网协议 ):一种多路访问广播型数据链路层协议,是当前应用最为广泛的局域网技术。
- PPPoE(Point-to-Point Protocol over Ethernet,以太网承载PPP协议):PPPoE提供通过简单桥接访问设备(接入设备)把一个网络的多个主机连接到远程访问集中器的功能。常见的应用有家庭宽带拨号上网。
2.4常见协议标准化组织
- IETF(Internet Engineering Task Force)
- 负责开发和推广互联网协议(特别是构成TCP/IP协议族的协议)的志愿组织,通过RFC发布新的或者取代老的协议标准。
- IEEE(Institute of Electrical and Electronics Engineers)
- IEEE制定了全世界电子、电气和计算机科学领域30%左右的标准,比较知名的有IEEE802.3(Ethernet)、IEEE802.11(WiFi)等。
- ISO(International Organization for Standardization)
- 在制定计算机网络标准方面,ISO是起着重大作用的国际组织,如OSI模型,定义于ISO/IEC 7498-1。
2.5应用层
- 应用层为应用软件提供接口,使应用程序能够使用网络服务。应用层协议会指定使用相应的传输层协议,以及传输层所使用的端口等。
- 每一个应用层协议,在传输层都有一个或多个已分配的端口号进行标识,让接受主机了解该数据时访问的何种应用层协议。
- 应用层的PDU被称为==Data(数据)==。
TCP/IP每一层都让数据得以通过网络进行传输,这些层之间使用PDU(Packet Data Unit,协议数据单元)彼此交换信息,确保网络设备之间能够通信。不同层的PDU中包含有不同的信息,因此PDU在不同层被赋予了不同的名称。
2.5.1常见应用层协议 - FTP
- FTP(File Transfer Protocol)是一个用于从一台主机传送文件到另一台主机的协议,用于文件的“下载”和“上传”,它采用C/S(Client/Server)结构。
- FTP File Transfer Protocol ,文件传输协议,提供可靠的文件传输服务,具有认证、权限等功能
- TFTP Trivial File Transfer Protocol,简单文件传输协议,提供不可靠的文件传输服务,常用于网络设备的配置文件和系统文件传输
2.5.2常见应用层协议 - Telnet
- Telnet是数据网络中提供远程登录服务的标准协议。 Telnet为用户提供了在本地计算机上完成远程设备工作的能力。
- 远程管理的主要协议(网络设备、服务器、数据库等)
- 常用终端工具有:SecureCRT、Putty、Xshell、MobaXterm(推荐)
注意:Telnet传输为明文传输,存在安全隐患。
2.5.3常见应用层协议 - HTTP
- HTTP(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
- 帮助客户端访问万维网(World Wide Web)
- 网页浏览器通过翻译HTML(超文本标识语言)文件来表现文本、图像、音乐、动画及视频等对象
2.5.4常见应用层协议 - DNS
DNS:Domain Name System,域名解析系统
建立IP地址与域名之间的映射关系
将域名解析为IP地址
将IP地址解析为域名
nslookup DNS调试工具
ipconfig /displaydns 查看DNS缓存
ipconfig /flushdns 清空DNS缓存
2.5.5常见应用层协议 - SMTP与POP3
SMTP
- Simple Mail Transfer Protocol,简单邮件传输协议,用于发送邮件
POP3
- Post Office Protocol v3,邮局协议版本3,用于接收邮件
IMAP
- Internet Message Access Protocol),互联网邮件访问协议,类似POP3,功能更多
注意:网页版邮箱如qq邮箱是通过http协议传输的。outlook,Foxmail邮箱是通过上述协议传输和获取邮件(通常经过SSL加密)。
2.6传输层
- 传输层协议接收来自应用层协议的数据,封装上相应的传输层头部,帮助其建立“==端到端==”(Port to Port)的连接。
- 利用报文的5元祖来区分不同“端到端”通信:SIP+DIP+(TCP/UDP)+SPORT+DPORT
- 传输层的PDU被称为==Segment(段)==。
2.6.1TCP和UDP – 报文格式
- TCP报文头部:
- Source Port:源端口,标识哪个应用程序发送。长度为16比特。
- Destination Port目:的端口,标识哪个应用程序接收。长度为16比特。
- Sequence Number:序号字段。TCP链接中传输的数据流每个字节都编上一个序号。序号字段的值指的是本报文段所发送数据的第一个字节的序号。长度为32比特。
- Acknowledgment Number:确认序列号,是期望收到对方下一个报文段数据的第1个字节的序号,即上次已成功接收到的数据段的最后一个字节数据的序号加1。只有Ack标识为1,此字段有效。长度为32比特。
- Header Length:头部长度,指出TCP报文头部长度,以32比特(4字节)为计算单位。若无选项内容,则该字段为5,即头部为20字节。
- Reserved:保留,必须填0。长度为6比特。
- Control bits:控制位,包含FIN、ACK、SYN等标志位,代表不同状态下的TCP数据段。
- Window:窗口TCP的流量控制,这个值表明当前接收端可接受的最大的数据总数(以字节为单位)。窗口最大为65535字节。长度为16比特。
- Checksum:校验字段,是一个强制性的字段,由发端计算和存储,并由收端进行验证。在计算检验和时,要包括TCP头部和TCP数据,同时在TCP报文段的前面加上12字节的伪头部。长度为16比特。
- Urgent:紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。长度为16比特。
- Options:选项字段(可选),长度为0-40字节。
- UDP报文头部:
- Source Port:源端口,标识哪个应用程序发送。长度为16比特。
- Destination Port:目的端口,标识哪个应用程序接收。长度为16比特。
- Length:该字段指定UDP报头和数据总共占用的长度。可能的最小长度是8字节,因为UDP报头已经占用了8字节。由于这个字段的存在,UDP报文总长不可能超过65535字节(包括8字节的报头,和65527字节的数据)。
- Checksum:覆盖UDP头部和UDP数据的校验和,长度为16比特。
2.6.2TCP和UDP – 端口号
- 客户端使用的源端口一般随机分配,目标端口则由服务器的应用指定;
- 源端口号一般为系统中未使用的,且大于1023;
- 目的端口号为服务端开启的应用(服务)所侦听的端口,如HTTP缺省使用80。
可以实现利用一个地址访问同一个地址的不同服务或者相同服务
可以实现利用一个地址访问不同地址的不同服务或者相同服务
2.6.3TCP的建立 - 三次握手
- 任何基于TCP的应用,在发送数据之前,都需要由TCP进行“三次握手”建立连接。
- TCP连接建立的详细过程如下:
- 由TCP连接发起方(图中PC1),发送第一个SYN位置1的TCP报文。初始序列号a为一个随机生成的数字,因为没收到过来自PC2的任何报文,所以确认序列号为0 ;
- 接收方(图中PC2)接收到合法的SYN报文之后,回复一个SYN和ACK置1的TCP报文。初始序列号b为一个随机生成的数字,同时因为此报文是回复给PC1的报文,所以确认序列号为a+1;
- PC1接收到PC2发送的SYN和ACK置位的TCP报文后,回复一个ACK置位的报文,此时序列号为a+1,确认序列号为b+1。PC2收到之后,TCP双向连接建立。
抓包流程图:
2.6.4TCP的序列号与确认序列号
- TCP使用序列号和确认序列号字段实现数据的可靠和有序传输。
- 假设PC1要给PC2发送一段数据,传输过程如下:
- PC1将全部待TCP发送的数据按照字节为单位编上号。假设第一个字节的编号为“a+1”,第二个字节的序号为“a+2”,依次类推。
- PC1会把每一段数据的第一个字节的编号作为序列号(Sequence number),然后将TCP报文发送出去。
- PC2在收到PC1发送来的TCP报文后,需要给予确认同时请求下一段数据,如何确定下一段数据呢?序列号( a+1 )+载荷长度=下一段数据的第一个字节的序号(a+1+12)
- PC1在收到PC2发送的TCP报文之后,发现确认序列号为“a+1+12” ,说明“a+1”到“a+12”这一段的数据已经被接受,需要从“a+1+12”开始发送。为了提升发送效率,也可以一次性发送多段数据,由接收方统一确认。
思考题答案:
服务器回报,报文实际负载为0, 没有具体数据发送给PC,只是对PC发过来的数据进行确认。Seq=b+1。在确认报文的时候没有实际数据的发送,只作确认作用。
2.6.5TCP的窗口滑动机制
- TCP通过滑动窗口机制来控制数据的传输速率。
- 在TCP三次握手建立连接时,双方都会通过Window字段告诉对方本端最大能够接受的字节数(也就是缓冲区大小)。
- 连接建立成功之后,发送方会根据接受方宣告的Window大小发送相应字节数的数据。
- 接受方接受到数据之后会放在缓冲区内,等待上层应用来取走缓冲的数据。若数据被上层取走,则相应的缓冲空间将被释放。
- 接收方根据自身的缓存空间大小通告当前的可以接受的数据大小( Window )。
- 发送方根据接收方当前的Window大小发送相应数量的数据。
思考题答案:
不是没有变化,而是PC1处理后,窗口本身有3个,代表有发送3个窗口的能力。
实际抓包图:
2.6.6TCP重传机制
重传机制
TCP重传机制主要是为了防止包丢弃,重传的工作方式主要借助TCP头部中的序列号和确认号来决定是否重传,重传的触发方式主要由以下几种:
- 超时重传
- 快速重传
- SACK
- D-SACK
超时重传
发送方在发送数据时设置一个定时器,当超过指定时间后如果还没有收到接收方的ACK响应,就会重发数据包。
超时重传的发生场景:
- 数据包丢失
- ACK响应丢失
什么是RTT?什么是RTO?
RTT就是数据包的往返时间
RTO就是超时重传时间。
RTO的长短对数据包的重传有什么影响?
- 如果过长,假设发生数据包丢失,那么需要很长时间才能重传,效率低下
- 如果过短,如果数据包因为网络状况阻塞传输慢但没有丢失,这时也会触发重传,会导致网络更加阻塞,触发更多的重传。
RTO如何设置?
精确的测量超时时间
RTO
的值是非常重要的,这可让我们的重传机制更高效。根据上述的两种情况,我们可以得知,超时重传时间 RTO 的值应该略大于报文往返 RTT 的值。
至此,可能大家觉得超时重传时间
RTO
的值计算,也不是很复杂嘛。好像就是在发送端发包时记下t0
,然后接收端再把这个ack
回来时再记一个t1
,于是RTT = t1 – t0
。没那么简单,这只是一个采样,不能代表普遍情况。实际上「报文往返 RTT 的值」是经常变化的,因为我们的网络也是时常变化的。也就因为「报文往返 RTT 的值」 是经常波动变化的,所以「超时重传时间 RTO 的值」应该是一个动态变化的值。
我们来看看 Linux 是如何计算
RTO
的呢?估计往返时间,通常需要采样以下两个:
需要 TCP 通过采样 RTT 的时间,然后进行加权平均,算出一个平滑 RTT 的值,而且这个值还是要不断变化的,因为网络状况不断地变化。
除了采样 RTT,还要采样 RTT 的波动范围,这样就避免如果 RTT 有一个大的波动的话,很难被发现的情况。
RFC6289 建议使用以下的公式计算 RTO:
# 首次计算RTO,R1为第一次测量的RTT
SRTT = R1
DevRTT = R1/2
RTO = μ * SRTT + δ * DevRTT = μ * R1 + δ * (R1/2)
# 后续计算RTO,R2为新测量的RTT
# SRTT是平滑的RTT值
SRTT = SRTT + α * (RTT - SRTT) = R1 + α * (R2 - R1)
# DevRTT是平滑的RTT和当前的RTT之间的差值
DevRTT = (1 - β) * DevRTT + β * (|RTT-SRTT|)= (1 - β) * (R1/2) + β * (R2 - R1)
RTO = μ * SRTT + δ * DevRTT
其中
SRTT
是计算平滑的RTT ,DevRTR
是计算平滑的RTT 与 最新 RTT 的差距。在 Linux 下,α = 0.125,β = 0.25, μ = 1,∂ = 4。这是大量实验中调出来的。
假设因为网络阻塞触发了超时,如何避免频繁重发加剧网络阻塞?
如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是==超时间隔加倍==。
也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
超时重传的弊端是什么?
超时周期可能相对较长,重传的等待时间可能过长。
快速重传
什么是快速重传?
快速重传不再以时间作为重传的标准,而是以数据作为重传的标准。
在上图,发送方发出了 1,2,3,4,5 份数据:
- 第一份 Seq1 先送到了,于是就 Ack 回 2;
- 结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;
- 后面的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;
- 发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。
- 最后,收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。
所以,快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。
比如对于上面的例子,是重传 Seq2 呢?还是重传 Seq2、Seq3、Seq4、Seq5 呢?因为发送端并不清楚这连续的三个 Ack 2 是谁传回来的。
根据 TCP 不同的实现,以上两种情况都是有可能的。可见,这是一把双刃剑。
为了解决不知道该重传哪些 TCP 报文,于是就有 SACK
方法。
SACK 方法
还有一种实现重传机制的方式叫:SACK
( Selective Acknowledgment 选择性确认)。
这种方式需要在 TCP 头部「选项」字段里加一个 SACK
的东西,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK
信息发现只有 200~299
这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。
如果要支持 SACK
,必须双方都要支持。在 Linux 下,可以通过 net.ipv4.tcp_sack
参数打开这个功能(Linux 2.4 后默认打开)。
Duplicate SACK
Duplicate SACK 又称 D-SACK
,其主要使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。
下面举例两个栗子,来说明 D-SACK
的作用。
- 「接收方」发给「发送方」的两个 ACK 确认应答都丢失了,所以发送方超时后,重传第一个数据包(3000 ~ 3499)
- 于是「接收方」发现数据是重复收到的,于是回了一个 SACK = 3000~3500,告诉「发送方」 3000~3500 的数据早已被接收了,因为 ACK 都到了 4000 了,已经意味着 4000 之前的所有数据都已收到,所以这个 SACK 就代表着
D-SACK
。 - 这样「发送方」就知道了,数据没有丢,是「接收方」的 ACK 确认报文丢了。
- 数据包(1000~1499) 被网络延迟了,导致「发送方」没有收到 Ack 1500 的确认报文。
- 而后面报文到达的三个相同的 ACK 确认报文,就触发了快速重传机制,但是在重传后,被延迟的数据包(1000~1499)又到了「接收方」;
- 所以「接收方」回了一个 SACK=1000~1500,因为 ACK 已经到了 3000,所以这个 SACK 是 D-SACK,表示收到了重复的包。
- 这样发送方就知道快速重传触发的原因不是发出去的包丢了,也不是因为回应的 ACK 包丢了,而是因为网络延迟了。
可见,D-SACK
有这么几个好处:
- 可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
- 可以知道是不是「发送方」的数据包被网络延迟了;
- 可以知道网络中是不是把「发送方」的数据包给复制了;
在 Linux 下可以通过 net.ipv4.tcp_dsack
参数开启/关闭这个功能(Linux 2.4 后默认打开)。
实际抓包图:
2.6.7TCP的关闭 - 四次挥手
- 当数据传输完成,TCP需要通过“四次挥手”机制断开TCP连接,释放系统资源。
- TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。如图所示:
- 由PC1发出一个FIN字段置”1 ”的不带数据的TCP段;
- PC2收到PC1发来的FIN置位的TCP报文后,会回复一个ACK置位的TCP报文。
- 若PC2也没有需要发送的数据,则直接发送FIN置位的TCP报文。假设此时PC2还有数据要发送,那么当PC2发送完这些数据之后会发送一个FIN置位的TCP报文去关闭连接。
- PC1收到FIN置位的TCP报文,回复ACK报文,TCP双向连接断开。
实际抓包图:
2.6.8TCP抓包完整流程图
2.7网络层
- 传输层负责建立主机之间进程与进程之间的连接,而网络层则负责数据从一台主机到另外一台主机之间的传递。
- 网络层的PDU被称为==Packet(包)==。
IPv4( Internet Protocol Version 4),简称IP,是目前应用最广泛的网络层协议。
2.7.1网络层协议工作过程
- 当采用IP作为网络层协议时,通信的双方都会被分配到一个“独一无二”的IP地址来标识自己。IP地址可被写成32位的二进制整数值形式,但为了方便人们阅读和分析,它通常被写成点分十进制的形式,即四个字节被分开用十进制表示,中间用点分隔,比如192.168.1.1。
- IP数据包的封装与转发:
- 网络层收到上层(如传输层)协议传来的数据时候,会封装一个IP报文头部,并且把源和目的IP地址都添加到该头部中。
- 中间经过的网络设备(如路由器),会维护一张指导IP报文转发的“地图”——路由表,通过读取IP数据包的目的地址,查找本地路由表后转发IP数据包。
- IP数据包最终到达目的主机,目的主机通过读取目的IP地址确定是否接受并做下一步处理。
- 除了IP协议外,网络层中还有如OSPF、IS-IS、BGP等各种路由协议帮助路由器建立路由表,ICMP帮忙进行网络的控制和状态诊断。
2.8数据链路层
- 数据链路层位于网络层和物理层之间,可以向网络层的IP、IPv6等协议提供服务。
- 数据链路层的PDU被称为==Frame(帧)==。
- 以太网(Ethernet)是最常见的数据链路层协议。
2.8.1以太网的发展
- 当今主导地位的局域网组网技术。
- 20世纪70年代,由Xerox公司联合Intel和DEC公司开发出以太网
- 1973年,传输速率 3Mb/s(实验室)
- 1980年,传输速率 10Mb/s
- 1990年,出现双绞线介质的以太网
- 1992年,传输速率 100Mb/s
- 1998年,传输速率 1000Mb/s
- 2010年,IEEE发布40G/100G标准
- 2013年,400G的以太网标准工作正式启动!
2.8.2以太网的分类
2.8.3以太网的标准
2.8.4以太网MAC地址
MAC地址由48比特(6个字节)长,12位的16进制数字组成。例如:48-A4-72-1C-8F-4F
- MAC地址由两部分组成,分别是供应商代码和序列号。其中前24位代表该供应商代码,由IEEE管理和分配。剩下的24位序列号由厂商自己分配。
- 如同每一个人都有一个名字一样,每一台网络设备都用物理地址来标识自己,这个地址就是MAC地址。网络设备的MAC地址是全球唯一的。MAC地址长度为48比特,通常用十六进制表示。
- MAC地址包含两部分:前24比特是组织唯一标识符(OUI,OrganizationallyUnique Identifier),由IEEE统一分配给设备制造商。例如,华为的网络产品的MAC地址前24比特是0x00eOfc。后24位序列号是厂商分配给每个产品的唯一数值,由各个厂商自行分配(这里所说的产品可以是网卡或者其他需要MAC地址的设备)。
2.8.5以太网帧结构
网络中传输数据时需要定义并遵循一些标准,以太网是根据==IEEE 802.3==标准来管理和控制数据帧的。了解IEEE 802.3标准是充分理解以太网中链路层通信的基础。
数据包在以太网物理介质上传播之前必须封装头部和尾部信息,封装后的数据包称为数据帧,数据帧中封装的信息决定了数据如何传输。以太网上传输的数据帧有两种格式,选择哪种格式由TCP/IP协议簇中的网络层决定。
帧格式
- IEEE802.3
- Ethernet_II
以太网上使用两种标准帧格式。第一种是上世纪80年代初提出的DIX v2格式,即EthernetⅡ帧格式。EthernetⅡ后来被IEEE 802标准接纳,并写进了IEEE 802.3x-1997的3.2.6节。
第二种是1983年提出的IEEE 802.3格式。这两种格式的主要区别在于EthernetⅡ格式中包含一个Type字段,标识以太帧处理完成之后将被发送到哪个上层协议进行处理,IEEE802.3格式中,同样的位置是长度字段。
不同的Type字段值可以用来区别这两种帧的类型,当Type字段值小于等于1500(或者十六进制的0x05DC)时,帧使用的是IEEE 802.3格式。当Type字段值大于等于1536(或者十六进制的0x0600)时,帧使用的是EthernetⅡ格式。以太网中大多数的数据帧使用的是Ethernet Ⅱ格式。
以太帧中还包括源和目的MAC地址,分别代表发送者的MAC和接收者的MAC,此外还有帧校验序列字段,用于检验传输过程中帧的完整性。
Ethernet_II帧格式
Ethernet_II的帧中各字段说明如下:
DMAC(Destination MAC):是目的MAC地址。DMAC字段长度为6个字节,标识帧的接收者。
SMAC(Source MAC):是源MAC地址。SMAC字段长度为6个字节,标识帧的发送者。
类型字段(Type):用于标识数据字段中包含的高层协议,该字段长度为2个字节。类型字段取值为0x0800的帧代表IP协议帧;类型字段取值为0x0806的帧代表ARP协议帧。
数据字段(Data):是网络层数据,最小长度必须为46字节以保证帧长至少为64字节,数据字段的最大长度为1500字节。
循环冗余校验字段(FCS):提供了一种错误检测机制。该字段长度为4个字节。
- 帧大小范围:64~1518
- MTU:最大传输单元,默认1500字节,每次发送的数据的最大值
- 帧校验:通过一定的计算公式对数据包进行计算
IEEE802.3帧格式
IEEE802.3帧格式类似于EthernetⅡ帧,只是EthernetI帧的Type域被802.3帧的Length域取代,并且占用了Data字段的8个字节作为LLC和SNAP字段。
Length字段:定义了Data字段包含的字节数。
逻辑链路控制LLC(Logical Link Control):由目的服务访问点DSAP(DestinationService Access Point)、源服务访问点SSAP(Source Service Access Point)和Control字段组成。
SNAP(Sub-network Access Protocol):由机构代码(Org Code)和类型(Type)字段组成。Org Code三个字节都为0。Type字段的含义与Ethernet_Ⅱ帧中的Type字段相同。
IEEE802.3帧根据DSAP和SSAP字段的取值又可分为以下几类:
- 当DSAP和SSAP都取特定值0xff时,802.3帧就变成了Netware-ETHERNET帧,用来承载NetWare类型的数据。
- 当DSAP和SSAP都取特定值Oxaa时,802.3帧就变成了ETHERNET_SNAP帧。ETHERNET_SNAP帧可以用于传输多种协议。
- DSAP和SSAP其他的取值均为纯IEEE802.3帧。
2.8.6数据链路层的分层
LLC (Logical Link Control ),逻辑链路控制
负责识别网络层的协议类型,接收上层数据包封装成帧后,向下层传递
MAC (Media Access Control) ,介质访问控制
- 负责控制与连接物理层的物理介质
- 处理硬件设备的物理寻址、定义网络拓扑及数据帧的传递顺序
2.8.7地址解析协议 (ARP)
- ARP,地址解析协议,根据IP地址获取物理地址。
Request
是用于获取局域网内某IP对应的MAC地址。Response
是用于响应局域网中ARP Request并提供目标设备MAC地址。
注意:ARP是网络层协议,放在这里方便理解以太网数据链路层工作流程。ARP是广播
ARP格式
- ARP (Address Resolution Protocol)地址解析协议:根据已知的IP地址解析获得其对应的MAC地址。
- ARP(Address Resolution Protocol,地址解析协议)是根据IP地址获取数据链路层地址的一个TCP/IP协议。
- ARP是IPv4中必不可少的一种协议,它的主要功能是:
- 将IP地址解析为MAC地址;
- 维护IP地址与MAC地址的映射关系的缓存,即==ARP表项==;
- 实现网段内重复IP地址的检测。
网络设备通过ARP报文来发现目的MAC地址。ARP报文中包含以下字段:
- Hardware Type表示硬件地址类型,一般为以太网;
- Protocol Type表示三层协议地址类型,一般为IP;
- Hardware Length和Protocol Length为MAC地址和IP地址的长度,单位是字节;
- Operation Code指定了ARP报文的类型,包括ARP Request和ARP Reply;
- Source Hardware Address指的是发送ARP报文的设备MAC地址;
- Source Protocol Address指的是发送ARP报文的设备IP地址;
- Destination Hardware Address指的是接收者MAC地址,在ARP Request报文中,该字段值为0;
- Destination Protocol Address指的是接收者的IP地址。
ARP原理
ARP的工作原理 (1)
网络设备一般都有一个ARP缓存(ARP Cache)。ARP缓存用来存放IP地址和MAC地址的关联信息。
在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的ARP表项,则直接采用该表项中的MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应信息,则通过发送ARP Request报文来获得它。
学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内(缺省:==180s==),设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。过了这段有效期,ARP表项会被自动删除。
如果目标设备位于其他网络,则源设备会在ARP缓存表中查找网关的MAC地址。然后将数据发送给网关。最后网关再把数据转发给目的设备。
ARP的工作原理 (2)
- 主机1的ARP缓存表中不存在主机2的MAC地址,所以主机1会发送ARP Request来获取目的MAC地址。
- ARP Request报文封装在以太帧里。帧头中的源MAC地址为发送端主机1的MAC地址。此时,由于主机1不知道主机2的MAC地址,所以目的MAC地址为==广播地址FF-FF-FF-FF-FF-FF==。
- ARP Request报文中包含发送端MAC地址、发送端IP地址、目 的端MAC地址、目的端IP地址,其中目的端MAC地址的值为0。ARP Request报文会在整个网络上传播,该网络中所有主机包括网关都会接收到此ARP Request报文。
ARP的工作原理 (3)
- 所有的主机接收到该ARP Request报文后,都会检查它的目的端IP地址字段与自身的IP地址是否匹配。
- 如果不匹配,则该主机将不会响应该ARP Request报文。
- 如果匹配,则该主机会将ARP请求报文中的发送端MAC地址和发送端IP地址信息记录到自己的ARP缓存表中,然后通过ARP Reply报文进行响应。
ARP的工作原理 (4)
- 主机2会向主机1回应ARP Reply报文。
- ARP Reply报文中的发送端IP地址是主机2自己的IP地址,目的端IP地址是主机1的IP地址,目的端MAC地址是主机1的MAC地址,发送端MAC地址是自己的MAC地址,同时操作类型被设置为Reply。
- ARP Reply报文通过单播传送。
ARP的工作原理 (5)
- 主机1收到ARP Reply以后,会检查ARP报文中目的端IP地址字段与自身的IP地址是否匹配。如果匹配,ARP报文中的发送端MAC地址和发送端IP地址会被记录到主机1的ARP缓存表中。
ARP代理
ARP报文不能穿越路由器,不能被转发到其他广播域
同一网段、不同物理网络上的计算机之间,可以通过ARP代理实现相互通信。
在上述例子的组网中,主机A需要与主机B通信时,目的IP地址与本机的IP地址在同一个网段,所以A将会以广播形式发送ARP Request报文,请求主机B的MAC地址。但是,广播报文无法被路由器转发,所以主机B无法收到主机A的ARP请求报文,当然也就无法应答。
在路由器上启用代理ARP功能,就可以解决这个问题。启用代理ARP后,路由器收到这样的请求,会查找路由表,如果存在主机B的路由表项,路由器将会使用自己的G0/0/0接口的MAC地址来回应该ARP Request。主机A收到ARP Reply后,将以路由器的G0/0/0接口MAC地址作为目的MAC地址进行数据转发。
免费ARP
- 免费ARP可以用来探测IP地址是否冲突
主机被分配了IP地址或者IP地址发生变更后,必须立刻检测其所分配的IP地址在网络上是否是唯一的,以避免地址冲突。主机通过发送ARP Request报文来进行地址冲突检测。
主机A将ARP Request广播报文中的目的IP地址字段设置为自己的IP地址,且该网络中所有主机包括网关都会接收到此报文。当目的IP地址已经被某一个主机或网关使用时,该主机或网关就会回应ARP Reply报文。通过这种方式,主机A就能探测到IP地址冲突了。
2.8.8单播、组播、广播
单播
- 局域网上的帧可以通过三种方式发送。第一种是单播,指从单一的源端发送到单一的目的端。
- 每个主机接口由一个MAC地址唯一标识,MAC地址的OUI中,第一字节第8个比特表示地址类型。对于主机MAC地址,这个比特固定为0,表示目的MAC地址为此MAC地址的帧都是发送到某个唯一的目的端。
- 在冲突域中,所有主机都能收到源主机发送的单播帧,但是其他主机发现目的地址与本地MAC地址不一致后会丢弃收到的帧,只有真正的目的主机才会接收并处理收到的帧。
组播
第二种发送方式为组播,组播比广播更加高效。组播转发可以理解为选择性的广播,主机侦听特定组播地址,接收并处理目的MAC地址为该组播MAC地址的帧。
组播MAC地址和单播MAC地址是通过第一字节中的第8个比特区分的。组播MAC地址的第8个比特为1,而单播MAC地址的第8个比特为0。
当需要网络上的一组主机(而不是全部主机)接收相同信息,并且其他主机不受影响的情况下通常会使用组播方式。
广播
第三种发送方式是广播,表示帧从单一的源发送到共享以太网上的所有主机。广播帧的目的MAC地址为十六进制的FF:FF:FF:FF:FF:FF,所有收到该广播帧的主机都要接收并处理这个帧。
广播方式会产生大量流量,导致带宽利用率降低,进而影响整个网络的性能。
当需要网络中的所有主机都能接收到相同的信息并进行处理的情况下,通常会使用广播方式。
2.8.9数据帧的发送和接收
- 当主机接收到的数据帧所包含的目的MAC地址是自己时,会把以太网封装剥掉后送往上层协议。
- 帧从主机的物理接口发送出来后,通过传输介质传输到目的端。共享网络中,这个帧可能到达多个主机。
- 主机检查帧头中的目的MAC地址
- 如果目的MAC地址不是本机MAC地址,也不是本机侦听的组播或广播MAC地址,则主机会丢弃收到的帧。
- 如果目的MAC地址是本机MAC地址,则接收该帧,检查帧校验序列(FCS)字段,并与本机计算的值对比来确定帧在传输过程中是否保持了完整性。
- 如果帧的FCS值与本机计算的值不同,主机会认为帧已被破坏,并会丢弃该帧。如果该帧通过了FCS校验,则主机会根据帧头部中的Type字段来确定将帧发送给上层哪个协议处理。
- 本例中,Type字段的值为0x0800,表明该帧需要发送到IP协议上处理。在发送给IP协议之前,帧的头部和尾部会被剥掉。
2.9物理层
- 数据到达物理层之后,物理层会根据物理介质的不同,将数字信号转换成光信号、电信号或者是电磁波信号。
- 物理层的PDU被称为==比特流(Bitstream)==。
2.9.1常见传输介质
- 双绞线:当今以太网最常见的传输介质,按照抗电磁干扰能力还可以分为:
- STP-屏蔽双绞线
- UTP-非屏蔽双绞线
- 光纤传输,按照功能部件可分为:
- 光纤:光传输介质,简单的说,就是一根玻璃纤维,用于约束光传输的通道。
- 光模块:将电信号与光信号互转的器件,产生光信号。
- 串口电缆在WAN(Wide Area Network,广域网)中大规模使用,根据WAN线路类型不同,串口电缆在设备上连接的接口类型也不同:异/同步串口、ATM接口、POS接口、CE1/PRI接口等。
- 无线信号的传输可以通过电磁波进行,例如:无线路由器将数据通过调制以电磁波发送出去,移动终端的无线网卡将电磁波解调,得到数据,完成从无线路由器到移动终端的数据传输。
2.9.2物理层封装
3.数据通信过程
3.1发送方数据封装
- 假设你正在通过网页浏览器访问华为官网,当你输入完网址,敲下回车后,计算机内部会发生下列事情:
- IE浏览器(应用程序)调用HTTP(应用层协议),完成应用层数据的封装(图中DATA还应包括HTTP头部,此处省略) 。
- HTTP依靠传输层的TCP进行数据的可靠性传输,将封装好的数据传递到TCP模块。
- TCP模块给应用层传递下来的Data添加上相应的TCP头部信息(源端口、目的端口等)。此时的PDU被称作Segment(段)。
- 在IPv4网络中,TCP模块会将封装好的Segment传递给网络层的IPv4模块(若在IPv6环境,会交给IPv6模块进行处理)。
- IPv4模块在收到TCP模块传递来的Segment之后,完成IPv4头部的封装,此时的PDU被称为Packet(包)。
- 由于使用了Ethernet作为数据链路层协议,故在IPv4模块完成封装之后,会将Packet交由数据链路层的Ethernet模块(例如以太网卡)处理。
- Ethernet模块在收到IPv4模块传递来的Packet之后,添加上相应的Ethernet头部信息和FCS帧尾,此时的PDU被称为Frame(帧)。
- 在Ethernet模块封装完毕之后,会将数据传递到物理层。
- 根据物理介质的不同,物理层负责将数字信号转换成电信号,光信号,电磁波(无线)信号等。
- 转换完成的信号在网络中开始传递。
3.2中间网络数据传输
- 封装好的完整数据,将会在网络中被传递。
- 一般情况下:
- 网络中的二层设备(如以太网交换机)只会解封装数据的二层头部,根据二层头部的信息进行相应的“==交换==”操作。
- 网络中的三层设备(如路由器)只会解封装到三层头部,并且根据三层头部的信息进行相应的“==路由==”操作。
- 注:“交换”和“路由”的详细细节和原则,将会在后面的课程中详细介绍。
3.3接收方数据解封装
- 经过中间网络传递之后,数据最终到达目的服务器。根据不同的协议头部的信息,数据将被一层层的解封装并做相应的处理和传递,最终交由WEB服务器上的应用程序进行处理。
- 不论是OSI参考模型还是TCP/IP参考模型,都采用了分层的设计理念。
- 各个层次之间分工、界限明确,有助于各个部件的开发、设计和故障排除
- 通过定义在模型的每一层实现什么功能,鼓励产业的标准化
- 通过提供接口的方式,使得各种类型的网络硬件和软件能够相互通信,提高兼容性
- 数据的产生与传递,需要各模块之间相互协作,同时每个模块又需要“各司其职”。
3.4数据转发过程案例
3.4.1转发过程概述
数据可以在同一网络内或者不同网络间传输,数据转发过程也分为本地转发和远程转发,但两者的数据转发原理是基本一样的,都是遵循TCP/IP协议簇。
本示例中,主机A需要访问服务器A的Web服务,并且假定两者之间已经建立了TCP连接。接下来会以此示例来讲解数据在不同网络间的传输过程。
3.4.2TCP封装
- 当主机建立了到达目的地的TCP连接后,便开始对应用层数据进行封装。
- 主机A会对待发送的应用数据首先执行加密和压缩等相关操作,之后进行传输层封装。Web应用是基于传输层的TCP协议传输数据的。主机A使用TCP进行报文封装时,必须填充源端口和目的端口字段,初始序列号和确认序列号字段,标识位,窗口字段以及校验和字段。
- 此例中数据段的源端口号为主机A随机选择的1027号端口,目的端口号为服务器A的TCP知名端口80。
3.4.3IP封装
主机A完成传输层封装后,一般会进行网络层数据封装,在使用IP进行封装时,需要明确IP报文的源和目的地址。如果IP报文的大小大于网络的最大传输单元(MTU),则该报文有可能在传输过程中被分片。
生存时间(TTL)字段用来减少网络环路造成的影响。ARG3系列路由器产生的数据包,默认TTL值为255。路由器转发一个数据包时,该值会被减1,如果路由器发现该值被减为0,就会丢弃该数据包。这样,即使网络中存在环路,数据包也不会在网络上一直被转发。
协议字段标识了传输层所使用的协议。本例中,传输层使用的是TCP协议,所以该字段的填充值为0X06。
3.4.4查找路由
- 主机A必须有到达目的地的路由
- 每个主机都会独自维护各自的路由表项。
- 主机A在发送数据前需要先检查是否能够到达目的端,这个过程是通过查找路由来完成的。在此示例中,主机A拥有一条到达“任何网络”(在IP编址部分已经简要介绍过)的路由,它发往其他网络的数据都会通过IP地址为10.1.1.1的接口转发到下一跳,即网关10.1.1.254。
3.4.5ARP
- 通过ARP缓存表找到下一跳的MAC地址。如果表项里没有下一跳的MAC地址,主机A会发送ARP请求。
接下来,由于数据包要被封装成数据帧,所以主机A需要获取下一跳的MAC地址,也就是网关的MAC地址。主机首先会查询ARP缓存表。本例中,主机A的ARP缓存表中存在网关MAC地址的表项。
如果没有查找到网关的MAC地址表项,主机A会通过发送ARP请求来获取网关的MAC地址。
3.4.6以太网封装
- 主机A在链路层封装数据帧时,会遵循IEEE 802.3或Ethernet_I标准,Ethernet_Ⅱ帧头中的类型字段填充为0x0800,以表示网络层使用的是IP协议。源MAC地址为主机A的MAC地址,目的MAC地址为网关路由器E0/0接口的MAC地址。
3.4.7数据帧转发过程
- 主机工作在半双工状态下,所以会使用CSMA/CD来检测链路是否空闲。
- 前导码用于使接收者进入同步状态,定界符用于指示帧的开始。
- 主机A工作在半双工状态下,所以会使用
CSMA/CD
来检测链路是否空闲。- 如果链路空闲,主机A会将一个前导码(Preamble)和一个帧首定界符(SFD)附加到帧头然后进行传输。
- 前导码的作用是使接收设备进行同步并做好接收数据帧的准备。前导码是包括了7个字节的二进制“1”、 “0”交替的代码,即1010…10共56位。
- 帧首定界符是长度为1个字节的10101011二进制序列,它的作用是使接收端对帧的第一位进行定位。
同一个冲突域里的设备都会接收到主机A发送的数据帧。只有网关(RTA)会处理该数据帧,并继续转发。
本例中,主机A发送数据帧到共享以太网,此网络中的所有网络设备都会收到该帧。设备收到帧之后,首先会进行FCS校验。
- 如果FCS校验未能通过,则帧被立即丢弃。对于通过了FCS校验的帧,设备会检查帧中的目的MAC地址。
- 如果帧中的目的MAC地址与自己的MAC地址不同,设备将丢弃帧,如果相同,则会继续处理。
- 处理过程中,帧头帧尾会被剥去(也就是解封装),剩下的数据报文会被根据帧头中的类型字段的值来送到网络层中的对应协议模块去处理。
3.4.8数据包转发过程
- 网关检查是否具有到达目的网络的路由条目。如果存在转发路径,则为数据包添加一个新的二层帧头和帧尾,并继续转发。
RTA收到此数据报文后,网络层会对该报文进行处理。
- RTA首先根据IP头部信息中的校验和字段,检查IP数据报文头部的完整性,
- 然后根据目的IP地址查看路由表,确定是否能够将数据包转发到目的端。
- RTA还必须对TTL的值进行处理。
- 另外,报文大小不能超过MTU值。如果报文大小超过MTU值,则报文将被分片。
网络层处理完成后,报文将被送到数据链路层重新进行封装,成为一个新的数据帧,该帧的头部会封装新的源MAC地址和目的MAC地址。如果当前网络设备不知道下一跳的MAC地址,将会使用ARP来获得。
4.4.9数据帧解封装
- RTB以服务器A的MAC地址作为目的MAC继续转发。服务器A接收到该数据帧后,发现目的MAC为自己的MAC,于是会继续处理该数据帧。
该示例中,服务器A处于一个共享以太网中,两台服务器都会收到RTB发送的数据帧。该帧的目的MAC地址与服务器B的接口MAC地址不匹配,所以会被服务器B丢弃。
服务器A成功收到该帧,并通过FCS校验。服务器A将利用帧中的类型字段来识别在网络层处理该数据的协议。该示例中,服务器A会将解封装后的此数据交给网络层的IP协议来进行处理。
3.4.10数据包解封装
- 服务器A检查数据包的目的IP地址,发现目的IP与自己的IP地址相同。服务器A剥掉数据包的IP头部后,会送往上层协议TCP继续进行处理。
服务器A通过IP协议来处理该报文,首先会通过校验和字段来验证报文头的完整性,然后检查IP报文头中的目的IP地址是否与自己当前的IP地址匹配。
如果在源与目的之间的数据传输期间数据发生了报文分片,则报文会被目的端重新组合。
- 标识字段用于标识属于同一数据源的分片报文,
- 偏移量表示该分片在原分组中的相对位置。
- 标志字段目前只有两位有意义,
- 标志字段最低位为1,表示后面还有分片,为0表示这已经是最后一个数据片;
- 中间一位为1表示不能分片,为0表示允许分片。
所有的分片报文必须被目的端全部接收到后才会进行重新组合。
协议字段表示此数据包携带的上层数据是哪种协议的数据。需要注意的是,下一个报头并非总是传输层报头。例如,ICMP报文也是使用IP协议封装,协议字段值为0x01。
3.4.11数据段解封装
- 服务器A检查TCP头部的目的端口,然后将数据段发送给应用层的HTTP协议进行处理。
- 当IP报文头被处理完并剥离后,数据段会被发送到传输层进行处理。
- 在此示例中,传输层协议使用的是TCP,且发送端和接收端已经通过三次握手建立了连接。
- 传输层收到该数据段后,TCP协议会查看并处理该数据段头部信息,其中目的端口号为80,用于表示处理该数据的应用层协议为HTTP协议。TCP处理完头部信息后会将此数据段头部进行剥离,然后将剩下的应用数据发送到HTTP协议进行处理。