HTTP是应用层协议
联网细节交给了通用的传输协议:TCP/UDP
请求/响应报文
<method> <request-URL> <version>
<headers>
<entity-body>
<version> <status> <respon-phrase>
<headers>
<entity-body>
状态码 | 描述 |
---|---|
101 | 切换协议,如:将 HTTP 协议切换为 WebSocket 协议 |
200 | 成功 |
206 | 返回部分内容,如:大文件下载 |
301 | 永久重定向,如:资源更换路径或改名 |
302 | 临时重定向,如:当前请求需要登录,临时跳转到登录页 |
304 | 资源未修改,不返回实体内容,客户端可直接读取本地缓存内容 |
400 | 错误请求 |
403 | 拒绝执行,如:无对应的访问权限 |
404 | 资源找不到,如:服务器已经删除该资源 |
413 | 请求实体过大,如:服务端限制了上传的文件大小 |
500 | 服务端内部错误,如:数据处理异常导致报错 |
502 | 作为网关或代理服务器时,上游服务器异常 |
504 | 作为网关或代理服务器时,上游服务器处理超时 |
URL:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
http://<host>:<port>/<path>?<query>#<frag>
ftp://<user>:<password>@<host>:<port>/<path>;<params>
受限字符:%/.#?;:$+@&= 以及非US-ASCⅡ字符集字符
Header 分类
通用
- Date: Tue, 3 Oct 2019 02:16:00 GMT
- Connection: close
请求
- User-Agent: Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
- Accept: */*
响应
- Server: Nginx
- Last-Modified: Thu, 16 Oct 2019 10:15:16 GMT
实体
- Content-Type: text/html; charset=utf-8
- Content-Length: 100
扩展(自定义)
- X-Powered-By: thinkjs-3.0.4
- X-Cache: hit
Cookie
GET / HTTP/1.1
Host: m.so.com
Connection: keep-alive
Cookie: __guid=34870781.3073803881376862000
HTTP/1.1 200 OK
Server: nginx/1.2.9
Date: Wed, 08 Oct 2014 05:59:59 GMT
Connection: keep-alive
Set-Cookie: thinkjs=s4mhqotbdbg9uh917lu8d5bub5; path=/
Content-Encoding: gzip
Set-Cookie: <name>=<value>[; <name>=<value>]... [; expires=<date>][; domain=<domain_name>] [; path=<some_path>][; secure][; httponly][; samesite=<samesite_value>]
响应头里也可以有多个 Set-Cookie
Cookie安全策略
- path
- domain (hostonly*)
- expires (max-age)
- secure
- httponly
- SameSite
- XSS 漏洞盗取 Cookie,设置 httponly
- CSRF 漏洞,设置 token/samesite
Session
- 服务器侧对应为 Session,基于 Cookie 存放用户信息
- Cookie 有效期为 Session(随浏览器进程退出而失效)
性能优化
1.keep-alive
- HTTP 1.0 原本不支持 Keep-Alive,后来扩充了 Connection: Keep-Alive
- HTTP 1.1 默认支持 Keep-Alive,除非显式指明 Connection: close
- 2.减少网络传输大小
3.缓存
- LocalStorage
- ServiceWorker
http2/http3
http2:
- 二进制传输
- 多路复用
- 头部压缩
- server push
http3:
基于 QUIC 协议(UDP)