您的位置:首页 > 理论基础 > 计算机网络

Beej的网络编程入门教程 第四篇 IP地址和端口

2010-02-19 21:08 344 查看
下面开始进入第3部分IP地址、结构及其填充,这部分主要是讲述一些在网络程序设计时所经常要用到的数据结构,有一部分内容我个人觉得放在第二章更为合适。作者的幽默在前两章你应该感受到了,第三章也不例外(对了他总是那么幽默。)欢迎讨论:我的email:luck_wei@live.cn。不管是网络编程方面的问题讨论,还是想交个朋友,或是想给我介绍个不错的职位,或是想一起创业都非常的欢迎!闲话少说,继续你的网络编程学习之旅吧!前面的风景在等着你。

3.IP地址、结构及其填充
从这一部分开始有一些变化,我们将开始接触一些代码。
但是首先讨论不用编写代码的部分。恩,首先我想说说IP地址和端口并做一点扩展。我们来搞清楚这个问题(IP地址和端口的问题),然后我们讨论一下套接字API如何存储和控制IP地址及其它信息。
3.1.IP地址,IPv4IPv6
在过去的那些日子里,Ben Kenobi还叫做Obi Wan Kenobi(译者:这是星球大战中一个主要角色的名字)。那时有一个优秀的路由系统叫做IPV4。它的地址由4个字节(4个八进制数)组成,通常以“点分十进制”书写,就像这样:192.0.2.111。
你可能在什么地方见过!
其实,写这份文档时,在互联网上的所有web站点均还使用IPv4。
包括Obi Wan在内的所有人都很高兴,情况良好,直到有一些反对者vint cerf(译者:这可不是虚拟的人物,他就是被人称为互联网之父的人),警告我们IPv4的地址快用完了(我没有怀疑他的判断)。
超出地址范围?怎么会这样?我的意思是32位的IPv4地址有10亿多,我们真的有10亿多的计算机吗?
是的。
另外,在一开始时只有不多的计算机,几乎每个人都认为10亿已经够多了。一些大机构申请了大量的IP地址自己使用(像XEROX, MIT, FORD, HP, IBM,GE,AT&T和一些小公司像APPLE)。
实际上,如果没有一些可替代方案,早就不够用了。
但是现在我们生活在一个世界为什么不给每个人,每台计算机,每个计算器,每部电话,每个流星,每个小狗一个IP地址?
就这样IPv6不生了。没有人再想听到vint cerf说:“我告诉你…”。但是如果下一代网际协议还没有足够的IP地址,你还是会听到。
看看这个建议怎么样?
我们需要大量的地址。我们需要的不是2个,10亿个,1000兆个,而是7900万10亿兆个;你将会见到它。
你可能会说:“Beej,这是真的吗?我不相信有这么大的数字。”
啊!32位与128位之间差别看起来并不大,只多了96位,对吗?但是记住我们讨论的是平方:32位表示40亿(2^32),123位表示大概340兆兆兆(2^128),就可以给宇宙中每个星星1百万个IPv4网络。
忘记IPv4的点分十进制吧!现在我们有一个16进制的表示方法,每2个字节使用冒号分隔,就像这样:2001:0bb8:c9d2:aee5:73e3:9349:a5ae:9551。
并不总像上面表示的那样!大多数情况下IP地址中有许多的0,你就可以使用双冒号进行压缩。如下(短线相隔为一组):
2001:0db8:c9d2:0012:0000:0000:0000:0051
2001:0db8:c9d2:12::51
-------------------------------------------------------------------------------------------------
2001:0db8:ad00:0000:0000:0000:0000:0000
2001:0db8:ad00::
-------------------------------------------------------------------------------------------------
00000:0000:0000:0000:0000:0000:0000:0001
::1
另外:地址::1是回环地址,它的意思是这个机器在运行。在IPv4中回环地址为:127.0.0.1。
最后,有IPv6兼容IPv4模式。如果你想这样,例如:表示一个IPv4的地址192.0.2.3为IPv6地址可以使用:“::192.0.2.3”。
我们继续讨论一些有趣的事。
确实,太有意思了。IPv6的创建者保留了数以兆计的地址,但是我们有如此多的地址,坦白的说谁需要那么多?剩余的够分给每个男人、女人、孩子、小狗、流星及银河系中的行星。
3.1.1子网
由于组织原因,为了方便声明第一部分IP地址是网络部分,余下的是主机部分。
举个例子:在IPv4中192.0.2.12我们可以说前3个字节是网络,最后一个字节是主机,或者我们可以说12号主机在192.0.2.0网络中。
现在我们说一些过时的知识!真的吗?在以前有一个经典的子网分类,前1个、2个或3个字节是网络部分。如果你够幸运有一个1字节的网络号,3字节的主机号,你可以有24位(2400万左右)之多的主机在同一个网络内。这就是A类网络,相反的是C类,它有3字节的网络号,1字节的主机号(256个主机,还有少部分保留)。
正如你看到的:一点点A类地址,大量的C类地址,处于中间的是B类地址。
IP地址的网络部分用网络掩码表示,你使用子网掩码按位与运算IP地址就得到网络部分。子网掩码通常形如:255.255.255.0(说明:如果你的IP是192.0.2.12,你的网络号是 192.0.2.12与运算255.255.255.0得到192.0.2.0)。
不幸的是C类地址很快就用完了。我可以定义A类地址,所以不要烦我。记住,子网掩码可以是任意位的,并不只能是8、16、24位。你可以定义一个子网掩码如:255.255.255.252,30位表示网络,2位表示主机号,可以容纳4台主机(注意:子网掩码总是一串“1”跟着一串“0”)。
但是位表示成一个长字符串不方便使用。如:255.192.0.0 。
首先,人们不容易知道它表示多少位,其次确实不紧凑。所以一个新的表达方式出现了,非常好用。你只需要在IP地址后加一个反斜杠,然后写上十进制表示的网络号的位数,就像:192.0.2.12/30 或在IPv6下,形如:2001:db8::/32 。
3.1.2端口
如果你记忆力不错,你可能还记得前面的分层网络模型。IP层与传输层分开了。如果不记得在看下一段之前快复习一下吧!
除了IP地址以外还有一个地址是TCP和UDP使用,这就是端口号。它是一个16位的数字,可以理解成一个连接中的本地地址。
把IP地址想象成旅馆地址,端口就是房间号。这个比喻很合适,后面可能还有一些类似比喻。
你可能用一台电脑处理邮件和浏览网页,在一个IP地址上如何区分他们?
不同的服务在互联网上有公知的端口号。你可以在LANA的端口列表中查看。如果你使用unix在/etc/services文件中,HTTP使用80端口,telnet使用23端口,SMTP使用25端口,DOOM游戏使用666端口等等。1024以下的端口有些特殊,通常需要专用的操作系统特权才能使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: