阅读 |《图解HTTP》
{\{< neodb "https://neodb.social/book/3BVOzAS5pkNSWDfRT5CMkn" >}\}
阅读笔记,讲得比较浅,结构有点散,但还是收获了一些
HTTP 协议
用于服务端和客户端之间的通信
// 请求报文:
// 请求方法 + uri + 协议版本 + [请求首部字段] + 内容实体
// 请求头 + 请求行 + 请求体,每一部分用换行符区分
GET /index.htm HTTP/1.1
Host:hackr.ip
- HTTP 是一种无状态 stateless 协议,状态交给 cookie etc.
Cookie
使用 cookie 进行状态管理,通过在请求、响应报文中添加 cookie 信息控制客户端的状态
- cookie 产生于服务端,包含在发送给客户端的 header 里的 set-cookie 字段
- 客户端根据 set-cookie 保存一段纯文本信息
- 再次向服务端发请求时,请求报文会带上这个 cookicookie
- 服务端接收到 cookie 和服务端记录对比,得到之前的状态信息
为 Cookie 服务的头部字段见 [[HTTP#Cookie 相关字段]]
用 Cookie 管理 Session(会话)
Set-Cookie:<Session-ID>
Ajax
解决 HTTP 的缺点:
- 1 条链接上只能发一个请求
- 头部未经压缩就发送,头部信息越多延迟越大
- 请求只能从客户端开始,客户端不能接收响应以外的指令
核心 API:XMLHttpRequest
实现无刷新局部更新
HTTP 头部
通用头部字段
Cache-control:private,max-age:0,no-cache // 控制缓存
Collection:close // 断开连接
...
请求头部字段
User-Agent:Mozilla/5.0 // 将创建请求的浏览器和用户代理名称等信息发给服务端,写爬虫用
Accept: text/html // 通知服务端,用户代理能处理的数据类型/格式和q权重
Authorization:Basic
dWufaslngafaJFljfsl== // 通知服务端,用户代理的认证信息
// If-xxx 条件请求
If-Modified-Since:Thu,15 Apr 2004
00:00:00 GMT // 如果在指定日期之后,资源发生了更新,服务端才会接受请求,用于确认本地资源的有效性
Range:bytes=5000-10000
...
响应头部字段
Age:600 // 源服务器600s前创建了响应
Server:Apache/2.2.17(Unix) // 当前服务器上HTTP服务器的信息
实体头部字段
Content-Language:zh-CN
Content-Length:15000 // 实体主体的大小(字节)
Content-Type:text/html;charset=UTF-8 // 实体主体内对象的媒体类型
Cookie 相关字段
Set - Cookie // 响应头部字段
Cookie // 请求头部字段
其他头部字段
X - Frame - Options
X - XSS - Protection
HTTP/1.1 中的 7 种方法
GET
请求资源
POST
发送实体的主体 entity body
PUT
传输文件,类似 POST,但是没有验证机制,几乎不使用
HEAD
获取报文首部,和 GET 一样,只是不返回报文主体部分
DELETE
删除文件,和 PUT 相反,同样的原因不推荐使用
OPTIONS
查询资源支持什么方法
- INVITE
- ACK
- CANCEL
- …
TRACE
服务端把接收到的请求报文再还给客户端,这样可以检查请求有没有/怎么样被加工篡改的
CONNECT
HTTP 报文
是多行数据构成的字符串文本
- 报文 message
- 实体 entity
请求报文
响应报文
多部分对象集合 Multipart
包含图片、文本、视频等多个不同类型的数据
multipart/form-data:上传 web 表单文件 multipart/byteranges:范围请求,允许服务端只发送 HTTP 消息的一部分到客户端;传输大媒体文件、断点续传时很有用
断点续传(获取部分内容的范围请求 Range Request)
- 用首部字段 Range 指定资源的 byte 范围
- 范围请求的对应状态码为 206,如果服务端无法响应范围请求,会返回 200 和完整的实体内容
例如:有一份 10000 字节的资源
GET /tip.jpg HTTP/1.1
Host: www.usagidesign.jp
// 返回5001-10000的部分
Range: bytes = 5001-10000
// 返回5001之后的全部
Range: bytes = 5001-
内容协商 content negotiation==i8n
根据浏览器的默认语言(en),返回一个 uri 的 en 页面
依据是请求报文中的一些首部字段:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商可以由服务端或客户端完成
HTTP 状态码
1-信息类 2-成功 3-重定向 4-客户端错误 5-服务端错误
Web 服务器
静态 web 服务器 Nginx
数据转发
- 代理
- 缓存代理 CDN
- 网关:网关是一个概念,是协议转换器(把 HTTP 转换为其他协议)
- 隧道
HTTPS
http 的缺点:
- 明文传输
- 不验证通信方的身份
- 无法保证完整性(中间人攻击)
TCP
提供字节流服务(分割数据包)
three-way handshaking
TCP 的标志 flag:SYN、ACK
- SYN 是发送端生成的(请求同步)
- ACK 是接收端生成的(确认同步)
第一次握手:发送端发送请求(syn=j) 第二次握手:接收端返回 SYN、ACK 标志,告诉对方发送功能正常,自己的接收功能正常 第三次握手:发送端告诉接收端,你的收发功能都正常(响应能力),可以开始通信了
- SYN blood 攻击:接到第 2 次握手后不回应第 3 次握手,服务器会发送 5 次请求然后丢弃请求。解决方法:cookie 记录恶意 ip、缩短服务器的等待时间
为什么不 2 次握手:如果是 2 次握手,客户端发送一次请求后网络中断,一段时间后这个废弃的请求到达服务器,服务器就会正常响应,建立一个无效的链接,增加了网络开销
DNS
应用层,把域名解析到 IP(联想:ARP)
URI/URL
URL 是 URI 的子集,url 一定是 uri,比如网址画 url 就是 uri,同时邮件地址、电话号码也是 uri
用户身份认证
认证方式:
- BASIC(401)
- DIGEST
- SSL 客户端
- FormBase