计算机网络:应用层 - 万维网 & HTTP协议
万维网 WWW
万维网是一个大规模的、联机式的信息储藏所。万维网用链接的方法能非常方便地从互联网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息。
万维网是一个分布式的超媒体系统
,它是超文本系统
的扩充。超文本
是指包含指向其他文档的链接的文本。
利用一个链接可使用户找到远在异地的另一个文档。这些文档可以位于世界上任何一个接在互联网上的超文本
系统中。
超文本
是万维网的基础。超媒体
与超文本
的区别是文档内容不同。超文本
文档仅包含文本信息,而超媒体
文档还包含其他表示方式的信息,如图形、图像、声音、动画以及视频图像等。
万维网以客户/服务器
方式工作。上面所说的浏览器就是在用户主机上的万维网客户程序。万维网文档所驻留的主机则是运行服务器程序,因此这台主机也称为万维网服务器。
客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档。在一个客户程序主窗口上显示出的万维网文档称为页面。
那么现在有一个问题了,万维网上有那么多文档,如何标识一个确定的唯一的文档呢?
此时就要用到统一资源定位符 URL
。
统一资源定位符 URL
统一资源定位符URL
是用来表示从互联网上得到的资源位置和访问这些资源的方法。
只有知道了这个资源在互联网上的什么地方,才能对它进行操作。互联网上的所有资源,都有一个唯一确定的URL
。这里所说的资源是指在互联网上可以被访问的任何对象,包括文件目录、文件、文档、图像、声音等,以及与互联网相连的任何形式的数据。
URL的一般形式由以下四个部分组成:
协议
:指出使用何种协议来获取该万维网文档。现在最常用的协议就是超文本传送协议HTTP
,其次是文件传送协议FTP
主机
:万维网文档所存放的主机的域名
,通常以www
开头,但这并不是硬性规定
主机名用点分十进制的IP地址
代替也是可以的端口
:端口号,但经常被省略掉。这是因为这个端口号通常就是协议的默认端口号。但如不使用默认端口号,那么就必须写明现在所使用的端口号路径
:前面的三个部分指明了互联网的具体主机,以及使用的协议,路劲则是在一台主机内部的相对路径
超文本传输协议 HTTP
HTTP
定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。
HTTP
是面向事务
的应用层协议,它是万维网上能够可靠地交换文件的重要基础。
事务
:一系列的信息交换是一个不可分割的整体,要么所有信息都交换完成,要么一次都不进行交换
HTTP
不仅传送完成超文本跳转所必需的信息,而且也传送任何可从互联网上得到的信息,如文本、超文本、声音和图像等。
每个万维网网点都有一个服务器进程,它不断地监听TCP
的端口80
,以便发现是否有浏览器向它发出连接建立请求。一旦监听到连接建立请求并建立了TCP
连接之后,浏览器就向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。服务器在完成任务后,TCP
连接就被释放了。
在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这些格式和规则,就是超文本传输协议HTTP
。
非持续连接
HTTP/1.0
采用了非持续连接
,浏览器获取一个文档的过程如下:
从浏览器请求一个万维网文档到收到整个文档。HTTP
首先要和服务器建立TCP
连接。这需要使用三报文握手。当建立 TCP
连接的三报文握手的前两个报文完成后,万维网客户就把HTTP请求报文
,作为建立TCP
连接的三报文握手中的第三个报文的数据,发送给万维网服务器。服务器收到HTTP请求报文后
,就把所请求的文档作为响应报文返回给客户。
整个过程所耗时为:两个往返时间RTT
+ 传输文档所需时间。也就是说,在HTTP/1.0
中最大的缺点就是每次请求一个文档都要两个RTT
的开销。
如果一个页面上有很多链接的对象需要依次进行链接,那么每一次链接下载都导致两个RTT
的开销。特别是万维网服务器往往要同时服务于大量客户的请求,所以这种非持续连接会使万维网服务器的负担很重。
持续连接
HTTP/1.1
开始改用了持续连接
的策略,所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户和该服务器可以继续在这条连接上传送后续的HTTP
请求报文和响应报文。这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行。
持续连接有两种工作方式:非流水线方式
和流水线方式
非流水线
非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。
如图所示:
在TCP
连接已建立后,客户每访问一次对象都要用去一个往返时间RTT
。这比非持续连接节省了建立TCP
连接所需的一个RTT
时间。
流水线
流水线方式的特点,是客户在收到HTTP
的响应报文之前就能够接着发送新的请求报文。
如图所示:
一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象一起只需花费一个RTT
时间以及这些文件的传输时间。流水线工作方式使TCP
连接中的空闲时间减少,提高了下载文档效率。
代理服务器
代理服务器
是一种网络实体,它又称为万维网高速缓存。
代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按URL的地址再次去互联网访问该资源。
如图所示是一个校园网:
校园网内多台主机通过浏览器访问互联网的网页,那么R1 - R2
这条链路就会非常拥堵。
但是此时若增加一个代理服务器
:
此时所有浏览器访问网页前,都要先通过代理服务器
,如果代理服务器
内有这个链接对应的数据,就直接返回。如果没有再去互联网访问,当代理服务器
访问互联网拿到链接对应的资源后,自己先缓存一份,然后交给客户浏览器
。后续别的浏览器再来访问同一个链接,代理服务器
就可以直接返回这个内容了。
HTTP报文
HTTP
有两类报文:HTTP请求报文
和HTTP响应报文
。
两类报文格式如下:
HTTP
报文是面向文本的,在HTTP
报文中,每个字段不是简单的数据,而是一些ACSII
码字符串,各个字段的长度都是不确定的!
HTTP
请求报文和响应报文都是由三个部分组成的。这两种报文格式的区别就是开始行不同。
各个区域含义如下:
开始行
:用于区分是请求报文还是响应报文。在请求报文中的开始行叫作请求行
,而在响应报文中的开始行叫作状态行
。在开始行的三个字段之间都以空格分隔开,最后的CR
和LF
分别代表回车
和换行
(它们也是ASCII码)。首部行
:用来说明浏览器、服务器或报文主体的一些信息。首部可以有好几行,但也可以不使用。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有回车
和换行
。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。实体主体
:在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。
下面先介绍 HTTP请求报文
的一些主要特点。
格式如下:
请求报文的请求行
只有三个内容:方法
,URL
,HTTP版本
,后两者都非常好理解,我着重讲讲方法
。
方法
:对所请求对象所做的一些操作,本质上就是一些命令。
常见的方法如下:
方法 | 含义 |
---|---|
OPTION | 请求一些选项信息 |
GET (有一个空格) | 请求读取URL 所标志的信息 |
HEAD | 请求读取URL 所标志的信息的首部 |
POST | 给服务器添加信息 |
PUT | 在指明的URL 下存储一个文档 |
DELETE | 删除指明的URL 所标志的资源 |
TRACE | 用来进行环回测试的请求报文 |
CONNECT | 用于代理服务器 |
再看看HTTP响应报文
的特点:
响应报文的状态行
包括:版本
,状态码
,短语
三部分。
短语
用于简单解释状态码,状态码
被分为五大类:
状态码 | 含义 |
---|---|
1xx |
表示通知信息,如请求收到了或正在进行处理 |
2xx |
表示成功,如接受或知道了 |
3xx |
表示重定向,如要完成请求还必须采取进一步的行动 |
4xx |
表示客户的差错,如请求中有错误的语法或不能完成 |
5xx |
表示服务器的差错,如服务器失效无法完成请求 |
比如最经典的404 Not Found
,就属于4xx
。