计算机网络(第6版) WriteBy 谢希仁 —— 网络层
计算机网络(第6版) WriteBy 谢希仁 —— 网络层
-
前言
本层讨论多个网络通过路由器互连成为一个**互连网络(或互联网)**的各种问题。
网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组时不需要先建立连接。每一个分组(也就是IP数据报)独立发送,与其前后的分组无关(不进行编号)。网络层不提供服务质量的承诺。也就是说,所传送的分组可能出错、丢失、重复和失序(即不按序到达终点),当然也不保证分组交付的时限。
-
虚拟互连网络
背景:没有一种单一类型的网络可以适用于所有的用户需求,且网络技术需要不断的发展,厂商之间也不断的推出自身的新技术以适应市场的需求以及抢占市场。
中间设备:
- 物理层使用的中间设备叫做转发器(repeater)
- 数据链路层使用的中间设备叫做网桥或桥接器(bridge)
- 网络层使用的中间设备叫做路由器(router)
- 在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统需要在高层进行协议的转换
TCP/IP体系在网络互连上采用的做法是在网络层(即IP层)采用了标准化协议,但相互连接的网络则可以是异构的。在满足用户需求的同时,也能让不同的异构型网络互连在一起,互相通信。其实这些网络之间并没有真正意义上的互连在一起,只是一个逻辑上的网络,所以称为 “虚拟”。
-
IP协议
这是一个重点哦!!!
IP协议工作在网络层,TCP/IP体系中的网络层常常称为网际层(internet layer),或IP层。与IP协议配套使用的还有三个协议:地址解析协议ARP、网际控制报文协议ICMP、网际组管理协议IGMP
IP地址在整个因特网的范围是唯一的,由 网络号 + 主机号 组成。
IP地址中的网络号字段和主机号字段:
这幅图应该很好懂的嘛,哈哈。A~C类地址永远单播(一对一)通信。。。
IP地址并不仅仅指明一个主机,而是还指明了主机所连接到的网络。
对主机或路由器来说,IP地址都是32位的二进制代码。人类采用点分十进制记法表示IP地址,如 192.168.0.1
IP地址与MAC地址的区别:
- 网络层及以上使用的是IP地址,数据链路层和物理层使用的是MAC地址
- IP地址是一种逻辑地址(靠软件生成的),MAC地址一种物理地址(靠硬件生成的)
地址解析协议ARP:

ARP协议就是用来根据目标主机的IP地址解析出对应的硬件地址。
每一个主机都设有一个ARP高速缓存,里面有本局域网上的各主机和路由器的IP地址地址到硬件地址的映射表。 => 表刚开始是空的?怎么望里面添加的数据呢?看图:

假设你是一个主机A,你和小梅的主机B在同一局域网下。有一天,你想给小美发消息了。但是你的APR缓存列表中没有小美的MAC地址,怎么办呢?于是乎,你就想局域网里的所有主机广播了一条消息(ARP请求分组):“我的MAC地址是xxx,小美的IP地址是xxx.xxx.xxx.xxx,小美,你在哪里?”。局域网中的所有主机都收到了该分组请求,当然,这也包括小美,小美收到了后,将你的MAC地址与IP地址缓存起来,然后给你回复她的MAC地址,该过程是单播的,小美之所以能够单独给你发,那是应为她已经知道了你的IP地址和MAC地址。
APR告诉缓存中的每一个映射地址条目都有一个生存时间,到时间了就会从中移除。 => IP是动态的,所以不能保证这个映射永远都是有效的
ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。=> 很显然,我们大部分的网络请求都是不在一个网络下进行的,这时候该怎么操作呢。嘻嘻,找到路由器不就行了嘛,剩下的交给它。
现在,让我们来看一下IP数据报的格式吧:

