1.2 通信协议

在Web里,一般客户端访问Web网页都会遵循超文本传输协议(HyperText Transfer Protocol,HTTP)。HTTP是一个客户端和服务器端发送请求及响应请求的标准,是用于从WWW服务器传输超文本到本地浏览器的传送协议。

HTTP常用于客户端与服务器端的通信。在HTTP里,必定有一方担任客户端,另一方担任服务器端,如图1.1所示。请求都是由客户端发起的,而服务器端则是响应客户端发起的请求。例如,通过浏览器访问网址www.baidu.com的时候,浏览器是发起请求的一方,所以浏览器是客户端;而百度的服务器根据相应的请求,给浏览器返回其想要的资源,所以它是服务器端。

图1.1 客户端与服务器端的通信

当在客户端输入www.baidu.com的时候,浏览器会发送一个请求到某个服务器,服务器响应后就给客户端发回一个页面。而当客户端向服务器发送请求的时候,客户端需要遵循一定的协议才能与之进行交流。正如一个只会说中文的人和一个只会说英文的人是无法通过语言进行交流的!只有当他们都说中文或者英文的时候才能通过语言进行交流,这语言就是他们之间必须遵循的协议。

1.2.1 TCP/IP

为了更好地理解HTTP,我们先来了解一下TCP/IP协议簇。人们通常使用的网络(包括互联网)都是在TCP/IP协议簇的基础上运作的,而HTTP就是它们内部的一个子集。

1.TCP/IP的分层管理

TCP/IP协议簇按层次可分为应用层、传输层、网络层和链路层。把TCP/IP层次化是有好处的。假设没有把TCP/IP层次化,当其中的某一部分需要改变时,整个TCP/IP都要被替换掉。但是TCP/IP层次化之后,层与层之间是通过接口进行通信的,若是其中一层内部发生了变化,而它的接口没有变化,这样只需要把这一层替换掉就行了。由此引申可知,程序员在设计程序的时候,也应该对程序进行层次化/模块化的划分,这样当程序的某一个模块发生改变时,只需改动某一个模块就行了,不用进行整体上的修改。TCP/IP协议簇的层次如图1.2所示。

图1.2 TCP/IP协议簇的层次

(1)应用层

应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议簇内预存了各类通用的应用服务。例如,文本传输协议(File Transfer Protocol,FTP)和域名系统(Domain Name System,DNS)就是其中的两类。

HTTP也处于该层,且大部分网络应用程序的编程都是基于应用层进行的。

(2)传输层

传输层实现了处于网络连接的两台计算机之间的数据传输。传输层有两个性质不同的协议:传输控制协议(Transmission Control Protocol,TCP)和用户数据报协议(User Data Protocol,UDP)。

(3)网络层

网络层可用来处理在网络上流动的数据包(数据包是网络传输的最小数据单位)。该层规定了通过怎样的路径(即传输线路)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多可选的路线中选择一条传输路线。

(4)链路层

链路层是为网络层提供数据传送服务的,其最基本的服务是将源自网络层的数据可靠地传输到相邻节点的目标机网络层。链路层包括物理链路(物理线路)和数据链路(逻辑线路)。物理链路是由传输介质与硬件设备组成的;数据链路是指在一条物理线路之上,通过一些规则或协议控制数据的传输,以保证被传输数据的正确性。

数据的封装与解封装是客户端与服务器端的数据交换需要经过封装、传输与解封装的过程。封装是将一端发送的数据变为比特流的过程。封装过程中,在TCP/IP模型的每一层需要添加特定的协议报头,如图1.3左图所示。数据封装完毕,转变为比特流,经过网络传输到服务器端,服务器端则对比特流进行解封装。解封装是封装的逆过程,即数据从比特流还原为原始数据的过程。解封装是从底层往高层依次解封装,每解封一层,都会将该层的那个协议报头去掉,如图1.3右图所示,最终还原为原始数据。

TCP/IP协议簇中最重要的协议就是TCP和IP。

图1.3 TCP/IP数据传输

2.TCP

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP位于传输层,提供了可靠的字节流服务(Byte Stream Service,BSS)。字节流服务是指为了方便传输,将大块数据分割成报文段(Segment)为单位的数据包以便进行管理。TCP通过“三次握手”(见图1.4)确保数据能够到达目标。而客户端与服务器端“三次握手”之后的主要目的是建立连接,接下来双方就可以进行通信了。

图1.4 三次握手

3.IP

IP(Internet Protocol,网际协议)的作用是把各种数据包传送给对方,要保证确实传送给了对方,需要满足各类条件。其中最重要的就是IP地址和媒体访问控制地址(Media Access Control Address,MAC)。IP地址指明了节点被分配到的地址,MAC则是指网卡所属的固定地址。

在网络上,经过多台计算机和网络设备中转才能连接到对方。而在进行中转的时候,会利用下一站中转的设备的MAC来搜索下一个中转目标,这时就要用到地址解析协议(Address Resolution Protocol,ARP)。ARP是一种用以解析地址的协议,它根据通信方的IP可以反查对应的MAC。图1.5所示为使用ARP凭借MAC进行IP间的通信。

图1.5 使用ARP凭借MAC进行IP间的通信

1.2.2 DNS服务

前面提到的www.baidu.com并不是一个IP地址,但是我们根据网址还是能够访问它的。其原因就是DNS解析了这个域名,并返回对应的IP地址给发送端。其工作流程如图1.6所示。

例如,客户端发送一个想要浏览http://javaweb.com/xss/Web的请求,这时DNS负责解析域名,并返回给客户端对应的IP地址。而HTTP则会生成一个针对目标Web服务器的HTTP请求报文。为了方便通信,TCP将HTTP请求报文分割成多个报文段,并保证会将之可靠地传给对方。路由器传递报文段的时候需要IP的协助,搜索对方的地址,边中转边传送,直到找到对应的服务器。这时TCP开始发挥作用,它将多个报文段按原来的顺序重组请求报文,而HTTP的职责就是对请求的内容进行处理,最后处理结果也是同样按照TCP/IP通信协议向用户进行回传。所有的流程如图1.7所示。

图1.6 DNS域名解析服务

图1.7 DNS域名解析服务

1.2.3 URI和URL的区别

1.URI

统一资源标识符(Uniform Resource Identifier,URI)用来唯一地标识一个资源。Web上可用的每种资源,如HTML文档、图像、视频片段、程序等都是用URI定位的。

URI一般由三部分组成。

(1)访问资源的命名机制。

(2)存放资源的主机名。

(3)资源自身的名称,由路径表示,着重强调资源。

2.URL

统一资源定位器(Uniform Resource Locator,URL)是一种具体的URI,可用来标识一个资源,而且还会指明如何定位这个资源。

URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL一般由三部分组成。

(1)协议(或称为服务方式)。

(2)存有该资源的主机IP地址(有时也包括端口号)。

(3)主机资源的具体地址,如目录和文件名等。

3.区别

URI和URL都能唯一标识资源,但URL还指明了该如何访问资源。URL是一种具体的URI,是URI的一个子集,它不仅唯一标识资源,而且提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的;而URL必须提供足够的信息来定位,是绝对的。