hi,欢迎访问本站!
当前位置: 首页学习笔记正文

趣谈网络协议(一):综述及二层到三层

用户投稿 学习笔记 14阅读

极客时间刘超的网络协议课《趣谈网络协议》中摘过来的,防止掌握这些知识前会员过期,又舍不得再续了 

极客时间-轻松学习,高效学习-极客邦

目录

一、为什么要学习网络协议

1、为什么要学习网络协议

2、要学习的网络协议

二、ip addr

三、DHCP与PXE

1、DHCP

2、PXE

四、从物理层到MAC层

1、物理层

2、数据链路层

五、交换机与VLAN

六、ICMP与ping

1、查询报文类型

2、差错报文类型:

七、网关

八、路由协议

1、如何配置路由

2、动态路由算法

(1)距离矢量路由算法(distance vector routing)

(2)链路状态路由算法

3、动态路由协议

一、为什么要学习网络协议

协议的三要素:语法、语义、顺序

1、为什么要学习网络协议

只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。

【以网上下单为例】

在浏览器里输入一个电商网址,浏览器会通过DNS或更为精确的HTTPDNS查找具体IP。

找到目标地址后,浏览器就开始打包它的请求。对于普通的浏览请求,往往使用HTTP协议,但对于购物的请求,往往需要进行加密传输,因而会使用HTTPS协议。

DNS、HTTP、HTTPS所在的层我们称为应用层,经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过socket编程来实现。下一层是传输层。传输层有两层协议,一种是无连接的协议UDP,一种是面向连接的TCP(面向连接就是,TCP会保证这个包能够到达目的地,如果不能,就一直发送,直到能)。对于支付来讲,往往使用TCP协议。

TCP协议里有两个端口,一个是浏览器监听的端口,一个是电商的服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程。

传输层封装完成后,浏览器会将包交给操作系统的网络层。网络层的协议是IP协议。在IP协议里会有源IP地址,即浏览器所在机器的IP地址和目标IP地址。

操作系统启动的时候,会被DHCP协议配置IP地址,以及默认网关的IP地址192.168.1.1,拿到目标IP地址后,操作系统通过ARP协议找到默认网关的MAC地址,于是,将IP包交给下一层,也就是MAC层,网卡再将包发出去,使其到达网关。

网关和网关之间沟通的协议成为路由协议,常用的有OSPF和BGP。

得益于网关之间的沟通,网络包可以从一个网关拿到下一个网关的MAC地址,直到找到目标服务器。

目标服务器取下MAC头,发给操作系统的网络层,发现IP也对上了,就取下IP头。IP头里会写上一层封装的是TCP协议,然后将其交给传输层,即TCP层。

在这一层,对于收到的包,都有一个回复的包说明收到了(仅仅是TCP层的一个说明,不是下单请求的结果)。

如果过了一段时间,发送端未收到回复,发送端的TCP层就会重新发送这个包(重新发送指TCP端的重试,并非浏览器将下单这个动作重新请求一遍,除非是TCP出了问题,如连接断了)。

网络包平安到达TCP层之后,TCP头中有目标端口号,通过端口号,可以找到电商网站的进程正在监视的端口号。

电商网址的进程得到HTTP请求的内容,会通过RPC调用(远程过程调用)来告诉相关的进程应该做什么事。

相关进程都处理好后,就回复一个HTTPS的包,告知下单成果,这个包最终进入发送端浏览器,显示支付成功。

2、要学习的网络协议

应用层:DHCP  HTTP  HTTPS  RTMP  P2P  DNS  GTP RPC

传输层:UDP  TCP

网络层:ICMP  IP  OSPF  BGP  IPSec  GRE

链路层:ARP  VLAN  STP

物理层:网络跳线

二、ip addr

IP地址是一个网卡在网络世界的通讯地址

MAC地址是一个网卡的物理地址,它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可用不用担心冲突。MAC地址的通信范围局限在一个子网里面。

IP地址在设计时低估了未来网络的发展,32位地址远远不够使用(于是有了IPv6(128位))

