HTTP
HTTP是什么
HTTP(全称为"超⽂本传输协议")是⼀种应⽤⾮常⼴泛的应⽤层协议.


目前:最新的HTTP3版本也正在完善中,⽬前Google/Facebook等公司的产品已经⽀持.
HTTP往往是基于传输层的TCP协议实现的.(HTTP1.0,HTTP1.1,HTTP2.0均为TCP,HTTP3基于 UDP实现) ⽬前我们主要使⽤的还是HTTP1.1和HTTP2.0
我们平时打开⼀个⽹站,就是通过HTTP协议来传输数据的.

当我们在浏览器中输⼊⼀个搜狗搜索的"⽹址"(URL)时,浏览器就给搜狗的服务器发送了⼀个HTTP 请求,搜狗的服务器返回了⼀个HTTP响应.
这个响应结果被浏览器解析之后,就展⽰成我们看到的⻚⾯内容.(这个过程中浏览器可能会给服务器发 送多个HTTP请求,服务器会对应返回多个响应,这些响应⾥就包含了⻚⾯HTML,CSS,JavaScript,图 ⽚,字体等信息).
所谓"超⽂本"的含义,就是传输的内容不仅仅是⽂本(⽐如html,css这个就是⽂本),还可以是⼀些其 他的资源,⽐如图⽚,视频,⾳频等⼆进制的数据.
理解"应⽤层协议"
我们已经学过 TCP/IP ,已经知道⽬前数据能从客⼾端进程经过路径选择跨⽹络传送到服务器端进程 [ IP+Port ].
可是,仅仅把数据从A点传送到B点就完了吗?
这就好⽐,在淘宝上买了⼀部⼿机,卖家[客⼾端]把⼿机通过顺丰[传送+路径选择]送到买家[服务 器]⼿⾥就完了吗? 当然不是,买家还要使⽤这款产品,还要在使⽤之后,给卖家打分评论。
所以,我们把数据从A端传送到B端, TCP/IP 解决的是顺丰的功能,⽽两端还要对数据进⾏加⼯处理 或者使⽤,所以我们还需要⼀层协议,不关⼼通信细节,关⼼应⽤细节!
这层协议叫做应⽤层协议。⽽应⽤是有不同的场景的,所以应⽤层协议是有不同种类的,其中经典协 议之⼀的HTTP就是其中的佼佼者.
再回到我们刚刚说的买⼿机的例⼦,顺丰相当于 TCP/IP 的功能,那么买回来的⼿机都附带了说明 书【产品介绍,使⽤介绍,注意事项等】,⽽该说明书指导⽤⼾该如何使⽤⼿机【虽然我们都不看, 但是⽗⺟辈有部分是有看说明书的习惯的:)】,此时的说明书可以理解为⽤⼾层协议
理解HTTP协议的⼯作过程
当我们在浏览器中输⼊⼀个"⽹址",此时浏览器就会给对应的服务器发送⼀个HTTP请求.对⽅服务器 收到这个请求之后,经过计算处理,就会返回⼀个HTTP响应.

事实上,当我们访问⼀个⽹站的时候,可能涉及不⽌⼀次的HTTP请求/响应的交互过程. 可以通过chrome的开发者⼯具观察到这个详细的过程.
通过F12打开chrome的开发者⼯具,切换到Network标签⻚.然后刷新⻚⾯即可看到如 下图效果.每 ⼀条记录都是⼀次HTTP请求/响应

HTTP协议格式
HTTP是⼀个⽂本格式的协议.可以通过Chrome开发者⼯具或者Fiddler抓包,分析HTTP请求/响应 的细节.
抓包⼯具的使⽤
以Fiddler为例.(下载地址:https://www.telerik.com/fiddler/)
抓包⼯具的原理
Fiddler相当于⼀个"代理".
浏览器访问sogou.com时,就会把HTTP请求先发给Fiddler,Fiddler再把请求转发给sogou的服务 器.当sogou服务器返回数据时,Fiddler拿到返回数据,再把数据交给浏览器.
因此Fiddler对于浏览器和sogou服务器之间交互的数据细节,都是⾮常清楚的.

抓包结果
以下是⼀个HTTP请求/响应的抓包结果.
HTTP请求

• ⾸⾏:[⽅法]+[url]+[版本]
• Header:请求的属性,冒号分割的键值对;每组属性之间使⽤\n分隔;遇到空⾏表⽰Header部分结束
• Body:空⾏后⾯的内容都是Body.Body允许为空字符串.如果Body存在,则在Header中会有⼀个 Content-Length属性来标识Body的⻓度;
HTTP响应

• ⾸⾏:[版本号]+[状态码]+[状态码解释]
• Header:请求的属性,冒号分割的键值对;每组属性之间使⽤\n分隔;遇到空⾏表⽰Header部分结束
• Body:空⾏后⾯的内容都是Body.Body允许为空字符串.如果Body存在,则在Header中会有⼀个 Content-Length属性来标识Body的⻓度;如果服务器返回了⼀个html⻚⾯,那么html⻚⾯内容就是 在body中.
协议格式总结

为什么HTTP报⽂中要存在"空⾏"?
因为HTTP协议并没有规定报头部分的键值对有多少个.空⾏就相当于是"报头的结束标记",或者是 "报头和正⽂之间的分隔符".
HTTP在传输层依赖TCP协议,TCP是⾯向字节流的.如果没有这个空⾏,就会出现"粘包问题".