第18章 因特网与TCP/IP
***************************************************************************
18.1 因特网
18.1.1 因特网的结构
18.1.2 因特网的地址
18.1.3 网际协议地址
18.1.4 域名和域名系统
18.1.5 统一资源地址
18.2 TCP/IP的参考模型
18.2.1 协议层次和协议的概念
18.2.2 TCP/IP和OSI模型
18.2.3 部分网络设备执行的协议
18.2.4 TCP/IP与以太网
18.3 网络应用层协议
18.3.1 网络应用与应用层协议
18.3.2 超文本传送协议HTTP
18.4 网络传输层协议
18.4.1 传输层简介
18.4.2 端口号和套接号的概念
18.4.3 用户数据包传输协议(UDP)
18.4.4 传输控制协议(TCP)
18.5 网络层上的网际协议练习与思考题参考文献和站点
***************************************************************************
因特网(Internet)是全世界使用TCP/IP协议堆和网关设备(gateway)组成的网络,TCP/IP实际上已成为因特网的代名词。为对多媒体网络应用有比较深入的理解,就需要了解因特网的基本术语、结构和协议。因特网上使用的协议非常多,本章只选择了最普通的几个协议作了简单介绍,这些协议是HTTP、UDP、TCP和IP。在介绍协议过程中自然要涉及到协议定义的各种内部结构,这是为了更好地理解协议的功能和执行这些协议的软件。
18.1 因特网
18.1.1 因特网的结构因特网是由网络ARPANET(Advanced Research Projects Agency Network)发展而来,而ARPANET是美国国防部高级研究计划署在20世纪60年代支持创建的资源共享计算机网络。因特网是许许多多子网(subnetwork)集合而成的网络,这些子网都有一个共同的通信协议,这就是TCP/IP通信协议。因此不难理解人们往往把Internet与TCP/IP紧紧联系在一起。
因特网的组织和新标准的采纳由因特网体系结构研究部(Internet Architecture Board,IAB)统管。IAB还协调好几个特别工作组,包括因特网工程特别工作组(Internet Engineering Task Force,IETF)和因特网研究特别工作组(Internet Research Task Force,IRTF)。
组成因特网的子网之间在物理上的相互连接都是通过网关设备实现的,如图18-01所示。通过网关设备互相连接在一起的不同的网络通常称为子网(subnetwork),因为它们是大网络之中的网络。子网是一个完整的网络,是互联网络中的一部分,或者说子网是因特网中的一部分。网关设备与执行TCP/IP协议的其他设备和软件一起工作,它的最基本的任务就是从互联网络或者局域网络上接收按照协议规范封装的协议数据单元(Protocol Data Unit,PDU),然后把它们递送到下一个网关设备或者局域网络。