本就不够用的32位IP地址还被分成5类,其中B类地址能包含的最大主机数量有6w+,一般企业基本达不到这个规模,闲置地址造浪费,而C类地址能包含的最大主机数量又太少,只有254个。于是产生了一个折中的法子叫作无类型域间选路。

无类型域间选路(CIDR):将32位IP地址一分为二,前面是网络号,后面是主机号。如:10.100.122.2/24,表示32位中,前24位是网络号,后8位是主机号。

CIDR可以用来判断一个IP地址是不是本地地址。

伴随着CIDR存在的一个是广播地址,10.100.122.255,如果发送这个地址,所有10.100.122网络里面的机器都可以收到。另一个是子网掩码,255.255.255.0。

将子网掩码和IP地址进行AND计算,可以得到网络号。

D类是组播地址,使用这一类地址,组内成员机器都可以接受到信息

linux中 执行 ip addr得到的返回信息:

 scope:对于 eth0 这张网卡来讲, global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于 lo 来讲,是 host,说明这张网卡仅仅可以供本机相互通信。  lo :全称是loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。  < BROADCAST,MULTICAST,UP,LOWER_UP > :是net_device flags,网络设备的状态标识。 UP 表示网卡处于启动的状态;BROADCAST 表示这个网卡有广播地址,可以发送广播包;MULTICAST 表示网卡可以发送多播包;LOWER_UP 表示 L1 是启动的,也即网线插着呢。  MTU1500 :指最大传输单元 MTU 为 1500,是以太网的默认值。 MTU 是二层 MAC 层的概念。MAC 层有 MAC 的头,以太网规定连 MAC 头带正文合起来,不允许超过 1500 个字节。  qdisc :queueing discipline 排队规则。内核如果需要通过某个网络接口发送数据包,就需要按照为这个接口配置的qdics把数据包加入队列。最简单的 qdisc 是 prifo ,它不对数据包做任何处理,数据包采用先入先出的方式通过队列。prifo_first 的队列包括三个波段(band),数据包按照服务类型(Type of Service,TOS)被分配到不同波段,三个波段优先级不同,波段内部先进先出。

三、DHCP与PXE 1、DHCP

DHCP(Dynamic Host Configuration Protocol):动态主机配置协议。

工作方式:

当一台机器新加入一个配置了DHCP Sever网络的时候,首先会进行 DHCP Discover,即使用IP地址0.0.0.0发送一个广播包,目的IP地址为255.255.255.255。广播包封装了UDP,UDP封装了BOOTP。DHCP是BOOTP的增强版,但如果抓包的话,很可能看到的名称还是BOOTP协议。

在这个广播包里,新来的机器进行Boot request。

DHCP Sever就会分配给它一个IP地址,这个过程称为DHCP Offer。同时,DHCP Sever会保留此IP地址,不再为其它机器分配。此时,DHCP Sever也使用广播地址作为目的地址,因为,当下请求分配IP的新机器还没有自己的IP,除此之外,服务器还发送的子网掩码、网关、和IP地址的使用期限等信息。

如果有多次DHCP Sever,这台新机器就会收到多个DHCP Offer,它会选择其中一个作为自己的IP地址,一般是最先到达的那个,并向网络发送一个DHCP Request 广播数据包,包含客户端的MAC地址、接受的IP地址、提供IP地址的DHCP服务器地址等,并告诉所有的DHCP Sever它将接受哪一台服务器提供的IP地址,同时请求其余DHCP Sever撤回它们提供的IP。

客户机会在IP使用期限过去50%的时候,直接向为其提供IP地址的DHCP Sever发送DHCP request消息包。接到服务器回应的DHCP ACK包后,根据包中所提供的新的使用期限以及其他已经更新的TCP/IP参数,更新自己的配置,这样,IP使用期限就更新完成了。

2、PXE

网络管理员不仅能自动分配IP,还能安装操作系统

这个过程和操作系统启动的过程相似。

