第1章简介
如今,人们可以通过电脑来打电话,看电视,给朋友发送即时信息,与其他人玩游戏,甚至可以通过电脑买到你能想到的任何东西,包括从歌曲 到SUV[ ]。计算机程序能够通过互联网相互通信使这一切成为了可能。很难统计现在有多少个人电脑接入互联网,但可以肯定,这个数量增长得非常迅速,相信不久就能达 到10亿。除此之外,新的应用程序每天在互联网上层出不穷。随着日益增加的互联网访问带宽,我们可以预见,互联网将会对人们将来的生活产生长远的影响。
那 么程序是如何通过网络进行相互通信的呢?本书的目的就是通过在Java编程语言环境下,带领你进入对这个问题的解答之路。Java语言从一开始就是为了让 人们使用互联网而设计的,它为实现程序的相互通信提供了许多有用的抽象应用程序接口(API, Application Programming Interface),这类应用程序接口被称为套接字(sockets)。
在我们开始探究套接字的细节之前,有必要向读者简单介绍计算机网络和通 信协议的整体框架,以使读者能清楚我们的代码将应用的地方。本章的目的不是向读者介绍计算机网络和TCP/IP协议是如何工作的(已经有很多相关内容的教 程[ ][ ][ ][ ][ ]),而是介绍一些基本的概念和术语。
1.1 计算机网络,分组报文和协议
计算机网络由一组通过通信信道 相互连接的机器组成。我们把这些机器称为主机(hosts)和路由器(routers)。主机是指运行应用程序的计算机,这些应用程序包括网络浏览器 (Web browser),即时通讯代理(IM agent),或者是文件共享程序。运行在主机上的应用程序才是计算机网络的真正"用户"。路由器的作用是将信息从一个通信信道传递或转发 (forward)到另一个通信信道。路由器上可能会运行一些程序,但大多数情况下它们是不运行应用程序的。基于本书的目的对通信信道 (communication channel)进行解释:它是将字节序列从一个主机传输到另一个主机的一种手段,可能是有线电缆,如以太网(Ethernet),也可能是无线的,如 WiFi[ ],或是其他方式的连接。
路由器非常重要,因为要想直接将所有不同主机连接起来是不可行的。相反,一些主机先得连接到路由器,路由器 再连接到其他路由器,这样就形成了网络。这种布局使每个主机只需要用到数量相对较少的通信信道,大部分主机仅需要一条信道。在网络上相互传递信息的程序并 不直接与路由器进行交互,它们基本上感觉不到路由器的存在。
这里的信息(information)是指由程序创建和解释的字节序列。在计算机网络 环境中,这些字节序列被称为分组报文(packets)。一组报文包括了网络用来完成工作的控制信息,有时还包括一些用户数据。用于定位分组报文目的地址 的信息就是一个例子。路由器正是利用了这些控制信息来实现对每个报文的转发。
协议(protocol)相当于是相互通信的程序间达成的一种约定, 它规定了分组报文的交换方式和它们包含的意义。一组协议规定了分组报文的结构(例如报文中的哪一部分表明了其目的地址)以及怎样对报文中所包含的信息进行 解析。设计一组协议,通常是为了在一定约束条件下解决某一特定的问题。比如,超文本传输协议(HTTP,HyperText Transfer Protocol)是为了解决在服务器间传递超文本对象的问题,这些超文本对象在服务器中创建和存储,并由Web浏览器进行可视化,以使其对用户有用。即 时消息协议是为了使两个或更多用户间能够交换简短的文本信息。
要实现一个有用的网络,必须解决大量各种各样的问题。为了使这些问题可管理和模块 化,人们设计了不同的协议来解决不同类型的问题。TCP/IP协议就是这样一组的解决方案,有时也被称为协议族(protocol suite)。它刚好是互联网所使用的协议,不过也能用在独立的专用网络中。本书以后所提到的网络(network),都是指任何使用了TCP/IP协议 族的网络。TCP/IP协议族主要协议有IP协议(互联网协议,Internet Protocol[ ]),TCP协议(传输控制协议,Transmission Control Protocol[ ])和UDP协议(用户数据报协议,User Datagram Protocol[ ])。
事实证明将各种协议分层组织是一种非常有用的措施,TCP/IP协议族,实际上其他所有协议族都是 按这种方式组织的。图1.1展示了通信协议、应用程序和主机和路由器中的套接字API(应用程序接口,Application Programming Interface)之间的关系,同时也展示了数据流从一个应用程序到另一个应用程序的过程(使用TCP协议)。标记为TCP,UDP和IP的方框分别代 表了这些协议的实现,它们通常驻留在主机的操作系统中。应用程序通过套接字API对UDP协议和TCP协议所提供的服务进行访问。箭头描述了数据流从一个 应用程序,经过TCP协议层和IP协议层,通过网络,再反向经过IP协议层和TCP协议层传输到另一端的应用程序。
(点击查看大图)图1.1: 一个 TCP/IP 网络
Application:应用程序;Socket:套接字;Host:主机;Channel:通信信道;Ethernet:以太网;Router:路由器;Network Layer:网络层;Transport Layer:传输层。
在 TCP/IP协议族中,底层由基础的通信信道构成,如以太网或调制解调器拨号连接。这些信道由网络层(network layer)使用,而网络层则完成将分组报文传输到它们的目的地址的工作(也就是路由器的功能)。TCP/IP协议族中属于网络层的唯一协议是IP协议, 它使两个主机间的一系列通信信道和路由器看起来像是一条单一的主机到主机的信道。
IP协议提供了一种数据报服务:每组分组报文都由网络独立处理和 分发,就像信件或包裹通过邮政系统发送一样。为了实现这个功能,每个IP报文必须包含一个保存其目的地址(address)的字段,就像你所投递的每份包 裹都写明了收件人地址。(我们随即会对地址进行更详细的说明。)尽管绝大部分递送公司会保证将包裹送达,但IP协议只是一个"尽力而为"(best- effort)的协议:它试图分发每一个分组报文,但在网络传输过程中,偶尔也会发生丢失报文,使报文顺序被打乱,或重复发送报文的情况。
IP协 议层之上称为传输层(transport layer)。它提供了两种可选择的协议:TCP协议和UDP协议。这两种协议都建立在IP层所提供的服务基础上,但根据应用程序协议 (application protocols)的不同需求,它们使用了不同的方法来实现不同方式的传输。TCP协议和UDP协议有一个共同的功能,即寻址。回顾一下,IP协议只是 将分组报文分发到了不同的主机,很明显,还需要更细粒度的寻址将报文发送到主机中指定的应用程序,因为同一主机上可能有多个应用程序在使用网络。TCP协 议和UDP协议使用的地址叫做端口号(port numbers),都是用来区分同一主机中的不同应用程序。TCP协议和UDP协议也称为端到端传输协议(end-to-end transport protocols),因为它们将数据从一个应用程序传输到另一个应用程序,而IP协议只是将数据从一个主机传输到另一主机。