HTTP小结
长连接 & 短连接
本质上HTTP长短连接指的是TCP连接。HTTP/1.1以后默认使用长连接。
短连接:每一次请求都建立一个TCP连接
长连接:一个TCP链接进行多次请求/响应
长链接设置方式: Connecting:keep-live (HTTP/1.1)
短链接设置方式: Connecting:close (HTTP/1.1)
设置长链接的目的是为了复用TCP连接,使得多个HTTP请求使用一个TCP连接,节约重复建立断开TCP连接的消耗。
长连接期限
设置最长保持时间、最多接受请求次数。
服务器主动断开TCP连接。
TCP保活。
如何判断数据是否传输完成 :
消息字段conent-length,设置实体内容长度
消息字段content-ebcoding: chunked.如果是动态页面等时,服务器是不可能预先知道内容大小,这时就可以使用Transfer-Encoding:chunk模式来传输数据了。即如果要一边产生数据,一边发给客户端,服务器就需要使用"Transfer-Encoding: chunked"这样的方式来代替Content-Length。
Chunked编码将使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)
重定向
301 moved permanently 永久移动
资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。
302 Found
客户端执行临时重定向。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
303 See Other
和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
307 Temporary Redirect
临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
304 Not Modified
如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。
缓存
代理服务器/浏览器进行缓存。
分为两大类:强制缓存,对比缓存。强制缓存优先级高于对比缓存。
HTTP/1.1 通过 Cache-Control 首部字段来控制缓存。
private:客户端可以缓存。默认为private。
public:客户端和代理服务器都可缓存。
max-age=xxx:缓存的内容将在 xxx 秒后失效。
no-cache:需要使用对比缓存来验证缓存数据。
no-store:所有内容都不会缓存。
要对响应进行缓存,需要满足以下条件:
请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。
响应报文的 Cache-Control 首部字段没有指定不进行缓存。
强制缓存
强制缓存命中,不与源服务器交互。
对比缓存
对比缓存,需要进行比较判断是否可以使用缓存。
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份。
再次请求数据时,客户端将缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
标识传递
Last-Modified / If-Modified-Since
服务器在响应请求时,告诉浏览器资源的最后修改时间。(Last-Modified)
再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。
服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。
若资源的最后修改时间大于If-Modified-Since,说明资源又被改动过,则响应整片资源内容,返回状态码200;
若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)
Etag:
服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。
If-None-Match:
再次请求服务器时,通过此字段通知服务器客户段缓存数据的唯一标识。
服务器收到请求后发现有头If-None-Match 则与被请求资源的唯一标识进行比对,
不同,说明资源又被改动过,则响应整片资源内容,返回状态码200;
相同,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
GET & POST
GEI用于获取资源,POST用于传输实体。
GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。
cooki & session
cooki是浏览器保存在本地的一块数据,它会在浏览器之后向同一服务器再次发起请求时被携带上。
会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。
持久性 Cookie:指定一个特定的过期时间(Expires)或有效期(max-age)之后就成为了持久性的 Cookie。
session是存储在服务器端的用户数据。Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中。session保存时会创建一个标识session ID,表示属于哪一个用户。
HTTPS & HTTP
参考:
https://cyc2018.github.io/CS-Notes/#/
https://juejin.im/entry/5766c29d6be3ff006a31b84e#comment
https://www.cnblogs.com/chenqf/p/6386163.html
https://www.cnblogs.com/bq-med/p/8602629.html
http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html
https://www.cnblogs.com/gotodsp/p/6366163.html