【附:操作系统启动过程】首先,启动BIOS,BIOS是一个特别小的小系统,只能做特别小的一件事,就是读取硬盘的MBR启动扇区,将GRUB启动起来,然后将权力交给GRUB,GRUB加载内核、加载作为根文件系统的initramfs文件,然后将权力交给内核,最后内核启动,初始化整个操作系统。

安装操作系统的过程,只能插在启动BIOS之前,因为没安装系统之前,连启动扇区都没有。因而,这个过程叫作预启动执行环境(Pre-boot Execution Environment),简称PXE。

PXE协议分为客户端和服务器端,由于还没有操作系统,只能先把客户端放在BIOS里面,当计算机启动时,BIOS将PXE客户端调入内存中,就可以连接服务端做一些操作了。

PXE的客户端启动起来后,会发送一个DHCP请求,让DHCP Sever为它分配一个IP地址。如果想使用PXE,除了IP地址,还需要配置next-sever,指向PXE服务器的地址,另外需要配置初始启动文件filename。这样,PXE客户端就知道PXE服务器在哪里了,也可以知道如何从PXE服务器上下载某个文件,去初始化操作系统。

知道了这些后,PXE客户端就可以开始下载了,下载的时候使用的是TFTP协议,所以在PXE服务器上,往往还需要一个TFTP服务器,将PXE客户端要下载的文件传给它。

PXE客户端收到文件后,开始执行文件。这个文件会指示PXE客户端,向TFTP服务器请求计算机的配置信息pxelinux.cfg。TFTP服务器会给PXE客户端一个配置文件,里面会说内核在哪里、initramfs在哪里。PXE客户端会请求这些文件。

最后,启动Linux内核。

四、从物理层到MAC层 1、物理层

没有路由器的时候,两台电脑如何配置局域网(LAN)呢?

可以借助一根电脑连电脑的网线(以前交叉接线,水晶头用1-3、2-6交叉接法做交叉线。水晶头的第1、2和第3、6脚,分别起着收、发信号的作用,1-3、2-6交换位置。现在网卡自适应直连线了)网线一头插在一台电脑的网卡上,一头插在另一台电脑的网卡上,就能够在物理层面实现一端发送的信号,另一端可以收到的功能了。

当然,除了网线,还要配置这两台电脑的IP地址、子网掩码和默认网关。要想两台电脑能够通信,这三项必须配置成一个网络。

那么,如何将三台网络连在一起呢?除了交换机,还有一个叫Hub的东西,也就是集线器。这种设备有多个口,可以将多台电脑连接起来。但是,和交换机不同,集线器没有大脑,它完全在物理层工作,它会将自己收到的每一个字节,都复制到其他端口上去。

这,是第一层物理层的联通方案。

2、数据链路层

Hub采用的是广播的模式,需要解决几个问题:

包是发给谁的?多台机器同时发包会不会产生混乱?有没有先后规则发送时出现错误该如何解决?

这几个问题都是数据链路层,也就是MAC层要解决的。

MAC的全称是Medium Access Control,即媒体访问控制,控制的是在往媒体上发数据的时候,谁先发,谁后发,防止发生混乱。解决的是第二个问题,问题中的规则叫多路访问。

解决方式:信道划分、轮流协议、随机接入协议

解决第一个问题,需要用到一个物理地址,叫作链路层地址,也叫MAC地址。

对于以太网,第二层的最开始,就是目标的MAC地址和源地址。

接下来是类型。大部分的类型是IP数据包,然后IP里面包含TCP、UDP以及HTTP等,这都是里层封装的事情。

有了目标MAC地址,数据包在链路上广播,MAC的网卡才能知道这个包是给它的。

MAC的网卡把包收起来,然后打开IP包,发现IP地址也是自己的,再打开TCP包,发现端口是自己,也就是nginx监听的80,于是将请求提交给nginx。

nginx返回一个网页。然后将网页发给需要发回请求的机器。然后层次封装,最后到MAC层。来时的源MAC地址,返回时变成目标地址,回到请求的机器。

