本文分享的是IP协议相关内容,其中重点讲解ICMP和ARP协议,以及关于IP地址的一些基础知识。

IP协议

IP 在 TCP/IP 参考模型中处于第三层,也就是网络层

网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。

有的小伙伴分不清 IP(网络层) 和 MAC (数据链路层)之间的区别和关系。

其实很容易区分,在上面我们知道 IP 的作用是主机之间通信用的,而 MAC 的作用则是实现「直连」的两个设备之间通信,而IP 则负责在「没有直连」的两个网络之间进行通信传输。

在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址。整个行程表就相当于网络层,充当远程定位的功能,行程的开始好比源 IP,行程的终点好比目的IP地址。

传统的分类地址(A、B、C、D、E类)

IPv4地址由32位二进制数组成,通常以四组点分十进制数表示(如192.168.1.1)。根据最初的设计,IP地址被分为五类:

  1. A类地址
    • 范围:0.0.0.0 - 127.255.255.255
    • 第一位固定为0
    • 网络号占7位,主机号占24位
    • 最大主机数:16,777,214个
    • 主要分配给:大型组织和政府机构
  2. B类地址
    • 范围:128.0.0.0 - 191.255.255.255
    • 前两位固定为10
    • 网络号占14位,主机号占16位
    • 最大主机数:65,534个
    • 主要分配给:中型组织
  3. C类地址
    • 范围:192.0.0.0 - 223.255.255.255
    • 前三位固定为110
    • 网络号占21位,主机号占8位
    • 最大主机数:254个
    • 主要分配给:小型组织
  4. D类地址
    • 范围:224.0.0.0 - 239.255.255.255
    • 用于多播(Multicast)
  5. E类地址
    • 范围:240.0.0.0 - 255.255.255.255
    • 保留用于研究

分类地址的缺点

尽管分类地址系统设计简单明了,但随着互联网的快速发展,其缺点变得越来越明显:

  1. 地址空间浪费:例如,一家只需要500台主机的公司获得了B类地址,但实际上只使用了不到1%的分配地址,造成了大量浪费。
  2. 路由表膨胀:路由器需要存储越来越多的路由条目,导致性能下降和内存消耗增加。
  3. 缺乏灵活性:地址分配过于刚性,无法满足不同规模网络的需求。

无分类地址 CIDR

为了解决分类寻址的问题,1993年引入了无分类域间路由(Classless Inter-Domain Routing,CIDR)技术。CIDR打破了传统的A、B、C类地址的界限,允许更灵活地分配IP地址块。

CIDR表示法

CIDR使用”前缀长度”表示法:IP地址/网络前缀长度。例如:

  • 192.168.100.0/24 表示前24位是网络部分,后8位是主机部分
  • 可分配的主机数:2^(32-前缀长度) - 2

CIDR的优势

  1. 地址分配更加精确:网络管理员可以根据实际需要分配恰当大小的地址块,就像城市规划师可以根据实际人口需求设计不同大小的住宅区。
  2. 路由聚合:多个小地址块可以合并为一个大地址块进行路由通告,减少了路由表的大小。这就像邮政系统可以将同一个小区的邮件一次性交给小区管理员,而不需要分别记录每家每户的地址。
  3. 解决了地址耗尽问题:通过更高效的地址分配,延缓了IPv4地址耗尽的速度。

公有IP与私有IP

在 A、B、C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。

平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有IP 地址和我学校的可以是一样的。

就像每个小区都有自己的楼编号和门牌号,你小区家可以叫1栋 101号,我小区家也可以叫1栋 101,没有任何问题。但一旦出了小区,就需要带上宛平南路 600 号(公网IP 地址),是国家统一分配的,不能两个小区都叫宛平南路 600 。

所以,公有 IP地址是有个组织统一分配的,假设你要开一个博客网站,那么你就需要去申请购买一个公有 IP,这样全世界的人才能访问。并且公有IP 地址基本上要在整个互联网范围内保持唯一。

