📙
Beej's Guide to Network Programming 简体中文版
  • 簡介
  • 联络译者
  • 译者鸣谢
  • 1. 前言
    • 1.1. 本书的读者
    • 1.2. 平台与编译器
    • 1.3. 官方网页与书本
    • 1.4. Solaris/SunOS 程序员要注意的事情
    • 1.5. Windows 程序员要注意的事情
    • 1.6. 来信原则
    • 1.7. 镜像站台(Mirroring)
    • 1.8. 译者该注意的
    • 1.9. 版权与出版(Copyright and Distribution)
  • 2. 何谓 Socket
    • 2.1. 两种 Internet Sockets
    • 2.2. 底层漫谈与网路理论
  • 3. IP address丶结构与数据转换
    • 3.1. IPv4 与 IPv6
      • 31.1. Sub network (子网)
      • 3.1.2. Port Number(连接埠号码)
    • 3.2. Byte Order(字节的顺序)
    • 3.3. 数据结构
    • 3.4. IP address,Part II
      • 3.4.1. Private Network
  • 4. 从 IPv4 移植为 IPv6
  • 5. System call 或 Bust
    • 5.1. getaddrinfo()-准备开始!
    • 5.2. socket()-取得 File Descriptor!
    • 5.3. bind()- 我在哪個 port?
    • 5.4. connect(),嘿!你好。
    • 5.5. listen()-有人会调用我吗?
    • 5.6. accept()-"谢谢你调用 port 3490"
    • 5.7. send() 与 recv()- 宝贝,跟我说说话!
    • 5.8. sendto() 与 recvfrom()- 用 DGRAM 风格跟我说说话
    • 5.9. close() 与 shutdown()-从我面前消失吧!
    • 5.10. getpeername()-你是谁?
    • 5.11. gethostname()-我是誰?
  • 06-Client-Server 基础
    • 6.1. 简易的 Stream Server
    • 6.2. 简易的 Stream Client
    • 6.3. Datagram Sockets
  • 07-高等技术
    • 7.1. Blocking(阻塞)
    • 7.2. select()-同步 I/O 多工
    • 7.3. 不完整传送的後续处理
    • 7.4. Serialization:如何封装数据
    • 7.5. 数据封装
    • 7.6. 广播数据包:Hello World!
  • 8. 常见的问题
  • 9. Man 使用手册
    • 9.1. accept()
    • 9.2. bind()
    • 9.3. connect()
    • close()
    • getaddrinfo(), freeaddrinfo(), gai_strerror()
    • gethostname()
    • gethostbyname(), gethostbyaddr()
    • getnameinfo()
    • getpeername()
    • errno
    • fcntl()
    • htons(), htonl(), ntohs(), ntohl()
    • inet_ntoa(), inet_aton(), inet_addr
    • inet_ntop(), inet_pton()
    • listen()
    • perror(), strerror()
    • poll()
    • recv(), recvfrom()
    • select()
    • setsockopt(), getsockopt()
    • send(), sendto()
    • shutdown()
    • socket()
    • struct sockaddr and pals
  • 10-参考文献
    • 10.1. 书籍
    • 10.2. 网站参考资料
    • 10.3. RFC
  • 11. 原着鸣谢
Powered by GitBook
On this page
Edit on GitHub
  1. 3. IP address丶结构与数据转换

3.1. IPv4 与 IPv6

在 Ben Kenobi 还是叫 Obi Wan Kenobi 的那段过去的美好时光,有个很棒的 network routing system(网路路由系统),称为 Internet Protocol Version 4(互联网协议第四版),又称为 IPv4。它的地址是由四个 bytes 组成(亦称为四个"octets"),而格式是由句点与数字组成,像是这样:192.0.2.111。

你或许曾经看过。

实际上,在撰写本文时,几乎整个 Internet(互联网)的每个网站都还是使用 IPv4。

