2023年11月28日发(作者:)

【软件通信协议】3.详细解析HTTP协议

1. HTTP协议简介

超⽂本传输协议(HTTP,Hyper Text Transfer Protocol)是互联⽹上应⽤最为⼴泛的⼀种⽹络协议。所有的WWW⽂件都必须遵守这个

标准。设计HTTP最初的⽬的是为了提供⼀种发布和接收HTML页⾯的⽅法。

在Web应⽤中,服务器把⽹页传给浏览器,实际上就是把⽹页的HTML代码发送给浏览器,让浏览器显⽰出来。⽽浏览器和服务器之间的传

输协议是HTTP,所以:

HTML是⼀种⽤来定义⽹页的⽂本,会HTML,就可以编写⽹页;

HTTP是在⽹络上传输HTML的协议,⽤于浏览器和服务器的通信。

2. HTTP的主要特点

简单快速:客户向服务器请求服务时,只需传送请求⽅法和路径。请求⽅法常⽤的有GET、HEAD、POST。每种⽅法规定了客户与服

务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模⼩,因⽽通信速度很快。

灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

Web上可⽤的每种资源如HTML⽂档、图像、视频⽚段、程序等都是⼀个来URI来定位的

URI⼀般由三部组成:

①访问资源的命名机制

②存放资源的主机名

③资源⾃⾝的名称,由路径表⽰,着重强调于资源。

URL是uniform resource locator,统⼀资源定位器,它是⼀种具体的URI,即URL可以⽤来标识⼀个资源,⽽且还指明了如何locate这

个资源。

URL是Internet上⽤来描述信息资源的字符串,主要⽤在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。

http是超⽂本传输协议,信息是明⽂传输,https 则是具有安全性的ssl加密传输协议

http和https使⽤的是完全不同的连接⽅式⽤的端⼝也不⼀样,前者是80,后者是443。

http的连接很简单,是⽆状态的

HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议 要⽐http协议安全

HTTPS解决的问题:

a. 信任主机的问题。采⽤https 的server 必须从CA 申请⼀个⽤于证明服务器⽤途类型的证书。该证书只有⽤于对应的server的时候,客

户端才信任该主机。所以⽬前所有的银⾏系统⽹站,关键部分应⽤都是https的。 客户端通过信任该证书,从⽽信任了该主机。其实这样做

效率很低,但是银⾏更侧重安全。这⼀点对我们没有任何意义,我们的server,采⽤的证书不管⾃⼰issue 还是在公众的地⽅issue, 客户端

都是⾃⼰的,所以我们也就肯定信任该server。

当我们在地址栏输⼊时,浏览器将显⽰新浪的⾸页。在这个过程中,浏览器都⼲了哪些事情呢?通过Network的记录,我

们就可以知道。在Network中,定位到第⼆条记录,点击,右侧将显⽰Request Headers,点击右侧的view source,我们就可以看到浏览器

发给新浪服务器的请求:

最主要的头两⾏分析如下,第⼀⾏:

GET / HTTP/1.1

GET表⽰⼀个读取请求,将从服务器获得⽹页数据,/表⽰URL的路径,URL总是以/开头,/就表⽰⾸页,最后的HTTP/1.1指⽰采⽤的

HTTP协议版本是1.1。⽬前HTTP协议的版本就是1.1,但是⼤部分服务器也⽀持1.0版本,主要区别在于1.1版本允许多个HTTP请求复⽤

⼀个TCP连接,以加快传输速度。

从第⼆⾏开始,每⼀⾏都类似于Xxx: abcdefg

Host:

表⽰请求的域名是。如果⼀台服务器有多个⽹站,服务器就需要通过Host来区分浏览器请求的是哪个⽹站。

继续往下找到Response Headers,点击view source,显⽰服务器返回的原始响应数据:

HTTP响应分为Header和Body两部分(Body是可选项),我们在Network中看到的Header最重要的⼏⾏如下:

200 OK

200表⽰⼀个成功的响应,后⾯的OK是说明。失败的响应有404 Not Found⽹页不存在,500 Internal Server Error:服务器内部出

错,等等。

Content-Type: text/html

HTTP响应的Body就是HTML源码,我们在页⾯上右键查看HTML源码:

当浏览器读取到新浪⾸页的HTML源码后,它会解析HTML,显⽰页⾯,然后,根据HTML⾥⾯的各种链接,再发送HTTP请求给新浪

服务器,拿到相应的图⽚、视频、Flash、JavaScript脚本、CSS等各种资源,最终显⽰出⼀个完整的页⾯。所以我们在Network下⾯能看

到很多额外的HTTP请求。

6.1 HTTP请求

跟踪了新浪的⾸页,我们来总结⼀下HTTP请求的流程:

步骤1:浏览器⾸先向服务器发送HTTP请求,请求包括:

⽅法:GET还是POSTGET仅请求资源POST会附带⽤户数据;

路径:/full/url/path

域名:由Host头指定:Host:

以及其他相关的Header;

如果是POST,那么请求还包括⼀个Body,包含⽤户数据。

步骤2:服务器向浏览器返回HTTP响应,响应包括:

响应代码:200表⽰成功,3xx表⽰重定向,4xx表⽰客户端发送的请求有错误,5xx表⽰服务器端处理时发⽣了错误;

响应类型:由Content-Type指定,例如:Content-Type: text/html;charset=utf-8表⽰响应类型是HTML⽂本,并且编码是UTF-

8Content-Type: image/jpeg表⽰响应类型是JPEG格式的图⽚;

以及其他相关的Header;

通常服务器的HTTP响应会携带内容,也就是有⼀个Body,包含响应的内容,⽹页的HTML源码就在Body中。

步骤3:如果浏览器还需要继续向服务器请求其他资源,⽐如图⽚,就再次发出HTTP请求,重复步骤1、2。

Web采⽤的HTTP协议采⽤了⾮常简单的请求-响应模式,从⽽⼤⼤简化了开发。当我们编写⼀个页⾯时,我们只需要在HTTP响应中

把HTML发送出去,不需要考虑如何附带图⽚、视频等,浏览器如果需要请求图⽚和视频,它会发送另⼀个HTTP请求,因此,⼀个HTTP

请求只处理⼀个资源。

6.2 HTTP格式

每个HTTP请求和响应都遵循相同的格式,⼀个HTTP包含Header和Body两部分,其中Body是可选的。

HTTP协议是⼀种⽂本协议,所以,它的格式也⾮常简单。HTTP GET请求的格式:

GET /path HTTP/1.1

Header1: Value1

Header2: Value2

Header3: Value3

每个Header⼀⾏⼀个,换⾏符是rn。

HTTP POST请求的格式:

POST /path HTTP/1.1

Header1: Value1

Header2: Value2

Header3: Value3

body data

当遇到连续两个rn时,Header部分结束,后⾯的数据全部是Body。

HTTP响应的格式:

200 OK

Header1: Value1

Header2: Value2