网络通信的不同方面被分解为不同的层。每一层表示为物理硬件与所传输信息之间的不同抽象层次。在理论上,每一层只与紧挨其上和其下的层对话。将网络分层,这样就可以修改甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层。如下图:
上图显示了你的网络中可能存在的协议栈。尽管如今在Internet上中间层协议相当稳定,但是上层和下层的协议变化很大。有些主机使用Ethernet(以太网);有些使用WiFi;有些使用PPP;还有一些主机使用其他的协议。类似地,这个栈顶层使用的协议完全取决于主机运行的程序。关键是,从栈的顶层来看,底层协议是什么并不重要,反之亦然,从底层来看,也不关心顶层协议是什么。这个分层模型实现了应用协议与网络硬件物理特性以及网络连接拓扑结构的解耦合。
有几种不同的分层模型,分别适合特定类型网络的需要。本书采用适用于Internet的标准TCP/IP四层模型,如下图:
在这个模型中,应用程序如Firefox运行在应用层,只与传输层对话。传输层只与应用层和网际层对话。网际层则只与主机网络层和传输层对话,绝不直接与应用层对话。主机网络层通过线缆、光纤或其他介质将数据移动到远程系统的主机网络层,然后再通过上述各层将数据逐级上移传输到远程系统的应用层。
例如,当web浏览器向web服务器发送获取网页的请求时,浏览器实际上只与本地客户机的传输层对话。传输层将请求分解为TCP片,向数据添加序列号和校验和,然后将请求传递给本地网际层。网际层根据本地网络所需的大小将各TCP片分成IP数据报,并传递到主机网络层以便通过线缆传输数据。主机网络层将数字数据编码为适合特定物理介质的模拟信号,将请求发送到线缆,目标地址的远程系统的主机网络层可以由此读取请求。
远程系统的主机网络层将模拟信号解码为数字数据,将生成的IP数据报传递给服务器的网际层。网际层简单地检查IP数据报是否被破坏,如果已经分片则重组数据,然后传递给服务器的传输层。服务器的传输层检查是否所有的数据都已到达,对于丢失或破坏的部分则要求重传(这个请求实际上将向下通过服务器的网际层,再通过服务器的主机网络层,回到客户端系统,然后再在客户端系统向上返回客户端的传输层,传输层再通过本地网际层和主机网络层重传前面丢失的数据。所有这些对应用层是完全透明的)。一旦服务器的传输层接收到足够多的连续顺序数据报,就将其重组写入一个流,由服务器应用层上运行的web服务器读取。服务器响应这个请求,再通过服务器系统的各个分层发回响应,通过Internet进行传输并分发给web客户端。
可以猜到,实际的过程更为错综复杂。主机网络层是最复杂的,特意地隐藏了很多细节。不过,90%的情况下java代码都将在应用层工作,只需要与传输层对话。其他10%的时间会在传输层处理,与应用层或网际层对话。主机网络层的复杂性对你是隐藏的,这是分层模型的关键。
提示:如果阅读网络相关文献,你可能会看到另一个OSI七层网络模型,称为开放系统互联参考模型(Open Systems Intercommection Reference Model,OSI)。对于java网络程序,OSI模型过于复杂了。OSI模型与本书使用的TCP/IP模型之间最大的区别是,OSI模型将主机网络层分为数据链路层和物理层,另外在应用层和传输层之间插入了表示层和会话层。OSI模型更加一般化,更适合于非TCP/IP网络,不过大多数情况下仍然过于复杂。在任何情况下,java的网络类只工作于TCP/IP网络中,而且始终运行在应用层或传输层上。