对于以太网,第二层的最后面是CRC,也就是循环冗余检测。通过XOR异或的算法,来计算整个包是否在发送的过程出现错误,主要解决第三个问题。

还有一个问题,如果源机器不知道目标机器的MAC地址,该怎么办呢?

这就需要ARP协议,也就是已知IP地址,求MAC地址的协议。

在一个局域网里面,发送一个广播包询问。

为了避免每次都用ARP请求,机器本地会进行ARP缓存。当然,机器会上线下线IP可能会变,所以ARP的MAC地址缓存过一段时间就会过期。

【附:RARP协议】没有硬盘的机器即无盘工作站,无法持久化IP地址带本地,但有网卡,所以可以用RARP协议来获取IP地址。RARP还可以应用于局域网管理员想指定机器IP(与机器绑定,不可变),又不想每台机器去设置静态IP的情况,能通过在RARP服务器上配置MAC和IP对于的ARP表,,不过获取每台机器的MAC地址也挺麻烦的。现在用BOOTTP和DHCP的更多了。

靠Hub组网的方式,一旦机器数目增多,就会出现问题。因为Hub是广播的,不管某个接口是否需要,所有的Bit都会被发送回去,然后让主机来判断是否需要,如此操作会造成很多浪费,且容易产生冲突。

哪种机器可以记住一台电脑的MAC地址,如果目标机器的MAC不是这台电脑的,就不向它转发呢?显然是能把MAC头拿下来,检查目标MAC地址,然后根据策略转发的二层设备交换机呀!

交换机怎么知道每个口的电脑的MAC地址呢?通过学习!

一台MAC1电脑将一个包发给MAC2电脑,当这个包第一次到达交换机的时候,交换机也不知道MAC2的电脑在哪个口,只能将包转发给除了来的那个口之外的所有口,同时,交换机会记住MAC1来自的口,以后有包的目的地址是MAC1时,直接发送到这个口就可以了。

当交换机工作一段时间后,就有了整个网络的一个结构了,这个时候,基本就不需要广播。当然,每个机器的IP地址会变,所在的口也会变,因而,转发表——也就是交换机的学习结果,也是有一个过期时间的。

五、交换机与VLAN

多台交换机连接在一起,就形成了拓扑结构。而拓扑结构过于复杂时,网线绕来绕去,不可避免会出现一些意外,其中最常见的就是环路问题(两个交换机将两个局域网同时连接起来)。

出现环路时,两个包转来转去,路就会堵,怎么破除环路呢?

在数据结构中,有一个方法叫最小生成树。有环的我们常称为图,将图中的环破了,就成了树。在计算机网络中,生成树的算法叫STP(Spanning Tree Protocol)。

STP协议中的一些概念:

Root Bridge:根交换机。

Designated Bridges:指定交换机。其他交换机通过指定交换机到达根交换机。

Bridge Protocol Data Units(BPDU):网桥协议数据单元。只有根交换机可以发,其他交换机只能传达根交换机的指示。

Priority Vector: 优先级向量。一组ID数目:Root Bridge ID,Root Path Cost(与根路由器的距离),Bridge ID,Port ID。值越小,优先级越高。

交换机数目过多会面临隔离问题,可以通过VLAN形成虚拟局域网。使用VLAN,一个交换机上会连属于多个局域网的机器。只需要在原来的二层的头上加上一个TAG,TAG里存放一个12位的VLAN ID,就可以区分机器是属于哪个局域网了。

如果我们买的交换机是支持VLAN的,当这个交换机把二层的头取下来,就能够识别这个VLAN ID,这样,只有相同VLAN的包,才会互相转发。这样,广播问题和安全问题就能解决了。

可以给设置交换机每个口所属的VLAN。

支持VLAN的交换机,有一种口叫Trunk口,它可以转发属于任何VLAN的口,交换机之间可以通过这种口互相连接。

六、ICMP与ping

ICMP全称Internet Control Message Protocol,互联网控制报文协议

网络包在复杂的网络环境中传输时,常常会遇到各种问题。当遇到问题的时候,要传出消息来,报告情况,才可以调整传输策略。

