ARP协议

ARP报头

当网络设备有数据要发送给另一台网络设备时,必须要知道对方的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。通过目的IP地址来获取目的MAC地址的过程是由ARP(Address Resolution Protocol)协议来实现的。

ARP.png

数据链路层在进行数据封装时,需要目的MAC地址。

网络设备通过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数据包格式.png

ARP报文不能穿越路由器,不能被转发到其他广播域。

通过ARP协议,网络设备可以建立目标IP地址和MAC地址之间的映射。网络设备通过网络层获取到目的IP地址之后,还要判断目的MAC地址是否已知。

ARP缓存与工作过程

网络设备一般都有一个ARP缓存(ARP Cache),ARP缓存用来存放IP地址和MAC地址的关联信息。在发送数据前,设备会先查找ARP缓存表。如果缓存表中存在对方设备的MAC地址,则直接采用该MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应信息,则通过发送ARP Request报文来获得它。学习到的IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内,设备可以直接从这个表中查找目的MAC地址来进行数据封装,而无需进行ARP查询。过了这段有效期,ARP表项会被自动删除。
如果目标设备位于其他网络,则源设备会在ARP缓存表中查找网关的MAC地址,然后将数据发送给网关,网关再把数据转发给目的设备。

ARP请求.png

本例中,主机A的ARP缓存表中不存在主机C的MAC地址,所以主机A会发送ARP Request来获取目的MAC地址。ARP Request报文封装在以太帧里。帧头中的源MAC地址为发送端主机A的MAC地址。此时,由于主机A不知道主机C的MAC地址,所以目的MAC地址为广播地址FF-FF-FF-FF-FF-FF。ARP Request报文中包含源IP地址、目的IP地址、源MAC地址、目的MAC地址,其中目的MAC地址的值为0。ARP Request报文会在整个网络上传播,该网络中所有主机包括网关都会接收到此ARP Request报文。网关将会阻止该报文发送到其他网络上。

所有的主机接收到该ARP Request报文后,都会检查它的目的协议地址字段与自身的IP地址是否匹配。如果不匹配,则该主机将不会响应该ARP Request报文。如果匹配,则该主机会将ARP报文中的源MAC地址和源IP地址信息记录到自己的ARP缓存表中,然后通过ARP Reply报文进行响应。

ARP响应.png

主机C会向主机A回应ARP Reply报文。ARP Reply报文中的源协议地址是主机C自己的IP地址,目标协议地址是主机A的IP地址,目的MAC地址是主机A的MAC地址,源MAC地址是自己的MAC地址,同时Operation Code被设置为Reply。ARP Reply报文通过单播传送。

主机A收到ARP Reply以后,会检查ARP报文中目的MAC地址是否与自己的MAC匹配。如果匹配,ARP报文中的源MAC地址和源IP地址会被记录到主机A的ARP缓存表中。

ARP代理&免费ARP

  • ARP代理

    位于不同网络的网络设备在不配置网关的情况下,可以通过ARP代理实现相互通信。

  • 免费ARP

    免费ARP可以用来探测IP地址是否冲突。

    原理:主机A将ARP Request广播报文中的目的IP地址字段设置为自己的IP地址,且该网络中所有主机包括网关都会接收到此报文。当目的IP地址已经被某一个主机或网关使用时,该主机或网关就会回应ARP Reply报文。通过这种方式,主机A就能探测到IP地址冲突了。

传输层协议

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)。

TCP

端口号用来区分不同的网络服务。

TCP允许一个主机同时运行多个应用进程。每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为0-1023。如FTP、HTTP、Telnet、SNMP服务均使用知名端口。动态端口号范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。

TCP端口号.png

TCP通常使用IP作为网络层协议,这时TCP数据段被封装在IP数据包内。

TCP数据段由TCP Header(头部)和TCP Data(数据)组成。TCP最多可以有60个字节的头部,如果没有Options字段,正常的长度是20字节。