公有IP地址

公有IP地址(也称为全球IP地址)是Internet上的唯一标识符,由全球互联网号码分配机构(IANA)及其区域注册商管控。就像城市中的正式门牌号码,每个地址都必须是唯一的,并且在全球范围内可路由。

私有IP地址

随着互联网的发展,IP地址资源越来越紧张。为了节约地址资源,RFC 1918定义了三个私有IP地址段:

  1. 10.0.0.0 - 10.255.255.255 (10.0.0.0/8)
  2. 172.16.0.0 - 172.31.255.255 (172.16.0.0/12)
  3. 192.168.0.0 - 192.168.255.255 (192.168.0.0/16)

私有IP地址只能在内部网络中使用,不能直接用于互联网通信。这就像小区内部的房间号,仅在该小区内有效。

IP地址与路由控制

4.1 路由的基本概念

路由是指数据包从源到目的地的路径选择过程。路由器通过维护路由表来决定数据包的下一跳去向。

4.2 默认网关

默认网关是本地网络与其他网络之间的接口。当主机需要与非本地网络通信时,数据包会被发送到默认网关,再由网关转发。

这就像你不知道如何前往某个陌生城市时,会先到达本地的交通枢纽(如火车站或机场),然后转乘到目的地。

4.3 路由表与路由协议

路由表包含了网络目的地和下一跳的映射关系。路由协议如RIP、OSPF和BGP则负责路由器之间交换路由信息,动态更新路由表。

这些协议就像导航系统,不断更新道路状况,确保数据包能够选择最优路径到达目的地。

IP分片与重组

最大传输单元(Maximum Transmission Unit, MTU)是数据链路层能够传输的最大数据包大小。不同类型的网络有不同的MTU值:

  • 以太网通常为1500字节
  • PPPoE通常为1492字节

每种数据链路的最大传输单元 MTu 都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是1500 字节等。

当 IP 数据包大小大于 MTU 时,IP 数据包就会被分片。经过分片之后的IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。

假设发送方发送一个 4000 字节的大数据报,若要传输在以太网链路,则需要把数据报分片成3个小数据报进行传输,再交由接收方重组成大数据报。

在分片传输中,一旦某个分片丢失,则会造成整个IP数据报作废,所以TCP引入了 MSS,也就是在 TCP层进行分片不由 IP 层分片;对于 UDP, 我们则尽量不要发送一个大于 MTU 的数据报文。

IPv6基本认识

随着全球互联网的爆炸性增长,IPv4的4.3亿个地址(2^32)远远不够用。IPv6应运而生,提供了2^128个地址,数量几乎是无限的。

如果将IPv4地址比作一粒沙子,那么IPv6地址的数量比地球上所有的沙子还要多得多。

IPv6的特点

  1. 更大的地址空间:128位地址长度,理论上可以为地球上的每粒沙子分配一个IP地址
  2. 简化的头部格式:提高了路由器处理效率
  3. 内置安全性:IPsec成为标准组件
  4. 自动配置能力:无需DHCP服务器,设备可以自动生成地址
  5. 更好的QoS支持:流标签字段提供了更好的服务质量控制

IPv6地址表示

IPv6地址使用8组4个十六进制数字表示,如: 2001:0db8:85a3:0000:0000:8a2e:0370:7334

可以使用以下规则简化:

  1. 每组前导零可以省略:2001:db8:85a3:0:0:8a2e:370:7334
  2. 连续的零组可以用双冒号替代(但只能使用一次):2001:db8:85a3::8a2e:370:7334

IPv4首部与IPv6首部

IPv4首部包含至少20字节的信息,包括:

  • 版本、首部长度、服务类型、总长度
  • 标识、标志、片偏移
  • 生存时间(TTL)、协议、首部校验和
  • 源IP地址和目的IP地址
  • 可选项和填充

IPv6首部固定为40字节,设计更加简洁:

  • 版本、通信量类别、流标签
  • 有效载荷长度、下一个首部、跳数限制
  • 源地址(16字节)
  • 目的地址(16字节)