ICMP报文本身非常简单,是封装在IP包里面的。因为传输指令的时候肯定需要源地址和目标地址。

ICMP报文有很多类型,不同类型有不同的代码。最常用的类型是主动请求8,主动请求的应答为0

1、查询报文类型

常用的ping就是查询报文,是一种主动请求,并且主动获得应答的ICMP协议。ping发出的包也符合ICMP协议格式,只不过它在后面增加了自己的格式。

对ping的主动请求,进行网络抓包,称为ICMP ECHO REQUEST,同理,主动请求的回复,称为ICMP ECHO REPLY,比起原生的ICMP,这里面多了标识符和序号两个字段。在选项数据中,ping还会存放发送请求的时间值,来计算往返时间,说明路程长短。

ping:查询报文类型的使用

ping执行命令的时候,源主机首先会构建一个ICMP请求数据包,ICMP数据包内包含多个字段,最重要的两个,一个是类型字段,对于请求数据包而言该字段为8;另一个是顺序号,主要用于区分连续ping的时候发出的多个数据包。每发出一个数据包,顺序号会自动加1。为了能够计算往返时间RTT,它会在报文的数据部分插入发送时间。

然后,由ICMP协议将这个数据包连同地址192.168.1.2一起交给IP层。IP层将以192.168.1.2作为目的地址,本机IP地址作为源地址,加上一些其他控制信息,构建一个IP数据包。

接下来,需要加入MAC头。如果在本节ARP映射表中查找出IP地址192.168.1.2所对应的MAC地址,就可以直接使用;如果没有,则需要发送ARP协议查询MAC地址,获得MAC地址后,由数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址则是本机的MAC地址;还要附加一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机B收到这个数据帧后,先检查它的目的MAC地址,并和本机的MAC地址对比,符合就接收,不符合则丢弃。接收后检查该数据帧将IP数据包从帧中提取出来,交给本机的IP层。同样,IP层检查后,将有用的信息提取后交给ICMP协议。

主机 B 会构建一个 ICMP 应答包,应答数据包的类型字段为 0,顺序号为接收到的请求数据包中的顺序号,然后再发送出去给主机 A。

在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 应答包,则说明目标主机可达。此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

如果跨网段的的话,还会涉及网关的转发、路由器的转发等。

如果在自己的可控范围内,当遇到网络不通的问题时,除了直接ping目标的IP地址之外,还应该有一个清晰的网络拓扑图。要清楚地知道一个网络包从源地址到目标地址都需要经过哪些设备,然后逐个ping中间的设备或机器。可能的话,在这些关键点,通过tcpdump -i eth0 icmp,查看包有没有到达某个点,回复的包到达了哪个点,可以更加容易推断出错的位置。

如果不再我们的控制范围内,很多中间设备都是禁止ping的,但是ping不通不代表网络不通,这个时候就要使用telnet,通过其他协议来测试网络是否畅通。

2、差错报文类型:

由异常情况发起的报告对应ICMP的差错报文类型

3终点不可达。其中网络不可达代码为0,主机不可达1,协议不可达2,端口不可达3,需要分片但设置了不分片4

4源抑制。即让源站放慢发送速度。

11超时。超过网络包的生存时间。

5重定向,让下次发给另一个路由器

差错报文的结构相对复杂一些,除了前面还是IP,ICMP的前8字节不变,后面则跟上出错的IP包的IP头和IP正文 的前8个字节。

不产生差错报文的情形:

对于携带ICMP差错报文的数据报,不再产生ICMP差错报文。如果主机A发送了一个ICMP的数据报文给主机B,数据在传输过程中经过其中一个路由器出现错误,由于该路由器已经接收到一个ICMP数据报文,所以不会再产生一个ICMP差错报文。对于分片的数据报,如果不是第一个分片,则不产生ICMP差错报文 。对于主机A发送了一个分片的数据,如果路由设备或主机接收到的分片数据不是第一个分片数据,不会产生ICMP差错报文。对于具有多播地址的数据报,不产生ICMP差错报文 。如果一个ip地址是一个广播地址的话,不会产生ICMP差错报文。对于具有特殊地址如(127.0.0.0或0.0.0.0)的数据报,不产生ICMP差错报文。