TCP头部.png

  • TCP Header是由如上图标识的一些字段组成,这里列出几个常用字段。
    • 16位源端口号:源主机的应用程序使用的端口号。
    • 16位目的端口号:目的主机的应用程序使用的端口号。每个TCP头部都包含源和目的端的端口号,这两个值加上IP头部中的源IP地址和目的IP地址可以唯一确定一个TCP连接。
    • 32位序列号:用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。
    • 32位确认序列号:用于标识接收端确认收到的数据段。确认序列号为成功收到的数据序列号加1。
    • 4位头部长度:表示头部占32bit字的数目,它能表达的TCP头部最大长度为60字节。
    • 16位窗口大小:表示接收端期望通过单次确认而收到的数据的大小。由于该字段为16位,所以窗口大小的最大值为65535字节,该机制通常用来进行流量控制。
    • 16位校验和:校验整个TCP报文段,包括TCP头部和TCP数据。该值由发送端计算和记录并由接收端进行验证。

TCP建立连接的过程:

TCP建立连接的过程.png

TCP是一种可靠的,面向连接的全双工传输层协议。

TCP连接的建立是一个三次握手的过程。如图所示:

  • 主机A(通常也称为客户端)发送一个标识了SYN的数据段,表示期望与服务器A建立连接,此数据段的序列号(seq)为a。
  • 服务器A回复标识了SYN+ACK的数据段,此数据段的序列号(seq)为b,确认序列号为主机A的序列号加1(a+1),以此作为对主机A的SYN报文的确认。
  • 主机A发送一个标识了ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文的确认。

TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。
主机A和服务器A之间通过滑动窗口来实现流量控制。

主机A向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。服务器A收到第3个数据段后,缓存区满,第4个数据段被丢弃。服务器以ACK 3073响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。

TCP关闭连接:

TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。
TCP连接的建立是一个三次握手的过程,而TCP连接的终止则要经过四次握手。

  • 主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b。
  • 服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机A的FIN报文的确认。
  • 服务器A想终止连接,于是向主机A发送一个标识了FIN,ACK的数据段,序列号为b,确认序列号为a+1。
  • 主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认。

以上四次交互便完成了两个方向连接的关闭。

UDP

当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单、易操作的机制在应用程序间传输数据,没有使用TCP中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。

UDP头部.png

UDP头部仅占8字节,传输数据时没有确认机制。

UDP报文分为UDP报文头和UDP数据区域两部分。报头由源端口、目的端口、报文长度以及校验和组成。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小,但是无法保障数据传输的可靠性。UDP头部的标识如下:

  • 16位源端口号:源主机的应用程序使用的端口号。
  • 16位目的端口号:目的主机的应用程序使用的端口号。
  • 16位UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度为8字节,所以该字段的最小值为8。
  • 16位UDP校验和:该字段提供了与TCP校验字段同样的功能;该字段是可选的。

UDP不提供重传机制,占用资源小,处理效率高。

一些时延敏感的流量,如语音、视频等,通常使用UDP作为传输层协议。

数据转发的过程

TCP封装.png

主机A会对待发送的应用数据首先执行加密和压缩等相关操作,之后进行传输层封装。Web应用是基于传输层的TCP协议传输数据的。主机A使用TCP进行报文封装时,必须填充源端口和目的端口字段,初始序列号和确认序列号字段,标识位,窗口字段以及校验和字段。此例中数据段的源端口号为主机A随机选择的1027号端口,目的端口号为服务器A的TCP知名端口80。

IP封装.png

主机A完成传输层封装后,一般会进行网络层数据封装,在使用IP进行封装时,需要明确IP报文的源和目的地址。如果IP报文的大小大于网络的最大传输单元(MTU),则该报文有可能在传输过程中被分片。

生存时间(TTL)字段用来减少网络环路造成的影响。ARG3系列路由器产生的数据包,默认TTL值为255。路由器转发一个数据包时,该值会被减1,如果路由器发现该值被减为0,就会丢弃该数据包。这样,即使网络中存在环路,数据包也不会在网络上一直被转发。

协议字段标识了传输层所使用的协议。本例中,传输层使用的是TCP协议,所以该字段的填充值为0X06。

以太网封装.png

主机A在链路层封装数据帧时,会遵循IEEE 802.3或Ethernet_II标准,Ethernet_II帧头中的类型字段填充为0x0800,以表示网络层使用的是IP协议。源MAC地址为主机A的MAC地址,目的MAC地址为网关路由器E0/0接口的MAC地址。

