IPv4与IPv6

1,306 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情


现将目录贴下:

  • 什么是socket
  • IP地址、struct以及地址转换
  • 从IPv4迁移到IPv6
    • IP地址,IPv4和IPv6
    • 字节序
    • struct结构
    • 再谈IP地址
  • System call 或 Bust
    • getaddrinfo()—准备开始!
    • socket()—拿到文件描述符!
    • bind()—我在监听哪个端口?
    • connect()—嘿,你好啊!
    • listen()—会有人联系我吗?
    • accept()—感谢呼叫3490端口
    • send() and recv()—跟我唠唠吧,宝儿!
    • sendto() and recvfrom()—用DGRAM风格跟我说话
    • close() and shutdown()—滚犊子!
    • getpeername()—你哪位?
    • gethostname()—我是谁?
  • Client-Server基础
    • 一个简单的流服务器
    • 一个简单的流客户端
    • Datagram Sockets
  • 技术进阶
    • Blocking—何谓阻塞?
    • poll()—同步的I/O多路复用
    • select()—老古董的同步I/O多路复用
    • 数据只传了一部分怎么办?
    • Serialization-如何封装数据?
    • 数据封装
    • 广播数据包-大声说「Hello,World」

远在「卧龙凤雏」成为贬义词之前,就有一个很棒的网络路由系统( network routing system)了,称为互联网通信协议第四版( Internet Protocol Version 4),又称为 IPv4。它的地址由4个字节组成,通常被写作点分十进制的形式,即四个字节被分开用十进制写出,中间用点分隔,比如:192.0.2.111

你大概率见过不少IPv4的地址了。

实际上,在撰写本文之前,几乎整个互联网的各个网站都还用的是IPv4。

人们用IPv4用的很开心,一切都是如此美好。直到一个叫 Vint Cerf 的老头儿提出了警告,说是IPv4的地址即将耗尽。

除了警告每个人即将到来的IPv4危机,Vint Cerf 本身还是鼎鼎大名的“Internet之父”,我实在是没有什么资格评判他的判断。

IPv4地址耗尽?这怎么可能呢?32-bit的IPv4有几十亿个IP地址呢,我们真的有几十亿台电脑在用吗?

是的。

一开始在电脑数量还不多的时候,大家也是认为这个数量已经足够了,几十亿已经算是一个天文数字了。甚至当时还很慷慨地分给某些大型组织几百万个IP地址给他们使用(比如Xerox、MIT、Ford、HP、IBM、GE、AT&T 及某个名为 Apple 的小公司,等等)。

事实上,要不是我们用了一些小手段(NAT转换等),IPv4早就被用尽了。

我们现在生活于每个人、每台电脑、每部计算器、每个电话、每部停车计时收费器,甚至是每个玩具小狗(没什么不可能的)都有一个IP地址的时代。

于是乎,128-bit的IPv6诞生了。

Vint Cerf 或许是不朽的,可是谁也架不住在每次地址不够用而研发下一代Internet协议的时候,他老人家出来嘟囔一句:“我早就说过了吧...。。。”

所以,我们应该怎么堵住他的嘴?

我们需要更多的地址,不只是需要两倍以上的地址、也不止几十亿倍、更不止于千兆倍,而是需要79✖️百万✖️十亿✖️兆倍以上的可用地址!我们终将见识到。

你可能会说:“真的吗?这个数字大的让我有点不可置信。”

32-bit和128-bit听起来差得并不算太多,只是多了96个bit而已。但是需要注意的是,这里说的可是等比数列,32 bits可以表示2322^{32} 个数字,128 bits可以表示21282^{128}(大约340个兆兆兆)个数字,大到我都不知道怎么读。。。。。。这么说吧,这个数字相当于宇宙中的每颗星星都能拥有一百万个 IPv4 地址。

忘记点分十进制的IPv4的写法吧,现在我们有了16进制表示法,每两个字节之间用:分隔,类似这样:

2001:0db8:c9d2:aee5:73e3:934a:a5ae:9551

还没完呢!大多时候,IP地址里边会有很多个0,你可以将它们压缩到两个冒号之间,而且可以省略每个字节对开头的0。例如,这些地址对中的每一对都是等价的:

2001:0db8:c9d2:0012:0000:0000:0000:0051
2001:db8:c9d2:12::51
    
2001:0db8:ab00:0000:0000:0000:0000:0000
2001:db8:ab00::
    
0000:0000:0000:0000:0000:0000:0000:0001
::1

地址 ::1 是個 loopback(本地回环)地址,相当于 IPv4 中的127.0.0.1

最后,你可能会碰到 IPv6 与 IPv4 兼容的模式。你如果愿意,你可以将 IPv4地址 192.0.2.33 用 IPv6 形式表示:::ffff:192.0.2.33

事实上,IPv6的创建者们已经肆无忌惮地保留了万亿计的地址以供备用,这真是太有趣了,但坦白地讲,我们有这么多地址,谁在意呢?