- **版本:**4个比特位,IPv4还是IPv6
- **首部长度:**4个比特位,可以表示的最大十进制数是15。首部长度 * 4 = 首部总的字节长度。所以,首部长度最小的十进制数是5。首部总的字段长度最大是60字节。
- **区分服务:**实际上没有什么作用,一个保留字段
- **总长度:**首部长度 + 数据部分的长度之和,单位是字节,最多能表示65535字节。 => 实际上很少有这么大的报文去传输的,毕竟在数据链路层有一个东西叫做MTU。如果要进行分片的话,“总长度”就表示每一个分片的首部与数据长度之和。
- **标识:**IP软件在存储器中维持着一个计数器,没产生一个数据报,计数器+1,这并不是为了数据报的顺序的,是为了在进行分片时,赋值给那些小分片,确保接收端可以重组成原数据报
- **标志:**虽然占了3位,但是只有后两位有作用。最低位为1,表示后面还有分片;为0,表示这是最后一个分片了。中间的那位为1,表示不能进行分片;为0,表示可以分片。
- **片偏移:**指出在进行片偏移后,某片的在原分组的相对位置。 => 毕竟肯定是要将这些分片组合成原数据报的嘛
- 生存时间:TTL (Time To Live),表名数据报在网络中的寿命。在发送端中设置好,显然最大是255。每经过一个路由器转发,就将数值-1,当数值为0时,就丢弃,不再进行转发操作。
- **协议:**指定上层协议,这样目标主机的IP层就能知道交给上层的哪一种协议进行处理
- **首部校验和:**类似于数据链路层的FCS和CRC,只不过算法没有这么复杂,了解就行了
- **源地址:**发送方的IP地址
- **目的地址:**接收方的IP地址
- **填充:**如果数据报的首部不是4的整数倍,那么就会自动填充为4的整数倍
IP分组转发的流程:上文我们也说过,在同一局域网下,利用MAC地址寻找你的“另一半”,如果不在同一个网络下,那么就得找到路由器,交给它去发送。那这个路由器又是怎么知道它该往哪里发送呢?其实也是很简单的。就是查路由表嘛,如果路由表缓存有**[目的网络地址,下一跳地址]**,那就直接拿到“下一跳地址”发送即可。如果路由表中没有呢?我们下文继续说。。。
-
划分子网
这个所谓的构造子网,其实就是占用主机号的一部分:IP地址 = <网络号 + 子网号 + 主机号>
这个是内部的事情,寻址是网络号的事情,所以你内部怎拆分成多个自网络,对外网来说,没有任何影响。
**子网掩码:**既然都划分子网了,那肯定得想办法找到子网的地址嘞,难不成广播啊?这就是子网掩码的作用,将子网掩码与目的IP进行按位与运算,就可以得出子网地址。
因特网标准规定了,任何网络都必须有子网掩码,无论有没有划分子网,路由器中也必须存在子网掩码这一栏,不划分子网的使用默认的子网掩码。
所以在网络的各个节点,都会进行IP地址与子网掩码的运算,已确定“下一跳”地址。 => 如果不是同一局域网下,那就发送给默认的网关,这通常是一个路由器,然后继续一样的流程。
-
网际控制报文协议ICMP
ICMP允许主机和路由器报告差错和提供有关异常情况的报告。
ICMP作为IP层数据报的数据,加上数据的首部,组成IP数据包发出去。
ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。
校验和用来检测整个ICMP报文内容,而IP数据报中的首部检验并不包括IP数据报的内容。
ICMP五大差错报告:
- **终点不可达:**当路由器或主机不能交付数据报时就向源点发送终点不可达报文
- **源点抑制:**当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢
- **时间超过:**当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文
- **参数问题:**当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文
- **改变路由(重定向):**路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)
所有的ICMP差错报告报文中的数据字段都具有同样的格式:

图应该很好看懂的,这里主要解释一下在IP数据报数据字段中提取的前8字节是什么东西。其实里面包含了运输层的端口号和运输层报文发送的序号。
常用的ICMP询问报文有两种:
-
回送请求和回答: ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态 => ping命令就是一个最好的例子
-
**时间戳请求和回答:**ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间
-
路由选择协议
因特网采用分层次的路由选择协议,分为内部网关协议IGP(如RIP和OSPF等)和外部网关协议EGP(BGP)
-
内部网关协议RIP
该协议基于距离向量算法,使用“跳数”作为路由的度量标准,即路由器到目的网络所经过的路由器数
基本特点:
- 仅与相邻路由器交换信息。
- 交换的信息是当前本路由器所知道的全部信息,即自己的路由表。
- 按照固定的时间间隔(默认为30秒)交换路由信息,通过UDP协议的520端口进行通信。
- 默认最大跳数为15跳,16跳的距离将被认为是不可达的,从而限制了网络的规模。
- 在小型网络中表现良好,但对于使用慢速WAN连接的大型网络或者安装有大量路由器的网络,效率较低
工作原理:
- 路由器启动RIP协议后,会向周围邻居路由器广播发送请求报文
- 邻居路由器收到请求报文后,将自己的RIP路由表封装在响应报文中,进行回应
- 路由器收到邻居路由器的响应报文后,会修改本地路由表
局限性:
-
由于RIP使用跳数作为路由度量,因此在大型或复杂网络中可能会导致非最优路由
-
RIP的收敛速度较慢,网络拓扑变化后可能需要较长时间才能更新所有路由器的路由表
-
RIP不支持基于不同服务类型的路由优化,如带宽、延迟或负载等
-
内部网关协议OSPF(开放最短路径优先)
OSPF 是基于链路状态的协议,与基于距离向量的协议(如 RIP)相比,OSPF 能够更快地收敛网络变化,提供更短的路径,并且能够处理更大规模的网络。
工作原理:
OSPF 通过构建一个全网的拓扑结构图来实现路由选择。每个运行 OSPF 协议的路由器都会维护一个链路状态数据库,该数据库包含了网络中所有路由器的链路状态信息。OSPF 使用洪泛法来传播链路状态信息,确保所有路由器都能够获得整个网络的完整视图。 => **洪泛法:**当路由器需要传播链路状态信息时,它会将信息发送给所有相邻的路由器。每个收到信息的路由器会首先更新自己的链路状态数据库,然后将这些信息转发给所有其他相邻的路由器,除了发送信息的来源路由器,以避免信息的循环传播。这个过程会不断重复,直到整个网络中的所有路由器都接收到并更新了这些信息。
特点:
-
快速收敛:OSPF 能够迅速响应网络拓扑的变化,当网络中出现链路故障时,OSPF 能够快速地计算出新的最短路径。
-
无路由环路:OSPF 使用 Dijkstra 算法来计算最短路径,确保网络中不会产生路由环路。
-
支持区域划分:OSPF 允许将大型网络划分为多个区域,每个区域内的路由器只维护该区域的完整链路状态信息,减少了路由器之间的信息交换量,提高了网络的可扩展性。
-
支持变长子网掩码(VLSM):OSPF 支持不同长度的子网掩码,使得网络地址分配更加灵活。
-
支持路由认证:OSPF 提供了多种认证机制,确保路由信息的安全性。
-
-
外部网关协议BGP
BGP是一种用于在不同自治系统(AS)之间交换路由信息的外部网关协议。它是互联网上的核心路由协议,用于确保数据包能够正确地从一个网络传输到另一个网络。
工作原理:
BGP通过维护一个包含网络可达性信息的路由表来工作。每个运行BGP的路由器都会与其他路由器交换这些信息。BGP使用TCP协议(端口179)来建立稳定的连接,并在这些连接上交换路由更新信息。这些信息包括路由的路径和各种属性,如自治系统路径、下一跳地址等。
BGP报文类型:
- Open报文:用于建立和确认BGP会话。
- Update报文:用于发送路由信息更新。
- Keepalive报文:用于保持BGP会话的活跃状态。
- Notification报文:用于在检测到错误时通知对方并关闭连接。
- Route-refresh报文:用于请求对等体重新发送路由信息。
BGP的应用场景:
- 互联网服务提供商(ISP):ISP使用BGP来交换路由信息,以便用户可以访问全球的互联网资源。
- 大型企业网络:企业使用BGP来连接其分支机构和数据中心,以及与ISP建立连接。
- 数据中心互联:BGP用于连接不同的数据中心,以实现高效的数据传输和负载均衡。
- 内容分发网络(CDN):CDN使用BGP来优化内容路由,确保用户能够快速访问内容。
BGP的特点:
-
策略控制:BGP允许网络管理员通过设置策略来控制路由的传播和选择。
-
无类域间路由:BGP支持CIDR(无类域间路由),可以有效地汇总路由。
-
避免环路:BGP通过携带AS路径信息来避免路由环路的产生。
-
增量更新:BGP仅在路由信息发生变化时发送更新,而不是周期性地发送完整路由表。
-
-
IP多播
**背景:**许多应用需要由一个源点发往许多的站点,即一对多的通信。
在因特网上进行多播就叫做IP多播。IP多播所传送的分组需要使用多播IP地址。
每一个D类地址标志一个多播组。
多播地址只能用于目的地址,而不能用于源地址。
IP多播可以分为两种。一种是只在本局域网上进行硬件多播,另一种则是在因特网的范围进行多播。
由于多播IP地址与以太网硬件地址的映射关系不是唯一的,因此收到多播数据报的主机,还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。
IGMP(网际组管理协议):让连接在本地局域网上的多播路由器知道本局域网上是否有主机(严格讲,是主机上的某个进程)参加或退出了某个多播组。
多播路由选择协议:
多播路由选择协议是用于在网络中的多播路由器之间传播多播路由信息,以便将多播数据有效传送到所有组成员的协议。这些协议能够构建多播转发树,确保多播数据沿着特定的路径传播,同时避免数据在网络中重复转发和循环。
工作原理:
洪泛与剪枝 => 路由器使用洪泛的方法转发多播数据报,即像广播一样发送到所有路径。然后,通过反向路径广播策略,路由器检查数据报是否来自最短路径的源点,并据此剪除不需要的分支,构建起多播转发树。
隧道技术 => 当多播组成员分布在不同地理位置时,可以使用隧道技术。在不支持多播的网络段之间,多播数据报被封装成单播数据报,通过隧道传输。
基于核心的发现技术 => 这种方法适用于多播组规模变化较大的情况。每个多播组G指定一个核心路由器,由核心路由器创建转发树。
-
虚拟专用网VPN
有些时候并不需要将所有的计算机都接入因特网,有些计算机仅仅只是在内部使用而已,不对外(公网)暴露。对于这些不需要接入公网的站点,可由内部自行分配IP地址。
专门用于内部通信的IP地址称为专用地址(可重用地址)。在因特网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发。
如果两个专用网络之间需要进行通信,可以使用公网作为媒介,在传输的过程中对数据进行加密即可。
所谓的“虚拟”其实更多的指代后面的“专用”,其实并不是专用,只是说整个过程看山去像是“建立了一条专门的信道一样”。
VPN可以通过多种协议实现,包括IPSec和SSL等:
IPSec VPN => 是一种较为传统的VPN技术,工作在网络层(OSI模型的第3层),能够在两个端点之间建立起一条加密的“隧道”,所有基于IP的应用数据都可以通过这条隧道进行传输。IPSec VPN的优势在于其强大的安全性和对IP层的直接支持,但需要用户安装客户端软件,且配置相对复杂。
SSL VPN => 是一种较新的技术,通常基于HTTPS(Secure HTTP),不需要安装专门的客户端软件,用户只需通过支持SSL的浏览器即可访问。SSL VPN的优势在于其易用性和跨平台能力,适合于需要快速部署和远程工作的场景。然而,SSL VPN可能不如IPSec VPN在性能和某些高级功能上强大。
一个机构要构建自己的VPN就必须为它的每一个场所购买专门的硬件和软件,并进行配置,使每一个场所的VPN系统都知道其他场所的地址。
-
网络地址转换NAT
网络地址转换(NAT,Network Address Translation)是一种在IP网络中转换IP地址的技术,主要用于将私有(本地)IP地址转换为公共(公网)IP地址,或反之。这样做的主要目的是为了节省IPv4地址空间,并提高网络的安全性。NAT可以在不同网络设备上实现,如路由器、防火墙或单独的NAT设备。
工作原理:
- 静态NAT:为内部网络中的每个主机分配一个固定的公共IP地址。这种方式下,公共IP地址与私有IP地址的映射是一一对应的,并且永久不变。
- 动态NAT:将内部网络的私有IP地址动态映射到一组预定义的公共IP地址上。当内部主机需要与外部通信时,动态NAT会从地址池中分配一个公共IP地址,直到该地址被释放并再次分配给其他内部主机。
- 端口地址转换:也称为多路复用NAT,允许多个设备共享单个公共IP地址,通过使用不同的端口号来区分不同的会话。这是最常见的NAT类型,因为它可以有效地支持大量设备同时访问互联网,而无需为每个设备分配一个单独的公共IP地址。
随着IPv6的推广,NAT的需求可能会逐渐减少,因为IPv6提供了几乎无限的地址空间。
结语:也算是一个完结了,重点是在IP协议,其余的没事多看看,多百度、多问一下AI就好了。。。