STP(生成树协议)

  • 环路引起的问题


    • 广播风暴
    • MAC地址表震荡

    交换机之间通过多条链路互连时,虽然能够提升网络可靠性,但同时也会带来环路问题


    • 产生环路的条件:


      • 数据帧没有类似IP报文TTL的概念,可以被无限制转发
      • 交换机泛洪的特性
      • 拓扑成环
    • 怎样判断产生环路:


      • 环路会影响交换机的CPU使用率,高达70%
      • 通过查看端口的广播以及组合和单播报文的比重(广播风暴)
      • 通过查看是否存在MAC地址漂移
      • 通过观察设备的环路指示灯是否闪烁
      • 测试网络设备的丢包率
    • 排查环路:


      • 查看生成树协议是否被关闭
      • 查看线缆连接是否正确
      • 查看链路是否存在单通的情况

    在以太网中,二层网络的环路会带来广播风暴,MAC地址表震荡,重复数据帧等问题,为解决交换网络中的环路问题,提出了STP。


    • STP的主要作用:
      • 消除环路:通过阻断冗余链路来消除网络中可能存在的环路。
      • 链路备份:当活动路径发生故障时,激活备份链路,及时恢复网络连通性。
  • STP工作原理


    • STP操作
      STP通过构造一棵树来消除交换网络中的环路。

      每个STP网络中,都会存在一个根桥,其他交换机为非根桥。根桥或者根交换机位于整个逻辑树的根部,是STP网络的逻辑中心,非根桥是根桥的下游设备。当现有根桥产生故障时,非根桥之间会交互信息并重新选举根桥,交互的这种信息被称为BPDU。BPDU中包含交换机在参加生成树计算时的各种参数信息,后面会有详细介绍。

      STP中定义了三种端口角色:指定端口,根端口和预备端口。

      指定端口是交换机向所连网段转发配置BPDU的端口,每个网段有且只能有一个指定端口。一般情况下,根桥的每个端口总是指定端口。

      根端口是非根交换机去往根桥路径最优的端口。在一个运行STP协议的交换机上最多只有一个根端口,但根桥上没有根端口。

      如果一个端口既不是指定端口也不是根端口,则此端口为预备端口。预备端口将被阻塞。

      STP中根桥的选举依据的是桥ID,STP中的每个交换机都会有一个桥ID(Bridge ID) 。桥ID由16位的桥优先级(Bridge Priority)和48位的MAC地址构成。在STP网络中,桥优先级是可以配置的,取值范围是0~65535,默认值为32768。优先级最高的设备(数值越小越优先)会被选举为根桥。如果优先级相同,则会比较MAC地址,MAC地址越小则越优先。

      交换机启动后就自动开始进行生成树收敛计算。默认情况下,所有交换机启动时都认为自己是根桥,自己的所有端口都为指定端口,这样BPDU报文就可以通过所有端口转发。对端交换机收到BPDU报文后,会比较BPDU中的根桥ID和自己的桥ID。如果收到的BPDU报文中的桥ID优先级低,接收交换机会继续通告自己的配置BPDU报文给邻居交换机。如果收到的BPDU报文中的桥ID优先级高,则交换机会修改自己的BPDU报文的根桥ID字段,宣告新的根桥。


      • 端口角色:
        • DP:指定端口,指定这个转发数据和BPDU
        • RP:根端口,非根桥到根桥路径开销最小的端口
        • AP:阻塞端口(备用端口)

      和RP相连的端口都是DP

      根桥是全局的,指定桥是物理段上的

      当跟路径开销一致的时候比较端口的优先级,优先级一样的时候,比较端口编号,编号小的作为RP

      端口角色决定了端口状态,端口状态决定了转发动作


      • 端口状态:
        • disable:关闭,没开STP
        • blocking:阻塞状态,不能收发数据,能收不能发BPDU
        • listening:监听状态,不能收发数据,能收发BPDU
        • learning:学习状态,不能收发数据,能收发BPDU,在学习MAC地址
        • fowrding:转发状态,能收发数据,能收发BPDU

      端口角色发生变化端口状态需要经历30s转发延迟时间,为了防止生成临时环路

      MAC地址表项老化时间是300s

    • STP缺陷

      收敛时间太长,正常情下,网路收敛后,有300s时间无法访问网络

      网络中所有VLAN公用一颗生成树,没办法实现trunk级别的负载分担

      为加快STP收敛,TCN BPDU(拓扑改变通知BPDU),通知根桥把MAC地址的老化时间刷新为15s,出发条件:接口状态变为forwding或blocking

RSTP(快速生成树协议)

