1. 网页请求流程(分层结构)
输入域名后,首先通过 DNS 域名解析查询 IP 地址,之后经过应用层协议(HTTP),装上协议头,然后经过 Socket 套接字传递给传输层,装上(TCP/UDP)协议头,之后交付给网络层 IP 协议,进行寻址,链路层的 ARP 协议负责 MAC 地址的寻址。
2. HTTP
2.1 POST 支持的编码格式
Content-Type: application/www-form-urlencoded
Content-Type: multipart/form-data
Content-Type: application/json
Content-Type: text/xml
2.2 GET 与 POST
- GET 是幂等操作,所以可以缓存;
- GET 参数在 url 中;
- GET 数据包有大小限制,POST没有限制,而且头部与数据分开传递;
2.3 HTTP 连接管理
- HTTP1.0 与 keep-alived
HTTP1.0 的 keep-alived 是在 TCP 的基础上实现的对 socket 套接字的复用,TCP 的 keep-alived 保活机制底层是靠心跳检测,当 HTTP 开启了 keep-alived 时,就能服用保活的 socket。但是由于 keep-alived 默认不开启,所以可能会出现哑代理的问题,即代理服务器不能识别keep-alived 导致的问题。并且 keep-alived 只能在完成一个请求之后才能接受另一个请求。
- HTTP1.1 与 持久连接
持久连接是默认开启的,支持持久连接的服务器克服了哑代理问题,并且不需要等待上一个请求结束,下一个请求再发送,但是请求仍然是顺序执行的,后面的请求会被前面的耗时请求阻塞
- HTTP2.0 与 多路复用
多路复用的出现解决了上述问题,每一个请求被切割成了多个 ID 相同的帧,相同的帧会在缓存区拼接,拼接好后,通过多路复用机制就能复用 TCP 连接。
2.3 HTTP2.0
多路服务,服务器推送,首部压缩,二进制分帧
2.4 Cookie, Session 与 Token
Cookies可以分为会话Cookie与持久Cookie两类,会话Cookie在退出浏览器时就会删除,持久Cookie会存到磁盘上,Discard参数可以标识会话Cookie,持久Cookie会伴随Max-Age等参数一起使用。Cookie可以通过域信息与路径信息声明其作用范围。
Session是存储在服务器上的对象,客户端可以获得sessionID的钥匙访问该对象,可以通过cookies或者url重写的方式携带sessionID,Java的encodeURL可以实现重写。
Token能克服Cookie和Session在多个服务器上的同步问题。JWT本质是一个储存在客户端的加密josn串,服务端使用盐对其解析。JWT的组成分为头部、荷载和签证,头部是json字符串,声明类型和加密算法,并且储存信息,荷载存储签发方以及存储方信息和过期时间,签证存贮base64加密后的头部、荷载以及secret盐。