通常所谓的万维网WWW(World Wide Web),并非某种特殊的计算机网络。万维网是一个大规模的、联机式的信息储藏所,英文简称为Web。万维网用链接的方法能非常方便的从互联网上的一个站点访问另一个站点,也就是所谓的“链接到另一个站点”,从而主动地按需获取丰富的信息。正是由于万维网的出现,使互联网从仅由少数计算机专家使用变为普通百姓也能利用的信息资源。万维网的出现使网站数按指数规律增长。因此,万维网的出现是互联网发展中一个非常重要的里程碑。
万维网是一个分布式的超媒体系统,它是超文本系统的扩充。所谓超文本是指包含指向其他文档的链接的文本。也就是说,一个超文本由多个信息源链接而成,而这些信息源可以分布在世界各地,并且数目也是不受限制的。利用一个链接可以找到远在异地的另一个文档,而这又可以链接到其他的文档。这些文档可以位于世界上任何一个接在互联网上的超文本系统中。超文本是万维网的基础。
超媒体与超文本的区别是文档内容不同。超文本文档仅包含文本信息,而超媒体文档还包含其他方式的信息,如图形、图像、声音、动画以及视频图像等。
万维网以客户服务器的方式工作。平时所说的浏览器就是在用户机上的万维网客户程序,万维网文档所驻留的主机则运行服务器程序,因此这台主机也称为万维网服务器。客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档。在一个客户程序主窗口上显示出的万维网文档称为页面。
万维网的出现必须解决以下几个问题:
(1)怎样标志分布在整个互联网上的万维网的文档?
(2)用什么样的协议来实现万维网上的各种链接?
(3)怎样使不同作者创作的不同风格的万维网文档都能在互联网上的各种主机上显示出来,同时使客户清楚地知道在什么地方存在着链接?
(4)怎样使用户能够很方便地找到所需要的信息?
为了解决第一个问题,万维网使用统一资源定位符URL(Uniform Resource Locator)来标记万维网上的各种文档,并使每一个文档在整个互联网的范围内具有唯一的标识符URL。为了解决第二个问题,就要使万维网客户程序与万维网服务器程序之间的交互遵守严格的协议,这就是超文本传输协议HTTP(HyperText Transfer Protocol)。HTTP是一个应用层协议,它使用TCP连接进行可靠的传送。为了解决第三个问题,万维网使用超文本标记语言HTML(HyperText Markup Language),使得万维网页面的设计者可以很方便的用链接从本页面的某处链接到互联网上的任何一个万维网页面,并且能够在自己的主机屏幕上将这些页面显示出来。最后,用户可以使用搜索工具来方便地找到所需要的信息。
HTTP的操作过程
HTTP定义了浏览器(即万维网客户端进程)怎样向万维网服务器请求万维网文档,以及服务器是如何把文档传送给浏览器。从层次的角度来看,HTTP是面向事务的应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。但需要主义的是,HTTP不仅传送完成超文本跳转所必需的信息,而且也传送任何可以从互联网上得到的信息,如文本、超文本、声音和图像等。
万维网的大致工作过程如下(图片来源于网络):
每个万维网网点都有一个服务器进程,它不断地监听TCP地端口80,以便发现是否有浏览器向它发出连接建立请求。一旦监听到连接建立请求并建立了TCP连接之后,浏览器就像万维网服务器发出浏览器某个页面的请求,服务器接着就返回所请求的页面作为响应。最后,TCP连接就被释放了。在浏览器和服务器之间的请求和响应的交互必须按照规定的格式和遵循一定的规则。这些格式和规则就是超文本传送协议HTTP。
HTTP规定在HTTP客户与HTTP服务器之间的每次交互都由一个ASCII码串构成的请求和一个类似的通用互联网扩充,即“类MIME(MIME-like)”的响应组成。HTTP报文通常都使用TCP连接传送。
用户浏览页面的方法有两种。一种是在浏览器的地址窗口中键入所要找的页面的URL。另一种方法是在某一个页面中用鼠标点击一个可选部分,这时浏览器会自动在互联网上找到所要链接的页面。HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP本身是无连接的。这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要建立HTTP连接。HTTP是无状态的,也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时相同,因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP的无状态特征简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
那么,从服务器请求一个万维网文档到收到整个文档所需要的时间是多少呢?用户在点击鼠标链接某个万维网文档时,HTTP协议首先要和服务器建立TCP连接。这需要使用三次握手。当建立TCP连接的三报文握手的前两部分完成后(即经过了一个RTT时间后),万维网客户就把HTTP请求报文作为建立TCP连接的三报文握手中的第三个报文的数据,发送给万维网服务器。服务器收到HTTP请求报文后就把请求中的文档作为响应报文返回给客户。
从上图(来自网络)可以看出,请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间RTT(一个RTT用于连接TCP连接,另一个RTT用于请求和接收万维网文档。TCP建立连接的三报文握手的第三个报文段中的数据,就是客户对万维网文档的请求报文)。
HTTP/1.0的主要缺点就是每请求一个文档就要有两倍RTT的开销。若一个主页上有很多链接的对象需要依次进行链接,那么每一次链接下载都导致2 * RTT的开销。另一种开销就是万维网客户和服务器每一次建立新的TCP连接都要分配缓存和变量。特别是万维网服务器往往要同时服务器大量客户的请求,所以这种非持续连接会使万维网服务器的负担很重。好在浏览器都能够同时打开5~10个并行的TCP连接,而每一个TCP连接处理客户的一个请求。因此,使用并行TCP连接可以缩短响应时间。
HTTP/1.1协议较好地解决了这个问题,它使用了持续连接。所谓持续连接就是万维网服务器在发送响应之后仍然在一段时间内保持这条连接,使同一个客户和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行。目前一些流行的浏览器的默认设置就使用了HTTP/1.1。
HTTP/1.1协议的持续连接有两种工作方式,即非流水线方式和流水线方式。非流水线方式的特点是,客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT。这比非持续连接要用去两倍RTT的开销节省了建立TCP连接所需的一个RTT的时间。但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。流水线方式的特点是,客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需花费一个RTT时间。流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档的效率。
HTTP的报文结构
HTTP有两类报文:
(1)请求报文:从客户向服务器发送请求报文。
(2)响应报文:从服务器到客户的回答。
![](https://i-blog.csdnimg.cn/blog_migrate/f37f54f08a0e82ff14e5636305f84697.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9a1f3fda61efc8368e1db807d08a3472.png)
由于HTTP使面向文本的,因此在报文中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的。HTTP请求报文和响应报文都是由三个部分组成的。可以看出,这两种报文格式的区别就是开始行不同。
(1)开始行:用于区分使请求报文还是响应报文。在请求报文中的开始行叫做请求行,而在响应报文中的开始行叫做状态行。在开始行的三个字段之间都以空格分隔开,最后的“CR”和“LF”分别代表“回车”和“换行”。
(2)首部行:用来说明浏览器、服务器或报文主体的一些信息。首部可以有很多行,但也可以不使用。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。整个首部行结束时,还有一行空行将首部行和后面的实体主体分开。
(3)实体主体:在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。
请求报文的第一行“请求行”只有三个内容,即方法、请求资源的URL以及HTTP的版本。方法是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的。请求报文中常用的几种方法有:
HTTP请求报文的一些方法
方法 | 意义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求读取由URL所标志的信息 |
HEAD | 请求读取由URL所标志的信息的首部 |
POST | 给服务器添加信息(例如注释等) |
PUT | 在指明的URL下存储一个文档 |
DELETE | 删除指明的URL所标志的资源 |
TRACE | 用来进行回环测试的请求报文 |
CONNECT | 用于代理服务器 |
HTTP的请求报文的开始行的格式为:(GET后有一个空格,接着是某个完整的URL,后面也有一个空格,最后是HTTP/1.1)
GET http://www.xyz.edu.cn/dir/index.htm HTTP/1.1
以下给出一个完整的HTTP请求报文的例子:
GET /dir/index.htm HTTP/1.1 请求行使用了相对URL
Host:www.xyz.edu.cn 此行是首部行的开始,这行给出主机的域名
Connection:close 告诉服务器发送完请求的文档后就可释放连接
User-Agent:Mozilla/5.0 表明用户代理是使用火狐浏览器Firefox
Accept-Language:cn 表示用户希望优先得到中文版本的文档
请求报文的最后还有一行空行
在请求行使用了相对URL(即省略了主机的域名)是因为下面的首部行(第2行)给出了主机的域名。第3行是告诉服务器不使用持续连接,表示浏览器希望服务器在传送完所请求的对象后即刻关闭TCP连接。这个请求报文没有实体主体。
HTTP响应报文的主要特点有:
每一个请求报文发出后都能够收到一个响应报文。响应报文的第一行就是状态行。
状态行包括三行内容,即HTTP的版本、状态码以及解释状态码的简单短语。
状态码都是三位数字的,分为5大类。
1xx表示通知消息,如请求收到了或正在进行处理。
2xx表示成功,如接受或知道了。
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行get方法,相应报文中通过Content-Range指定范围的资源。
3xx表示重定向,如要完成请求还必须采取进一步的行动。
301:永久重定向
302:临时重定向
303:与302相似,只不过它希望客户端在请求一个URL的时候,能通过get方法重定向到另一个URL上。
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302相似,只是强制要求使用post方法
4xx表示客户的差错,如请求中有错误的语法或不能完成。
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
5xx表示服务器的差错,如服务器失效无法完成请求。
500:服务器内部错误
503:服务器正忙
在响应报文中常见的三种状态行有:
HTTP/1.1 202 Accepted 接受
HTTP/1.1 400 Bad Request 错误的请求
HTTP/1.1 404 Not Found 找不到
若请求的网页从http://www.ee.xyz.edu/index.html转移到了一个新的地址,则响应报文的状态行和一个首部行就是下面的形式:
HTTP/1.1 3.1 Moved Permanently 永久性地转移了
Location:http://www.xyz.edu/ee/index.html 新的URL
HTTP1.0、HTTP1.1、HTTP2.0的特点
HTTP1.0即平时所说的HTTP:
(1)支持客户/服务器模式
(2)简单快速:客户端向服务器发送请求时,只需传送请求方法和路径,通信速度很快。
(3)灵活:HTTP允许传输任意类型的数据对象。
(4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后即断开连接。采用这种方式可以节省传输时间。
(5)无状态:HTTP协议是无状态协议。无状态是指对于事务的处理没有记忆功能,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,导致每次连接传送的数据量增大。缺点是不够安全。
HTTP1.1的特点:
(1)默认持久连接,节省通信量,只要客户端或服务端任意一方没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求。
(2)管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应。
(3)断点续传。
HTTP2.0的特点:
(1)HTTP2.0采用二进制格式而非文本格式。
(2)HTTP2.0是完全多路复用的,而非有序并阻塞的,只需要一个HTTP连接就可以实现多个请求响应。
(3)使用报头压缩,HTTP2.0降低了开销。
(4)HTTP2.0让服务器可以将响应主动推送到客户端缓存中。
HTTP和HTTPS的区别
(1)http是超文本传输协议,是明文传输。https则是在http的基础上加上了SSL的安全加密传输协议。
(2)http的连接很简单,是无状态的。https协议是经过SSL协议构建的加密传输,身份认证的网络协议,比http协议安全。
(3)https协议需要申请CA证书,一般情况下,CA证书是需要收费的。
(4)https和http的连接方式和采用的端口不同。http默认80端口,https默认443端口。http是无连接的,https采用长连接的方式。