IEEE于2001年发布的802.1w标准定义了快速生成树协议RSTP(Rapid Spanning-Tree Protocol),RSTP在STP基础上进行了改进,实现了网络拓扑快速收敛。

RSTP使用了Proposal/Agreement机制保证链路及时协商,从而有效避免收敛计时器在生成树收敛前超时。在交换网络中,P/A过程可以从根桥向下游级联传递。

PA报文.png

  • Flag:
    • 7bit:TCA,拓扑改变通知,在RSRP里面不用
    • 6bit:握手回应
    • 5bit:转发状态
    • 4bit:学习状态
    • 3bit:端口角色
    • 2bit:
    • 1bit:握手请求
    • 0bit:TC位--RSTP拓扑改变的时候会发送TC置位的BPDU

在发送握手回应报文之前,先同步临时阻塞自己身上的除了边缘以为的其他端口,防止临时环路

  • TC位:
    除了接收到TC置位的BPDU端口,以及边缘端口外,其他立马刷新MAC地址表项

RSTP里,位于网络边缘的指定端口被称为边缘端口。边缘端口一般与用户终端设备直接连接,不与任何交换设备连接。边缘端口不接收配置BPDU报文,不参与RSTP运算,可以由Disabled状态直接转到Forwarding状态,且不经历时延,就像在端口上将STP禁用了一样。但是,一旦边缘端口收到配置BPDU报文,就丧失了边缘端口属性,成为普通STP端口,并重新进行生成树计算,从而引起网络震荡。

  • RSTP把原来STP的5种端口状态简化成了3种:


    • Discarding状态,端口既不转发用户流量也不学习MAC地址。
    • Learning状态,端口不转发用户流量但是学习MAC地址。
    • Forwarding状态,端口既转发用户流量又学习MAC地址。
  • 对RSTP来说,不需要等到根桥泛洪RST BPDU也能发送BPDU
    STP中,当网络拓扑稳定后,根桥按照Hello Timer规定的时间间隔发送配置BPDU报文,其他非根桥设备在收到上游设备发送过来的配置BPDU报文后,才会触发发出配置BPDU报文,此方式使得STP协议计算复杂且缓慢。RSTP对此进行了改进,即在拓扑稳定后,无论非根桥设备是否接收到根桥传来的配置BPDU报文,非根桥设备都会仍然按照Hello Timer规定的时间间隔发送配置BPDU,该行为完全由每台设备自主进行。

  • RSTP对定时器的改进:


    • Hello time:2s
    • Max age:6s
    • Forwarding delay:15s

RSTP收敛遵循STP基本原理。网络初始化时,网络中所有的RSTP交换机都认为自己是“根桥”,并设置每个端口为指定端口。此时,端口为Discarding状态。

每个认为自己是“根桥”的交换机生成一个RST BPDU报文来协商指定网段的端口状态,此RST BPDU报文的Flags字段里面的Proposal位需要置位。当一个端口收到RST BPDU报文时,此端口会比较收到的RST BPDU报文和本地的RST BPDU报文。如果本地的RST BPDU报文优于接收的RST BPDU报文,则端口会丢弃接收的RST BPDU报文,并发送Proposal置位的本地RST BPDU报文来回复对端设备。

在STP中,当出现链路故障或根桥失效导致交换机收不到BPDU时,交换机需要等待Max Age时间后才能确认出现了故障。而在RSTP中,如果交换机的端口在连续3次Hello Timer规定的时间间隔内没有收到上游交换机发送的RST BPDU,便会确认本端口和对端端口的通信失败,从而需要重新进行RSTP的计算来确定交换机及端口角色。

RSTP是可以与STP实现后向兼容的,但在实际中,并不推荐这样的做法,原因是RSTP会失去其快速收敛的优势,而STP慢速收敛的缺点会暴露出来。
当同一个网段里既有运行STP的交换机又有运行RSTP的交换机时,STP交换机会忽略接收到的RST BPDU,而RSTP交换机在某端口上接收到STP BPDU时,会等待两个Hello Time时间之后,把自己的端口转换到STP工作模式,此后便发送STP BPDU,这样就实现了兼容性操作。

  • RSTP缺陷
    多个VLAN共享一颗生成树,无法实现trunk级别的负载分担

  • 保护机制


    • 跟保护
    • BPDU保护
    • 环路保护
Last modification:October 4th, 2019 at 02:44 pm