每个人跟 Obi Wan 都很开心,一切都是如此美好,直到某个名为 Vint Cerf 的人提出质疑,警告所有人 IPv4 address 即将耗尽。

Vint Cerf [10] 除了提出即将到来的 IPv4 危机警告,他本身还是有名的 Internet 之父,所以我真的没资格能评论他的判断。

你说的是耗尽 address 吗?会发生什麽事呢?其实我的意思是,32-bit 的 IPv4 address 有几十亿个 IP address,我们真的有几十亿台的电脑在用吗?

是的。在一开始大家也是认为这样就够用了,因为当时只有一些电脑,而且每个人认为几十亿是不可能用完的大数目,还很慷慨的分给某些大型组织几百万个 IP address 供他们自己使用[例如:Xerox丶MIT丶Ford丶HP丶IBM丶GE丶AT&T 及某个名为 Apple 的小公司,族繁不及备载]。

不过现实状况是,如果不是有些变通的方法,我们早就用光 IPv4 地址了。

我们现在生活於每个人丶每台电脑丶每部计算机丶每只电话丶每部停车计时收费器丶以及每条小狗[为什麽不行?]都有一个 IP address 的年代,因此,IPv6 诞生了。

因为 Vint Cerf 可能是不朽的,[即使他的肉体终究应该会回归自然,我也希望不要,不过他的精神或许已经以某种超智慧的 ELIZA [11] 程式存在於 Internet2 的核心],应该没有人想要因为下一代互联网协议又没有足够的地址,然後又听到他说:"我要告诉你们一件事 ..."。

那你有什麽建议吗?

我们需要更多的地址,我们需要不止两倍以上的地址丶不止几十亿倍丶千兆倍以上,而是 79 乘以 百万 乘以 十亿 乘以 兆倍以上的可用地址!你们大家将会见识到的。

你说:"Beej,真的吗?我还是有许多可以质疑这个大数字的理由。"

好的,32 bits 与 128 bits 的差异听起来似乎不是很多;它只多了 96 个 bits 而已,不是吗?不过请记得,我们所谈的是等比数列;32 bits 表示个 40 亿的数字[2 的 32 次幂],而 128 bits 表示的大约是 340 个兆兆兆的数字[2 的 128 次幂],这相当於宇宙中的每颗星星都能拥有一百万个 IPv4 Internets。

大家顺便忘了 IPv4 的句号与数字的长相吧;现在我们有十六进制的表示法,每两个 bytes 间以冒号分隔,类似这样:

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

这还不是全部呢!大部分的时候,你的 IP address 里面会有很多个零,而你可以将它们压缩到两个冒号间,你也可以在每个 byte pair(字节对)上保留零。例如,这些地址的配对是相等的:

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

[10] http://en.wikipedia.org/wiki/Vinton_Cerf

[11] http://en.wikipedia.org/wiki/ELIZA

地址 ::1 是个 loopback(回路网络接口)地址,它永远只代表"我现在执行的这台电脑",在 IPv4 中,lookback 地址是 127.0.0.1。

最後,你可能会遇到 IPv6 与 IPv4 兼容的模式。例如,如果你愿意的话,你可以将 IPv4 address 192.0.2.33 以 IPv6 地址表示,可以使用如下的符号:"::ffff:192.0.2.33"。

我们所谓的自信,实际上,因为自信,所以 IPv6 的发明人很有把握的将兆来兆去的地址用於保留用途,不过说实在的,我们有这麽多地址,谁能算清楚呢?

还剩下很多地址可以分配给星系中每个行星的每个男人丶女人丶小孩丶小狗跟停车计时收费器。相信我,星系中的每个行星都有行车计时收费器。你明白这是真的。

[10] http://en.wikipedia.org/wiki/Vinton_Cerf

[11] http://en.wikipedia.org/wiki/ELIZA

Previous3. IP address丶结构与数据转换Next31.1. Sub network (子网)

Last updated 2 years ago