- 英文小册原文地址:beej.us/guide/bgnet…
- 作者:Beej
- 中文翻译地址:www.chanmufeng.com/posts/netwo…
现将目录贴下:
- 什么是socket
- 两种Socket
- 漫谈网络
- IP地址、struct以及地址转换
- IP地址,IPv4和IPv6
- 字节序
- struct结构
- 再谈IP地址
- 从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可以表示 个数字,128 bits可以表示
(大约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的创建者们已经肆无忌惮地保留了万亿计的地址以供备用,这真是太有趣了,但坦白地讲,我们有这么多地址,谁在意呢?