主要区别

  1. 简化设计:IPv6移除了许多IPv4首部字段,如校验和(校验工作交给上层协议)和分片相关字段(分片由源端处理)
  2. 扩展首部:IPv6使用扩展首部机制代替IPv4的选项字段,提高了处理效率
  3. 更高效的路由:固定长度的基本首部使路由器处理更快速
  4. 更好的扩展性:IPv6设计考虑了未来扩展

ICMP

定义与报文格式

ICMP是 Internet Control Message Protocol 的缩写,即互联网控制消息协议。它是互联网协议族的核心协议之一。它用于 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。

虽然 ICMP 是网络层协议,但是它不像 IP 协议和 ARP 协议一样直接传递给数据链路层,而是先封装成 IP 数据包然后再传递给数据链路层。所以在 IP 数据包中如果协议类型字段的值是 1 的话,就表示 IP 数据是 ICMP 报文。IP 数据包就是靠这个协议类型字段来区分不同的数据包的。如下图 WireShark 抓包所示:

从 ICMP 的报文格式来说,ICMP 是 IP 的上层协议。但是 ICMP 是分担了 IP 的一部分功能。所以,他也被认为是与 IP 同层的协议。下面一起来看一下 ICMP 数据包格式和报文内容吧。具体参考下图:

协议类型

ICMP 包头的类型字段,大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是「查询报文类型
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型

询问报文

常用的ICMP询问报文有以下两种:

  • 回送请求和回答:ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文这种询问报文用来测试目的站是否可达及了解其有关状态。

可以向对端主机发送回送请求的消息(ICMP Echo Request Message,类型 8),也可以接收对端主机发回来的回送应答消息(ICMP Echo Reply Message ,类型 0)。

相比原生的 ICMP,这里多了两个字段。标识符用以区分是哪个应用程序发ICMP包,比如用进程PID作为标识符;序列号从 8开始,每发送一次新的回送请求就会加 1,可以用来确认网络包是否有丢失。

在选项数据中, ping还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

  • 时间戳请求和回答:ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。

差错报文

事先说明,以下情况不应发送ICMP差错报告报文:

  • 对ICMP差错报告报文不再发送ICMP差错报告报文
  • 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
  • 对具有多播地址的数据报都不发送ICMP差错报告报文
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文

而差错报文一共有以下五种,下面分别进行介绍:

1.终点不可达

当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误。

2.源点抑制

当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。

3.超时

当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值减1。

  • 若结果不为0,则将该IP数据报转发出去;
  • 若结果为0,除了丢奔该IP数据报外,还要向源点发送时间超过报文。

另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文。

4.参数问题

当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。

5.重定向

路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

ICMP应用

PING(分组网间探测,Packet InterNet Groper)

文章该部分来自:https://xiaolincoding.com/network/4_ip/ping.html#%E5%B7%AE%E9%94%99%E6%8A%A5%E6%96%87%E7%B1%BB%E5%9E%8B

ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包。

ICMP 数据包内包含多个字段,最重要的是两个:

  • 第一个是类型,对于回送请求消息而言该字段为8;
  • 另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包。

每发出一个请求数据包,序号会自动加1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。

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

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

接收后检查该数据帧,将IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。

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

整个过程如下:

当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。

但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据目标 IP 地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换 MAC 头里面的 MAC 地址。

说了这么多,可以看出 ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8 )和 ECHO REPLY (类型为 0)

跟踪路由(traceroute)

该命令用来测试IP数据报从源主机到达目的主机要经过哪些路由器。

在Windows版本中,

  • tracert命令
  • 应用层直接使用网际层ICMP
  • 使用了ICMP回送请求和回答报文以及差错报告报文

在Unix版本中,

  • traceroute命令
  • 在运输层使用UDP协议
  • 仅使用ICMP差错报告报文

以下是对B站发送tracert命令的截图:

