1.1 计算机网络、分组报文和协议

计算机网络由一组通过通信信道相互连接的机器组成。我们把这些机器称为主机(hosts)和路由器(routers)。主机是指运行应用程序的计算机,这些应用程序包括网络浏览器(Web browser)、即时通信代理(IM agent)或者文件共享程序。运行在主机上的应用程序才是计算机网络的真正“用户”。路由器的作用是将信息从一个通信信道传递或转发(forward)到另一个通信信道。路由器上可能会运行一些程序,但大多数情况下它们是不运行应用程序的。基于本书的目的对通信信道(communication channel)进行解释:它是将字节序列从一个主机传输到另一个主机的一种手段,可能是有线电缆,如以太网(Ethernet),也可能是无线的,如WiFi [7],或是其他方式的连接。

路由器非常重要,因为要想直接将所有不同主机连接起来是不可行的。相反,一些主机先得连接到路由器,这些路由器再连接到其他路由器,这样就形成了网络。这种布局使每个主机只需要用到数量相对较少的通信信道,大部分主机仅需要一条信道。在网络上相互传递信息的程序并不直接与路由器进行交互,它们基本上感觉不到路由器的存在。

这里的信息(information)是指由程序创建和解释的字节序列。在计算机网络环境中,这些字节序列称为分组报文(packet)。一组报文包括了网络用来完成工作的控制信息,有时还包括一些用户数据。用于定位分组报文目的地址的信息就是一个例子。路由器正是利用了这些控制信息来实现对每个报文的转发。

协议(protocol)相当于相互通信的程序间达成的一种约定,它规定了分组报文的交换方式和它们包含的意义。一组协议规定了分组报文的结构(例如报文中的哪一部分表明了其目的地址)以及怎样对报文中所包含的信息进行解析。设计一组协议,通常是为了在一定约束条件下解决某一特定的问题。比如,超文本传输协议(HyperText Transfer Protocol,HTTP)是为了解决在服务器间传递超文本对象的问题,这些超文本对象在服务器中创建和存储,并由Web浏览器进行可视化,以使其对用户有用。即时消息协议是为了使两个或更多用户间能够交换简短的文本信息。

要实现一个有用的网络,必须解决大量各种各样的问题。为了使这些问题可管理和模块化,人们设计了不同的协议来解决不同类型的问题。TCP/IP协议就是这样一组解决方案,有时也称为协议族(protocol suite)。它刚好是互联网所使用的协议,不过也能用在独立的专用网络中。本书以后所提到的网络(network)都是指任何使用了TCP/IP协议族的网络。TCP/IP协议族主要协议有IP协议(Internet Protocol[8]互联网协议),TCP协议(Transmission Control Protocol [9],传输控制协议)和UDP协议(User Datagram Protocol[10],用户数据报协议)。

事实证明将各种协议分层组织是一种非常有用的措施,TCP/IP协议族(实际上其他所有协议族)都是按这种方式组织的。图1-1展示了主机和路由器中的通信协议、应用程序和套接字API之间的关系,同时也展示了数据流从一个应用程序到另一个应用程序的过程(使用TCP协议)。标记为TCP、UDP和IP的方框分别代表了这些协议的实现,它们通常驻留在主机的操作系统中。应用程序通过套接字API对UDP协议和TCP协议所提供的服务进行访问。箭头描述了数据流从一个应用程序,经过TCP协议层和IP协议层,通过网络,再经过IP协议层和TCP协议层传输到另一端的应用程序。

figure_0012_0002

图 1-1 一个TCP/IP网络

在TCP/IP协议族中,底层由基础的通信信道构成,如以太网或调制解调器拨号连接。这些信道由网络层(network layer)使用,而网络层则完成将分组报文传输到它们的目的地址的工作(也就是路由器的功能)。TCP/IP协议族中属于网络层的唯一协议是IP协议,它使两个主机间的一系列通信信道和路由器看起来像是单独一条主机到主机的信道。

IP协议提供了一种数据报服务:每组分组报文都由网络独立处理和分发,就像信件或包裹通过邮政系统发送一样。为了实现这个功能,每个IP报文必须包含一个保存其目的地址(address)的字段,就像你所投递的每份包裹都写明了收件人地址。(我们随即会对地址进行更详细的说明。)尽管绝大部分递送公司会保证将包裹送达,但IP协议只是一个“尽力而为”(best-effort)的协议:它试图分发每一个分组报文,但在网络传输过程中,偶尔也会发生丢失报文,使报文顺序被打乱,或重复发送报文的情况。

IP协议层之上称为传输层(transport layer)。它提供了两种可选择的协议:TCP协议和UDP协议。这两种协议都建立在IP层所提供的服务基础上,但根据应用程序协议(application protocol)的不同需求,它们使用了不同的方法来实现不同方式的传输。TCP协议和UDP协议有一个共同的功能,即寻址。回顾一下,IP协议只是将分组报文分发到了不同的主机,很明显,还需要更细粒度的寻址将报文发送到主机中指定的应用程序,因为同一主机上可能有多个应用程序在使用网络。TCP协议和UDP协议使用的地址叫做端口号(port number),都是用来区分同一主机中的不同应用程序的。TCP协议和UDP协议也称为端到端传输协议(end-to-end transport protocol),因为它们将数据从一个应用程序传输到另一个应用程序,而IP协议只是将数据从一个主机传输到另一主机。

TCP协议能够检测和恢复IP层提供的主机到主机的信道中可能发生的报文丢失、重复及其他错误。TCP协议提供了一个可信赖的字节流(reliable byte-stream)信道,这样应用程序就不需要再处理上述的问题。TCP协议是一种面向连接(connection-oriented)的协议:在使用它进行通信之前,两个应用程序之间首先要建立一个TCP连接,这涉及相互通信的两台电脑的TCP部件间完成的握手消息(handshake message)的交换。使用TCP协议在很多方面都与文件的输入输出(Input/Output,I/O)相似。实际上,由一个程序写入的文件再由另一个程序读取就是一个TCP连接的适当模型。另一方面,UDP协议并不尝试对IP层产生的错误进行修复,它仅仅简单地扩展了IP协议“尽力而为”的数据报服务,使它能够在应用程序之间工作,而不是在主机之间工作。因此,使用了UDP协议的应用程序必须为处理报文丢失、顺序混乱等问题做好准备。

[1]SUV,英文Sports Utility Vehicles的缩写,中文意思是运动型多用途汽车。—译者注

[2]Comer,Douglas E.,Internetworking with TCP/IP,Volume I:Principles,Protocols,and Architecture(fourth edition),Prentice-Hall,2000.

[3]Comer,Douglas E.,and Stevens,David L.,Internetworking with TCP/IP,Volume Ⅲ:Client-Server Programming and Applications(Linux/POSIX Sockets Version),Prentice-Hall,2001.

[4]Peterson,Larry L.,and Davie,Bruce S.,Computer Networks:A Systems Approach(third edition),Morgan Kaufmann,2003.

[5]Stevens,W.Richard,UNIX Network Programming:Networking APIs:Sockets and XTI(second edition),Prentice-Hall,1997.

[6]Stevens,W.Richard,TCP/IP Illustrated,Volume 1:The Protocols,Addison-Wesley,1994.

[7]WiFi,全称Wireless Fidelity,即无线保真,是一种短距离无线技术。—译者注

[8]Postel,John,“Internet Protocol,”Internet Request for Comments 791,September 1981.

[9]Postel,John,“Transmission Control Protocol,”Internet Request for Comments 793,September 1981.

[10]Postel,John,“User Datagram Protocol,”Internet Request for Comments 768,August 1980.