一篇文章详细解析 IPv4地址
IP数据报(IP分组)
实际传输中,数据部分的长度会受到数据链路层的的 最短/最长帧长 限制
一个链路层数据帧能承载的最大数据量称为 最大传送单元(MTU)。
如果一个IP数据包的总长度 > 下一段链路的MTU,就需要对其进行分片。到达目标主机的网络层后再对分片进行重组。
那么接收方如何区分分片属于哪个数据报?如何进行组装?
- 通过分片的 标识 字段来判断属于哪个数据报。
- 通过 标志 字段来判断分片是不是最后一个分片。最低为MF(More Fragment),次低位DF(Dont Fragment)。
- MF = 1,表示后面还有分片。MF = 0表示这是最后一个分片。
- DF = 1,表示不允许被分片。DF = 0表示允许被分片。
- 最后根据 片偏移 来完成分片的重组(由于首部的 片偏移 字段必须是以 ×8B 为单位,因此除最后一个分片之外,其他分片的长度必须是 8B 的整数倍)
生存时间:数据报在网络中可通过的路由器数的最大值。IP分组每经过一个路由器,TTL--,如果已经减到0,该路由器就丢弃分组并向源主机发送ICMP报文(通知出现异常)
协议:如果为TCP协议服务设为6,为UDP协议服务设为17。可以让目的主机知道当前数据报向上递交给TCP协议还是UDP协议
IP地址
- 在那个年代,要求每台主机、每个路由器接口被分配的 IP 地址都是全球唯一的
- 路由器和路由器连接的接口可以不分配 IP 地址,但路由器和其他节点连接的接口必须分配 IP 地址
- 从属于同一个网络的所有主机、路由器接口的 IP 地址 “网络号” 都相同
- 当一台新主机接入网络时,需要给它分配一个 IP 地址、并配置 “默认网关”
- 如果是跨网络传播,则需要经过网关。
- ARP协议可以将IP地址转换为对应的MAC地址
- 如果是同一个网络内传播,则无需经过网关。通过ARP协议将目标IP地址转为目标MAC地址,然后将数据报封装为MAC帧直接在网络内部传输。如果要跨网络传输,则需要将数据报封装 吗,则要再经过不同网关传输到另一个网络
子网划分与子网掩码
子网划分是将一个大的网络划分成若干个较小的子网的过程。例如将学校的网络再划分为不同校区的网络。
作用:
- 提高 IP 地址利用率:在没有子网划分前,一个网络无论主机数量多少,都只能使用一个固定类别的网络地址,造成 IP 地址浪费。通过子网划分,可根据实际需求将大网络划分为多个子网,合理分配 IP 地址。例如,一个公司有多个部门,每个部门主机数量不同,子网划分后,可按需分配 IP,减少浪费。
- 增强网络管理和安全性:不同子网可以进行独立的管理和配置,如设置不同的访问控制策略。同时,子网间的通信需要通过路由器,可在路由器上设置防火墙规则,提高网络安全性。
划分原理:
- IP 地址由网络号和主机号两部分组成。子网划分是通过借用主机位来扩展网络号,从而产生子网。例如,对于一个 C 类网络(默认子网掩码是 255.255.255.0 ,即网络号占 24 位,主机号占 8 位 ),若借用 3 位主机位来划分子网,那么子网掩码就变为 255.255.255.224(/27 ),网络号变为 27 位,主机号变为 5 位 。
子网掩码:子网掩码用于标识 IP 地址中网络号和主机号的界限。通过将 IP 地址和子网掩码进行按位与运算,可得到网络前缀(<网络号,子网号>)。例如,IP 地址为 192.168.1.100 ,子网掩码为 255.255.255.0 ,按位与运算后得到网络地址 192.168.1.0 ,网络前缀为192.168.1。只有网络前缀相同的IP地址才属于同一个网络
无分类编制 CIDR
子网划分:
- 定长子网划分:把主机号的前k bit分出来作为定长子网号,可以划分出2^k 个子网
- 缺点:每个子网都一样大,不够灵活,IP地址利用率低,资源浪费多
- 变长子网划分:
CIDR 地址块的子网划分技巧:
可以利用类似于 “从根到叶构造二叉哈夫曼树” 的技巧
- 原始 CIDR 地址块作为根节点(假设可以自由分配的主机号占 h bit)
- 每个分支节点必须同时拥有左右孩子,左 0,右 1(反过来也行)
- 每个叶子结点对应一个子网,根据根节点到达叶子结点的路径来分析子网对应的 IP 地址块范围
- 整棵树的高度不能超过 h - 1(因为即便最小的子网也至少要保留 2bit 主机号)
路由聚合
对于一个路由转发表,如果几条路由表项的转发接口相同,部分网络前缀也相同,那么可以将这几条路由表项聚合为一条。这种地址的聚合就是路由聚合,也称构成超网。
采用CIDR技术后,由于路由聚合,一个IP地址转发表项可能匹配多个表项,应使用 最长前缀原则
优缺点:
- 路由聚合可以减少路由表的大小
- 减少查询时间,转发时延更低
- 可能会引入额外的无效地址
网络地址转换NAT
私有 IP 地址(内网 IP)
- 只允许分配给局域网内部的节点,不允许分配给互联网上的节点
- 每个局域网内部都可以自行分配这些私有 IP 地址
- 私有 IP 地址是可复用的,只要求局域网内唯一,不要求全球唯一
全球 IP 地址(外网 IP)
- 通常由 ISP 提供,全球唯一
- 外网 IP 是一个局域网与外界通信时所需使用的 IP 地址
NAT 路由器
- 作用:转发 IP 数据报时,进行内网 IP、外网 IP 的相互转换
- NAT 表,记录地址转换关系 ——<内网 IP: 端口号↔外网 IP: 端口号>
- 一个 IP 数据报
- 从内网转发到外网,会更改源 IP 地址、源端口号
- 从外网转发到内网,会更改目的 IP 地址、目的端口号
- NAT 路由器包含传输层的功能(因为端口号是传输层的概念)
不同网络进程之间通信过程:
地址解析协议ARP
在一个局域网内部,可以通过 ARP协议 可以查询到一个 IP 地址对应的 MAC 地址
ARP表(ARP缓存)
- 记录(IP 地址 - MAC 地址)之间的映射关系
- 一个数据结构(每台主机、每台路由器都有自己的 ARP 表)
- 需要定期更新 ARP 表项
查询过程:
- ARP 请求分组
- 内容
- 发送方标识:自身 IP 地址为 X,MAC 地址为 Y
- 目标方查询:需查询 IP 地址为 Z 的设备
- ARP 请求分组被封装进 MAC 帧,其中帧的目的地址设为全 1(表示广播),源地址为 Y,以广播帧形式发送
- ARP 响应分组
- 内容:表明自身为 IP 地址是 Z 的设备,同时说明自身 MAC 地址为 V
- ARP 响应分组被封装进 MAC 帧,帧的目的地址为 Y,源地址为 V,以单播帧形式发送
动态主机配置协议DHCP
DHCP协议用来给刚接入网络的主机动态分配IP地址、配置默认网关、子网掩码。
DHCP是应用层协议,基于UDP,客户 UDP 端口号 = 68、服务器 UDP 端口号 = 67。
DHCP 使用客户 / 服务器模型(C/S)
- DHCP 客户
- 就是新接入网络的主机(希望获得 IP 地址等配置)
- DHCP 服务器
- 就是负责分配 IP 地址的那台主机,管理一系列 IP 地址池
- 在一个大型网络内可以有多台 DHCP 服务器
执行过程:
- 客户→服务器:DHCP 发现报文
- 携带信息:客户主机的 MAC 地址(还可以提出对 IP 地址租用期的要求)
- 网络层:源 IP 地址 = 0.0.0.0,目的 IP 地址 = 255.255.255.255(广播 IP 数据报)
- 链路层:源 MAC = 客户的 MAC 地址,目的 MAC = 全 1(广播帧)
- 服务器→客户:DHCP 提供报文
- 携带信息:给客户分配的 IP 地址、租用期、子网掩码、默认网关
- 网络层:源 IP=DHCP 服务器的 IP 地址,目的 IP=255.255.255.255(广播 IP 数据报)
- 链路层:源 MAC = 服务器的 MAC 地址,目的 MAC = 客户的 MAC 地址(单播帧)
- 客户→服务器:DHCP 请求报文
- 携带信息:客户机确认要使用的 IP 地址
- 网络层:源 IP=0.0.0.0,目的 IP=255.255.255.255(广播 IP 数据报)
- 链路层:源 MAC = 客户的 MAC 地址,目的 MAC = 全 1(广播帧)
- 服务器→客户:DHCP 确认报文
- 携带信息:与报文2类似
- 网络层:源 IP=DHCP 服务器的 IP 地址,目的 IP=255.255.255.255(广播 IP 数据报)
- 链路层:源 MAC = 服务器的 MAC 地址,目的 MAC = 客户的 MAC 地址(单播帧)
国际控制报文协议ICMP
ICMP 属于网络层,ICMP 报文封装在 IP 数据报中。ICMP 可以让主机或路由器互相报告网络中发生的差错和异常情况
ICMP报文的常见类型
差错报告报文
- 终点不可达
- 路由器向发送方反馈:“目的 IP 地址不可达(网络路径不通)”。
- 目的主机向发送方反馈:“目的端口号不存在,无对应进程处理”。
- 时间超过
- 路由器向发送方反馈:“IP 数据报到达时 TTL(生存时间)为 0,已被丢弃(传输路程过长)”。
- 目的主机向发送方反馈:“IP 数据报被分片后,规定时间内分片未全部到达,已全部丢弃”。
- 参数问题:向发送方反馈 “IP 数据报首部参数不合法,或首部校验出错”。
- 改变路由(重定向):路由器向发送方反馈 “针对该目的网络,下次可由另一台路由器转发,路径更短”。
- 源点抑制(2012 年后已废弃):曾用于向发送方反馈 “网络发生拥塞,存在丢包情况,请降低发送速率”。
询问报文
- 回送请求(Echo Request):A 向 B 发送:“请确认可达性并回复”。
- 回送回答(Echo Reply):B 向 A 回复:“可达”。
- 时间戳请求(Timestamp Request):A 向 B 发送:“当前本地时间为 xxxx,请问你处时间是多少?”。
- 时间戳回答(Timestamp Reply):B 向 A 回复:“收到请求的时间为 yyyy,发出此回答的时间为 zzzz”。
不必反馈ICMP差错报文的情况
- 若携带 ICMP 差错报告报文的 IP 数据报出错,不再反馈 ICMP 差错
- 若 IP 数据报被分片,则无论几个分片出错,都只反馈一次 ICMP 差错
- 若 IP 数据报的目的地址为多播地址,不反馈 ICMP 差错
- 若 IP 数据报的源地址为特殊地址(如:127.x.x.x、0.0.0.0),则即便发生 IP 数据报异常也不反馈 ICMP 差错