------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.1.1 TCP/IP
TCP/IP是UNIX/LINUX世界中网络的基础,甚至,在某种意义上,UNIX网络就是TCP/
IP,而且TCP/IP也就是网际互联的标准。你可能知道有一个叫OSI(开放系统互联标准
)的模型,它是教科书上描述网络互联的标准模型,不幸的是,这个标准在实际的网络
世界中毫无意义,尽管许多教程会以它为模板传授网络理论。这是对标准化和美国政府
的一种嘲弄。事实是,TCP/IP在前进,而OSI已经不复存在。
本书试图直接按TCP/IP的构成来理解问题,尽管这也许不会在考试中给你带来高分,
但它确是唯一合理的方式。如果你喜欢OSI那种似乎井井有条的方式,你总会找到合适的
教材的。
作为网络互联的标准,TCP/IP给出的是一系列协议,这些协议要完成各种各样的网络
应用支持。你可以合理地把这协议看成一组编程接口,一旦应用程序了解这些接口便能
使用网络。为了实现这种抽象,TCP/IP被分成了四层,我们可以通过一个WWW浏览器来
看看这四层的概况:
应用层:www,SMTP,DNS,FTP
传输层:解释数据
网路层:定位IP地址、确定连接路径
链路层:与硬件驱动程序对话
首先WWW浏览器必须调用HTTP协议,这个协议规定用什么样的命令来得到WWW文本,这
种协议构成了TCP/IP的最高层— 应用层。
为了使用HTTP协议,浏览器要把命令发送到服务器上去,并且从服务器得出回答,
但是,必须记住,网络上传输的总是些字节,哪些字节是命令,哪些是回送数据,又有
哪些是用于表示“就绪”,“传输中”或者“停止”的验证码呢?这些解释工作需要一
串复杂的协议进行控制,这构成了第三层 — 传输层。
假定所有校验和和控制字都已经完毕,现在要把这些数据真正发送到对方那里,那么
,面对下一个问题是:这台机器到底位于哪里?如果保证数据被发送到了我希望的位置
?这种地址定位构成了第二层一网路层。
最底层 — 链路层完成最终的工作:将地址、数据等等变换成真正的电气信号,并且
在网络上送出,让网络设备彼此对话。
在以后的各节中,我们将会概述一下各层的情况及与我们相关的主要的问题。相信我
,这里讨论的只是主要的问题。许多问题由于仅有历史的意义而无需考虑,而另外一些
问题不太象是一个LINUX管理者会非常关心的,例如ATM交换。相反,如果要管理LIN
UX务嚣,迟早你必需理解ARP和路由选择。
我知道从理论上说一个服务器管理员也许根本不需要了解下面陈述的问题,也许需要
知道更深奥得多知识。但是根据我的经验,一旦你成为服务器管理者,并且你是在真实
世界而不是管僚机构中,你将很快发现一切困难的任务都必须由你来完成,而且毫无商
量余地,最终你会看到你将成为整个系统的管理者。了解足够多的东西,你将会在系统
管理员的恶梦中生存下来。
在后面的解释中,你将看到TCP/IP是如何工作的,但是我们必须先说明一件事情,你
很容易看出,TCP/IP的设计是有弹性的,实际上,存在某种方法把其他网络协议当成TC
P/IP的基础,例如,我们一般让TCP/IP协议直接与网卡驱动程序对话,但是,也可以想
象这样的情况,把其他的网络协议,例如IPX当成一种虚拟的“网络设备”,这样,TCP
/IP就可以运行在其他的网络协议之上,这种技术被称为IP隧道。不过,在本章中,我们
将不涉及如此复杂的问题。
1.1.2 IP地址和子网
你肯定知道,互联网用IP地址来标识主机地址,而数据传输则是通过把数据分成一
列的小“包”来完成。TCP/IP世界里的每一台主机都要有唯一的IP地址,这个IP地址是
一个32位无符号整数,不过通常使用点分十进制表示。例如,0001000011000001111111
1000000001是二进制的281148929,但是实际应用中把它按照8位一段的方法分成四段,
第一段是00010000,也就是16,第二段是11000000,十进制是192,同样,剩下来的两段
是254和1,因此这个地址是16.192.254.1。
这听起来很简单,但是在实际实现中有些复杂,主要问题是TCP/IP必须兼顾许多困难
的问题,其中之一是网络联接。全世界有太多的网络主机,随便给你一个主机号,你怎
么知道它在哪里?最大恶梦在于,或许13.2.0.5在美国纽约,而64.0.7.6 却在北京,如
果搜索一台主机地址就要查阅全世界的主机列表的话,那么互联网将立即崩溃。
解决这一个问题的第一个要点是网络分类.分类把世界上的IP地址分段,各段之间独立
管理,通常每一段用同样的方式连接到一起,本段的机器之间可以直接互相访问,这样的一
个段称为一个系列网络地址。
为了管理的方便,分段用一个有点古怪的方式。例如,对些公司(比如IBM),一个上
万台机器的网络很正常,而小公司也许只有十几台机器,TCP/IP实现中用A、B、C类地
址来处理这个问题。
A类地址用于超过65534个主机的网络,例如,一个前缀为18的网络使用18.0.0.1~18.
255.255.254的网络地址,这些地址之间是直通的,主机之间可以彼此访问。为了说明这
一点,TCP/IP使用网络掩码和网络地址的概念。
在上面的例子中,网络地址是18.0.0.0,这表示网络的包含地址段是18.0.0.1~18.25
5.255.254,即地址部分除去前缀后,余下的部分由全零变成全1,不过全1的地址将保留
为广播使用。
与网络地址相应,对在此网络中的主机,TCP/IP使用网络掩码。在上面的例子中,掩
码是255.0.0.0,其含义是这样:假设18.0.0.3想和18.110.75对话,那么,将这两个地
址相互异或,再与掩码取“与“(&),结果是零 ,说明这两个地址可以直接对话;相
反,如果要与19.1.1.1对话,那么运算之后不为零,说明必须使用间接方式才能到达。
可以用直接方式理解掩码,掩码中的“1“用来描述网络地址(前缀),“0“用来描
述子网的主机,如:255.0.0.0意味着将主机地址的前8位解释为网络号,而后24位解释
成网内的主机地址。也就是说,与某个A类主机地址前8位相同的主机地址被认为是在同
一子网之内。
A、B、C类用下面的方式规定:
A类地址使用255.0.0.0的掩码,为了管理方便, 规定A类地址总是使用头一位为0的地址
值,这意味着A类地址是从1.0.0.0到126.0.0.0另外还有一个特殊的A类地址127.0.0.0它
用来表示"本机",即自身。
B类地址使用255.255.0.0的掩码,B类网从128~0.0.1到191.255.0.0。
C类地址的掩码是255,255.255.0,网络地址从192.0.0.0到233.255.255.0。
首字节在224以上的地址用于实验和开发,部分用于组播, 通常无需关心。
地址255为特殊的含义,它用于广播,即“向本网上所有人通话”。这个概念对任何人
都应该是很容易理解的。使用广播有两种方法,并且是几乎等价的,即:(1)使用全1的
地址,即255.255.255.255 。(2)使用本址广播,即用网络号加上全1。例如,A类网180
.0.0.0可以使用18.255.255.255广播,B类网190.4.0.0的广播地址则是190.4.255.255。
无论哪一种,对于广播地址的访问都将引发对数据发送给本网络上的所有机器。
计算网络掩码和标志子网地址是网络管理者经常需要进行的工作,第一种计算是根据
某个确定的主机地址和它的网络掩码求出所有可以和它直接通信(在同一子网之内)的
主机地址。例如,主机地址是202.112.50.3,掩码是255.255.255.0,与它可以直接通话
的主机的地址可以这样计算:掩码是255.255.255.0,因此32位网络地址的前24位被解释
为网络地址,所以凡是和202.112.50.3的前24位内容相同的主机地址就和它处在同一子
网之内,后8位是子网里面的机器地址,它可以从全0变到全1,所以所有和这个主机在同
一子网之内的主机的地址是202.112.50.0-202.112.50.255。
网络地址/掩码一般用斜线分开,如网络地址是202.199.248.0,掩码255.255.255.0在
UNIX中一般写成202.199.248.0/255.255.255.0。但是也有另外一种写法,就是用掩码中
1的个数来代替掩码的实际形式。例如,255.255.255.0的前24位是1,其他位是0,因此
可以写成202.199.248.0/24。同样,下面的两栏地址形式是彼此等效的:
202.199.248.0/255.255.255.0 202.199.248.0/24
122.24.0.0/255.255.255.0 122.24.0.0/16
13.4.5.7/255.0.0.0 13.4.5.7/8
我们在前面一直设置掩码的0/1分界在字节边界处,但是这其实并不是必须的。完全可
以有其他形式的掩码。例如,240等于二进制的11110000,因此一个255.255.255.240的
掩码意味着前面28位是网络地址,而后面4位是子网内的IP。同样,网络地址也可以不由
0结尾。举个例子来说,202.112.50.16/255.255.255.240是什么意思?202.112.50.16是
二进制的11001010011100000011001000010000,套上一个有28位为1的网络掩码,意味着
最后四位由全0变成全1,就是最小是11001010011100000011001000010000,最大是1100
1010011100000011001000011111,这两个数是202.112.50.16和202..112.50.31,所以这
个网络地址代表202.112.50.16到202.112.50.31的所有主机。这个网络地址也可以写成
202.112.50.16/26。
1.1.3 网络硬件
TCP/IP并不关心具体的网络实现,但是不幸的是系统管理员必须了解。你的网卡可能
会失效,以太网可能会拥塞,调制解调器会被击穿,还有诸如此类的种种问题。另一方
面,特别对于以太网,如何将IP地址译码成实际的电气位置是非常重要的问题。
对于一般的系统,最重要的两种网络连接是以太网和电话线。以太网使用同轴电缆,
双纹线或光纤作为连接介质,面电话线则为广域网提供主要的连接手段。
以太网无疑是最主要的网络技术,对一个DIY人员来说,10MB或100 MB以太网的硬件
连接如此简单以至于无需在这里作任何描述。但是有几个特殊点可能仍然需要指出。首
先是以太网的通讯协议。
以太网命使用一种载波监听/碰撞检测的方式工作,因为线路上跑的是电气讯号,所
以以太网卡通过监视电缆电位来判断是否有某个设备在传输数据。如果网卡接到一个发
送任务,它首先判断线路上是否有数据传输,如果有,它等待一会:如果没有,它就以
一个特定的数据包大小(帧)将数据发送到线路上。
以太网的帧格式有些怪异,它允许在帧中包含帧的类型,当一个帧到达某台计算机时
,计算机根据帧的类型作不同的处理。如果你经管理过Netware,那么肯定会面对802.2
或802.3以及Ethernet -II的种种令人晕头转向的配置问题。幸运的是,在Linux或者W
indows的世界里,你极少需要真正处理它们。
当一个帧被发送到网络上时,它实际上是在网络的整个电气连接上漫游。“电气连接
”指电信号可以传递到的任何地方,比如,集线器上连接的几片网卡,穿过几根电缆或
双绞线,等等。然而一台机器上的两片网卡不在一个电气连接上,因为电信号无法直接
在两者之间传递。(你会问如果这两片卡正好插在同一个集线器上会如何,我只能说:!
@#$%)每个以太网卡必须有一个唯一的“以太网地址”,也叫MAC地址。它是一个48位整
数,理论上,它应该是全世界唯一的,当网卡发出一个数据帧时,它在帧的头部包含发
送者和接收者的“以太网地址”,因此,当一个网卡“听到”与自已地址适应的帧时,
它接收这个数据帧。显然,只要整个电气连接上没有两片网卡的“以太网地址“相同,
这种方式就可以工作。
有几个特殊的问题,首先,“以太网地址”必须在整个电气连接上唯一,当然你会想
:“这是肯定的; 2的48次方比任何电气连接都大得多”,这很难说,确实有某些不那
么聪明(或不那么负责,也许仅仅不太走运,随你去猜)的厂商生产过一些以太网地址
完全相同的网卡,如果拿到这样的网卡,你必须找到厂家提供的设置程序修改以太网地
址,用术语叫“设置MAC地址”。第二,你可能会想,是否以太网的这种工作方式意味着
任何帧实际可以被整个网络的成员收听到而不是确定地送到对应地址,答案是确实如此
。有一种叫“嗅探器“的东西就是干这个的;最后,由于电信号实际是以近于光速的速
度传播,所以可能会发生这样的情况:两片网卡同时发现网络空闲,同时传送数据,结
果造成信号的混乱。术语中这叫碰撞。以太网卡可以通过电位检测判断出碰撞的存在,
一旦发生碰撞,碰撞两者立刻停止发送数据,等待一段时间,随后重新试图发送。由于
以太网的信号共享性质,对于连接数太多的网络,网络碰撞将使行实际上每次发送都会
碰撞,这时我们说以太网已经拥塞,你必须分割或升级网络连接了。
广域网连接中,最主要的是基于电话拨号的IP连接。但是这包含着许多种类型,其中
最主要的也许是调制器和ISDN连接。对于专线的连接,曾经流行过一个称为X .25的分组
交换协议,但是这已成为历史。事实上,从逻辑角度看来,电活线连接比以太网简单得
多,因为你不必关心信号应该传送给谁的问题。不幸的是,它们实在太慢,而且也过于
昂贵了。
一般情况下,我们用以太网构成局域网连接再用其它技术(例如DDN或者ISDN)将整个
局域网连入Internet。在这种情况下,我们必须了解许多事情,特别是关于网际互联的
一些行为方式。
1.2 地址和路由选择
这一节我们来研究数据在网络上如何寻址,特别是与ARP和RIP相关的一些内容。如果
你准备用Linux实现廉价的路由器和防火墙,那么这部分知识是必需的。
1.2.1 地址解析和路由器
如同我们在以太网能够实现网卡之间的直接地址数据传送,为此,它要了解发送者和
接收者的MAC地址,对于需要向所有连接者通知的内容,它使用广播,广播可以被所有网
络接口设备接收。
MAC地址是一个48位的整数,它用来标记网卡,问题是TCP/IP用IP地址来描述传输地
址,而IP地址是32位的,那么,如何将IP地址转换为MAC地址呢?
为了解决从IP地址到实际的设备之间的转换问题,TCP/IP定义了两件事情,首先是地
址转换协议ARP,它用来解决在一个子网之内如何将IP地址转换为实际的设备位置。显然
,设备可以不仅是以太网,但是象调制解调器这样的连接,其地址翻译在建立连接时就
已经确定了。而令牌环等设备在地址确定方面实际是和以太网一样的,所以我们主要讨
论的将是以太网。
假设某主机想和与自己同子网的机器通信,例如202.14.0.3到202.14.0.7,它首先将
使用以太网提供的硬件广播功能:首先广播一个数据包,其内容将包括:自己的IP地址
,自己的MAC地址,以及试图通讯的IP地址。由于硬件广播可以送到以太网电气连接的任
何地方,所以202.14.0.7如果开着就会接收到这个数据包,于是它向202.14.0.3回送一
个数据包(因为广播包中已经包含了202.14.0.3的MAC地址,所以B知道如何送数据),
内容将包含202.14.07的MAC地址。这样,一个“广播-应答”就确定了两台机器的MAC地
址。
为了提高效率,每台机器都会在自己的系统上维护一个对照表,每当得到一个应答或
是听到一个地址广播,机器就在自己的对照表中加入一项,这样以后再需要与相应地址
通信时就可以直接从表中查到MAC地址。因为MAC到IP的映射可能会改变,所以对照表被
设定为每过一段时间更新一次。
因为ARP是靠广播来维护的,所以在一个庞大的网络系统内部,广播可能会消耗大量网
络资源,这曾经带来许多问题。随着以太网将速度提升到GB级,ARP广播已经不那么令人
头痛,然而某些广播仍然十分讨厌。
ARP解决了在同一物理网络系统之内IP到物理地址的解析问题,而对需要跨越子网的通
信,TCP/IP使用路由的方法。
路由器是一台用作子网之间数据传送的计算机,它接收由某个子网来的数据请求,并
将它转发到另一个子网上,你可以考虑,类似于下面的结构
路由器说明
子网A中的机器需要与B中的机器对话时,它首先判断出机器不在本子网之内,于是它
把请求包发送到R上。
R上有两个网络接口,不妨假定A、B的网络地址是192.168.1.0和192.168.2.0,而R上
的两个接口分别是192.168.1.3和192.168.2.6,显然,A可以把它数据包发送到192.168
.1.3上,当路由器尺接到这样一个数据包时,它发现这个数据包的地址是在网络B中,于
是它将数据包提交给B上的接口192.168.26,然后这个接口就可以直接与目标机器对话了
。当B中机器反馈这个响应时,发生相反的过程。
对于更复杂的情况,工作方式与这个例子是一致的。所不同的是,这时由A到B的路径
可能更加复杂,有两种标准案可以考虑。
首先的方法是采用递送缺省路由方式,比如,考虑下面的一个情况:
路由递送
在子网A中有一台计算机,地址为192.168.1.1,它想和192.168.3.7对话,按照网络掩
码,它知道192.168.3.7不在自己的子网内,于是它把信息投递到路由器R1。
路由器R1知道目标地址是192.168.1.0/24的信息应该发送到子网A,对于192.168.3.7
,它也一无所知。但是它知道这个网络上还有另外一个与它相连的路由器R2,于是它把
信息投递到R2。R2知道192.168.2.0/24的信息如何投递,但也同样不知道关于192.168.
3.7的事情,于是它再将自己的信息投递到自己的缺省路由器R3,最后,R3发现目标地址
正是它所负责的网络地址,于是,投递成功。
另外一个方法是为了解决上面方法的一个缺陷。例如,由于用户可能动态地加入和移
除网络,使得路由表将频繁地修改。为此,可以使用动态修正的方法,让每个路由与其邻
近的路由器联系,不断交换路由信息,使得路由信息表总是可以使用。如何交换路由信
息构成了TCP/IP协议的重要部分。
无论哪一种方案,都可能成数据包在路由之间循环。解决的方式是引入一个“跳“的
概念,为每一个数据规定一个最大跳数,每通过一个路由器被减去一跳,当跳数达到零
时如果还没有到达目的地,数据将被简单地丢弃。
1.2.2 地址扩充和伪装
如同我们所看到的样,互联网地址被分成A、B和C类地址。由于A类地址只有只有126个
,所以对一个普通公司来说去申请一个A类地址几乎是不可能的;B类地址有几万个,应
该说并不少,但是拥有上万台机器的公司更多;至于C类地址目前尚宽裕,然而政策和路
由规则的限制也许会使得使用C类地址有些困难。
无论怎样,互联网址地已经告急;对于B类地址尢其如此。最大问题也许是,每个网络
要求自己的机器位于一个物理网络中,在B类和A类的情况下几乎是不可能的。想一想,
如何将几万台机器连接进一个以太网系统!更不用说产生的地址广播了。
假定你申请到了一个B类网址,显然,你有必要将其切割成更小的子网,否则你肯定会
面对地址管理的恶梦;但是一旦你进行了这种切割,那么你就会面对另一个问题:B类网
总是假定掩码为255.255.0.0,每一台机器假定为可以直接与网络内的任何机器对话,这
会带来ARP问题。
ARP代理问题
为为分割子网,你引入路由器R,将它放到主干上,并有将M4和M5放在路由器后面。
但是M1和M2,M3都会认为M4,M5就在主干上,并且试图用ARP广播取得M4,M5的MAC地址
,当然这不会成功了,所以M4,M5就无法工作。
最根本的解决方法当然是修改总体的网络设置,并且将M1,M2,M3也放到路由后面,
修改它们的网络掩码。但对于已经分配了很多网络地址的网络,这就会带来一些很讨厌
的问题,所以实用中一般采用另外的办法,即ARP代理。
在ARP代理方式下,R将截获所有对于M4、M5的ARP请求,并且代替M4和M5回应ARP广播
,这样在M1、M2、M3看来,仿佛路由器R除了R的实际地址之外,还拥有M4、M5的IP地址
,或者说在M1看来M4、M5的IP都对应着R,因此它们会将所有目标是M4,M5的通信送到R
,R自己当然是知道M4,M5的存在的,它会将数据包转发给M4、M5,这样的方式称为ARP
代理(proxy ARP)。
显然对于M4和M5,也可以由R1代理M1,M2,M3来完成这个工作;不过由于实际上在主
干上的机器总是极多的,如果手工加所有的代理项请求是不现实的,因此实现中通常用
另外一个办法,即改变M4,M5的掩码,使得M4,M5认为自己处于一个C类甚至更小的子网
中,而凡越出掩码范围的信息,让它们将R2作为缺省路由,将数据发送到R2。
ARP代理的主要用处是在B类地址中分割子网,尽管技术上它也适用于C类网,但是很少
有人这样干。要记住ARP并不能节约网络地址,而仅仅是使得B类(有时也用于A类)网络
的物理连接更灵活,地址管理更有效率。并且它总是用在你的B类地址已经被分配了相当
一部分的情况,如果你有一个未使用的B类地址,毫无疑问将其分裂成一组C类地址会更
有效率。如:
分割子网
R为主路由,R1,···R12各自带一个较小的网络,R1分析数据包的目的地址并且
把它发送到对应的路由上,而A,B,C,···D分别将R2···R11作为缺省路由器。
可惜这里叙述的内容显然无助于普通的公司级用户。一般来说,在大学中申请一组IP
地址是容易的(一般的大学会有4-32个C类地址)。而对公司这几乎是不可能的。一个
普通公司能申请到时候1-16个IP地址已经不错了。
IP代理
为了解决IP地址不够的问题,有另外一个解决方案,即IP代理。首先,TCP/IP申定义
了几个特殊的系列IP地址,对A类是10.0.0.0,B类为172.16.0.0和192.168.0.0,这些地址
用于“私用网络”,任何人都可以随意使用。
你可能会对这个感到奇怪,如果有两个单位使用同样网络会不会出现同路,答案是这
些网络并不直接接入Internet,相反,它们需要一个特殊的路由器来处理这个问题。
IP代理路由器R有两个网络地址,连到Internet的这一端,是一个 申请到的真实IP,
如203.17.45.6,在另一端则是私用网络地址,比如10.0.0.1。当私用网络上的一台主机
(如10.2.3.5)想和Internet上的主机对话时,它将数据报文发送到R,但是R并不是直
接转发这个数据包,而是改写数据包的封装,使得看上去数据是从R的203.17.45.6网络
接口发送出来的,所以这个数据包能够到达目的地。而当数据返回时,它返回到203.17.
45.6,然后路由器分析包上的封装,将数据包转送到10.2.3.5。
显然这有一个弱点,即外界并不知道10.2.3.5的任何事情,因此除非对话是由私用网发
起,否则对话不会成功。这使得外界不能去主动访问私用网上主机。对于某些工作这是
非常头痛的,例如ftp将会失灵,因为ftp要求一个反向的会话。不过,HTTP和TELNET,
gopher等都不受这个限制。
还有另一个技术用于使IP地址的使用有效率。也许你的系统中有很多机器,但并不是
全都打开的。例如,你有100台机器联到网上,但是也许最多只有50台计算机会同时打开
。这在一个官僚机构中是很常见的。于是,你可以让IP地址动态分配,只有实际工作的
机器才需要IP,这样,只要50个IP就足以解决问题了。这种技术称为DHCP(动态主机配置
协议)。这个技术还有一个古怪的应用,就是你可以省去为下面的的机器提供网络配置信
息的麻烦,而是让客户机器直接从DHCP中得到正确的路由和其他必要信息。
1.3 连接和数据传输协议
连接和传输协议提供网络机器之间传输数据的基本支持,它主要包括报文传输的控制
协议,直接的数据传输协议和机器之间的数据流传输协议。
1.3.1 控制和传输协议
假定你已经构造了“正确”的网络体系结构,那么下步就是在IP地址之间投递数据
。如同我们说的那样,IP层的实现就提供了如何向目标地址投递数据的知。但是在投递
数据时,仍然必须引入一些协议,它们规定投递的方式和一旦出错如何处理。
最常见的差错是路径错误。路由可能失效,目标主机可能挂起,网络线路可能断连,
甚至某个缺乏经验的研究生错误地修改了路由列表。无论哪一种情况,对发送者来说数
据都是丢失了。TCP/IP中定义ICMP协议来处理这种问题,它用来在路由或主机之间传送
关于网络的状况信息。例如,众所周知的ping命令就使用ICMP协议来确定目标主机是否
工作。ICMP关心的只是网络连接是否可用,路由信息是否正确,以及目标主机是否工作
,它不关心目标机器上是否有任何服务程序在运行。
除此之外,ICMP还需要完成其它一些功能,例如路由重定向。
假设网络连接是可用的,那么下一步是约定传输数据的协议。有两种标准的协议用来
处理数据传输,第一种方案是发送者简单地向目标投递信息,所有的判断,纠错,流量
控制等等都由传输协议去处理;另一种办法是发送和接收者自己完成各种高级控制和较
验工作,协议只提供发送和接收机制。第一处称为传输控制协议(TCP),第二种称为用
户数据报协议(UDP),TCP更常用一些。
无论哪一种情况,都要理解所谓“端口”的含义。端口是一个十六位整数,实际传输
中,源地址和目标地址都是用“IP地址+端口”的数对来标况的,因此,一台机器可以同
时进行多路的UDP或TCP通讯,只要使用不同的端口。
让我们用TCP来解释一下这种情况,因为这是大部分网络程序使用的协议。TCP是一个
连接传输协议,当连接开始时在源和目的之间建立一条虚拟的数据通路,通路由两个端
点的地址和端口号决定,而且数据传输是双向的,一条通路可以同时向两个方向传递数
据。
最重要的一点是,TCP连接决定于两端点,也就是说,(A,port1;B,prot2)和(A,
port3;B,port2)是两条独立的连接路径,一台机器上的端口可以用于不同的数据传输任
务,只要另一端的地址和端口号不同。
连接建立之后,双方就可以相互交谈了,因为数据连接是双向的,每一方都可以既发
送又接收信息,一方发送信息的时候,基本上是按照队列的先进先出的方式传递,接收
方如果发现某个部分传输错误就向发送方提出请求把相应部分重发一次。所有的排队和
纠错工作都由TCP协议来完成。
UDP和TCP是类似的,不同的是UDP是一个无连接协议,它不能构成数据通路,相反,发
送者盲目地向目标投递数据并且等待回应,使用UDP的程序必须自己处理和数据较验,排
队,以及准备应付数据次序混乱,缓冲区溢出,数据包丢失等等问题。
很显然,无论TCP或UDP, 必须提供一种机制用于分配可用的端口号。IP地址是系统管理
者设定的,而对于端口号,一般采用一种折衷的方式。TCP/IP保留某些端口号用于标准
的服务应用,而其它的端口号由操作系统控制,当应用程序需要传输数据时动态分配。
但这种保留并不是具备实际的约束能力,因为操作系统总可以用自己的方式分配端口号
。在UNIX系统中,为了管理的统一,规定要分配小于1024端口号,必须拥有系统管理员
权限,而普通的用户程序只能申请大于1024的端口号。不过,某些较大的端口号在近来
的系统中也具备了特定的含义(如 1080,8080等),但是这些含义并非严格地被遵守。
1.3.2 服务器和应用层协议
现在我们可以理解服务器的实现了。服务器软件就是一种按照TCP或者UDP连接回应客
户机器请求的软件,而运行服务器软件的机器就成为服务器。
服务器的实现是靠一种监听机制,TCP/IP为每种重要的服务功能分配一个端口号,而
股务器程序在这个端口上进行监听。当某个客户程序申请服务时,它试图去和对应端口
进行连接。如果对应端口上有服务程序在监听,将会成功地形成一个连接。服务器可以
处理这个连接,分析客户机送来的请求,回送合适的应答。但更常见的办法是服务器启
动一个子进程,将连接转交给子进程,然后自己继续监听其它的请求。
在整个协议的顶层,就是如何完成标准服务所需要的格式约束协议了,如 TELNET,F
TP,HTTP 等等,尽管许多人把这些东西和实现它们的应用程序看成一回事,不过实际上
它们仍然是不同的。这些协议是独立于使用的应用程序的,因此,不同厂家的浏览器才
能给出同样正确的结果。原则上,如果你熟悉 HTTP 文件协议,你也完全可以用TELNET
程序来阅读远端服务器的WWW传输,或者,直接 TELNET 到 25/110 端口来完成发信和收
信(不过,如果你凭心算就能解码 ISO-8859信件,我只能对你表示廉价的崇拜)。特别
是后者,是调试的主要手段之一。
FTP 协议是特别需要重视的,因为它的实现有些古怪,它使用两个连接:首先客户向
服务器的21端口发出请求,建立一个连接。但是这个连接仅用于传输 FTP 命令。当客户
程序正式要求下载某个文件时,服务器向客户机发出要求,建立第二条连接,文件内容
由这条连接传递。第二条连接使用较高的端口号(大于1024),这个通路是设计防火墙
的专家的噩梦之一。目前发展了一种新的ftp工作方式,即第二条连接不用服务器发起,
而是让客户向服务器的20端口发出请求,用这个连接来传递ftp数据。
HTTP协议相对来说简单一点,服务器在80端口等待客户的连接,所有的数据也从这个
连接传送。每传送一个独立的文件需要一个新的连接。
另外还有许多协议,我们在本书后面将详细介绍,例如 DNS,NFS 等等。我们在这里
只简单地列出一些重要的协议所使用的端口和协议类型:
协议名 端口 协议类型 说明
daytime 13 TCP/UDP 日期/时间服务
ftp 21 TCP 文件传输服务
ftp-data 20 TCP ftp数据
ssh 22 TCP/UDP Security Shell
telnet 23 TCP 远程登录
smtp 25 TCP 电子邮件
time 37 TCP/UDP 时间服务
domain 53 TCP/UDP DNS域名服务
gopher 70 TCP/UDP Gopher服务
http 80 TCP HTTP传输协议
pop-3 110 TCP 邮局协议3
sunrpc 111 TCP/UDP 端口映像程序
auth 113 TCP 用户身份认证
nntp 119 TCP Usenet新闻传输
netbios-ns 137 TCP/UDP netbios名字服务
netbios-dgm 138 TCP/UDP netbios数据处理
netbios-ssn 139 TCP/UDP netbios会话
imap2 143 TCP/UDP IMAP邮件管理
irc 194 TCP/UDP Internet Chat
https 443 TCP/UDP 使用SSL的http
除此之外,有一个协议非常重要。但我们在这本书中无法叙述,因为各种公司都加上
自己的稀奇古怪的内容,而且往往保密。这就是 SNMP 协议,它用于对网络进行远程管
理,也许有一天我们可以用一整本书的篇幅讨论 SNMP 和各种怪异的实现。