[ 计算机网络 | 第四章 ] 网络层 04 IP的局限与扩展
本文的认知流前言IP 协议的设计是尽力而为它只管把数据报从源地址-目的地址不保证一定送到不保证按序到达不保证不重复。这个设计让 IP 极其简单高效但也留下了几个缺点不会报告错误地址空间有限只擅长一对一通信假设设备位置不变、明文传输不安全每一个缺陷都催生了一个扩展协议。这一章我们就来逐个拆解这些IP 的补丁。当网络出现问题时ICMP1.为什么需要 ICMPIP 协议有一个很要命的短板它是哑巴。路由器转发数据报如果 TTL 减到 0 、目标网络不可达、需要分片但 DF 标志置位.它就直接把数据报扔掉不告诉任何人。网络管理员什么都不知道。比喻:1.这就像一个快递中转站收到一个包裹发现地址写错了直接扔了也不告诉寄件人。2.寄件人等了一周没消息完全不知道发生了什么事。3.这就太坏了ICMP网际控制报文协议就是为了解决这个问题而生的。它是 IP 协议的“传话筒”——当路由器丢弃一个数据报时它负责给源主机发一条消息告诉对方“你的包裹被扔了原因是地址不存在”。ICMP 报文直接封装在 IP 数据报里协议号是 1。它在逻辑上属于网络层但它是为 IP 协议服务的可以理解为 IP 协议的随行助手。2.差错报告与询问报文ICMP 报文分为两大类差错报告报文和询问报文。差错报告报文用于告知源主机“你的数据报没送到”。常见的几种包括终点不可达最常见目标网络或主机不存在时间超过TTL 减到 0 了、参数问题首部字段有问题询问报文用于主动查询网络状态。最常见的两种是回送请求和回答报文也就是后面要讲的 ping。以及时间戳请求和回答报文用于测量往返时间。ICMP 报文的结构很简单类型码标识“这是哪种报文”代码码进一步说明“是什么原因”接下来是校验和后面跟着具体内容。差错报告报文的内容里会包含导致错误的那份数据报的 IP 首部和前 8 个字节这样源主机收到后就能判断是哪个程序发出的数据报出了问题。3.ping 与 tracerouteping和traceroute是每个网络工程师每天都会用到的诊断工具它们都基于 ICMP。ping的原理极其简单。源主机向目标发送一个 ICMP 回送请求报文。目标收到后回复一个回送回答报文。源主机收到回答说明目标可达没收到说明中间某个环节出了问题。ping 还会统计往返时间让你知道网络延迟大概是多少。比喻这就像你去敲邻居家的门。敲一下邻居开门答应——你知道邻居在家而且从敲门到开门用了多长时间你也心里有数。敲了半天没人应——可能不在家也可能门铃坏了总之“不可达”。traceroute利用了 TTL 字段的巧妙机制。它的工作过程分为三步源主机先发一个 TTL1 的数据报。它到达第一个路由器后TTL 减为 0路由器丢弃它并向源主机发回一个“时间超过”的 ICMP 报文。源主机收到这份报文后就知道了路径上第一个路由器的 IP 地址。然后源主机再发一个 TTL2 的数据报。它经过第一个路由器TTL 减为 1、到达第二个路由器TTL 减为 0。第二个路由器丢弃它并发回“时间超过”报文。源主机收到后就知道了第二个路由器的 IP 地址。如此反复每次 TTL 加 1直到最终到达目标主机。目标主机收到数据报后不会发“时间超过”而是发回一个“终点不可达”的 ICMP 报文。源主机收到这份不同的报文后就知道已经到达了目标。traceroute 的本质就是“投石问路”。在一条你从未走过的漆黑走廊里你每走一步先往前方扔一颗小石子听听有没有回声。有回声说明石子撞到了墙——你知道这一跳的距离和方向。没有回声说明前面是空的可以继续走。每扔一次石子TTL 就加 1你就能探出路径上的下一跳。当 IPv4 地址不够用时私有地址与 NAT1.地址枯竭问题IPv4 地址只有 32 位约 43 亿个。2011 年IANA 分配完了最后一组未分配的 IPv4 地址块。但互联网还在增长新的设备还在接入——智能手机、物联网设备、智能家居每台设备都需要一个 IP 地址。比喻这就像一栋公寓楼最初设计了 43 亿个房间以为够用。结果入住的人比预期多了十倍房间早就不够分了。有什么办法能在不重建整栋楼的前提下让更多人住进来2.私有地址解决方案的第一步是划分出几块“内部专用”的地址空间这些地址只能在局域网内部使用不能出现在公网上。任何组织都可以在自己的内部网络里自由使用这些地址无需申请A 类私有地址块10.0.0.0/8B 类私有地址块172.16.0.0/12C 类私有地址块192.168.0.0/16比喻这就像公司内部的“分机号”。市场部的小张分机号是 101研发部的小李分机号也是 101。分机号只在各自部门内部有意义不能直接用来打外线。但它有效缓解了“房间号不够用”的问题——只要不在同一个楼层相同分机号可以重复使用。3.NAT网络地址转换私有地址只能在局域网内部使用但局域网里的设备也需要访问公网。这就需要一个“翻译官”在私有地址和公网地址之间做转换。NAT网络地址转换就是这个翻译官。NAT 设备通常是路由器一端连接内网拥有一个私有 IP 地址另一端连接公网拥有一个全球唯一的公网 IP 地址。所有内网主机访问公网时都共享这一个公网 IP。4.NAT 的工作过程假设内网主机192.168.1.10想访问百度服务器。主机发送 IP 数据报源地址是私有地址192.168.1.10目的地址是百度的公网 IP。数据报先到达 NAT 路由器。NAT 路由器收到后把源 IP 地址从192.168.1.10改成自己的公网 IP比如123.123.123.123同时在内部维护一张 NAT 转换表记录下“原来源地址是 192.168.1.10源端口号是 3000”。然后NAT 把修改后的数据报发到公网上。百度服务器收到数据报它看到的源地址是 NAT 的公网 IP123.123.123.123。百度完全不知道这个请求来自一个私有地址。百度处理后发回响应数据报目的地址是123.123.123.123。NAT 路由器收到百度的响应后查自己的 NAT 转换表找到对应的记录把目的 IP 地址从123.123.123.123改回192.168.1.10。然后从内网接口发给主机。NAT 的本质是“共享公网 IP 端口映射”。1.它用一个公网 IP 加上不同的端口号区分来自不同内网主机的连接。2.如果内网有多台主机同时访问公网每台主机的每个连接会被分配不同的源端口号NAT 转换表通过这些端口号来一一对应。NAT 是缓解 IPv4 地址枯竭的关键技术但它让网络变得更复杂了。它打破了 IP 协议“端到端透明”的原始设计——服务器看到的源地址不再是真正的源地址内网主机也不能被动接受来自公网的连接除非手动配置端口转发。这为后来的 P2P 通信带来了额外的复杂性。当通信模式发生变化时IP 多播1.单播、广播、多播单播IP 协议原生擅长的是单播——一个发送方一个接收方数据报沿着一条路径精准送达。但在视频直播、视频会议、IPTV 这类场景中一个发送方需要给成千上万个接收方同时发送完全相同的数据。如果用单播发送方要给每个接收方各发一份带宽全部浪费在重复传送上。广播广播发给广播域内所有设备也不行。广播域太大覆盖范围不可控所有设备都必须处理广播报文不管它们是否需要这份数据。把直播视频用广播发出去整个互联网都会被淹没。多播是介于单播和广播之间的折中方案。数据只发给一个多播组中的成员——接收方可以主动选择加入或退出某个多播组。发送方只需要发一份数据路由器在网络中根据需要复制数据报送到所有组内成员。这就像广播电台电台只发射一个信号只有调到了这个频率的收音机才能听到。不感兴趣的人不调这个频率就行信号不会干扰他们。2.多播地址与 IGMP多播使用专门的 D 类 IP 地址——224.0.0.0/4即224.0.0.0到239.255.255.255。这些地址不分配给任何主机只用来标识多播组。多播需要两个配套协议。第一个是 IGMP网际组管理协议它负责让主机告诉本地路由器“我想加入某个多播组”或“我要退出这个多播组”。路由器收到 IGMP 报文后就知道应该把该多播组的数据转发到哪个局域网里。3.多播路由协议第二个是支持多播的路由协议它负责在多播源和所有组成员之间建立一棵“分发树”。路由器通过多播路由协议交换多播组成员信息计算出从源到所有组成员的最优路径只沿着分发树的枝干复制和转发数据。没有成员的网络段不会被发送数据带宽只用于有接收者的路径。这和 OSPF 单播路由的“全网洪泛”完全不同多播路由是一种“按需复制”的智能分发。当设备发生移动时移动 IP1.移动带来的问题IP 地址在设计之初假设设备的位置是固定的——一个 IP 地址对应一个物理网络位置。网络号标识“这个设备在哪个网络”路由器根据网络号来转发数据报。但如果你的手机从家里的 WiFi 切换到公司的 WiFi它的 IP 地址就变了。正在进行的视频通话、文件下载——所有基于 TCP 的连接都会因为 IP 地址改变而中断。TCP 用 IP 地址和端口号的组合来标识一个连接IP 地址一变连接就死了。矛盾IP 地址既用来标识设备也用来定位设备。这两者绑在一起导致设备一旦移动标识就失效了。移动 IP 就是要解开这个绑定——让设备在移动时既保持原来的 IP 地址作为“身份标识”又能被正确定位到当前位置。2.家乡代理与转交地址移动 IP 的核心设计是“双重地址”。每台移动设备有一个“家乡地址”它是设备在“家乡网络”里分配到的固定 IP 地址是设备的永久标识。还有一个“转交地址”它是设备移动到“外地网络”后获得的新 IP 地址是设备的当前位置信息。家乡网络上有一台“家乡代理”它是一台路由器负责维护“家乡地址 → 转交地址”的映射。当其他设备向移动设备发送数据报时它们仍然使用家乡地址。数据报到达家乡网络后家乡代理截获它查映射表找到转交地址把数据报封装一层新 IP 头通过隧道转发到移动设备的当前位置。3.移动 IP 的工作流程移动 IP 的工作过程可以分为三个阶段代理发现移动设备到达外地网络后侦听外地代理的广播或者主动发送请求发现自己已经移动到了一个新网络。注册移动设备把新获取的转交地址告诉家乡代理。家乡代理更新自己的映射表。路由优化家乡代理收到发往家乡地址的数据报将其隧道到转交地址。反过来移动设备发回给对端的响应可以直接发送无需经过家乡代理这称为“三角路由”问题的优化。比喻这是一个“邮件转发”模型。你搬到另一个城市工作但你在老家保留了你的老地址家乡地址。所有寄往老地址的邮件会由邮局家乡代理自动帮你重新封装到新地址转交地址的信封里转发到你实际居住的地方。寄信的同事完全不知道你搬了家——他们仍然用你的老地址寄信但邮局在背后做了转寄。当需要安全跨公网通信时VPN1.为什么需要 VPNNAT 解决了 IPv4 地址枯竭的燃眉之急但它也让一个问题变得更加突出大量内网流量流经公网而这些流量是明文传输的。IP 数据报的原生设计中没有加密——任何中间节点都能看到数据内容。如果一个公司的分支机构需要访问总部的内部服务器数据需要在公网上传输但内部数据不应该被公网上的任何人看到。解决方案是在 IP 层之上建立一条加密隧道让内网数据“经过公网但内容不可见”。这就是 VPN——虚拟专用网。2.隧道技术VPN 的核心是“隧道”。在公网上VPN 网关将整个原始 IP 数据报加密后封装进一个新的 IP 数据报里新数据报的源地址是发送方 VPN 网关目的地址是接收方 VPN 网关。对方 VPN 网关收到后拆开外层解密取出原始数据报再转发给内网的目标主机。对于内网主机来说它们完全不知道自己的数据在公网上“包裹了一层密文”。它们只看到自己直接和对方的内网主机通信。这条加密隧道像在公网的地下开了一条“专用管道”内网数据走在管道里公网上的其他人只能看到管道的外壳不知道里面是什么。3.加密与认证VPN 需要满足两个安全需求。第一个是加密——外人即使抓到数据包也读不懂内容。第二个是认证——接收方需要确认数据包确实来自合法的发送方而不是被中间人篡改过。当前主流 VPN 协议采用对称加密保护数据机密性用证书和哈希验证身份。简单来说加密保护数据内容不被偷看认证保护数据来源不被伪造。两者缺一不可——没有认证的加密是脆弱的没有加密的认证是透明的。4.典型应用场景VPN 最常见的三种应用场景。第一种是远程接入。出差的员工在外地连上公司的 VPN 网关就能访问公司内部的服务器、文件系统、打印机就像坐在办公室里一样。第二种是站点互连。一个公司在两个城市的分支机构通过 VPN 把两地的内部网络连接成一个逻辑上的整体。两地的员工像在同一个局域网里一样互相访问。第三种是个人上网。个人用户通过 VPN 将所有流量加密后转发可以保护自己的上网行为不被公网上的中间人监控。 小结这一部分梳理了 IP 协议的五个原生局限及其对应的扩展协议。ICMP 让 IP 学会说话网络出问题时能报告错误。NAT 让私有地址也能访问公网缓解了 IPv4 地址枯竭。多播让 IP 支持一对多通信直播和视频会议不再浪费带宽。移动 IP 让设备移动时 IP 地址不变正在进行的 TCP 连接不会中断。VPN 让内网数据在公网上安全传输公司各地分支机构像一个整体网络。这些扩展协议不是一个整体设计而是一个一个打上去的补丁。但它们共同完成了一件事——让一个最初只考虑了几十台固定设备的小型网络协议变成能支撑全球几十亿台设备互联的通信基石。感谢你的阅读祝你有开心的一天