Mobile IP 要解决「地址既是身份又是位置」这个矛盾:换网络 IP 就变,连接就断。 它的办法是「留一个永远不变的家乡地址」,代价是三角路由。
4.2.1 讲了 IP 地址是「网络层地址」,这一节讲「它同时还是身份」。 5.7 的隧道是它的实现手段,家乡代理转发靠的就是隧道。
一、矛盾在哪
IP 地址身兼两职:一半是「你是谁」(身份),一半是「你在哪」(位置)。 平时这两件事不冲突,因为「你」就在「那儿」。 可一旦你移动了,冲突就来了:地址跟着位置变,对方就找不到「你」了。 具体会怎么断:TCP 用「源地址、源端口、目的地址、目的端口」四元组标识一条连接, 你换了网段,源地址一变,四元组就不是原来那条了, 对方回过来的包会被当成「新连接」或者直接丢掉。 所以问题的本质不是「找不到」,而是「找到了也不是同一条连接」。 这一点很重要——它决定了「改地址」这件事必须对上层透明。
二、三个角色
Mobile IP 的思路是「把身份和位置拆开」:
| 概念 | 作用 | 位置 |
|---|---|---|
| 家乡地址 | 永远不变,当身份用 | 对端只认这个 |
| 转交地址 | 当前在哪儿 | 实际收包的 |
| 家乡代理 | 替它收包再转发 | 在家乡网段 |
第一行是「身份」:对端始终往家乡地址发,所以它的「眼里」你从来没动过。 第二行是「位置」:这是你到了外地之后拿到的地址,它会变,但对端看不见。 第三行是关键的那台设备:它守在家乡网段,替移动主机「收信」,收到了再用隧道转给外地。 所以 5.7 讲的隧道在这里不是可选项,是必需品。
三、三角路由的代价
问题出在「对端不知道你在外地」:它按家乡地址发,包先到家乡代理,家乡代理再隧道转发到外地。 于是路径变成「对端 → 家乡 → 外地」,绕了一个三角。 绕的代价按距离放大:同城多 20 毫秒还能忍,跨洋就多 8000 毫秒——延迟直接翻倍, 而 TCP 的吞吐和延迟成反比,等于带宽也砍半。 所以后来加了「路由优化」:让对端直接知道转交地址,不再绕回家乡代理。 但这样又要求「对端也支持」,而且「告诉对端我在哪」本身有安全问题(位置泄露)。 所以优化版反而更难部署。
四、为什么用得少
最根本的原因是「上层已经解决了」: TCP 会重连、应用会重试、QUIC 干脆把「连接迁移」做进了协议—— 换个网络,连接标识不变,业务无感。 而这些办法不需要改网络,只需要改两端。 第二个原因是「它要改的东西太多」:主机要装移动 IP 栈,网络要有家乡代理,对端最好也支持。 三样凑齐才能用,而任何一样不齐就退化成「不能用」。 所以它更像一个「思路正确但时机不对」的协议:「把身份和位置分开」这个洞察是对的, 今天叫「身份与位置分离」,有一整类研究在做。但「用隧道绕回家乡」这个做法,被上层替代了。 和 RARP、NAT-PT 一样——值得知道,不必深究。
五、动手 Demo:Mobile IP 的三角路由
算三种距离下,三角路由比直连多出多少延迟。 重点看最后一行「多出来」和「直连」的比值。
for name, direct, tri in (('同城', 10, 30), ('跨省', 800, 1600), ('跨洋', 8000, 16000)):
print('%-4s 直连 %5d ms 三角 %6d ms 多出 %5d ms'
% (name, direct, tri, tri - direct))
实跑输出:
--------------------------------------------------------------------
Mobile IP 的三角路由
--------------------------------------------------------------------
**Mobile IP 要解决的是「地址既是身份又是位置」这个矛盾**:**换了网络 IP 就变,连接就断。**
**它的办法是「保留一个永远不变的家乡地址」。**
概念 作用 位置
-------------------------------------------------------
**家乡地址** **永远不变** **对端看到的**
**转交地址** **当前在哪儿** **实际收包的**
**家乡代理** **替它收包再转发** **在家乡网段**
**代价是「三角路由」**:**对端发给家乡代理,家乡代理再隧道给外地**——**绕了一圈。**
**算一下多绕多少**:
场景 直连延迟 三角路由延迟 多出来
-----------------------------------------------
同城 10 ms 30 ms 20 ms
跨省 800 ms 1600 ms 800 ms
跨洋 8000 ms 16000 ms 8000 ms
**第三行跨洋的例子最刺眼**:**延迟翻了一倍**。
**所以 Mobile IP 后来加了「路由优化」**——**让对端直接知道转交地址,不再绕回家乡代理。**
**但这样又要求「对端也支持」,部署就更难了。**
**现实中 Mobile IP 用得很少**,**因为「换网络不断连接」这件事被上层解决了**:
**TCP 有重连、应用有断线重传、QUIC 有连接迁移。**
**所以它更像一个「思路正确但时机不对」的协议**——**和 RARP、NAT-PT 一样,值得知道,不必深究。**
「多出来」这一列最说明问题:同城只多 20 毫秒(还算能忍),跨洋多 8000 毫秒(等于翻倍)。 所以「三角路由的代价随距离线性放大」,而「移动」恰恰经常是「跨远距离」。 注意这张表里的数是为了看清趋势取的示意值,真实的跨洋往返延迟取决于光缆路径和中转, 不能当成「跨洋一定是 8000 毫秒」来用。 最后一个观察: 「延迟翻倍」对 TCP 的影响比听起来严重——因为 TCP 的吞吐上限约等于「窗口除以往返时间」, 往返翻倍,同样的窗口就只能跑一半的速度。 所以三角路由不是「慢一点」,是「带宽也砍半」。
30 秒实验
- 算一下:往返 100 毫秒、窗口 64 KB,吞吐上限大约多少?
- 想一下:为什么 Mobile IP 必须靠隧道?
- 想一下:QUIC 的「连接迁移」绕开了 Mobile IP 的哪个难点?
常见误区
- 以为「Mobile IP 是给手机上网用的」。 它解决的是「换网络不断连接」, 和蜂窝网切换是两回事。
- 以为「有了家乡代理就没有延迟问题」。 三角路由会让延迟翻倍,跨洋尤其明显。
- 以为「路由优化是纯好处」。 它要求对端支持,而且会暴露位置。
自测三问(点开对答案)
1. Mobile IP 要解决什么矛盾? —— **IP 地址同时是「身份」和「位置」**:一移动位置就变,连接就断。 2. 三角路由是怎么形成的? —— **对端按家乡地址发,家乡代理再隧道转给外地**,路径绕成「对端 → 家乡 → 外地」。 3. 为什么它用得少? —— **上层已经解决了**:TCP 重连、QUIC 连接迁移都不用改网络,而 Mobile IP 要主机、网络、 对端三样都支持。第五章到这里结束。下一章进入传输层:TCP 与 UDP。
- ☐ (本章完,下一节 6.1.1 传输层定义)