协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。HTTP(超文本传输协议) 是一种详细规定了浏览器和万维网(WWW)服务器之间相互通信的规则,通过因特网传送万维网文档的数据传送协议。HTTP协议可以使浏览器更加高效地运行,使网络传输效率更高。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的那一部分内容首先显示(如文本先于图形)。
HTTP由于其灵活、简单、快速的特点,应用非常广泛。浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地,比如常用的QQ、迅雷这些软件,都使用了HTTP协议。
浏览器背后的故事
当我们在浏览器地址栏上输入要访问的URL后,浏览器会分析出URL上面的域名,然后通过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通信,而通信的协议就是HTTP协议。
我们可以把这个过程类比成一个电话对话的过程。当我们要打电话给某个人,首先要知道对方的电话号码,然后进行拨号。打通电话后我们会进行对话,当然要对话肯定需要共同的语言,如果一个人说国语,而另一个人说英语,那肯定不能进行沟通的。在本例中,电话号码相当于上面的IP地址,而共同语言相当于HTTP协议。
我们通过一个简单的图来阐述这个过程:
![](https://img-blog.csdnimg.cn/20190620213920370.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgxOTE5Nw==,size_16,color_FFFFFF,t_70)
1 HTTP协议的工作流程
在网络七层模型中, HTTP 是在应用层,也就是在传输层以上。事实上, HTTP 是基于TCP 协议的;而我们常说的 HTTPS 协议,则是同处应用层而基于TLS 、SSL 协议层之上的协议,两者的区别如下图所示。
![](https://img-blog.csdnimg.cn/20190620212519952.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzgxOTE5Nw==,size_16,color_FFFFFF,t_70)
HTTP 默认的端口号为80
, HTTPS 的默认端口号则为443
。
HTTP
是基于传输层的 TCP
协议,而 TCP
是一个端到端的面向连接的协议。所谓的‘端到端”可以理解为进程到进程之间的通信,所以 HTTP
在开始传输之前,首先需要建立 TCP 连接,而 TCP 连接的过程需要进行“三次握手”,在 TCP 三次握手之后,建立了 TCP 连接,此时 HTTP 就可以进行传输了。在 HTTP 1.1 中(通过Connection 头设置)默认在HTTP 传输完成后不断开TCP 连接。在此之前的版本 HTTP 则默认是断开连接,也就是同一个客户端的这次请求和上次请求是没有对应关系的。
一次HTTP 操作称为一个事务,其工作过程可分为以下4 步。
- 首先客户机与服务器需要建立连接。只要单击某个超级链接, HTTP 的工作即开始。
- 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符 (URL )、协议版本号,后边是MIME
信息(包括请求修饰符、客户机信息和可能的内容)。 - 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息(包括服务器信息、实体信息和可能的内容) 。
- 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与 服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,由显示屏输出。对于用户来说,这些过程是由HTTP 自己完成的,用户只要用鼠标操作, 等待信息显示就可以了。
2 HTTP协议结构
HTTP 协议无论是请求报文还是回应报文,都分为以下4 个部分。
- 报文头,上面的例子中的“ GET http:// www.baidu .com/favicon.icoHTTP/1.1 ”表示用 GET 方法请求http://www.baidu.com/favicon.ico这个文件,用的是 HTTP/1.1 协议。
- 0个或者多个请求头(header line),例如:Accept-Language:en
- 空行(作为header lines的结束)
- 可选的消息体
HTTP 协议是基于行的协议
,每一行以 \r\ n 作为分隔符。报文头通常表明报文的类型(例如请求类型),且报文头只占一行;请求头附带一些特殊信息,每一个请求头占一行,其格式为name:value ,即以分号作为分隔; 空行也就以一个 \r\n 分隔;可选body 通常包含数据,例如服务器返回的某个静态 HTML 文件的内容。
2.1 HTTP请求报文
http请求由三部分组成,分别是:请求行、消息报头、请求正文
请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本,格式如下:
Method Request-URI HTTP-Version CRLF
其中 Method
表示请求方法;Request-URI 是一个统一资源标识符;HTTP-Version 表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据 HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT保留将来使用 OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
常用的请求头:
- Accept:浏览器可接受的媒体类型;
- Accept-Language:浏览器所希望的语言种类;
- Accept-Encoding:浏览器能够解码的编码方法,如gzip,deflate等;
- User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本;
- Connection:表示是否需要持久连接,Keep-Alive表示长连接,close表示短链接
2.2 HTTP响应报文
HTTP响应主要有:响应行,响应报头,实体报头组成
header和body之间有一个空行(CRLF)
状态相应码:
- 1XX 提示信息 - 表示请求已经被成功接收,继续处理
- 2XX 成功 - 表示请求已经被成功接收,理解,接受
- 3XX 重定向 - 要完成请求必须进行更进一步的处理
- 4XX 客户端错误 - 请求有语法错误或者请求无法实现
- 5XX 服务器端错误 - 服务器执行一个有效请求失败