网络层

网络层的IP协议

IP只为主机提供一种无连接不可靠的、尽力而为的数据包传输服务。

无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。

不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。

IP

IP数据报格式:
在这里插入图片描述

  1. 版本号:4。代表IPv4。
  2. 首部长度:没什么用吧,普通IP数据报(没有任何选择项)字段的值是5。
  3. TOS:4bit分别代表最小时延最大吞吐量最高可靠性最小费用。如果是二进制的0000表示一般服务。如二进制的0100,表示要求最大吞吐量(像FTP中传输数据)。
  4. 总长度:指整个IP数据报的长度,以字节为单位。
  5. 标识字段:唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
  6. TTL:(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。(ICMP协议会用它来检测经过的路由器)。
  7. 8位协议:记录了上层的协议是UDP还是TCP。

ICMP

前面说到IP协议是无连接,不可靠的。因此网络包在异常复杂的网络环境中传输时,常常会遇到各种各样的问题。当遇到问题的时候,总不能"死个不明不白",要传出消息来,报告情况,这样才可以调整传输策略。

ICMP(Internet Control Message Protocol,互联网控制报文协议)协议就是在网络不通的时候可以用到的协议。

当我们查看网络通不通的时候,一般最容易想到的就是ping一下。

ping就是基于ICMP协议工作的。
ICMP报文是封装在IP包里面的。
在这里插入图片描述
类型:主动请求为8,主动应答为0。终点不可达为3,源抑制为4,超时为11,重定向为5等等。
代码:不同的类型有不同的代码。

比如在差错报文中,错误类型为终点不可达3,具体是如何终点不可达的就用代码表示出来:
(0)网络不可达代码为0,
(1)主机不可达代码为1,
(2)协议不可达代码为2,
(3)端口不可达代码为3,
(4)需要进行分片但设置了不分片位代码为4。

源站抑制,也就是让源站放慢发送速度
时间超时,也就是超过网络包的生存时间还是没到
路由重定向,也就是让下次发给另一个路由器

ping:查询报文类型的使用(请求与响应的时候)

假定主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,都在同一个子网。

当你在主机A上运行"ping 192.168.1.2"后,会发生什么呢?

(1)首先主机A会先构建一个ICMP数据包,包内的数据字段类型为8(请求数据包),还有序号字段,序号字段主要用来在连续ping的时候区分数据包,每发出一个请求数据包,序号加1。此外还在数据部分记录发送的时间,用来计算往返时间RTT。
(2)然后ICMP协议将这个数据包和源IP地址192.168.1.1交给IP层,从而构建一个IP数据包。
(3)在数据链路层发现源IP地址和目的IP地址都在同一个网段,因此采用ARP协议广播获取目的IP地址的MAC地址(单播的方式回复)。从而构建一个MAC数据帧进行发送。
(4)主机B收到这个数据帧,对比MAC地址正确,取出IP数据包,IP层检查后将有用的信息提交给ICMP协议。
(5)主机B构建一个ICMP应答包,类型设置为0,顺序号为收到请求包中的序号,回送给主机A。
(6)在规定时间内如果主机A未收到应答包,说明主机不可达。如果正常收到应答包,说明主机可达。

Tracesroute:差错报文类型的使用

一个程序Traceroute,是个“大骗子"。它会使用ICMP的规则,故意制造一些能够产生错误的场景。

(1)Traceroute故意设置特殊的TTL,来追踪去往目的地的路由路径。比如先设置TTL为1,指向某个目的IP,发送一个UDP数据报,一旦遇到一个路由器或者关卡的时候“牺牲”了,此时会返回一个ICMP差错报,差错类型为11,表示超时。接下来设置TTL为2发送,如此反复,直到到达目的主机。
(注意上图中差错报文包含IP头和ICMP前8字节)
虽然发送的只是一个UDP数据包,但是由于出错了会返回一个IP层的ICMP差错包

(2)怎么知道UDP有没有到达目的主机呢?
Traceroute程序会发送一个UDP数据报问,但是会选择一个不可能的值作为端口号,这样当数据报到达到了目的主机,将使目的主机会产生一个端口不可达的ICMP差错报文。如果数据报没有到达,则可能是超时。

(3)Traceroute还有一个作用是故意设置不分片,从而确定路径的MTU。首先发送分组,并设置“不分片”标志。发送的第一个长度正好与出口MTU相等。如果过程中遇到窄的关口被卡住,则会回复一个ICMP差错报文,错误类型为3,代码为4的“需要进行分片但设置了不分片”。收到这个差错就减小分组长度,直到能到达目的端。

静态路由

任何一个想发往其他局域网的包,都会到达路由器其中一个口,被拿进来,拿下MAC头和IP头,看看,根据自己的路由算法,选择另一个口,加上IP头和MAC头,然后扔出去。

静态路由,其实就是在路由器上,配置一条一条规则,然后保存在路由器的路由表里。

路由表的组成:子网掩码、目的地址、下一跳、接口
在这里插入图片描述

MAC地址是一个局域网内才有效的地址。因而,MAC地址只要过网关,就必定会改变,因为已经换了局域网。(这种是IP头不变,MAC头变)不改变IP地址的网关,我们称为转发网关
还有一种是IP头和MAC头都发生改变,改变IP地址的网关,我们称为NAT网关

转发网关的情况:

对于下图服务器A访问服务器B
在这里插入图片描述
(1)服务器A先判断服务器B的IP是否和自己在同一网段,不再同一网段,就发送给网关(本地ARP缓存表里没有记录的话就广播ARP请求,获取网关的MAC地址),此时源IP为服务器A的IP地址,目的IP为服务器B的IP,源MAC地址为服务器A的MAC地址,目的MAC为192.168.1.1的MAC地址

(2)网关收到服务器A发来的数据帧后,发现是发给自己的,拿出IP数据包,看到目的IP后,查自己的路由表,找到目的网络对应的下一跳和出口,发现下一跳是192.168.56.2,因此发送ARP请求获取下一跳的MAC地址,再发送。此时源IP为服务器A的IP地址,目的IP为服务器B的IP,源MAC地址为192.168.56.1的MAC地址,目的MAC为192.168.56.2的MAC地址。

(3)右侧网关收到数据帧后,拿出IP数据包看到目的IP后,查看自己的路由表找到对应的下一跳和出口(发现没有下一跳,是直连的),直接通过出口192.168.4.1发送ARP获取目的IP的MAC地址,进行发送。此时此时源IP为服务器A的IP地址,目的IP为服务器B的IP,源MAC地址为192.168.4.1的MAC地址,目的MAC为服务器B的MAC地址。

通过这个过程可以看出,每到一个新的局域网,MAC都是要变的,但是IP地址都不变。在IP头里面,不会保存任何网关的IP地址。

NAT网关的情况

局域网内部采用的是私网地址。(私有网络中IP地址可以任意分配,不需注册,也不需要全球唯一)

NAT的应用主要由以下四点:
(1)IP地址池。企业多台主机共用少量合法IP地址,NAT设备选择地址池中合法地址进行映射。
在这里插入图片描述

(2)支持业务供应商的变更。业务供应商使用CIDR为企业网分配合法的IP地址,改变业务供应商就意味着要改变所有的IP地址,但是采用NAT网关的话,NAT设备上有静态地址邦定表,变更新的网络业务供应商只需要对NAT进行更新,网络内部的用户是感觉不到变化的。
(3)单个合法IP地址映射到私有网的多台主机。很显然采用NAT主要一方面就是节省合法的IP地址占用,只要少量的合法IP地址就行了,但是很显然要是很多主机都要用这个合法IP,最后给谁用呢?可以根据传输层信息或其他上层协议去区分不同的会话,并且可能要对上层协议的标识进行转换,比如TCP或UDP端口号。NAT设备更改输出业务流的端口号。
在这里插入图片描述
一对多的端口映射方式有以下几种:全锥型,限制锥型(只有私网主机向特定的外部主机发送过数据,外网主机才能向私网主机发送数据),端口限制锥型,对称型。

(4)服务器负载均衡。将负载分给一组相同功能的服务器分担,而这些服务器对外只有一个IP地址。

最大弊端:NAT破坏了Internet上主机之间的端到端可达性,访问只能先由私网侧发起,公网无法主动访问私网主机。
还有一些其他弊端。

当两个不同私网上的主机需要相互通信时(P2P),怎么办?
NAT穿越

(网上有很多)
主要思想就是:比如网络A的某个私网主机a想喝网络B的私网主机b通信,在公网搭建一个服务器C,服务器C里记录网络A和网络B的公网地址(公网IP地址+端口号),并且服务器C需要能发出让网络A和网络B建立UDP隧道的命令。(注意:网络A和B的NAT路由器类型只能是Cone NAT类型(也就是上面提到的限制锥型,端口限制锥型))。只要服务器C通知网络A和网络B相互发送数据报就可以了。

上面介绍可以看出每次经过一个NAT路由器,IP头和MAC头都会发生改变。

动态路由

上面说的都是静态的路由,一般来说网络环境简单的时候,在自己的可控范围之内,自己捣鼓还是可以的。但是有时候网络环境复杂并且多变,如果总是用静态路由,一旦网络结构发生变化,让网络管理员手工修改路由太复杂了,因而需要动态路由算法。

我们知道求最短路径常用的有两种方法,一种是Bellman-Ford算法,一种是Dijkstra算法。在计算机网络中基本也是用这两种方法计算的。

距离矢量路由算法
基于Bellman-Ford算法。

这种算法的基本思路是,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,从哪条线出去,另一个是到目标路由器的距离

由此可以看出,每个路由器都是知道全局信息的

信息如何更新?每个路由器都知道自己和邻居之间的距离,每过几秒,每个路由器都将自己所知的到达所有的路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。

问题1:导致好消息传得快,坏消息传得慢。

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

为什么会出现坏消息传的慢? 路由环路造成坏消息传的慢
解决路由环路的方法? 水平分割、毒性逆转、触发更新等。

问题2:每次发送的时候,要发送整个全局路由表。

网络大了,谁也受不了,所以最早的路由协议RIP就是这个算法。它适用于小型网络(小于15跳)。当网络规模都小的时候,没有问题。现在一个数据中心内部路由器数目就很多,因而不适用了。限制了距离矢量路由的网络规模。

目前基于距离矢量算法的协议包括 RIP、IGRP、BGP。其中 BGP是距离矢量协议变种,它是一种路径矢量协议。

链路状态路由算法
基于Dijkstra算法。

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

不像距离距离矢量路由协议那样,更新时发送整个路由表。

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

动态路由协议

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

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

内部网关协议的重点就是找到最短的路径
多个最短路径的时候,可以进行负载均衡,称为等价路由。

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

**BGP(Border Gateway Protocol,外网路由协议)**又分为两类,eBGP和iBGP,自治系统(AS)间,边界路由器之间使用eBGP广播路由。内部网络也需要访问其他的自治系统。

边界路由器如何将BGP学习到的路由导入到内部网络呢?就是通过运行iBGP,使得内部的路由器能够找到到达外网目的地的最好的边界路由器。

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

域内协议有:RIP,OSPF,ISIS
域间协议有:BGP
在这里插入图片描述

MPLS

多协议标签交换(MPLS,Multi-Protocol Label Switching)

前面说到IP不是面向连接的,不可靠的,是尽力而为的协议,每个IP包自由选择路径,到每一个路由器,都自己去找下一跳,丢了就丢了,是靠上一层TCP的重发来保证可靠性。

因此我们可以通过一定的技术将网络层的协议变成面向连接的。

(1) IP网络从设计的时候,就认为是不可靠的,所以即使同一个连接,也可能选择不同的道路,这样的好处是,一条道路崩溃的时候,总有其他的路可以走。坏处是效率低。

(2) 与IP对应的另一种技术称为ATM,这种协议和IP协议的不同在于,它是面向连接的。ATM是传输之前先建立一个连接,形成一个虚拟的通路,一旦连接建立了,所有的包都按照相同的路径走,不用像IP包那样思考怎么走。网络层的面向连接。坏处是一旦虚拟通路上的某个路由器断了,什么也发不过去了。

MPLS就是将两者的优点结合起来
该技术支持多种网络层协议,可运行在大多数现有底层网络上,所以称为多协议标签交换。
在这里插入图片描述
MPLS的格式如图所示,在原始的IP头之外,多了MPLS的头,里面可以打标签。
在这里插入图片描述
根据上图注意MPLS的位置在链路层首部和IP首部之间。

MPLS的基本网元设备

有了标签,还需要设备认这个标签,并且能够根据这个标签转发,这种能够转发标签的路由器称为标签交换路由器(LSR,Label Switching Router)

(1)标签交换路由器(Label Switching Router,LSR
(2)由MPLS LSR构成的网络区域称为MPLS域,位于MPLS域边缘与其他网络或用户相连的LSR称为标签边缘路由器(LER)

这种路由器会有两个表格,一个就是传统的FIB(FIB转发信息库),也即路由表,另一个就是LFIB,标签转发表。有了这两个表,既可以进行普通的路由转发,也可以进行基于标签的转发。

在这里插入图片描述

这里我们区分MPLS区域非MPLS区域
(1)在MPLS区域中间,使用标签进行转发
(2)非MPLS区域,使用普通路由转发
在边缘节点上,需要有能力将对于普通路由的转发,变成对于标签的转发——LER

有了标签,转发是很简单的事,但是如何生成标签,却是MPLS中最难修炼的部分。在MPLS秘笈中,这部分被称为LDP(Label Distribution Protocol),是一个动态的生成标签的协议。

标签交换控制层面的操作过程:

(1)在传统路由协议(如OSPF等)形成的路由表的基础上,LSR进行转发等价类(FEC)的划分。
(2)标签分配:LSR将标签绑定到FEC上。
(3)标签分发:LSR通过标签分发协议(LDP)将标签与FEC的绑定关系分发到其他LSR,在LSR上形成标签转发信息表,同时形成标签交换路径(LSP)

标签分发方式:

在一条LSP上,沿数据包传送的方向,相邻的LSR分别叫上游LSR(upstream LSR)和下游LSR(downstream LSR)

下游自主分发方式(Downstream Unsolicited):由数据流动方向的下游节点分配标签。
在这里插入图片描述
(1)在收到上游节点明显的请求时,才由下游节点分配标签
(2)只有收到它的下游返回的标签映射消息后才向其上游发送标签映射消息
在这里插入图片描述
具体的一个例子:
在这里插入图片描述
(1)MPLS最初是为了提高路由器的转发速度而提出的。
(2)随着ASIC技术的发展,路由查找速度已经不是阻碍网络发展的瓶颈。这使得MPLS在提高转发速度方面不再具备明显的优势。但是MPLS支持多层标签和转发平面面向连接的特性,使其在QoS、VPN、流量控制等方面得到广泛应用。

VPN

VPN,全名Virtual Private Network,虚拟专用网,就是利用开放的公众网络,建立专用数据传输通道,将远程的分支机构、移动办公人员等连接起来。

VPN通过隧道技术在公众网络上仿真一条点到点的专线,是通过利用一种协议来传输另外一种协议的技术,这里面涉及三种协议:乘客协议、隧道协议和承载协议
以IPSec协议为例:
在这里插入图片描述

在最前面的时候说了,直接使用公网太不安全,所以接下来我们来看一种十分安全的VPN,IPsec VPN,这是基于IP协议的安全隧道协议,为了保证在公网上面信息的安全,因而采取了一定的机制保证安全性。

(后续再写…)

参考读物:

  1. 极客时间《趣谈网络协议》。
  2. 上课时候的《IP网络基础》课堂笔记。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值