Traceroute:差错报文类型的使用

Traceroute会使用ICMP规则,故意制造一些能够产生错误的场景。

Traceroute的第一个作用就是故意设置特殊的TTL(Time To Live生存时间值,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量),来追踪去往目的地时沿途经过的路由器。Traceroute的参数指向某个目的IP地址,它会发送一个UDP的数据包,故意将TTL设为1,这样,碰到第一个路由器后就会返回一个ICMP包,也就是网络差错包,类型是时间超时。

【附:关于Traceeoute发UDP,出错返回ICMP的原因:正常情况下,协议栈走到UDP,就会正常返回UDP,但是主机不可达是网络层(未到UDP,传输层),只会回ICMP(网络层),报文分片同理】

接下来,将TTL设置为2、3……如此反复,知道到达目标主机。这样,Traceroute就拿到了所有的路由器IP。当然,有的路由器不会回这个ICMP,这也是Traceroute一个公网的地址,看不到中间路由的原因。

怎么知道UDP有没有到达目的主机呢?Traceroute程序会发送一份UDP数据包给目的主机,但它会选择一个不可能的值作为UDP端口号(大于30000),当该数据包到达时,将使目的主机的UDP模块产生一份“端口不可达”错误ICMP报文。如果数据没有到达,则可能是超时。

Traceroute还有一个作用就是故意设置不分片,从而确定路径的MTU。要做的工作首先是发送分组,并设置“不分片”标志。发送的第一个分组的长度刚好与出口MTU相等。如果中间遇到窄的关口会被卡住,会发送ICMP网络差错包,类型为“需要进行分片但设置了不分片位”。每次收到ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机。

七、网关

MAC头和IP头的细节:

任何一台机器,想要访问另一个IP地址的时候,都会先通过CIDR和子网掩码判断这个目标IP地址和当前机器的IP地址是否在同一个网段。

在的话,直接将源地址和目标地址放入IP头中,然后通过ARP获得MAC地址,将源MAC和目标MAC放入MAC头中,发出去就可以了。不在同一网段的话,就需要发往默认网关Gateway。Gateway的地址一定是和源IP地址是一个网段的。

网关往往是一个路由器,是一个三层转发设备,一个路由器往往有多个网口,分别连着不同的局域网。如果是一台服务器做这个给事情,则就有多个网卡,其中一个网卡是和源IP同网段。

静态路由就是在路由器上,配置一条一条的规则。

不改变IP地址的网关称为转发网关,改变IP地址的网关称为NAT(Network Address Translation)网关。

八、路由协议 1、如何配置路由

路由器就是一台网络设备,它有多张网卡。当一个入口的网络包送到路由器时,它会根据一个本地的转发信息库,来决定如何正确地转发流量。这个转发信息库通常被称为路由表。

一张路由表中会有多条路由规则。每一条规则至少包含这三项信息。

目的网络:这个包想去哪儿?出口设备:将包从哪个口扔出去?下一跳网关:下一个路由器的地址。

通过 route 命令和 ip route 命令都可以进行查询或者配置。例如,设置 ip route add 10.176.48.0/20 via 10.173.32.1 dev eth0,就说明要去 10.176.48.0/20 这个目标网络,要从 eth0 端口出去,经过 10.173.32.1。

除了可以根据目的 ip 地址配置路由外,还可以根据多个参数来配置路由,这就称为策略路由。可以配置多个路由表,可以根据源 IP 地址、入口设备、TOS 等选择路由表,然后在路由表中查找路由。这样可以使得来自不同来源的包走不同的路由。

网络环境复杂又多变,如果总是用静态路由,一旦网络结构发生变化,让网络管理员手工修改路由太复杂了,因而需要动态路由算法。

2、动态路由算法

