HTTP
头部
请求
- GET/aboutHTTP/1.1
- 信息类:User-Agent(应用程序)、Host(主机名和端口号)、Referer(当前请求的url)
- 请求实体相关:Accept,Accept-Language、Accept-Encoding、Range
- 缓存控制:Cache-Control、if-None-Match(如果提供的实体标记和当前文档标记不同,就获取文档)、If-Modified-Since(在这个指定时间后修改了,否则就限制这个请求)
- 会话:Cookie
- 跨域:Origin
响应
- HTTP/1.1 200OK
- 信息:Server Date
- 实体信息:Location,Content-Length、Content-Encoding、Content-Language
- 缓存:Etag、Last-Modified、Cache-Control、Expires(实体不再有效)
- 跨域:Access-Control-Allow-Orgin,-Language
状态码
1XX信息性状态码
- 100 Continue
2XX成功状态码
- 200 OK
204 No Content
- 响应报文没有主体部分
206 PartialContent
- 成功执行了Range请求,必须包含Content-Range首部
3XX重定向状态码
301 Moved Permanently
- 原URL已被移除,使用响应的Location纸箱的URL
302 Found
- 未移除,但临时用Location的URL来临时定位资源
304 No MOdified
- 协商缓存
4XX客户端错误代码
400 Bad Request
- 客户端发送了错误请求
401 Unauthorized
- 需要认证身份
403 Forbidden
- 被服务器拒绝
404 Not Found
- 无法找到请求的url
405 Method Not Allowed
- 使用了不支持的方法
5XX服务端错误状态代码
500 Internal Server Error
- 服务器出错
504 Gateway Timeout
- 网关等待服务器的响应超时
GET、POST
区别
- 1.GET方法没有消息体,数据只能放在UPL中,而URL有长度限制,POST有消息体
- 2.GET请求能缓存,而POST不能
- 3.GET语义是获取/查询资源信息,POST为提交数据。
缓存问题
Cache-Control【优先】
- max-age
no-cache
- 告知代理服务器不直接使用缓存,向原服务器发起请求
- 有可能存下来,但是不用
no-store
- 所有内容都不保存到缓存
Expires
- GMT时间
- 缺点:服务器时间可能不准,跨时区
304和200的区别
200为强缓存
- 如果设置协商缓存,但没有设置Cache-Control,该值默认为Private;缓存系统可以(但不一定要)对一个成功的响应返回200OK
304为协商缓存
不同刷新行为的区别
UPL输入地址栏然后回车、直接点击链接
- 200
F5、点击刷新、右键菜单重新加载
此行为让浏览器无论如何都要发送一个HTTP Request
- 304
- 200
ctr+f5
- 无视缓存,并刷新相关的缓存时间
Etag【优先】和Last-Modified
ETag
- 配合If-None-Match使用
根据文件实体内容产生一段hash字符串(类似于MD5):inode+mtime
- Inode:文件的元信息
- mtime:文件内容上一次变动时间
包括但不限于文件内容(还包括读写权限,拥有者UserID等)
缺点
- 同一文件不同物理机的inode不同,导致304失效
- 计算ETag需要性能消耗
- 因为通常是使用CDN,所以问题不会太大
Last-Modified
- 配合if-modefied-since
- 格式为GET时间
- 缺点:精确到秒,1s内频繁变化无法识别,周期性改变但内容无变化的资源也要重新请求
关于from memory cache 和from disk cache(只反映缓存存放的位置,有200和304)
- 高版本的chorme新增
from memory cache
- 与渲染线程绑定,通常就是tab对应
- 从内存中读取,通常0ms
from disk cache
- 从磁盘读取,通常几十ms
无状态
- 不保存每次提交的信息
- 优点:不用为每个客户端连接分配内存来记忆大量状态,也不用再失去连接时清理内存
- 缺点:若以来先前信息,客户端需要重传
会话追踪技术
cookie
七个字段
- namevalue
- domain
path
- 默认响应时的URL
max-age=
- secure
- Http-only
session
- 写在服务器的session中,分配sid,将sid写入cookie中
URL重写
- 动态写sessionID,类似于token
作为隐藏域嵌入HTML表单中
- 页面由表单提交而动态产生时可使用
1.0和1.1区别
1.默认持久连接和流水线传输。默认connection:keep-alive除非提出断开,否则以后保持。且默认使用流水线的方式发送(即不用再等上一个响应再发下一个)
- 若要关闭,Connection:closed
2.状态码100,POST时大于1024,先询问是否能接受
3.多了HOST域
- 一个物理主机多个虚拟主机共享一个主机
4.可分块传输数据:Transfer-Encoding:chunked
- 否则动态生成的响应,要把响应整个缓存才知道长度,才能填写Content-Length