网络层
1. 网络层作用
网络层负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。
注意:不要把运输层的“用户数据报 UDP”和网络层的“IP 数据报”弄混。
网络层的还有一个任务就是选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。
互联网是由大量的异构网络通过路由器相互连接起来的。互联网使用的网络层协议是无连接的网际协议和许多路由选择协议,因此互联网的网络层也叫做网际层或 IP 层。
网络层最重要的协议是 IP 协议。
2. IP 地址
整个的互联网就是一个单一的、抽象的网络。IP 地址就是给互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的 32 位的标识符。IP 地址的结构使我们可以在互联网上很方便地进行寻址。
对主机或路由器来说,IP 地址都是 32 位的二进制代码。为了提高可读性,我们常常在表示时每 8 位插入一个空格,或用其等效的十进制数字表示,并且在这些数字之间加上一个点,称之为点分十进制记法。
IP 地址的一些重要特点:
每一个 IP 地址都由网络号(net-id)和主机号(host-id)组成:IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号由得到该网络号的单位自行分配;路由器仅需根据目的主机所连接的网络号来转发分组,而不必考虑止的主机号,减小了路由表所占的存储空间以及查找路由表的时间。 $$ IPAddress::={[netId], [hostId]} $$
- net-id 标志主机(或路由器)所连接到的网络,一个 net-id 在整个互联网范围内必须是唯一的;
- host-id 标志该主机(或路由器),一台 host-id 在它前面的网络号所指明的网络范围内必须是唯一的;
- 由此,一个 IP 地址在整个互联网范围内是唯一的。
按照互联网的观点,一个网络是指具有相同网络号 net-id 的主机的集合。因此,用转发器或网桥连接起来的若干个局域网仍为一个网络。具有不同网络号的局域网必须使用路由器进行互连。
在 IP 地址中所有分配到网络号的网络都是平等的。所谓平等,是指互联网同等对待每一个 IP 地址。
3. 子网划分
子网划分是将一个大的 IP 网络划分成更小、更可管理的子网络(Subnet)的过程。在网络中,允许管理员将主机分组为子网,以便更有效地管理网络流量、提高网络性能和安全性。
在一个大的 IP 网络中,子网通常通过将子网掩码(Subnet Mask)应用到 IP 地址来定义。子网掩码决定了 IP 地址中哪些部分用于网络标识符,哪些部分用于主机标识符。通过这种方式,管理员可以划分网络并定义子网范围。
具体而言,子网掩码是一个由连续的 1 构成的二进制序列,后跟由 0 组成的序列,其中前缀 1 的个数就代表网络前缀的长度。例如,255.255.255.0
,前 24 位(即前三个字节)是网络部分,而最后 8 位(即最后一个字节)是主机部分。换句话说,这个子网掩码告诉设备前 24 位标识了网络,而最后 8 位标识了主机。
对于一个 IP 地址,只有再结合其对应的子网掩码,网络设备才可以识别出对应的网络,从而决定数据包是应该在本地网络内传输,还是需要通过路由器转发到其他网络。
子网掩码的选择取决于网络的规模和需求。较小的子网掩码可以产生更多的主机地址,但可能会导致广播风暴和网络拥塞。较大的子网掩码会减少可用的主机地址数量,但可以提供更好的网络性能和安全性。
另一种能同时表达 IP 地址与其子网的表示方法是斜线记法,也称 CIDR 记法。即在 IP 地址后面加上斜线/
,然后写上网络前缀所占的位数。比如:
4. IP 地址的分类
4.1 A ~ E 类地址
IP地址根据网路 ID 的不同分为A、B、C、D、E 类地址共5种类型:
- A 类地址
- 范围:
1.0.0.0 ~ 126.0.0.0
,默认的子网掩码为255.0.0.0
。 - 数量:可用的 A 类网络有 126 个。每个网路可以容纳 $2^{24}-2$ 个,约一亿多个主机。
- 应用:A 类地址分配给规模特别大的网络使用。例如 MS、IBM、阿里这样公司的网络。
- 范围:
- B 类地址
- 范围:
128.0.0.0 ~ 191.255.255.255
,默认的子网掩码为255.255.0.0
。 - 数量:可用的 B 类网络有:$2^8\times64$ 个,约有 1.6 万个,每个网络能容纳的主机有 $2^{16}-2$ 个,约 6 万多个。
- 应用:B 类地址一般分配给中等规模网络。
- 范围:
- C 类地址
- 范围:
192.0.0.0 ~ 223.255.255.255
,默认的子网掩码为255.255.255.0
。 - 数量:可用的 C 类网络有 $2^{16} \times 32$ 个,约有 209 万个。每个网路能容纳的主机个数为 $2^8-2$ 个。
- 应用:C 类地址一般分配给小型网路,如一般的局域网和校园网,它连接的主机数量比较少,把用户分为若干段进行管理。
- 范围:
- D 类地址
- 范围:
224.0.0.0 ~ 239.255.255.255
- D 类地址并不用于标识特定的网络设备,而是用于多播(Multicast)通信。多播通信允许一台主机向多台主机发送数据,这在视频会议、在线游戏等场景中非常有用。
- D 类地址没有网络标识符和主机标识符的划分。
- 范围:
- E 类地址
- 范围:
240.0.0.0 ~ 255.255.255.255
。 - E 类地址保留作为未分配的地址,用于特殊用途,如实验和未指定用途。
- E 类地址同样没有网络标识符和主机标识符的划分。
- 范围:
注意,对于所有的网络空间,在计算其可用的主机数量时,计算都必须 $-2$,这是因为要扣除两个保留地址:
- 网络地址:主机号全部为 0 的地址。在每个网络中,最小的地址通常用于表示网络本身。如
192.168.1.0
。 - 广播地址:主机号全部为 1 的地址。在每个网络中,最后一个地址通常被用作广播地址。广播地址用于向网络中的所有设备发送数据包。如
192.168.1.255
。
4.2 私有地址
国际组织在规划 IP 地址时,还划分了一些不会在公共互联网上进行路由的私有 IP 地址的范围,它们只能在内部网络中使用。私有 IP 地址主要是为了在局域网(LAN)内部通信而保留的,其目的是为了提高网络安全性并减少公共 IP 地址的使用。
私有 IP 地址范围根据 IP 地址类别的不同而有所区别:
- A类:
10.0.0.0 ~ 10.255.255.255
- B类:
172.16.0.0 ~ 172.31.255.255
- C类:
192.168.0.0 ~ 192.168.255.255
4.3 保留地址
有些 IP 地址是专门保留的,不用于分配给某个主机或设备。它们被用于特殊的情况。主要包含以下情况:
0.0.0.0
:其含义取决于上下文,但通常用于表示默认路由。- 默认路由:在网络配置中,
0.0.0.0
通常用作默认路由或默认网关的表示。当设备需要发送数据包到不在本地子网内的目标网络时,它会将数据包发送到默认路由,而默认路由的地址通常被设置为0.0.0.0
。 - 任意地址:在某些情况下,
0.0.0.0
也可表示某个本地服务将接受来自任何可用网络接口的连接或数据包。 - 未指定或未知地址:在某些情况下,
0.0.0.0
可以用来表示未指定或未知的地址。例如,在某些网络协议或配置中,0.0.0.0
可能表示尚未分配 IP 地址或无法确定 IP 地址的情况。
- 默认路由:在网络配置中,
127.0.0.1
:称为本地回环地址,用于在本地主机上进行自我测试和通信。255.255.255.255
:称为广播地址,用于向网络中的所有设备发送数据包。
举例而言,命令行中输入netstat -ano
查看前面几行,如下,它们表示本地系统开放的 tcp4 服务,其中显示本地已开放 38127、111、37681 等端口,然而这些端口外部都能访问吗?为什么有些端口前面是 0.0.0.0
,有些却是 127.0.0.1
呢?
127.0.0.1
叫本地环回地址 ,用于测试协议栈的正确性,它不依赖硬件上是否有接网卡,相当于用一根看不见的网线将网卡的发送和接收端连接起来。0.0.0.0
叫任意地址 ,若某个以太网设备存在多块物理网卡,其表示只要本地开放对应的端口服务,无论从哪个网卡发起的连接请求都是允许的。若想限制某服务只允许外部设备从指定网卡入口发起访问,则需要将其配置成具体网卡的 IP 地址,比如上图中,8081 端口只允许从 IP 地址为192.168.2.3
的网卡入口发起。
5. IPv6
到 2011 年 2 月,IPv4 的地址已经耗尽,ISP 已经不能申请到新的 IP 地址块了。于是有了 IPv6 的解决方案。到目前为止,IPv6 还只是草案标准阶段。
一般来讲,一个 IPv6 数据报的目的地址为以下三种类型之一:
- 单播 (unicast)——就是传统的点对点通信
- 多播 (multicast)——一对多点的通信,数据报发送到一组计算机中的每一个。IPv6 没有采用广播的术语,而是将广播看作多播的一个特例。
- 任播 (anycast)——IPv6 增加的一种类型,任播的终点是一组计算机,但数据报只交付其中一个,通常是距离最近的一个。
IPv6 所引起的主要变化如下:
更大的地址空间——在 IPv6 中,每个地址占 128 位。为了使地址更简洁些,IPv6 使用冒号十六进制记法,把每个 16 位的值用十六进制值表示,各值之间用冒号分隔。
扩展的地址层次结构
灵活的首部格式
改进的选项
允许协议继续扩充
支持即插即用(即自动配置)
支持资源的预分配
IPv6 首部改为 8 字节对齐(即首部长度必须是 8 字节的整数倍)
6. 网络层的协议
6.1 IP 协议
IP(Internet Protocol,网际协议)是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。通常提到的 IP 协议是指 IPv4 版本。
6.2 ARP 协议
ARP 协议,全称地址解析协议(Address Resolution Protocol),用于将 IP 地址解析为对应的 MAC 地址,当一台设备知道目标设备的 IP 地址但不知道其 MAC 地址时,它会使用 ARP 协议来查询目标设备的 MAC 地址。
6.3 NAT 协议
NAT(Network Address Translation,网络地址转换)主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
NAT 不光可以缓解 IPv4 地址资源短缺的问题,还可以隐藏内部网络的实际拓扑结构,使得外部网络无法直接访问内部网络中的设备,从而提高了内部网络的安全性。
6.4 ICMP 协议
ICMP(Internet Control Message Protocol,互联网控制报文协议)是一种用于在 IP 网络上发送控制消息的协议。ICMP 的主要目的是提供有关网络的错误报告和诊断信息,以及执行一些网络管理功能。以下是 ICMP 的一些主要特点和应用场景:
- 错误报告:ICMP 主要用于报告网络错误和异常情况。例如,当一个路由器无法将数据包传递到目标主机时,它可能会向源主机发送 ICMP 错误消息,以便源主机可以进行故障排除。
- PING 测试:ICMP Echo 请求和回应消息通常用于 Ping 测试。Ping 测试用于测试主机之间的连通性和测量往返时间(RTT)。发送 Ping 请求后,目标主机应该会回应一个 ICMP Echo 回应消息,从而表明它是可达的。
- 跟踪路由:ICMP 的一种特殊类型是跟踪路由(traceroute)消息。当启动跟踪路由时,每个路由器都会向源主机发送一个 ICMP 时间超过消息,源主机通过检测这些消息来确定数据包通过的路由路径。
- 生存时间和片段超时:ICMP 消息还用于处理 IP 数据包的生存时间(TTL)和片段超时。当 IP 数据包在路由器上达到其 TTL 或片段超时时,路由器可能会发送 ICMP 时间超过消息或片段超时消息。
- 网络诊断:ICMP 还用于执行网络诊断任务。例如,网络管理员可以使用 ICMP Echo 请求消息来测试网络中的特定主机或设备的可达性。
- 路径 MTU 发现:ICMP 还提供了路径 MTU 发现的机制,用于发现源主机和目标主机之间最大传输单元(Maximum Transmission Unit,MTU)。这有助于避免由于 IP 数据报大小超出网络链路 MTU 而导致的分片重组。
PING 命令
ICMP 协议最常见的用途应该就是 PING 命令了。PING 是一种常用的网络诊断工具,经常用来测试网络中主机之间的连通性和网络延迟。
这里简单举一个例子,我们来 PING 一下百度。
# 发送4个PING请求数据包到 www.baidu.com
❯ ping -c 4 www.baidu.com
PING www.a.shifen.com (14.119.104.189): 56 data bytes
64 bytes from 14.119.104.189: icmp_seq=0 ttl=54 time=27.867 ms
64 bytes from 14.119.104.189: icmp_seq=1 ttl=54 time=28.732 ms
64 bytes from 14.119.104.189: icmp_seq=2 ttl=54 time=27.571 ms
64 bytes from 14.119.104.189: icmp_seq=3 ttl=54 time=27.581 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 27.571/27.938/28.732/0.474 ms
PING 命令的输出结果通常包括以下几部分信息:
- ICMP Echo Request(请求报文)信息:序列号、TTL(Time to Live)。
- 目标主机的域名或 IP 地址:输出结果的第一行。
- 往返时间(RTT,Round-Trip Time):从发送 ICMP Echo Request(请求报文)到接收到 ICMP Echo Reply(响应报文)的总时间,用来衡量网络连接的延迟。
- 统计结果(Statistics):包括发送的 ICMP 请求数据包数量、接收到的 ICMP 响应数据包数量、丢包率、往返时间(RTT)的最小、平均、最大和标准偏差值。
如果 PING 对应的目标主机无法得到正确的响应,则表明这两个主机之间的连通性存在问题。如果往返时间(RTT)过高,则表明网络延迟过高。
有些主机或网络管理员可能禁用了对 ICMP 请求的回复,这样也会导致无法得到正确的响应。