在这个输出中,前三个跳点正常响应:本地路由器(192.168.10.1)、网关(192.168.1.1)和第一个ISP节点(100.115.0.1)。第4-16跳点显示”请求超时”(*),这表示这些中间路由器配置为不响应ICMP请求;最后一跳(第17跳)成功到达目标服务器(119.3.70.188,bilibili.com)。

tracert依然成功的原因是它只需要最终目标响应,或者至少要找到通往目标的路径。中间节点不响应并不意味着数据包无法通过这些节点——它们只是不发送ICMP响应而已。

至于为什么不发送呢?其实这也是出于网络安全的角度考虑的。黑客常用ping扫描和traceroute工具来发现活跃主机和路由路径,屏蔽ICMP响应可减少这类初步侦察的效果,同时也达到了避免ICMP洪水攻击的效果。

ARP

ARP(Address Resolution Protocol,地址解析协议)是一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的 MAC地址。如果目标主机不在同一个链路上时,可以通过 ARP查找下一跳路由器的MAC地址。不过ARP只适用于IPv4,不能用于 IPv6。IPv6中可以用ICMPv6 替代 ARP 发送邻居探索消息。

请求响应过程

1. ARP 请求

当设备需要与目标设备通信时,如果不知道目标设备的 MAC 地址,它会发送一个 ARP 请求广播包,询问”谁拥有这个 IP 地址?”。

  • 发送方广播 ARP 请求包,询问目标 IP 地址对应的 MAC 地址。
  • 局域网中的所有设备都会收到该请求。

2. ARP 响应

如果某个设备发现自己的 IP 地址与 ARP 请求中的目标 IP 地址匹配,它会发送一个 ARP 响应包,告知自己的 MAC 地址。

  • 接收方发送 ARP 响应包,告知自己的 MAC 地址。
  • ARP 响应包是单播的,只发送给请求方。

3. ARP 缓存

发送方在收到 ARP 响应后,会将 IP 地址和 MAC 地址的映射关系存储在本地 ARP 缓存中,以便后续通信时直接使用。

不过,MAC地址的缓存是有一定期限的。超过这个期限,缓存的内容将被清除。这使得MAC地址与IP地址对应关系即使发生了变化,也依然能够将数据包正确地发送给目标地址。

ARP 的关键特性

  1. IP 地址到 MAC 地址的映射
    • 将网络层地址解析为数据链路层地址。
  2. 广播请求和单播响应
    • 使用广播发送 ARP 请求,使用单播发送 ARP 响应。
  3. ARP 缓存
    • 存储 IP 地址和 MAC 地址的映射关系,减少重复的 ARP 请求。
  4. 局域网内使用
    • ARP 主要用于局域网中,不适用于跨网络通信。

ARP 的安全性

显然由于广播请求的特性,ARP 本身是不安全的,容易受到以下攻击:

  1. ARP 欺骗(ARP Spoofing):
    • 攻击者伪造 ARP 响应,将自己的 MAC 地址与目标 IP 地址关联。
  2. ARP 泛洪(ARP Flooding):
    • 攻击者发送大量伪造的 ARP 请求,耗尽网络资源。

为了提高安全性,可以使用以下防护措施:

  1. 静态 ARP 表:手动配置 IP 地址和 MAC 地址的映射关系。
  2. ARP 检测:监控网络中的 ARP 流量,检测异常行为。
  3. 网络隔离:使用 VLAN 或子网隔离设备,减少 ARP 攻击的影响。

综合实践

设计一个简单的家庭网络方案,包括公有IP、私有IP分配以及NAT配置。

1. 网络需求分析

首先,让我们假设一个普通家庭的网络需求:

  • 1台路由器(连接互联网)
  • 1台台式电脑(有线连接)
  • 2台笔记本电脑(无线连接)
  • 2部智能手机(无线连接)
  • 1台智能电视(无线连接)
  • 1台打印机(无线连接)
  • 潜在的访客设备和未来可能增加的设备

