Web前端涉及到的相关网络协议概述。(待完善)
HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是建立在TCP协议之上的网络传输协议。
HTTP有如下几个特点:
- 基于文本的
- 无状态,有会话的(Cookies)
- 可扩展的(Header)
- 可缓存的
HTTP/1.x
一个典型的会话过程:
在像 HTTP 这样的Client-Server(客户端-服务器)协议中,会话分为三个阶段:
- 客户端建立一条 TCP 连接(如果传输层不是 TCP,也可以是其他适合的连接)。
- 客户端发送请求并等待应答。
- 服务器处理请求并送回应答,回应包括一个状态码和对应的数据。
从 HTTP/1.1 开始,连接在完成第三阶段后不再关闭,客户端可以再次发起新的请求。这意味着第二步和第三步可以连续进行数次。
报文
- request:
请求由以下元素组成:
- 一个HTTP的method,经常是由一个动词像GET, POST 或者一个名词像OPTIONS,HEAD来定义客户端的动作行为。通常客户端的操作都是获取资源(GET方法)或者发送HTML form表单值(POST方法),虽然在一些情况下也会有其他操作。
- 要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocol (http://),domain(developer.mozilla.org),或是TCP的port(HTTP一般在80端口)。
- HTTP协议版本号。
- 为服务端表达其他信息的可选头部headers。
- 对于一些像POST这样的方法,报文的body就包含了发送的资源,这与回应报文的body类似。
- response:
响应报文包含了下面的元素:
- HTTP协议版本号。
- 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
- 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
- HTTP headers,与请求头部类似。
- 可选项,比起请求报文,响应报文中更常见地包含获取的资源body。
Proxy
代理,转发HTTP消息。
作用
代理主要有如下几种作用:
- 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
- 过滤(像反病毒扫描,家长控制…)
- 负载均衡(让多个服务器服务不同的请求)
- 认证(对不同资源进行权限管理)
- 日志记录(允许存储历史信息)
分类
正向代理
一般由客户端主动设置。
客户端
向代理
服务器发送一个请求,并且指定目标服务器
,之后代理
向目标服务器
转交并且将获得的内容返回给客户端
。作用:
- 访问本无法访问的服务器B
- 加速访问服务器B
- Cache作用
- 客户端访问授权
- 隐藏访问者的行踪
反向代理
客户端不需要进行任何设置,
客户端
向反向代理
发送请求,接着反向代理
判断请求走向何处,发送请求,并将返回的响应转交给客户端
,客户端并不会感知到反向代理后面的服务,使得这些内容就好似他自己响应的一样。作用:
- 保护和隐藏原始资源服务器
- 加密和SSL加速
- 负载均衡
- 缓存静态内容
- 压缩
- 减速上传
- 安全
- 外网发布
HTTP Method
- GET 获取被请求 URI(Request-URI)指定的信息。
- HEAD 不能在响应里返回消息主体,其响应里的元(头域)信息应该和 GET 请求响应里的元信息一致。
- OPTIONS 请求想得到请求/响应链上关于此请求里的 URI(Request-URI)指定资源 的通信选项信息。
- POST 用于请求源服务器接受请求中的实体作为请求资源的一个新的从属物。
- PUT 请求服务器去把请求里的实体存储在请求 URI(Request-URI)标识下,如果该资源已存在,则更新。
- DELETE 请求源服务器删除请求 URI 指定的资源。
- TRACE 被用于激发一个远程的、应用层的请求消息回路,不能包含一个实体。
- CONNECT 被HTTP1.1 协议规范保留,为了能用于能动态切换到隧道的代理(如:SSL tunneling)。
HTTP Code
HTTP 状态码
- 1xx 消息
- 2xx 成功
- 3xx 重定向
- 4xx 客户端错误
- 5xx 服务器错误
HTTP Cookie
Cookie 用途:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
Web storage API ( localStorage 和 sessionStorage )或 IndexedDB 。
创建Cookie:
服务器使用Set-Cookie响应头部向用户代理(User Agent)(一般是浏览器)发送Cookie信息。
|
|
之后,用户代理对该服务器发起的每一次新请求,浏览器都会将之前保存的Cookie信息通过Cookie请求头部再发送给服务器。
示例:
|
|
Cookie 类型:
- 会话期Cookie
会话期Cookie是最简单的Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie也会被保留下来,就好像浏览器从来没有关闭一样。
Max-Age: 单位是秒,优先级高于Expires
- 持久性Cookie
持久性Cookie,和关闭浏览器便失效的会话期Cookie不同,可以指定一个特定的过期时间(Expires)或有效期(Max-Age)。
示例:
|
|
Cookie 作用域
Domain 和 Path 标识定义了Cookie的作用域:即Cookie应该发送给哪些URL。
- Domain 标识指定了哪些主机可以接受Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了Domain,则一般包含子域名。
例如,如果设置 Domain=mozilla.org,则Cookie也包含在子域名中(如developer.mozilla.org)。
- Path 标识指定了主机下的哪些路径可以接受Cookie(该URL路径必须存在于请求URL中)。以字符 %x2F (“/“) 作为路径分隔符,子路径也会被匹配。
例如,设置 Path=/docs,则以下地址都会匹配:
/docs
/docs/Web/
/docs/Web/HTTP
Cookie 安全
Document.cookie属性可创建新的Cookie,获取非HttpOnly
的Cookie。
- 会话劫持和XSS
- 跨站请求伪造(CSRF)
HTTP authourization
HTTP Cache
Cache 目标
重用已获取的资源。缓存的关键主要包括request method和目标URI(一般只有GET请求才会被缓存,HEAD请求也可以被缓存,但OPTIONS、POST、PUT、DELETE、TRACE都不可以被缓存,CONNECT方法不具备可缓存cacheable的特性)。
Cache Control
HTTP/1.1定义的 Cache-Control 头用来区分对缓存机制的支持情况, 请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略。
Cache-Control的可能取值:
- private 默认值。表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。
- public 表示该响应可以被任何中间人(比如中间代理、CDN等)缓存。
- no-cache 此方式下,每次有请求发出时,缓存会将此请求发到服务器,服务器端会验证请求中相关验证字段所描述的缓存是否过期,若未过期,则缓存才使用本地缓存副本。
- no-store 缓存中不得存储任何关于客户端请求和服务端响应的内容。每次由客户端发起的请求都会下载完整的响应内容。
- must-revalidate 缓存在考虑使用一个陈旧的资源时,必须先验证它的状态,已过期的缓存将不被使用。
Cache 校验
- ETag/If-None-Match 强校验器
- Last-Modified/If-Modified-Since 弱校验器
- Vary 当缓存服务器收到一个请求,只有当前的请求和原始(缓存)的请求头跟缓存的响应头里的Vary都匹配,才能使用缓存的响应。
CORS
WebSocket
HTTP/2
与HTTP/1.x主要的区别:
- 二进制的,而不是文本的;(is binary, instead of textual)
- 是完全多路复用的,而不是按序和阻塞的;(is fully multiplexed, instead of ordered and blocking)
- 能用一个(TCP)连接来实现并行(请求);(can therefore use one connection for parallelism)
- 压缩头部(header),来减少开销;(uses header compression to reduce overhead)
- 允许服务器主动地将响应“推”到客户端缓存中。(allows servers to “push” responses proactively into client caches)