前段时间为了研究计算机网络,看了看《计算机网络自顶向下方法》这本书。不得不说这真是一本好书,内容详细,而且讲解的浅显易懂,采用了大量类比的方式进行讲解,而不是单纯的叙述理论,同时在每一章的后面都有大量的练习题以及很有意思的编程题,所以开头先来推荐一波。这本书我暂时只看到了第二章,刚看完HTTP的内容,所以写一篇HTTP相关的博客,就当是记笔记了。
二、详解 2.1 HTTP概述
HTTP是一个应用层的协议,全称是超文本传输协议,它是web的核心。HTTP由两个程序实现——客户端程序和服务端程序,而HTTP的作用简单来说就是客户端向服务器发请求,而服务器根据请求做出响应。HTTP定义了Web客户端向服务器请求资源的方式,以及Web服务器向客户端回送资源的方式,也就是HTTP的请求+响应模型。客户端向服务器发送请求报文请求资源,服务器接收到请求,向客户端回送包含这些资源的响应报文。
HTTP基于TCP协议,由TCP协议支持数据的传输,这说明HTTP协议是一个面向连接的可靠协议。当客户端向服务器请求资源时,首先将与服务器建立一个TCP连接,当TCP连接建立成功时,客户端和服务器之间就可以通过套接字接口访问TCP,客户端通过TCP连接传输请求报文,而服务器也通过这个TCP连接回送响应报文及资源。由于TCP的可靠传输,保证了HTTP的报文一定能够完整的送到服务器上,而服务器的响应也能完整的回送到客户。
HTTP请求的资源一般是一个Web页面,而一个Web页面是由一个或多个对象组成的,这个对象可能是一个html文件,一张图片,甚至是一段视频或者小程序。对于HTTP来说,组成一个Web页面的这些对象并不属于同一个资源,每一个对象都是一个单独的资源,需要逐一请求。假设我们向服务器请求一个Web页面,这个页面由一个html文件以及5张图片组成(html通过路径引用图片),则这个页面共有6个对象,当服务器接收到客户端对页面的请求后,将html文件通过响应报文返回,而客户端接收到响应的html文件后,发现它还引用了5张图片,这时客户端将再次发送5个HTTP请求,来分别请求这5张图片。
服务器向客户端发送被请求的文件,但是不记录任何客户的信息,所以当你连续向服务器请求同一份资源两次时,服务器也会给你响应两次,不会因为你已经请求过就不给你响应了。正是因为HTTP不记录客户的信息,所以它也是一个无状态协议。
2.2 非持续连接和持续连接的HTTP
大多数情况下,我们对Web服务器发出请求时,都不止发出一个请求,比如上面说到的包含5张图片的页面。那这个时候就需要考虑一个问题,对于这多次目的地相同的请求/响应,HTTP是对每一个请求/响应使用同一个TCP连接,还是每次请求单独创建一个TCP连接呢?这里就分两种情况,多次请求/响应使用同一个TCP连接的被称为持续连接,而每个请求/响应单独使用一个TCP连接,则被称为非持续连接。而HTTP默认使用的是持续连接,但是也可以通过配置,改用非持续连接。下面就来简单说一说两者的区别。
(1)非持续连接
非持续连接表示对于每一个请求/响应,都将单独建立一个TCP连接来进行。假设我们还是以之前说过的例子来讲解:我们向服务器请求一个包含5张图片的页面,而页面的路径假设就是(这是我的个人服务器,目前部署了一个制作简单的小游戏),当我们请求这个路径时,将发生以下情况:
HTTP客户进程通过80端口向服务器发起一个TCP连接,80端口时HTTP的默认端口;
HTTP客户进程通过套接字向服务器发送一个请求报文,请求资源的路径为/index.html;
HTTP服务器进程通过套接字接收到该请求,从它的存储器(如:RAM)中搜索这个资源,生成一份响应报文,并将html页面封装进响应报文中,并通过套接字将此报文回送给客户端;
HTTP服务器通知TCP断开连接(但是直到TCP确认客户端已经接收到完整的报文后,才会将连接断开);
HTTP客户进程完整的接收到响应报文好,TCP连接断开。客户端解析响应报文后,发现封装的对象是一个html文件,且html文件包含5张图片的引用;
重复上面步骤1-4,请求页面包含的5张图片;