2. 公有IP地址配置

  • 公有IP获取方式:通过ISP(网络服务提供商)获得,通常为动态分配的单个公有IPv4地址
  • 假设分配的公有IP:203.0.113.25(这是一个保留给文档使用的示例IP地址)

3. 私有IP地址规划

我们选择使用192.168.1.0/24网段作为家庭内部网络:

  • 网络地址:192.168.1.0
  • 广播地址:192.168.1.255
  • 可用IP范围:192.168.1.1 - 192.168.1.254
  • 子网掩码:255.255.255.0

具体IP分配方案:

  • 路由器WAN口:203.0.113.25(公有IP,由ISP分配)

  • 路由器LAN口:192.168.1.1(作为内网默认网关)

  • 固定设备IP分配

    • 台式电脑:192.168.1.10
    • 智能电视:192.168.1.20
    • 打印机:192.168.1.30
  • DHCP动态分配区域:192.168.1.100 - 192.168.1.200(用于笔记本、手机和访客设备)

4. NAT配置

在家用路由器中配置NAT(网络地址转换):

  1. 基本NAT设置
    • 启用NAT功能(大多数家用路由器默认启用)
    • NAT类型:SNAT(源网络地址转换)
  2. 端口转发设置(如有需要):
    • 如果家庭内有需要从外网访问的服务(如网络摄像头),配置特定端口转发
    • 例如:将外部访问203.0.113.25:8080的请求转发到内部192.168.1.30:80(打印机Web管理界面)
  3. DMZ主机(可选):
    • 如果有一台设备需要完全暴露给互联网(如游戏主机),可以将其设置为DMZ主机
    • 例如:将192.168.1.10(台式电脑)设置为DMZ主机

5. 安全措施

  1. 防火墙设置
    • 启用路由器自带防火墙
    • 仅开放必要的入站端口
    • 设置状态检测功能
  2. 无线安全
    • 使用WPA3加密(如果设备不支持,则使用WPA2-PSK)
    • 设置强密码,避免使用常见词组
    • 可考虑隐藏SSID(虽然这只是基本防护)
  3. 访客网络
    • 设置独立的访客WiFi网络(192.168.2.0/24)
    • 限制访客网络只能访问互联网,不能访问主网络中的其他设备

6. 网络拓扑图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
                   互联网

│ (公有IP: 203.0.113.25)

┌─────────────────┐
│ 路由器 │
│ 192.168.1.1 │
└─────────────────┘
/ │ │ \
/ │ │ \
┌─────────────┐ │ ┌─────────┐ ┌──────────┐
│ 台式电脑 │ │ │智能电视 │ │ 打印机 │
│192.168.1.10 │ │ │192.168.1.20│ │192.168.1.30│
└─────────────┘ │ └─────────┘ └──────────┘

┌───────────────┐
│ 无线接入点 │
│(内置于路由器) │
└───────────────┘
/ | \
/ | \
┌────────────┐ ┌────────────┐ ┌────────────┐
│ 笔记本1 │ │ 笔记本2 │ │ 智能手机 │
│DHCP分配 │ │DHCP分配 │ │DHCP分配 │
└────────────┘ └────────────┘ └────────────┘

7. 实施步骤

  1. 连接路由器WAN口到ISP提供的网络接入设备(光猫/调制解调器)
  2. 配置路由器LAN口IP为192.168.1.1
  3. 配置DHCP服务,IP分配范围设为192.168.1.100-192.168.1.200
  4. 为固定设备手动设置静态IP或在路由器中设置MAC地址绑定
  5. 配置WiFi设置(SSID、密码、安全模式)
  6. 设置防火墙规则和必要的端口转发
  7. 测试内网连接和互联网访问

这个方案适用于大多数家庭网络需求,具有足够的灵活性和扩展性,同时通过NAT和基本安全措施提供了必要的安全保障。随着IoT设备增加,可能需要考虑分VLAN或增加更严格的网络隔离策略。