动态路由:使用动态路由器,可以根据路由协议算法生成动态路由表,随网络运行状况的变化而变化。

路由算法(可以转化为寻找最短路径的问题)有两大类:

(1)距离矢量路由算法(distance vector routing)

基于Bellman-Ford算法,基本思路是,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,从哪条线走,一个是要走多远。

每个路由器都知道自己和邻居路由器的距离,每隔几秒,每个路由器都将自己所知道的到达所有路由器的距离告知邻居并从邻居那里得到相似的信息,并根据新收集的信息,计算和其他路由器的距离。如邻居距离目标路由器的距离是m,自己距邻居的距离是x,那么,自己距目标路由器的距离就是m+x。因此,每个路由器都是知道全局信息的。

这个算法的一个问题是好消息传的快,坏消息传的慢。如果有个路由器加入了这个网络,它的邻居就能很快发现它,然后将消息广播出去。要不了多久,整个网络就都知道了。但是一旦一个路由器挂了,挂的消息是没有广播的。当每个路由器发现原来的道路到不了这个路由器的时候,感觉不到它已经挂了,而是试图通过其他的路径访问,直到试过了所有的路径,才发现这个路由器是真的挂了。

另一个问题是每次发送的时候,都要发送整个全局路由表。最早的路由协议 RIP 就是这个算法。它适用于小型网络(小于 15 跳)。

(2)链路状态路由算法

链路状态路由算法基于Dijkstra算法。基本思路是当一个路由器启动的时候,首先是发现邻居,向邻居发送一个 echo,要求马上返回,除以二就是距离。然后将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能够收到它和邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用 Dijkstra 算法,找到两点之间的最短路径。

不像距离距离矢量路由协议那样,更新时发送整个路由表。链路状态路由协议只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了带宽和 CPU 利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。

3、动态路由协议

(1)基于链路状态路由算法的OSPF

OSPF(Open Shortest Path First)开放式最短路径优先。主要应用于数据中心内部,用于路由决策,因而被称为内部网关协议(Interior Gateway Protocol,简称IGP)

内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。有时OSPF会发现多个最短路径,可以在这多个路径中进行负载均衡,这常常被称为等价路由。

有了等价路由,到一个地方去可以有相同的两个路线,可以分摊流量,当一条路不通的时候,还可以走另外一条路。数据中心的网络,一般应用的接入层会有负载均衡 LVS。它可以和 OSPF 一起,实现高吞吐量的接入层设计。

(2)基于距离矢量路由算法的BGP

BGP(Border Gateway Protocol)外网路由协议。对于网络包,每个数据中心都设置了自己的Policy,规定哪些外部的 IP 可以让内部知晓,哪些内部的 IP 可以让外部知晓,哪些可以通过,哪些不能通过,这称作自治系统AS(Autonomous System)。

自治系统分为几种类型:

Stub AS:对外只有一个连接。这类 AS 不会传输其他 AS 的包。例如,个人或者小公司的网络。Multihomed AS:可能有多个连接连到其他的 AS,但是大多拒绝帮其他的 AS 传输包。例如一些大公司的网络。Transit AS:有多个连接连到其他的 AS,并且可以帮助其他的 AS 传输包。例如主干网。

每个自治系统都有边界路由器,通过它和外面的世界建立联系。

BGP也分为两类:eBGP和iBGP。自治系统之间,边界路由器使用eBGP广播路由。内部网络访问其他自治系统运行的是iBGP。

BGP使用的算法是路径矢量路由协议(path-vector protocol),是距离矢量路由协议的升级版。

前面说了距离矢量路由协议的缺点。其中一个是收敛慢。在 BGP 里面,除了下一跳 hop 之外,还包括了自治系统 AS 的路径,从而可以避免坏消息传得慢的问题,也即上面所描述的,B 知道 C 原来能够到达 A,是因为通过自己,一旦自己都到达不了 A 了,就不用假设 C 还能到达 A 了。

标签:
声明:无特别说明,转载请标明本文来源!
发布评论
正文 取消