HTTP
HTTP 是什么
HTTP 全称为"超文本传输协议".
HTTP不仅仅能传输文本,还能传输图片,传输音频文件,传输其他的各种数据.
因此它广泛应用在日常开发的各种场景中.
HTTP 往往是基于传输层的 TCP 协议实现的.
- HTTP1.0 , HTTP1.1 , HTTP2.0 均为 TCP.
- HTTP3 基于 UDP 实现.
目前互联网上见到的 HTTP 协议,绝大部分都是 HTTP/1.1 版本.
因为 1.1 版本就足够好用了,升级到 2.0 成本比较高(浏览器/服务器的兼容性),带来的收益有限.
有点 IPv6 的感觉~
HTTP 协议,是一种典型的"一问一答"的协议.
- 客户端发一个请求,服务器返回一个响应(一一对应)
HTTP 协议抓包
借助抓包工具,我们可以观察到 HTTP 请求/响应 的详细情况.
PS: TCP/UDP 也是可以抓包的.
抓包: 把通过网卡上的数据,获取到,并且解析出来.
代理 又分为正向代理和反向代理.
举个例子:
fiddle 用法
fiddle 用法.
只要启动 fiddle,此时,抓包工作就自动开始了~
fiddle 开启后,会多一层处理,就可能导致你打开其他网页比较慢~
-
左侧是抓到的 HTTP 数据报的列表.
-
点击某一项,右侧就能看到请求和响应的详细情况.
右上方是请求的详情.右下方是相应的详情.
两排标签页:
响应这里打开,看到的是二进制.(本身相应也是文本,此处的二进制,是压缩后的)为啥要压缩呢?
答: 体积小了,传输时消耗的带宽就低了,带宽是互联网中最贵的硬件资源,比 cpu,内存都要贵~
raw 标签页就是 HTTP 的原始数据.
发送 HTTP 请求就是往 TCP socket 中,按照上述格式,写入一段字符串.
收到 HTTP 响应,就是从 TCP socket 中,读出一段字符串再解析~
HTTP 请求响应基本格式
以下是一个HTTP请求/相应的抓包结果.
HTTP请求:
- 首行: [方法] + [URL] + [版本]
方法: 这次请求的"动作"是啥.
URL: 访问的资源是啥.
版本号: 在上图中是 HTTP/1.1 - 请求头(Header): 从第二行开始的若干行,一直到空行结束. 表示请求的属性,
:空格
分隔的键值对; 每组属性之间使用\n
分割; - Body: 空行后面的内容都是 Body. Body 允许为空字符串.如果 Body 存在,则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度.
HTTP 一般来说,GET 往往是不带 Body. POST 往往是带 Body 的.
HTTP 响应:
HTTP 响应的基本格式也是四个部分~
- 首行:
首行的三个部分,使用空格分隔.(请求也是如此) - 响应头(Header) : 键值对.每行是一个键值对,不确定有几行,以
空行
结尾. 键 与 值 之间使用:空格
分隔. - 空行
- 正文
对于相应来说,正文通常是 HTML/CSS/JS/JSON/图片/音频/字体…