图18-01 子网之间通过网关设备相互连接
在美国,因特网使用美国国家科学基金会NSF(National Science Foundation)资助的网络NSFnet作为全国性的主干网络,如图18-02所示。连接到主干网络NSFnet的网络有美国国家航空和宇宙航行局(National Aeronautics and Space Administration,NASA)的空间物理分析网络(Space Physics Analysis Network,SPAN),计算机科学网络(Computer Science Network,CSNET),BITNET(Because It's Time Network),WESTNET,UUNET(UNIX to UNIX Network)和圣地亚哥的巨型计算机网络(San Diego Supercomputer Network,SDSCNET),在图18-02上没有标出,……。

图18-02 美国在因特网上的部分子网
NFSnet主干网由3000多个研究站点组成,通过T-3线路把它们互连在一起,数据速率是44.736 Mbps。为提高传输速率而采用的技术有同步光纤网络(Synchronous Optical Network,SONET),异步传输模式(Asynchronous Transfer Mode,ATM)网络以及由美国国家标准化学会ANSI提议的高性能并行接口(High-Performance Parallel Interface,HPPI)等技术,数据传输速率将达到1 Gb/s。
18.1.2 因特网地址的概念由通信协议使用的术语——地址(address)的含义很多,它可以指发送端地址、接收端地址、机器的端口地址、存储器地址、应用程序地址等等。因此当遇到这个术语时需要倍加小心,确信它所指的真正含义。
网络地址(network address)类似于信函上的地址,它告诉传输系统把数据包(datagram)递送到何处去。在因特网上与地址相关的术语主要有3个:名称(name)、地址(address)和传输路线(route)。名称是一台机器、一个用户或者一个应用软件的唯一的标识符,它为数据包(datagram)提供一个绝对目标;地址用来标识这个绝对目标所在的位置,通常是它指网络上的物理位置或者逻辑位置;传输路线是告诉传输系统如何从这个地址中获取数据包。
1。 名称地址人们经常使用收发者的名字来指定一个用户名或者一台机器。根据指定的名称,通过称为域名服务器(Domain Name Server,DNS)也叫做名称服务器(name server)的网络软件包去分析物理地址。例如,当发送电子邮件时,你可简单地指出接收者的名称,域名服务器就会想办法解决如何把电子邮件传送给接收者。使用域名服务器除了把名称转换成地址和传输路径之外,也为系统管理员或者网络管理员提供许多方便,更改网络时就不必要把更改内容告诉每一台机器。
2,物理地址网络上需要与他人通信的任何一台设备都需要一个唯一的地址——物理地址(physical address),有时也叫做硬件地址。在一个给定的网络上一个物理地址只能出现一次,否则域名服务系统就无法准确确定目标设备。硬件地址通常设计在网络接口卡上,通过开关或者软件进行设置。
在物理层(物理层的概念见后面的介绍)上对每个过往的数据包(即协议数据单元PDU)进行分析,如果数据包中接收者的机器地址与这台设备的物理地址相匹配,就把这个数据包传送到这台设备的物理层,否则就不理睬。
不同的计算机平台、网络和软件版本可能使用不同的名称约定,物理地址的长度也不相同。例如,以太网的物理地址使用48位,这是开发以太网的Xerox公司指定的地址长度。现在,为子网分配通用物理地址的任务由电气和电子工程师协会(Institute of Electrical & Electronic Engineers,IEEE)承担。IEEE为每个子网分配24位长的组织唯一标识符(organization unique identifier,OUI),而组织可指派另外一个24位的标识符。组织唯一标识符OUI的格式如图18-03所示。
1位
1位
22位
24位
I/G
U/L
IEEE指派的子网地址
当地分配的物理地址
注:I/G(individual / group)=0: 个人地址 1:组地址(group)
U/L(universal / local)=0: IEEE指派 1:当地指派图18-03 组织唯一标识符(OUI)
在24位OUI格式中,有2位用作标志位,其余22位表示IEEE指派的子网物理地址。当整个OUI都设置成1时,表示网络上的所有站点都是目的地址。其余的24位用来表示当地管理的网络地址。用作组织唯一标识符OUI的24位和当地管理的24位组合在一起形成的地址称为媒体接入控制(media access control,MAC)地址。当封装在网络上传输信息包时,有两种MAC地址:发送地址和接收地址。
3,数据链路地址
IEEE以太网标准使用的另一种地址叫做链路层地址(link layer address),用LSAP(link service access point)表示。LSAP表示在数据链路层(data link layer)上使用的链接协议的类型,自带寻址信息的、能够独立地从源端传送到终端的数据包(datagram)就携带有这种发送和接收的LSAP信息。
18.1.3 网际协议地址在因特网上的每台联网计算机都需要有一个唯一的地址,这样才能在计算机之间进行通信。为此,定义了两种形式来表示计算机在因特网上的地址:一种是机器可识别的用数字表示的地址,通常称为网际协议地址(Internet Protocol address,IP),简称为IP地址。因特网的IP地址由美国国家科学基金会于1993年组成的因特网信息中心注册服务部门(InterNIC Registration Services)进行分配和注册,InterNIC是NSFnet (Internet) Network Information Center的简写。IP地址就像你家中的电话一样,每一部电话都有一个唯一的电话号码,它是识别电话网络上某一部电话的标准方法。另一种是人比较容易看懂的用字母表示的地址,称为域名地址(domain name address)。这两种地址可用一个可能不太恰当的比方来帮助理解,例如我国的人口管理系统,每个公民都有一个用数字表示的身份证ID号码,又有一个用中文字表示的名字。
IP地址在扩充之前共有32比特,由类别、网络地址和主机地址共3个部分组成:
类别
网络地址
主机地址
IP地址分成5类:A类(Class A),B类(Class B),C类(Class C),D类(Class D)和E类(Class E)。其中A、B和C类地址是基本的因特网地址,是用户使用的地址,D类地址用于多目标广播的广播地址,E类地址为保留地址。IP地址的详细结构如图18-04所示。

图18-04 IP地址的组成
A类地址用于有许多机器连网的大型网络,在这种情况下需要使用24位的主机地址(host address)来标识连网计算机,而网络地址(network address)使用7位来限制可被识别的网络数目;B类地址用于连网机器数目和网络数目都为中等程度的网络,在这种情况下使用16位的主机地址和14位的网络地址;C类地址用于连网机器数目少(最多256)而网络数目多的网络;D类地址用于多目标广播(multicasting)。
32位的IP地址分成4组,每组为8位。因此可把A类地址想象成“网络地址.主机地址.主机地址.主机地址,,把B类地址想象成“网络地址.网络地址.主机地址.主机地址,,而把C类地址想象成“网络地址.网络地址.网络地址.主机地址”。
32比特的IP地址用4个十进制数表示,并用句点(.)隔开,每个数都小于256。例如,10100110 01101111 00000001 01000010,用4个十进制数表示成166.111.1.66,是某个大学的一台服务器地址;又例如,11001010 01100000 00111101 10101000,用4个十进制数表示成202.96.61.168,是某个电报局的一台服务器地址。
如果用w,x,y,z分别表示这4个字节,这3类地址的范围就为:
A类:1.x.y.z ~ 126.x.y.z (其中,127.0.0.1不作IP地址,用于网络内部使用)
B类:128.x.y.z ~ 191.x.y.z
C类:192.x.y.z ~ 223.x.y.z
D类:224.0.0.0~239.255.255.255 (其中,244.0.0.0不用,224.0.0.1分配给永久性IP主机组,包括网关)
多目标广播的地址范围从224.0.0.0到239.255.255.255,也就是D类地址的范围。用于视听会议的MBone(multicast backbone)的地址由因特网号码分配局(Internet Assigned Numbers Authority,IANA)指定为224.2.*.* 。
网络使用IP地址可以确定数据是否要通过网关设备送出。如果网络地址与当前的网络地址相同就不必通过网关设备,否则就要通过网关设备。
18.1.4 域名和域名系统域名(Domain Name)是连接到网络上的计算机或者计算机组的名称,在数据传输时用来标识计算机的电子方位,有时也指地理位置。域名通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型和所在的国家或者地区。例如,域名 microsoft.com,其中microsoft是组织名,com是commercial的缩写,代表商业组织。在美国使用的其它后缀包括gov(政府)、edu(教育机构)、org(组织,一般指非盈利组织)以及net(网络,ISP使用)。在美国以外,两个字的后缀表示该域所在的国家或者地区,例如 uk(英国)、de(德国)、jp(日本)。
例如,www.bta.net.cn,其中,
cn:
表示在中国的Internet
net.cn:
表示中国邮电部负责组建的Internet商业网,即ChinaNET
bta.net.cn,
表示北京地区的ChinaNET
www.bta.net.cn:
表示北京地区ChinaNET上一台联网服务器的名字
从这个例子可以看到,域名分成几个区域,从左到右表示区域的范围越来越大。域名最右边的区域具有最高级别,表示国家,如cn表示中国。
因特网上的域名分为顶级(又称最高级)、二级、三级等不同等级,级别越低,域名越长。顶级域名有三类:
国家和地区,如CN(中国)。
国际顶级域名,INT(仅此一个)。
通用顶级域名,共有10个(至1996年12月),如表18-01所示。
表18-01 通用顶级域名域名
域
arts
文化娱乐
com
公司
firm
企业或公司
info
信息提供单位
net
网络单位
nom
个人
org
事业单位
rec
娱乐活动单位
store
售货企业
web
www单位
由于美国是Internet的发起国,她的最高级别域名的表示法是一个特殊情况,最高级别域名表示的不是国家,而是网络的类型,例如www.microsoft.com。美国的最高级别域名分成6类,如表18-02所示。
表18-02 美国的最高级别域名域名
com
edu
gov
mil
org
net
域
商业
教育
政府
军队
其它组织
网络资源
由于人们不容易阅读使用4个十进制数表示连网机器和网络的IP地址,因此许多系统都采纳对人更容易阅读和理解的名称,这种地址叫做域名地址(domain name address)。域名地址是连接到因特网或者任何TCP/IP网络的某一台设备的地址。在分等级结构的系统中,使用“词”来标识服务器、组织和类型。例如www.tsinghua.edu.cn代表中国教育领域中清华大学使用HTTP协议的一台计算机。因此一台连网机器在因特网上既有用户使用的域名地址(例如,www.tsinghua.edu.cn),又有递送信息送软件使用的IP地址(例如,166.111.9.2),域名系统(Domain Name System,DNS)就是自动地把域名地址翻译成IP地址的系统。
域名服务系统DNS(Domain Name System)中的域名服务DNS(Domain Name Service)软件实际上是一张两列的查找表,一列是帮助记忆计算机的名称,另一列是用数字表示的IP地址,计算机的名称和它的IP地址是相对应的,这个软件存放在域名服务器DNS(Domain Name Server)上。用户申请入网时需要因特网接入服务公司(Internet service provider,ISP)提供域名服务器的地址,例如ChinaNET网络上的一个域名服务器地址是202.96.0.133,当计算机首次连网时需要人工设置这个地址。
18.1.5 统一资源地址因特网上资源所在的地址使用统一资源地址(Uniform Resource Locator,URL)表示法,它是识别因特网上任何一个文件或资源地址的标准表示法。例如,清华大学网页(Web page)上的一个文件,用URL表示成:
http://www.tsinghua.edu.cn/docs/xydy/bjtag.html
又如,微软公司的主页(home page)用URL表示成:
http://www.microsoft.com
组成URL的各部分的名称如图18-05所示。

图18-05 统一资源地址的结构
18.2 TCP/IP的参考模型
18.2.1 协议层次和协议的概念为减少网络设计的复杂性,网络设计人员把整个数据交换过程划分成层(layer),并制定了各层次上的协议,以便于网络软硬件分层管理和执行,这种层就称为协议层(Protocol Layer)。为了叙述方便,我们把客户机、服务机、路由器和网桥等设备称为网络单元。一个网络单元层n(layer n)与另一个网络单元层n(layer n)交换的消息是层n(layer n)上的消息,不是层(n+1)上的消息,也不是层(n-1)上的消息,这些消息称为层n协议数据单元,简写成n-PDU(layer-n protocol data unit)。n-PDU的格式以及n-PDU在网络单元之间如何交换则由层n协议(layer-n protocol)定义。当各层协议组合在一起时,就把这整套协议称为协议堆( protocol stack),也称协议组(protocol suite)。例如,因特网上使用的许许多多协议都归纳在传输控制协议/网际协议TCP/IP中,称为TCP/IP协议堆。
当主机A的层n发送一个n-PDU到主机B的层n时,主机A就把n-PDU传到下一层,即层n-1,然后让层n-1把n-PDU递送给主机B的层n,这就是说,层n依靠层n-1把n-PDU递送到目的地,这也叫做层n-1给层n提供服务。我们把发送端称为源端(如主机A),接收端称为终端(如主机B)。
假设有一个用4层通信协议组织的网络,如图18-06所示。由于网络用4层通信协议组织,因此就有4种类型的PDU:1-PDU,2-PDU,3-PDU和4-PDU。运行在最高层的层4称为应用层,它给出一个消息M,即M为4-PDU。在源端机,M被分成2部分:M1和M2,加上层-3消息标题生成2个3-PDU。这个过程在源端机一直到生成1-PDU,然后从源端机把它们发送到物理链路上。终端机接收1-PDU,然后引导1-PDU到上一层,并把相应层的消息头去掉,最后重新装配成M消息。

图18-06 协议层和协议堆的概念
18.2.2 TCP/IP和OSI模型顾名思义,TCP/IP固然是指传输控制协议(Transmission Control Protocol,TCP)和网际协议(Internet Protocol,IP),但是TCP/IP协议堆不仅仅是指这两个单独的协议组成的协议堆,而是由许多协议组成的协议堆。TCP/IP协议堆组合了100多个协议,包括文件传送协议(File Transfer Protocol,FTP),简单邮件传输协议(Simple Message Transfer Protocol,SMTP),用户数据包协议(User Datagram Protocol,UDP),用于远程访问的Telnet协议,普通文件传输协议(Trivial File Transfer Protocol,TFTP),地址解析协议(Address Resolution Protocol,ARP),逆向地址解析协议(Reverse Address Resolution Protocol,RARP)和网际控制消息协议(Internet Control Messages Protocol,ICMP)等协议。这些协议是用来把计算机和数据通信设备组织到计算机网络中的标准通信协议,它们要管理传输数据的路线、实际的传输以及处理传输过程中出现的错误。
在计算机通信网络中,有一个叫做国际标准化组织/开放系统互连参考模型(International Organization for Standardization Open Systems Interconnection reference model,ISO/OSI reference model ),通常把它翻译成开放式系统互连参考模型OSI Reference Model 。OSI参考模型分成7层,TCP/IP也采用层次结构,但并不与OSI参考模型的层次一一对应。因特网采用的TCP/IP模型并不与OSI模型发生冲突,因为这两种标准是并行开发的,它们是互相补充的。OSI模型和TCP/IP模型相比,认为OSI的结构更严谨,层次更加独立,但现在似乎更喜欢使用TCP/IP模型,OSI模型是否放弃也难说。
TCP/IP结构的分层不太统一,有的把它分成5层,如图18-07所示,有的把数据链路层(data link layer)和物理层(physical layer)算作一层,把它分成4层。本教材使用前一种分层方法,TCP/IP的5层是:应用层(application layer)、传输层( transport layer)、网络层(network layer)/互联网络层(internet layer)、网络接口层(network interface layer)或者叫做数据链路层(data link)和物理层(physical layer),并给其中4层中的PDU分别命名为消息(message)、消息段(segment)、数据包(datagram)和数据帧(frame)。因特网的协议堆(Internet Protocol Stack)由层3-层5上的协议组成。TCP/IP参考模型和其相应的PDU的名称如图18-08所示,各层执行的部分协议如图18-09所示。虽然这样划分有点简单化,而且不是100%的正确,但可帮助我们比较好地理解整个协议堆的全貌。
OSI参考模型
TCP/IP(Internet)模型
应用层(application)
表示层(presentation)
应用层(application)
对话层(session)
传输层( transport)
传输层( transport)
网络层(network)
网络层(network)
数据链路层(data link)
数据链路层(data link)
物理层(physical)
物理层(physical)
图18-07 TCP/IP的参考模型
TCP/IP参考模型
(TCP/IP reference model )
协议数据单元
PDU(protocol data unit)
执行器
层5
应用层(application)
消息(message)
软 件
层4
传输层( transport)
消息段(segment)
软 件
层3
网络层(network)
数据包(datagram)
软件/硬件
层2
数据链路层(data link)
数据帧(frame)
硬 件
层1
物理层(physical)
1-PDU
硬 件
图18-08 协议堆中的协议层和相应的PDU名称
网络层次
执行的协议
应用层
FTP,Telnet,SMTP,MIME,X,HTTP,Kerberos,DNS
NFS,SNMP,TFTP,RPC,DNS,专用协议
传输层
TCP
UDP
网络层
IP,ICMP,IGMP
数据链路层
HDLC,PPP,SLIP,Ethernet,X.25,FDDI,TokenRing
物理层
RS-232,V.35,10Base,FiberOptic
图中:
CLNP(Connectionless Network Protocol) 无连接网络协议
DNS(Domain Name System) 域名系统
HDLC(High-level Data Link Control) (IBM)高级数据链路控制规程
ICMP(Internet Control Messages Protocol) 网际控制消息协议
IGMP(Internet Group Multicast Protocol) 因特网多目标广播协议
Kerberos 科巴楼司协议(美国麻省理工学院制定的一种网络确认协议)
MIME(Multipurpose Internet Mail Extension protocol) 多用途网际邮件扩充协议
NFS(Network File System) 网络文件系统
RPC(Remote Procedure Call) 远程过程调用
SMTP(Simple Message Transfer Protocol) 简单邮件传输协议
SNMP(Simple Network Management Protocol) 简单网络管理协议
TFTP(Trivial File Transfer Protocol) 普通文件传输协议
TP4(Transport Protocol Class 4) 传输协议类4
X:X-Windows
图18-09 各层上的部分协议(供参考)
协议层上的协议由软件、硬件或者组合软硬件一起执行。应用层协议(如HTTP和SMTP)和传输层协议(如TCP和UDP)几乎都是用软件执行;物理层和数据链路层协议是负责链路上的通信,因此通常在网络接口卡上执行,例如以太网卡或者ATM接口卡;网络层上的协议通常由软件或者由软硬件联合执行。网络协议堆中的每一层协议都有它自己的职责。此外,为使上下层之间工作协调,层与层之间的接口必需要有精确的定义,这些精确的定义在相应的标准中都有详尽的说明。现将各层的主要功能说明如下。
(1) 应用层:负责支持网络应用。它所包含的协议包括支持Web的HTTP,支持电子邮件的SMTP和支持文件传输的FTP等协议。
(2) 传输层:负责把应用层消息递送给终端机的应用层。因特网上的传输控制协议(Transfer Control Protocol,TCP)和用户数据包协议(User Datagram Protocol,UDP)这两种传输协议都能递送应用层消息。TCP提供面向连接服务,而UDP提供无连接服务。TCP为应用层提供许多重要的服务,包括保证把应用层消息递送到目的地,把很长的消息分割成比较小的消息段,提供超时监视和端对端的确认和重递送功能,提供流程控制方法使得源端能够根据拥挤情况调节传输速率。
(3) 网络层:为数据包安排从源端到终端的行程。因特网在网络层上有网际IP协议和网际控制消息协议(Internet Control Message Protocol,ICMP)等协议。传输层协议就是依赖IP协议安排传输层消息段从源端到达终端的。
(4) 数据链路层:负责把数据帧从一个网络单元(主机或者交换机)递送到相邻网络单元。链路层协议包括Ethernet,ATM和端对端协议(Peer-Peer Protocol,PPP)等。由于数据包需要途经好几个链路才能从源端到达终端,因此数据包可能要沿着它所经历的路线由不同的链路层协议来处理。例如,一个数据包也许要由一个链路上的以太网协议和下一个链路上的PPP协议来处理。
(5) 物理层:物理层的主要工作是把整个数据帧从一个网络单元递送到相邻网络单元。物理层的责任是把数据帧中的数据从一个网络单元递送到相邻网络单元。这一层的协议则取决于链路的实际的传输媒介,例如双绞线和单模态光纤。在这一层上就要规定位速率、传输电压的高低、调制方式和编码方法。
18.2.3 部分网络设备执行的协议任何一个数据网络不仅要有许多硬件支持,而且还要有许多软件支持才能运转。网络硬件包括路由器、网桥、计算机和接口卡,如以太网、ATM等网卡,而网络软件通常集成到主机的操作系统和网络设备中,这些软硬件组合在一起共同执行相互通信的协议。
在因特网中,最主要的网络设备是主机和信息包交换机。主机就是我们每天使用的PC机和工作站等,信息包交换机实际上也是计算机,只是它的用途和名称不同而已,例如路由器(router)和网桥(bridge)。这些设备用来连接运行相同类型的网络或者是不同类型的网络。如图18-10所示,路由器是局域网(LAN)和因特网之间的接口,用于疏导消息传输的中间设备,它的功能像分类器和解释器,它查看信息包的地址然后把它们发送到目的地。网桥主要用于连接使用相同通信协议和地址结构的网络,如果在一个组织里有多个局域网,而且它们之间的通信很频繁,使用网桥连接可不必通过主干线。

图18-10 路由器和网桥的概念
如前所述,主机和信息包交换机都是以协议层来组织网络软硬件的,主机要执行所有层次的协议,而信息包交换机一般只执行底层协议。例如,网桥(bridge)和路由器(router)都属于信息包交换机,网桥执行层1和层2的协议,路由器执行层1、层2和层3的协议,而主机执行所有5层的协议。上述设备执行的协议如图18-11所示。此外,中继器又称为转发器(repeater)是另一种网络设备(在图中没有表示),它仅仅执行层1的协议。
层5
层5
层4
层4
层3
层3
层3
层2
层2
层2
层2
层1
层1
层1
层1
主机
(Host)
网桥
(bridge)
路由器
(router)
主机
(Host)
图18-11 部分网络设备执行的协议
18.2.4 TCP/IP与以太网由于历史的原因,以及以以太网(Ethernet)为基础的TCP/IP网络比其他类型的网络要多,因此很自然地往往把TCP/IP和以太网这两个术语连在一起。以太网最初是在1976年由在美国加州的施乐公司(Xerox)的帕洛阿尔托研究中心(Palo Alto Research Center,PARC)开发的,它在实现电子办公通信系统道路上向前迈出了一大步。随后,它的功能不断得到增强,而应用不断扩大。
以太网是一个硬件系统,相当于OSI模型中的数据链路层和物理层。现在已经有几种类型的以太网得到普遍使用,例如称为10Base2的细缆以太网(thin Ethernet)和10BaseT的双绞线以太网(twisted-pair Ethernet),它们的结构是总线结构,前者使用类似于电缆电视系统中的同轴电缆,在电缆长度为185米的情况下数据传输速率为10 Mbps,后者使用普通的非屏蔽双扭线,在电缆长度为100米的情况下数据传输速率为10 Mbps。
以太网和TCP/IP结合在一起工作得很好,以太网提支持数据链路层和物理层的通信,而TCP/IP支持网络层、传输层和应用层的通信。以太网和TCP/IP都有它们各自的信息包地址的标记方法,TCP/IP使用32位地址,而以太网使用48位地址,这两种地址方案通过TCP/IP中的地址解析协议(Address Resolution Protocol,ARP)进行转换。
以太网是依靠一个称为带有检测冲突的载波侦听多路存取(Carrier Sense Multiple Access with Collision Detection,CSMA/CD )协议进行工作的。为了简化通信操作过程,通信设备在发送数据之前就先查看网络电缆上是否有信息在传送,如果忙就等待,如果空闲就发送。如果有两台设备同时在传输,这叫做“冲突(collision)”,就等待获得一个随机的空闲时间之后再发送。
18.3 网络应用层协议
18.3.1 网络应用与应用层协议在过去的20多年中,人们已经发明了许多非常富有创造性的和奇妙的应用。例如,Web、文件传输、电子邮件、网络新闻和远程存取等等,以及现在正在构思和开发的应用,例如声音点播、网际多目标网络广播(IP multicasting)、影视点播和因特网电话等等,这些叫做网络应用(networking applications)。
这些网络应用通过相应的应用层协议(application-layer protocol)来支持。例如,HTTP,FTP,SMTP,网络新闻传输协议(Network News Transfer Protocol,NNTP)和Telnet等等。这些应用层协议的主要职责是把文件从一台主机传送到另一台主机,协议的主要内容是定义:
(1) 消息的内容,例如请求消息和响应消息。
(2) 各种消息类型的语法结构,也就是消息中的域(field)以及如何描述消息中的域。
(3) 域的语义,也就是域所包含的信息的含义。
(4) 确定通信程序何时发送消息和接收消息的规则。
表18-03列出了流行的部分应用层协议。这些应用层协议留驻在协议堆的最高层(层5),它们依赖传输层(层4)提供两种类型的服务,一种是使用TCP的面向连接服务,另一种是使用用户数据包(User Datagram Protocol,UDP)的无连接服务。例如,HTTP使用TCP协议提供可靠的面向连接的服务,而为多媒体应用制定的协议一般都使用UDP协议提供不可靠的服务,所谓不可靠是指不保证在传输过程不丢失信息包,出现的错误数据既不纠正也不重传。
表18-03 流行的部分应用层协议网络应用
应用层(层5)协议
传输层(层4)协议
电子邮件(e-mail)
SMTP(RFC 821)
TCP
远程存取?
Telnet(RFC 854)
TCP
万维网(WWW)
HTTP(RFC 2068)
TCP
文件传输
FTP(RFC 959)
TCP
流式多媒体
(streaming multimedia)
(如Real Network公司的)
专用协议
UDP或者TCP
因特网电话
(Internet telephony)
(如Vocaltec公司的)
专用协议
UDP
网络应用和网络应用层协议是两个不同的概念。例如,万维网(Web,World Wide Web,WWW)是环球超媒体信息网,是网络应用的典范,它可让用户从Web服务器上得到文档资料,它所运行的模式叫做客户机/服务机(Client/Server)模式,如图18-12所示。Web应用主要由下面几个部分组成:①文档格式标准(如HTML),②Web浏览器(如Netscape Navigator,Internet Explorer),③Web服务器(如Microsoft公司和Netscape公司的服务器),④应用层上的协议HTTP。Web系统是负责把以HTML语言编写的多媒体文件从运行Web服务器的服务机上传送到运行Web浏览器的客户机,而Web的超文本传输协议(Hypertext Transfer Protocol,HTTP)是网络应用的一小部分。又如电子邮件系统是负责把电子邮件从源端电子邮件服务器(mail server)传送到终端电子邮件服务器,而简单邮件传输协议(Simple Message Transfer Protocol,SMTP)是该应用系统的一部分。

图18-12 客户机/服务机模式
因特网的许多协议都定义在征求评议文件(Request For Comments,RFC)中。例如,应用层协议HTTP/1.1定义在RFC 2068中,简单邮件传输协议SMTP定义在RFC 821中。随着技术的不断更新,RFC也在不断修改。RFC经过讨论和实践之后就成为标准,并用“STD XXXX”来命名。
执行应用层协议的软件有两个单独的部分:一部分在服务机上运行,通常称为server(服务器),另一部分在客户机上运行。例如,执行HTTP协议的软件,在服务机上的软件叫做HTTP服务器或者叫做WWW服务器,在客户机上的软件通常称为浏览器(browser)。
许多软件包都组合了执行多种协议的应用程序。例如Microsoft公司的Internet Explorer和Netscape公司的Netscape Communicator就有Web浏览器、电子邮件读写器、新闻阅读器等应用程序,这样就把用户、应用程序、应用层协议和传输层协议链在一起,如图18-13所示。

图18-13,用户-应用程序包-协议”链
18.3.2 超文本传送协议HTTP
1989年~1991年在欧洲粒子物理研究所(Conseil Européen pour la Recherche Nucléaire,the European Laboratory for Particle Physics,CERN)由Tim Berners-Lee构思了万维网(Web),它的4个核心部分是HTML,HTTP,Web服务器和Web浏览器。超文本传输协议(Hypertext Transfer Protocol,HTTP)是应用层协议,它定义Web页面如何从Web服务器传送到Web浏览器。直到1997年,几乎所有Web浏览器和Web服务器都使用HTTP/1.0,该协议定义在RFC 1945中。从1998年开始Web浏览器和Web服务器开始执行HTTP/1.1,该协议定义在RFC 2068中。
1,HTTP的执行过程在服务机向客户机传送文档之前,客户机和服务机需要建立TCP连接(参考下一节的介绍)。TCP连接由客户机上的Web浏览器使用URL中的域名地址(如www.tsinghua.edu.cn)或者叫做服务器的地址来启动(编者已注意到URL中的这个域的英文名称很多,因此中文的名称也很多,但它们的含义都相同)。与TCP的连接一旦建立,Web浏览器就发送一个HTTP请求消息(HTTP Request Message)到这个连接上,服务器接收到请求之后就给Web浏览器回送一个HTTP响应消息(Response Message),在服务器发送响应信息之后就断开TCP连接。Web服务器和Web浏览器之间的通信如图18-14所示。

图18-14 Web服务器和Web浏览器之间的通信
一个典型的Web页面(Web page)由许多Web对象组成,这些对象通常存储在服务机的文件系统中。所谓Web对象是指用URL标识的HTML文件、GIF图象文件、JPEG图象文件、电视图象、声音文件或者Java小应用程序等等,Web网页本身也是Web对象。例如,Web页面可由HTML格式的文本、JPEG格式的图象和Java小应用程序组成。在传送Web网页时,传送一个对象需要建立一次TCP连接,如图18-15。

图18-15 使用TCP连接传送对象
当客户机接收到Web页面之后,Web浏览器就显示该网页。但不同公司开发的浏览器解释Web页面时,在客户机上显示出的格式可能会有些不相同。HTTP对如何在客户机上显示Web页面不做任何事情,HTTP仅仅定义在客户机和服务机之间如何传送数据。
2,HTTP请求消息
HTTP协议(RFC 1945和RFC 2068)定义了两种消息格式:HTTP请求消息(HTTP Request Message)格式和HTTP响应消息(HTTP Response Message)格式。HTTP消息请求格式如图18-16所示,如前所述。当用户点击超链接以请求Web页面时,首先与相应的Web服务器建立TCP连接,然后经TCP连接把HTTP请求消息发送给Web服务器。

图18-16 HTTP请求消息格式
请求消息由请求行、标题行中的各种标题域和实体主体(entity body)组成。请求行和标题行由ASCII字符组成。图中的sp域、cr域和if域分别代表空格(space)字符、回车-换行(carriage-return)字符和换行(line-feed)字符。我们先看请求行中的那些域:
(1) 统一资源地址<URL>域是用户请求访问的Web页面的路径和文件名,而服务器的名称和应用层协议的名称(如http://)是系统自动设置的。如<URL>域包含
chinese/internet/search.html
(2) 版本<version>域是客户机使用的HTTP的版本号。1997年是使用HTTP/1.0(RFC 1945),1998年开始使用HTTP/1.1(RFC 2068),它向后兼容HTTP/1.0。
(3) 方法<method>域有很重要的意义,它的值描述请求的方法,两个普通的值是GET和POST:
① GET:如果客户请求一个Web页面就把GET写入<method>域,在这种情况下实体主体<entity body>域是空的。
② POST:如果客户已经填写了一张表单,例如填写了一个搜索关键字“多媒体”或者“multimedia”,就把POST填入<method>域,然后把这表单送给给服务器,再由服务器交给检索软件(如Yahoo)。如果方法域中的值是POST,实体主体<entity body>域就包含用户写入表单域中的内容。
在消息请求格式中的其余行是标题行。尽管标题行是可选择的,但客户一般都要在请求消息时插入许多标题行。每一标题行都包含两个部分:标题域名<header field name>和相关的值<value>。下面是一个使用GET方法向Web服务器请求对象的一个例子。
****************************************
GET normal/html_design.html HTTP/1.1
Connection:close
User-agent:Netscape Communicator/4.5
Accept:text/html,image/gif,image/jpeg
Accept-language:cn
(extra carriage return,line feed)
****************************************
这个请求消息包含一行请求行和4行标题行,整个消息共有5行ASCII文本。 请求行(GET normal/html_design.html HTTP/1.1)用来告诉服务器:浏览器使用GET方法想要得到的对象是“normal/html_design.html”,使用的应用层协议是HTTP/1.1。
标题行共有4行,分别是:
① 标题行“Connection:close”用来告诉服务器:浏览器不想采用持续连接,在发送请求对象之后服务器就可断开连接。
② 标题行“User-agent:Netscape Communicator/4.5”用来告诉服务器用户代理的类型,也就是用户使用的浏览器的类型,在这个例子中的用户代理是Communicator/4.5。
③ 标题行“Accept:text/html,image/gif,image/jpeg”用来告诉服务器浏览器准备接收对象的类型。
④ 标题行“Accept-language:cn”用来告诉服务器如果有中文版的对象就发送中文版的对象,没有就发送服务器默认的对象。
3,HTTP响应消息服务器接收到客户的HTTP请求消息(HTTP Request Message)之后进行分析,将分析和操作结果返回给客户机,具体做法就是发送一条HTTP响应消息(HTTP Response Message),然后断开相应的TCP连接。响应消息的一般格式如图18-17所示。

图18-17 HTTP响应消息格式
从图中可以看到,除了状态行之外,响应消息的格式与请求消息的格式相同。实体主体(entity body)包含有请求消息要求获得的对象,即文件。
除了HTTP的版本号之外,状态行还包含状态码<status code>和短语<phrase>,它们组合起来表示客户请求所获得的结果。例如,如果请求文件存放在Web服务器的文件系统中,而且可发送给客户机,状态码和短语就分别包含“200”和“Document follows”(文档如下)或“OK”。如果客户机请求的文件没有得到的授权,这两个域中的值就分别为“403”和“Forbidden”(禁止),而实体主体可能有一个解释,例如“your client does not have permission to get this URL”(你的客户没有得到允许去访问这个URL)。
一般情况下,3位状态码中的第1位包含一般信息。“1”表示信息码,“2”表示访问成功,“3”表示重定向(即URL已经改变),“4”表示你的请求有误,“5”Web服务器出错。当你存取某个文件时有可能看到下面的一些信息:
200:
表示你的请求得到满足,信息在响应消息中返回。
301:
表示请求的对象已经被删除;新的URL放在响应消息标题中,客户的软件将自动转到新的URL.。
400:
表示服务器不能理解你的请求。
404:
表示服务器没有找到请求的文件,请求的文件不存在。
505:
表示服务器不支持浏览器请求使用的的HTTP版本号。
一个HTTP响应消息的例子如下:
****************************************
HTTP/1.1 200 OK
Connection,close
Date,Thu,08 Jan 1999 12:00:15 GMT
Server,XXXX
Last-Modified,Mon,22 Jun 1998 09:23:24 GMT
Content-Length,3456
Content-Type,text/html
data data data,..
****************************************
在这个例子中,除了状态行之外还包含6行标题行,而且大多数都自含解释。最后一行标题行的“data data data ……”是传送的实际对象。
服务器一旦发送响应消息,就断开TCP连接。如果HTML文件包含其他对象(如GIF图,JPG图象,AVI文件等),HTTP就对每个对象分别打开一个TCP连接进行传送。HTTP服务器软件不保留任何客户机的状态信息,它只是简单地接收在TCP连接上的对象请求,从文件系统中获取对象,把响应消息中的对象传送给同一TCP连接,然后断开TCP连接。由于HTTP服务器不保留客户的状态信息,所以把HTTP协议称为无状态协议(stateless protocol)。
4,条件获取使用过Web浏览器的用户可能已经知道,Web浏览器有一个功能可供用户进行设置,即把客户访问过的Web对象存放在高速缓存(cache)中,Web的高速缓存留驻在客户机上或者留驻在网络上的代理服务机(proxy server)中。浏览器的这种功能是减少已经阅读的对象的时延和减轻Web网络交通负担的一种非常重要的手段,这也是用户(特别是调制解调器用户)省钱的好办法,尤其是对网络速度很低的国家和地区显得更为重要。
使用Web页面缓存有一个危险,就是留驻在缓存中的对象副本会过时,因此用户对一些经常会作修改的网页(如公告栏)需要使用浏览器界面上的刷新操作(如IE浏览器的或者网景公司的)重新获取。幸运的是HTTP有一种措施来保证递送给Web浏览器的页面是最新的,这个措施叫做条件获取(conditional GET)。如果请求消息使用GET方法并且包含If-Modified-Since(如果从…之后修改)标题行,这个HTTP请求就是条件获取。
例如,一个Web浏览器希望得到一个对象,Web浏览器首先检查本机Web浏览器的缓存中是否有此对象。如果请求的对象不在缓存中,Web浏览器就使用标准的GET方法,即不包含If-Modified-Since的标题行;如果对象已经在缓存中,Web浏览器就发送一条带标题行的条件GET消息到原来的Web服务器,如,
If-Modified-Since,Wed,27 May 1998 10:15:30 GMT
这行标题行表示缓存中的对象是在1998年5月27日格林尼治标准时间10:15:30存储的。当Web服务器接收到这个条件获取消息(conditional GET message)时,如果对象已经修改,就发送这个对象的拷贝给客户机,否则就给客户机发送一条对象没有被修改的响应消息。
5 HTTP/1.0与HTTP/1.1
如前所述,Web服务器和Web浏览器从1998年开始执行新的协议——HTTP/1.1。它是向后兼容HTTP/1.0的协议,即执行HTTP/1.0的Web浏览器能够与执行HTTP/1.1的服务器进行通信,而执行HTTP/1.1的Web浏览器能够与执行HTTP/1.0的服务器进行通信。
HTTP/1.0和HTTP/1.1都有非持续连接(non-persistent connection)和持续连接(persistent connection)功能。非持续连接是指启动一次TCP连接服务机就向客户机传送一个对象,而持续连接是指服务机可在相同的TCP连接上向客户机发送多个对象。HTTP/1.0的默认设置是非持续连接,而HTTP/1.1的默认设置是持续连接。
在使用HTTP/1.0的情况下,如果打开一个包含一个HTML文件和10个内联图象对象的网页时,HTTP就要建立11次TCP连接才能把文件从服务机传送到客户机。而使用HTTP/1.1的情况下,如果打开同样的文件时,HTTP建立一次TCP连接就可把文件从服务机传送到客户机。使用一次TCP连接传送一个对象的效率比较低,这体现在下列几个方面:
(1) 每次TCP连接必需要建立和断开。客户机和服务机建立一次连接需要执行三向沟通连接法(three-way handshake),服务机在对象递送之后要断开TCP连接。在建立和断开连接时要占用CPU的资源。如果使用一次连接代替11次连接的话,占用客户机和服务机的CPU时间可大大减少。
(2) 对每次连接,客户机和服务机都必须分配发送和接收缓存。这就意味着要影响客户机和服务机的存储器资源,这同样要占用CPU的时间。
(3) 对由大数量对象组成的文件,TCP的低速启动算法(slow start-up algorithm)会限制服务机向客户机传送对象的速度。使用HTTP/1.1之后,大多数对象都可以尽最大的速率传送。
由于HTTP/1.1允许持续连接,文件中的所有对象都可在相同的TCP连接上传送。HTTP/1.1也允许在客户机接收到服务机的消息响应之前发送多个消息请求,这叫做流水线式请求(pipelined request)。
18.4 网络传输层协议
18.4.1 传输层简介如果因特网协议堆按5层来划分,第4层就是传输层(transport layer),它是应用层(第5层)和网络层(第3层)之间的接口。传输层为应用层上的应用提供两类截然不同的服务:第一类服务叫做可靠的面向连接服务(connection-oriented service),确保正确无误地把消息从源端传送到目的地,使用的协议是TCP协议。第二类服务是不可靠的无连接服务(unreliable,connectionless service),使用的协议是用户数据包协议UDP(User Datagram Protocol)。一般来说,应用层协议运行在操作系统之上,而传输层协议集成在操作系统之中。因此,当设计网络应用时,设计人员必需要指定其中的一种网络传输协议,网络多媒体应用通常使用UDP协议。
在前面已经提到,一个网络单元层n(layer n)与另一个网络单元层n(layer n)交换的消息是层n(layer n)上的消息,这些消息称为层n协议数据单元(layer-n protocol data unit,n-PDU)。如图18-18所示,主机A的传输层与主机B的传输层交换的消息就是传输层上的消息,这叫做逻辑上的端端传输,当信息包通过中间设备(例如路由器、网桥和中继器等设备)时,这些网络设备对使用UDP协议的信息包和使用TCP协议的信息包将一视同仁。在一些网络文献中,通常把使用UDP的协议数据单元(protocol data unit,PDU)称为数据包(datagram),但网络文献也使用数据包(datagram)这个术语表示网络层的PDU,名词术语不统一就会使人很混乱。为了简化术语,本书把传输层上的协议数据单元PDU称为消息段(segment),或者就叫做传输层协议数据单元。

图18-18 传输层之间的通信
18.4.2 端口号和套接号的概念在客户机/服务机(client/server)运行模式中,一端的主机叫做客户机,另一端的主机叫做服务机。一台服务机可以同时运行同一应用程序的几个进程,例如服务机上的FTP服务软件可以同时给几个客户传送文件,对每个客户至少要调用一个FTP服务软件的进程。同样,一个客户可以同时与几台不同的主机进行远程对话,对每个不同的主机,客户软件至少要调用一个远程客户软件的进程。因此,对连网计算机上的进程就需要相互联系的端口号来递送IP信息包。
在因特网上,所有使用TCP或者UDP协议的应用程序都有一个标识协议本身的永久性端口号(port number)。例如,我们在设置Web浏览器或者FTP文件传输程序时会经常遇到的端口号:HTTP的端口号=80,FTP的端口号=21,电子邮件协议SMTP的端口号=25,Telnet的端口号=23,这些端口号叫做众所周知的端口号(well-known port number)。端口号的分配定义在RFC 1700中,并在1994年成为一个标准,标准号是STD0002。可供TCP使用的端口号共计65,535,一般来说,大于255的端口号由本地的机器使用,小于255的端口号用于频繁使用的进程,0和255是保留端口号。
收发两端的传输层TCP之间的通信由两个号码的组合来鉴别,一个是机器的IP地址,另一个是TCP软件使用的端口号,这两个号码组合在一起就叫做套接标识符(socket)或者叫做套接号,而且收发双方都需要有套接标识符。因为在互联网上机器的IP地址是唯一的,而对单台机器的端口号也是唯一的,因此套接标识符在互联网上也是唯一的,这就可通过套接标识符使互联网络上的进程之间相互通信。互联网上收发两端的进程之间的通信建立过程如图18-19所述。

图18-19 使用套接标识符建立虚拟线路连接
18.4.3 用户数据包协议(UDP)
1,UDP协议简介因特网为网络应用提供有两种不同的传输协议:用户数据包传输协议(User Datagram Protocol,UDP)和传输控制协议TCP(Transfer Control Protocol)。不同的网络应用使用不同的协议,如图18-20所示。例如,HTTP使用TCP协议,而普通文件传输协议(Trivial File Transfer Protocol,TFTP)则使用UDP。
UDP协议不提供端-端的确认和重传功能,它不保证信息包一定能到达目的地,因此称为不可靠协议。应用开发人员选择UDP时,应用层协议软件几乎是直接与IP通信。
应用层协议
HTTP,FTP,Telnet,SMTP,NNTP,……
TFTP,RTP,Real Audio,……
传输层协议
TCP
UDP
网络层
IP,ICMP,IGMP
HTTP(Hypertext Transfer Protocol) 超文本传送协议
FTP(File Transfer Protocol) 文件传输协议
Telnet 远程联接服务标准协议
SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议
RTP(Real-time Transport Protocol) 实时传输协议图18-20 传输层协议与相邻层协议之间的关系
UDP有下述几个特性:
(1) UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中,例如,Progressive Networks公司开发的RealAudio软件,它是在因特网上把预先录制的或者现场音乐实时传送给客户机的一种软件,该软件使用的RealAudio audio-on-demand protocol协议就是运行在UDP之上的协议,大多数因特网电话软件产品也都运行在UDP之上。
2,UDP协议的标题结构
UDP信息包由UDP标题和数据组成。UDP的标题结构如图18-21所示,它由5个域组成:源端端口(Source Port)、目的地端口(Destination Port)、用户数据包的长度(Length)和检查和(Checksum)。其中,前4个域组成UDP标题(UDP header),每个域由2个字节组成;检查和域占据2个字节,它用来检测传输过程中是否出现了错误;用户数据包的长度包括所有5个域的字节数。

图18-21 UDP信息包的标题结构
检查和的详细计算可在RFC 1071中找到,现举一例说明使用检查和检测错误的道理。例如,假设从源端A要发送下列3个16位的二进制数:word1,word2和word3到终端B,检查和计算如下:
word1
0110011001100110
word2
0101010101010101
word3
0000111100001111
sum=word1+ word2+ word3
1100101011001010
检查和(sum的反码)
0011010100110101
从发送端发出的4个(word1,2,3以及检查和)16位二进制数之和为1111111111111111,如果接收端收到的这4个16位二进制数之和也是全“1”,就认为传输过程中没有出差错。
许多链路层协议都提供错误检查,包括流行的以太网协议,读者也许想知道为什么UDP也要提供检查和。其原因是链路层以下的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。
读者也可能会问,收发两端的两个进程是否有可能通过UDP提供可靠的数据传输?答案是可以的。但必需要把确认和重传措施加到应用程序中,应用程序不能指望UDP来提供可靠的数据传输。
18.4.4 传输控制协议(TCP)
1,TCP协议简介传输控制协议TCP(Transmission Control Protocol)是TCP/IP协议堆中的一部分。消息在网络内部或者网络之间传递时要打包,TCP负责把来自高层协议的数据装配成标准的数据包,相当于在数据包上贴包装清单,而IP则相当于在数据包上贴收、发人的姓名和地址,TCP和IP之间要进行相互通信才能完成数据的传输。TCP/IP协议中的IP主要负责在计算机之间搬运数据包,而TCP主要负责传输数据的正确性。TCP/IP有3个主要的特性:功能丰富,开放性和普遍型。随着新的网络服务的不断出现,TCP/IP协议也在不断修改和扩充。
TCP是传输层上的协议,该协议定义在RFC 793,RFC 1122,RFC 1323和RFC 2001文件中。目前,TCP协议比UDP协议用得更广泛,也更复杂。
TCP是面向连接的协议。面向连接的意思是在一个应用程序开始传送数据到另一个应用程序之前,它们之间必须相互沟通,也就是它们之间需要相互传送一些必要的参数,以确保数据的正确传送。
TCP是全双工的协议。全双工(full duplex)的意思是,如果在主机A和主机B之间有连接,A可向B传送数据,而B也可向A传送数据。TCP也是点对点的传输协议,但不支持多目标广播。TCP连接一旦建立,应用程序就不断地把数据送到TCP发送缓存(TCP send buffer),如图18-22所示。TCP就把数据流分成一块一块(chunk),再装上TCP协议标题(TCP header)以形成TCP消息段(TCP segment)。这些消息段封装成IP数据包(IP datagram)之后发送到网络上。当对方接收到消息段之后就把它存放到TCP接收缓存(TCP receive buffer)中,应用程序就不断地从这个缓存中读取数据。

图18-22 TCP发送和接收缓存
TCP为应用层和网络层上的IP提供许多服务,其中3个最重要的服务是:
(1) 可靠地传输消息:为应用层提供可靠的面向连接服务,确保发送端发出的消息能够被接收端正确无误地接收到。接收端的应用程序确信从TCP接收缓存中读出的数据是否正确是通过检查传送的序列号(sequence number)、确认(acknowledgement)和出错重传(retransmission)等措施给予保证的。
(2) 流程控制:连接双方的主机都给TCP连接分配了一定数量的缓存。每当进行一次TCP连接时,接收方主机只允许发送端主机发送的数据不大于缓存空间的大小。如果没有流程控制,发送端主机就可能以比接收端主机快得多的速度发送数据,使得接收端的缓存出现溢出。
(3) 拥挤控制:TCP保证每次TCP连接不过分加重路由器的负担。当网络上的链路出现拥挤时,经过这个链路的TCP连接将自身调节以减缓拥挤。
2 TCP协议标题的结构如前所述,TCP递给IP的数据块叫做消息段(segment)。这个消息段由TCP协议标题域(TCP header field)和存放应用程序的数据域(data field)组成,如图18-23所示。
 图18-23 TCP协议标题的结构
TCP协议标题有很多域组成,现将几个比较重要的域作一个简单介绍。
(1) 源端端口号(Source Port Number)域和目的地端口号(Destination port Number)域:前者的16位域用来识别本机TCP;后者的16域用来识别远程机器的TCP。
(2) 顺序号(sequence number)域和确认号(acknowledgment number)域:这两个域是TCP标题中两个最重要的域。32位的顺序号域用来指示当前数据块在整个消息中的位置,而32位的确认号域用来指示下一个数据块顺序号,也可间接表示最后接收到的数据块顺序号。顺序号域和确认号域由TCP收发两端主机在执行可靠数据传输时使用。
在介绍顺序号(sequence number)和确认号(acknowledgement number)之前,首先要介绍TCP最大消息段大小(maximum segment size,MSS)的概念。在建立TCP连接期间,源端主机和终端主机都可能宣告最大消息段大小MSS和一个用于连接的最小消息段大小。如果有一端没有宣告MSS,就使用预先约定的字节数(如1500,536或者512字节)。当TCP发送长文件时,就把这个文件分割成许多按照特定结构组织的数据块(chunk),除了最后一个数据块小于MSS外,其余的数据块大小都等于MSS。在交互应用的情况下,消息段通常小于MSS,像Telnet那样的远程登录应用中,TCP消息段中的数据域通常仅有一个字节。
在TCP数据流中的每个字节都编有号码。例如,一个106字节长的文件,假设MSS为103字节,第一个字节的顺序号定义为0,如图18-24所示。

图18-24 TCP顺序号和确认号
顺序号就是消息段的段号,段号是分配给该段中第一个字节的编号。例如,第1个消息段的段号为0,它的顺序号就是0;第2个消息段的段号为1000,顺序号就为1000;第3个为2000,顺序号为2000;…,依此类推。
确认号(Acknowledgement Number)是终端机正在等待的字节号。在这个例子中,当终端机接收到包含字节0~999的第1个消息段之后,就回送一个第2消息段数据的第1个字节编号(本例中为1000),这个字节编号就叫做确认号,本例中的确认号就是1000。依此类推。
(3) 检查和(Checksum)域,它的功能和计算方法同UDP中的检查和。
(4) 标志(flag)域:6位标志位中的(Urgent Pointer,URG)标志用来表示消息段中的数据已经被发送端的高层软件标为“urgent(紧急数据)”,紧急数据的位置由紧急数据指针(Urgent Data Pointer)域中的值指定,遇到这种情况时TCP就必须通知接收端的高层软件;确认(Acknowledgment,ACK)标志用来表示确认号(Acknowledgment Number)的值是有效的;PSH(Push)功能标志等于1时接收端应该把数据立即送到高层;RST(Reset)标志等于1时表示TCP连接要重新建立;SYN(Synchronize)标志等于1时表示连接时要与顺序号同步; FIN标志等于1时表示数据已发送完毕。
(5) 窗口大小(Window Size)域:16位的窗口域用于数据流的控制。域中的值表示接收端主机可接收多少数据块。对每个TCP连接主机都要设置一个接收缓存,如图18-22 所示,当主机从TCP连接中接收到正确数据时就把它放在接收缓存中,相关的应用程序就从缓存中读出数据。但有可能当从TCP连接来的数据到达时操作系统正在执行其他任务,应用程序就来不及读这些数据,这就很可能会使接收缓存溢出。因此,为了减少这种可能性的出现,接收端必须告诉发送端它有多少缓存空间可利用,TCP就是借助它来提供数据流的控制,这就是设置TCP接收窗口大小的目的。收发双方的应用程序可以经常变更TCP接收缓存大小的设置,也可以简单地使用预先设定的数值,这个值通常是2 KB~64 KB。
(6) 标题长度(length)域:4位标题长度域用来说明TCP标题的长度,单位是32位组成的字的数目。由于TCP选择域(option)是可选的,所以TCP标题的长度是可变的。这个域通常是空的,因此该域中的值通常是5,标题的长度合计20个字节。
3,确立连接
TCP连接不是端对端的TDM或者FDM线路连接,因为收发端之间的路由器并不维持TCP连接的任何状态,TCP连接状态完全是留驻在收发两端的主机中。现在让我们来分析TCP连接建立的过程。
假设主机A想与主机B建立TCP连接,主机A就发送一个特殊的TCP“连接请求消息段(connection request segment)”给主机B,这个消息段封装在IP数据包中,然后发送到因特网。主机B接收到这个消息段之后就分配接收缓存和发送缓存给这个TCP连接,然后就给主机A回送一个“允许连接消息段(connection-granted segment)”。主机A接收到这个回送消息段之后也分配接收缓存和发送缓存,然后就给主机B回送“确认消息段(acknowledgement segment),,这时主机A和主机B之间就建立了TCP连接,它们就可在这个连接上相互传送数据。由于主机A和主机B之间连接要连续交换3次消息,因此把这种TCP连接建立的方法称为三向沟通(three-way handshake)连接法,如图18-25所示。在三向沟通期间,完成分配收发缓存、分配发送端端口号和接收端端口号等工作。

图18-25 TCP连接使用三向沟通连接法
4,确认和重传假设主机A和主机B之间有一个TCP连接,当主机A发送一个包含数据的消息段时,它启动一个定时器后就等待主机B对这个消息段的响应。主机A在发送消息段之后期待在一定的时间范围里接收到B的响应,这个期待的时间称为传输等待时间(timeout)。如果在等待时间之内没有接收到确认消息段,主机A就重发包含数据的消息段。这个过程如图18-26所示。

图18-26 确认和重传
当主机B接收到一个消息段时,延迟若干分之一秒(通常200 ms)之后就回送一个确认消息段。如果主机B接收到的消息段是无顺序的,TCP执行软件会重新整理使数据流符合主机A的发送顺序,它也会去掉重复的消息段。
18.5 网络层上的网际协议网际协议(Internet Protocol,IP)是TCP/IP协议堆中的一个协议,是网络层上的一个协议。虽然“Internet”这个词在协议名称里面,但它不限于用在因特网上,它也可以用在与因特网完全无关的专用网络上。IP的主要任务是把来自TCP或者UDP协议执行软件装配的消息装配成数据包(datagram),负责安排数据包的传送路线以及在接收端把数据包还原成原来的消息段。
数据包是IP使用的传输单元,有时更明确地叫做IP数据包(IP datagram)。IP协议的主要内容是定义IP数据包标题(Internet Protocol Datagram Header),它由6个32位长共计24个字节组成,它的结构如图18-27所示。如果不使用“选择(option)”域,最短的标题是5个32位长的字。
Version Number
Header Length
Type of Service
(服务类型)
Datagram Length
(数据包长度)
Identification(标识)
0
DF
MF
Fragment Offset(数据块偏移)
Time to Live (TTL)
(生存时间)
Transport Protocol
(传输协议)
Header Checksum
(标题检查和)
Sending Address(发送端地址)
Destination Address(目的地地址)
Options(现在项)
Padding(填充)
图18-27 IP数据包标题的结构
版本号(Version Number)域:4位长的版本号域包含协议软件使用的IP版本号,接收软件根据版本号就可以知道如何处理标题中的其他域的内容。目前使用最广泛的版本号是4。虽然有几个系统正在测试第6版本,叫做下一代网际协议(IPng)——IPv6,但因特网和大多数局域网目前还不支持这个新协议。
标题长度(Header Length)域:4位长的标题长度域包含由发送端创建的IP标题的总长度。最短的标题长度为20个字节,最长为24个字节。
服务类型(Type of Service)域:8位长的服务类型域用来引导IP如何处理数据包,它的格式如下:
Precedence (3 bits)
Delay
Throughput
Reliability
Not used
①前3位表示数据包的优先权(precedence),数值越大表示优先权越高,但执行TCP/IP的大多数软硬件在实际中都不管这个域的值,对数据包的先后传送次序都一视同仁。
②后面3个1位的标志域分别是延迟(delay)、吞吐量(throughput)和可靠性标志。如设置为0,表示正常值;如果设置成1,则分别表示低延迟、高吞吐量和高可靠性。当前的软硬件也都不管它们的设置。
数据包长度(Datagram Length)域:16位长的数据包长度域中的数值是数据本身的字节数和标题长度的字节数之和。一个IP数据包的最大长度为65 535个字节。
标识(Identification)域:该域包含一个由发送端创建的唯一的标识号,它在接收端用来引导如何把数据包还原出原来的消息。
标志(Flags)域:该域用来控制数据包的分块。由于一个IP数据包的最大长度不能超过65 535个字节,因此有可能要把消息分成碎块。当DF(Don't Fragment)=0,表示数据包可以分成碎块,当DF=1,表示数据包不可以分碎块。MF(More Fragments)=0,表示最后的一个碎块,MF=1表示后面还有碎块要处理。
数据块偏移量(Fragment Offset)域:当MF(More Fragments)=1时,该域包含有碎块的位置信息。
生存时间TTL(Time to Live)域:该域包含有数据包在网络上保留的时间,其值由发送端设置,通常设置为15秒或者30秒传输协议(Transport Protocol)域:该域包含有传输协议的标识号。目前定义和指定了大约50个传输协议号。两个最重要的协议是网际控制消息协议(Internet Control Messages Protocol,ICMP),协议号为1,和传输控制协议(Transfer Control Protocol,TCP),协议号为6。
标题检查和(Header Checksum):该域的值仅由这个协议标题域中的值计算得到,不计算数据域中的值。检查和的计算方法将在后面介绍。
发送端地址和目的地地址(Sending Address and Destination Address):该域包含创建数据包(datagram)时生成的32位IP地址选择(Options)域:主要用来提供安全保证的方法,有兴趣的读者请参看RFC 791。
与网际协议IP一起工作的一个协议是网际控制消息协议ICMP(Internet Control Message Protocol)。在把消息从发送端传输到接收端的过程中可能会出现许多问题,例如生存时间TTL定时器到时,网关设备把数据包错送到其他地方等问题。让发送者知道数据包传输过程中出现的问题是很重要的事情,ICMP协议就是为这个目的开发的协议。
因特网现在使用的IP版本号是4,使用的IP地址是32位。随着因特网用户的不断扩大,32位IP地址有可能会不能满足因特网发展的需求,因此近年来已经开始开发新的IP协议——IP version 6 (IPv6),称为下一代IPng(IP Next Generation)。现在正在研究的几个提案是TUBA (TCP and UDP with Bigger Addresses)和SIPP(Simple Internet Protocol Plus)等。IPng的其中几个特性是:
① 使用128位IP地址替代现在的32位IP地址。
② 更有效的IP标题,去除标题检查和(Header Checksum)。
③ 防止数据包分裂。
④ 内置安全保密措施。
⑤ 增加流动标签域(Flow Label field),用它帮助识别传输许多IP数据包的发送端和接收端,以提高传输速度。
练习与思考题查阅一些文献资料(如工具书等),分析和比较网关(gateway)、路由器(router)和网桥(bridge)在网络中所起的作用。
什么叫做IP(Internet address)地址,什么叫做域名地址(domain name address),它们之间有什么关系。
IP地址有哪几类?总结它们各有什么特点?
分别说出IP地址为167.216.130.62和202.98.36.120是哪一类网络?它们的网络数目和连网机器数目各有什么特点。
域名服务DNS(Domain Name Service)的功能是什么?
举例说明统一资源地址URL(Uniform Resource Locator)的含义。
用简洁的语言说出“http://www.mpeg.org/~tristan/MPEG/MPEG-content.html”的意思。
在网络上下载详细描述HTTP/1.0协议的RFC 1945文件,试一试看自己读懂其中的多少内容。
TCP和UDP是哪一层的协议?这两种协议的有什么主要差别?
网络技术人员对因特网的层次结构和各层使用的协议了如指掌,网络用户对此也需要了解。若因特网粗略划分成5层,请写出各层的名称,各层使用的协议(写出1至2个协议即可)
写一篇关于以太网的性能调查报告,网络类型包含10Base-F,10BASE-T,10Base2(也称thin Ethernet),10Base5(也称Thick Ethernet,ThickNet,ThickWire),100BaseT以及千兆以太网,内容包含使用的标准、使用的电缆和电缆连接器、传输的距离、数据传输率、应用场合等,并把要点综合成表格。
参考文献和站点
[1] 有关域名协议的部分RFC文件
RFC 1034 Domain names - concepts and facilities
RFC 1035 Domain names - implementation and specification
RFC 1876 A Means for Expressing Location Information in the Domain Name System,
RFC 2065 Domain Name System Security Extensions
[2] 有关TCP协议的部分RFC文件:
RFC 1180 TCP/IP Tutorial
RFC 2001 W,Stevens,"TCP Slow Start,Congestion Avoidance,Fast Retransmit,and Fast Recovery Algorithms",01/24/1997
RFC 1323 D,Borman,B,Braden,V,Jacobson,"TCP Extensions for High Performance",05/13/1992
RFC 1122 B,Braden,"Requirements for Internet hosts - communication layers",10/01/1989,(STD 3)
RFC 793 J,Postel,"Transmission Control Protocol",09/01/1981,(STD 7)
[3] 有关UDP协议的部分文件:
RFC 2013 K,McCloghrie,"SNMPv2 Management Information Base for the User Datagram Protocol using SMIv2",11/12/1996
RFC 768 J,Postel,"User Datagram Protocol",08/28/1980,(STD 6)
[4] 有关IP地址协议的部分RFC文件:
标准号0005 Internet Protocol,J,Postel,September 1981.
RFC1112 S,Deering,"Host extensions for IP multicasting",08/01/1989.
RFC 2236 B,Fenner,"Internet Group Management Protocol,Version 2",11/11/1997,(Updates RFC1112)
RFC 1700 J,Reynolds,J,Postel,"ASSIGNED NUMBERS",10/20/1994,(STD 2)