这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
HTTP
Hypertext Transfer Protocol (HTTP) 是一应用层协议,用于超媒体文档的传输,如HTML。虽然http被设计为在浏览器与服务端之间沟通,但是也可以被用于其它用途。值得注意的是,HTTP是一个无状态的协议,这意味着server端并不会在请求间保留任何状态。(cookie不是带有状态吗?难道cookie不属于协议本身?)其实HTTP is stateless, but not sessionless即cookies提供了在session中保持状态的能力,通过配置http header即可实现。
HTTP流
一个http的流程通常有以下4个步骤:
- 建立一个TCP连接:
TCP属于传输层协议,TCP连接用于发起请求以及接受请求,客户端需要创建一个新请求或复用原有请求。
- 发送HTTP请求
http请求报文包括请求行,请求头部,空行和请求数据4部分组成。其中请求行由请求方法、URL字段,HTTP协议版本字段3个字段组成,并由空格分隔。如: GET /index.html HTTP/1.1。请求头部由键值对组成。
值得一提的是,对于http/2来说,请求报文并非human-readable,因为http/2采用了二进制分帧,将简单的报文封装为frame。
- 解析服务器响应
http请求报文包括状态行,消息报头,空行和响应正文4部分组成。其中状态行由HTTP协议版本字段、状态码, 状态码字段3个字段组成,并由空格分隔。如: HTTP/1.1 200 OK。请求头部由键值对组成,剩余部分都与请求报文格式相似。
- 关闭或者复用连接
browser http
浏览器提供了内置的API用于发起http请求。比较古老的是XMLHttpRequest API。
const req = new XMLHttpRequest();
req.addEventListener("load", reqListener);
req.open("GET", "http://www.example.org/example.txt");
req.send();
Fetch API是一个相对比较新的API
fetch('http://example.com/movies.json')
.then((response) => response.json())
.then((data) => console.log(data));
与XMLHttpRequest 相比,Fetch省去了open, send, close等步骤,更符合声明式编程的思想,也更为简单易用。
总结
应用层协议并非只有http这一种选择,wx、qq等均有自己自研的协议,可能是出于安全考虑或是http功能存在不足的地方。但http协议也在不断进步,HTTP/3与前任不同,采用了基于UDP协议的QUIC实现,可以预想,网络传输速度或将迎来一次飞跃。