
在上一篇中我们学习了传输层的 UDP 和 TCP 协议。但无论是 UDP 还是 TCP最终都要交给网络层来寻找传输路径。网络层的核心协议就是 IP 协议。它负责为每一个数据包标注源地址和目的地址并通过路由选择把数据包一步步送到目标主机。本文就将带你深入理解IP 协议的报文格式、IP 地址、NAT、网段划分与路由选择一. IP协议1. IP协议的报文格式接下来我们来讲解各个字段的含义及作用1.1 4位版本IP 协议 的版本分为 IPv4 和 IPv6 两个版本其中IPv4 是现在使用比较广泛的版本而 IPv6 则是近几年的使用才多起来的基于此本文主要讲解 IPv4 这个版本。4位版本这个字段就记录了这个 IP 协议的版本1.2 4位首部长度由于 IP 数据报中的 选项 这一字段的存在IP 数据报的报头的长度也是不固定的而 4位首部长度 则记录下了 IP数据报报头的长度单位是 “ 4个字节 ”。1.3 8位服务类型8位划分前三位 优先权字段(已经弃用)紧接着四位 服务质量标志(TOS) 字段和最后一位保留字段(必须置为1)。四位服务质量标志(TOS) 字段分别为最小延时、最大吞吐量、最高可靠性 和 最小成本这四个字段相互排斥只能选择一个1.4 16位总长度字节数16位总长度表示的是 一个 IP 数据报报头 载荷 的长度最大为 64 kb。IP 协议中内置了拆包组包的功能当一个比较大的 TCP 数据报交给 IP 协议进行封装时IP 协议就会将这个 TCP 数据报 拆分成多个 IP 数据报 进行传输。而报文中的16位标识字段 就会标记那些 IP 数据报是同一个数据报拆分出来的方便后续的组包操作1.5 8位生存时间TTL8位生存时间表示的是一个 IP 数据报 能够在网络上传输的最大时间单位是 “ 次数 ”IP 数据报每经过路由器转发一次TTL 的值就 -1当 TTL 减到 0 时就说明这个数据报已经传输不到目的IP了这个 IP 数据报就会被路由器丢弃1.6 8位协议8位协议标识的是传输层使用的是哪种协议在目的主机 网络层收到 IP数据报 去分用时会使用 IP 协议会解析 IP 数据报拿到载荷并交给上层(传输层) 处理这个 8位协议编号就决定了把数据交给哪一个传输层协议处理1.7 16位首部检验和和之前所说的校验和的作用一致都是用来检测传输的数据是否出错的字段1.8 32位源IP地址 和 32位目的IP地址32 位源 IP 地址发送该 IP 数据报的主机的 IP 地址32 位目的 IP 地址该 IP 数据报最终要送达的目标主机 IP 地址IP地址是通过 32位的整数来表示的但由于 32位的整数不方便阅读通常会将 IP地址 写作点分十进制的形式例如 192.168.100.9832位的 IP 地址最多只能表示大约 43亿 个不同的 IP这个数量放到如今来看是远远不够用的的为了解决这个问题IP 协议 引入了两个方案——动态分配IP地址和NAT 网络地址转换机制2. 解决 IP地址不够用的两种方式2.1 动态分配IP地址动态分配 IP地址简单就是一个主机只有在上网时才会分配IP地址下线后就回收该 IP地址可以将该 IP地址重新分配给其他设备这个方式属于治标不治本的方法只能够暂时缓解并不能从根源上解决问题2.2 NAT 网络地址转换机制NAT 的核心思想多个内网主机共享同一个公网 IP 访问互联网NAT 将所有的 IP 地址分为了两大类公网IP(外网IP)和私网IP(内网IP)公网IP 是唯一的而私网IP 在不同的局域网中是可以重复的同一个局域网下的不同的网络设备有属于自己的私网IP可以通过网络地址转换的方式使用同一个 公网IP 去访问互联网了私网IP 转换为 公网IP 的示意图如下所示像这样同一个局域网下的 设备1设备2设备3 就可以在经过一个带有公网IP 的路由器后使用同一个 公网IP 去访问互联网了NAT 背景下的不同的网络设备之间的网络通信1. 同一个局域网下设备A 访问 设备B在同一个局域网下的 私网IP 是不能重复的所以这两个设备的通信无需发生 IP 地址的转换NAT不起作用2. 公网设备A 访问 公网设备B公网IP 本身也是不可以重复的所以这两个设备的通信也是无需发生 IP 地址的转换的NAT 不起作用3. 不同局域网下的 设备A 访问 设备B这个情况在 NAT 中是不被允许的 4. 公网设备A 访问 局域网下的设备B这个情况在 NAT 中也是不被允许的 5. 局域网设备A 访问 公网设备B这样的访问会触发“ 网络地址映射 ”具体流程如下图所示此外NAT 还会记录下一个网络地址映射表这个表是路由器执行网络地址映射的依据记录下了内网 私网 IP 源端口 与公网 公网 IP 分配的新的源端口 的一一对应关系负责处理双向数据包的网络地址的转换(避免在多台主机同时通过这个路由器发送 IP数据报时 IP 数据报 在返回的时候找不到对应的主机的情况2.3 使用 IPv6IPv4使用 4 个字节作为 IP地址而 IPv6 则是使用 16 个字节作为 IP地址使用 IPv6 能表示的 IP地址 完全足够现在使用3. 网段划分一个 IP 地址会被分为两个网段前半部分称为“ 网络号 ”后半部分称为“ 主机号 ”划分方式如下图所示在同一个局域网中网络号必须相同主机号必须不同在两个相邻的局域网中网络号必须不同主机号则无限制当前网段划分的方式 —— 子网掩码子网掩码是一个 32 位二进制数字IPv4配合 IP 地址使用用来区分 IP 地址里 网络号 和 主机号作用1.判断两台主机是否处于同一个子网同一网段2.划分子网把大网络切分成多个小局域网过去曾提出过一种将所有 IP 地址划分为 5类的划分 网络号 和 主机号 的方案现已不再使用如下图所示特殊的 IP地址1.将 IP 地址中的主机地址全部设置为 0就成为了网络号代表这个局域网2.将 IP 地址中的主机地址全部设置为 1就成为了广播地址用于给同一个链路中相互连接的所有主机发送数据包3. 127.* 的 IP 地址用于本机环回loop back测试通常是 127.0.0.14. 路由选择定义当 IP 数据包需要跨越多个网络传输时主机、路由器根据目的 IP 地址决定数据包转发方向、下一跳设备的整套决策流程网络环境是一个非常复杂的环境任何一个路由器都无法存储所有的网络信息但是每个路由器都可以知道附近的网络情况知道谁与它相连当一个数据包到达某个路由器的时候就会匹配这个路由器的 “ 路由表 ”如果 目的IP 刚好匹配到了路由表中的记录就直接按照当前对应的接口转发过去就可以了如果没有匹配到就会执行 “ 下一跳 ”直接将该数据包转发给上一级路由器所在的位置路由表的 5个核心字段1.目的网络地址 / 前缀长度目标网段例192.168.2.0/242.下一跳地址转发给上一级路由器的 IP直连网络下一跳写直连3.出接口本机用来向外发送数据包的网卡接口4.度量值开销 Metric多条可达路径时用来选出最优路径5.路由来源标记直连路由 / 静态路由 / 动态路由下一跳 转发流程示意图如下所示下一跳 转发的服务器越往上所涵盖的范围也就越大也就越有可能找到 目的IP 地址所对应的路由器二. 以太网协议接下来我们接着来讲解数据链路层的以太网协议1.以太网数据帧的报文格式1.1 目的地址 和 源地址此处的目的地址和源地址指的不是 IP 地址而是mac 地址物理地址mac 地址 的长度为 6个字节固化在网卡NIC的 ROM 芯片里出厂时由网卡厂商烧录在出厂时就已经固定了1.2 类型标识以太网数据帧内部「数据载荷」里封装的是什么协议有如图所示的 0800IP数据报、0806ARP 地址解析协议 和 8035RARP 反向地址解析协议 三种类型ARP 不是传输业务层数据的协议而是用来打辅助的协议作用是根据 IP 地址 来得到 对应的mac 地址1.3 CRC 帧尾记录的是校验和用来验证存储的数据是否发生改变1.4 数据记录的是存储的数据也就是载荷部分最大为 1500 个字节IP 数据报的 组包 和 拆包 操作更多的时候是因为数据链路层的限制才发生2. DNS 域名解析系统计算机通信依靠 IP 地址但我们很难去记住一串数字我们更擅长的是去记一个域名当我们在浏览器中输入一个域名去搜索的时候计算机就会自动的把这个域名解析成对应的 IP 地址最初DNS 是通过hosts 文件来实现 域名 到 IP地址 的映射的用户每次在访问某个网站时就会在 hosts 文件中搜索该域名对应的 IP地址在通过 IP地址去真正地访问服务器但是hosts 文件的维护太复杂了每当有新的网站诞生或销毁都有对 hosts 文件进行更新而在如今的时代每时每刻都有数不清的网站在诞生和销毁这也就造成了 hosts文件维护的巨大难度所以现在已经不适用 hosts 文件 来完成映射了hosts 文件 的功能仍然存在优先级比 DNS 更高主要的用途是用于程序测试为了解决 hosts 文件难维护的问题DNS 就将 hosts 文件中的内容提取出来单独放到一个服务器上这样的服务器就称为 DNS 服务器用户每次在访问某个网站时就要先去访问 DNS 服务器把 要搜索的域名 对应的 IP地址拿到并通过拿到的 IP地址 去真正地访问服务器但是这也就带来了新的问题全球上网的设备有这么多如果每次发起网络请求都需要先访问 DNS 服务器的话那么 DNS 服务器就会承担 海量的并发量那DNS服务器不就挂了吗为了解决这个问题引入了以下两个解决方案1. 缓存你的电脑并不会在每次发送网络请求时都触发 DNS 请求就比如你在第一次访问 www.sogou.com 进行了一次 DNS 之后就会将该域名对应的 IP地址记录下来下次再访问这个域名时就不需要重新访问 DNS 服务器了2. 设置多个 DNS 服务器全球可以有多个 DNS 服务器其中存储原始数据的 DNS 服务器称为 “ DNS 根服务器 ”其他各种网络运营商就可以搭建 “ DNS 镜像服务器 ”三. 小结本文把 网络层 和 数据链路层 的核心内容串在了一起。IP 协议负责网络层的寻址与路由通过源 IP 和目的 IP 为数据包指明方向并借助 NAT、子网掩码和路由表完成跨网络转发。以太网协议负责数据链路层用 MAC 地址在局域网内定位设备通过以太网帧承载 IP 数据报并依靠 ARP 完成 IP 到 MAC 的映射。DNS 则站在应用层把人类易记的域名翻译成机器可读的 IP 地址并通过缓存和分布式服务器体系扛住全球海量查询一次完整的网络访问其实就是这三者协作的结果DNS 先解析出目标 IPIP 负责把数据包路由到目标网络以太网再在局域网内把帧送到目标主机。分层不是割裂而是各司其职、互相配合到这里我们从应用层出发一路向下经过了传输层、网络层和数据链路层。希望这个系列能帮你建立起计算机网络的分层视角再回头看 HTTP、TCP、IP 这些协议时不再是零散的知识点而是一张完整的网络通信地图