http
http
- 请求行、请求头、请求体。请求头与请求体之间用空行分隔
- http连接的建立必须由客户端发起
- http是无状态的协议。即其自身不具备保存之前发送过的请求或响应的功能
- 通过Cookie技术可以对状态进行保存
- keep-alive:持久连接,只要任意一端没有明确提出断开连接,则保持TCP连接状态。避免了频繁传输中连接建立和断开的开销,可以一次连接,进行多次请求和相应。HTTP/1.1中的默认连接是持久连接
- 管线化:通常来说一次请求一次响应,之后才能进行下一次请求,但管线化可不必等到响应到达便可继续下一次请求
- Cookie:用户识别以及状态管理。客户端第一次请求时,服务器响应中Set-Cookie字段,客户端保存下来,当再次请求时,会自动在请求头中附加上Cookie值。服务器通过比较则知道是原来的客户。
- 编码:
- 压缩内容的编码:将实体(如文件)按照一定的压缩方式压缩后再传输
- 分块传输的编码:实体较大时传输需要较长时间,客户端感受会有较大延迟,通过将文件分块后再传输,可降低客户端延时,逐步显示页面
- 多部分对象集合:可在一份报文主体内含有多种类型的实体
- multipart/form-data 在表单上传时使用
- multipart/byteranges 状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用
- 内容协商机制:客户端和服务器就响应的资源进行交涉,然后提供给客户端最为适合的资源,如中英文界面等。其会以语言、字符集和编码等方式作为判断的基准。这些基准一般包含在Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language中
请求方法
- GET:请求一个指定资源的表示形式。幂等
- HEAD:请求一个与GET请求的响应相同的响应,但没有响应体。幂等
- POST:将实体提交到指定的资源。非幂等
- PUT:更新或添加资源。幂等
- DELETE:删除资源。幂等
- OPTIONS:询问支持的方法。
- TRACE:路径追踪,沿着到目标资源的路径执行一个消息环回测试。
- CONNECT:开启一个客户端与所请求资源(一般是代理服务器)之间的双向隧道
浏览器与服务器之间的HTTPS通信都是加密的。然而当浏览器需要通过代理服务器发起HTTPS请求时,由于请求的站点地址和端口号都是加密保存于HTTPS请求头中的,代理服务器是如何既确保通信是加密的(代理服务器自身也无法读取通信内容)又知道该往哪里发送请求呢?为了解决这个问题,浏览器需要先通过明文HTTP形式向代理服务器发送一个CONNECT请求告诉它目标站点地址及端口号。当代理服务器收到这个请求后,会在对应的端口上与目标站点建立一个TCP连接,连接建立成功后返回一个HTTP 200状态码告诉浏览器与该站点的加密通道已建成。接下来代理服务器仅仅是来回传输浏览器与该服务器之间的加密数据包,代理服务器并不需要解析这些内容以保证HTTPS的安全性。
- PATCH:用于对资源应用部分修改
POST往往用来创建资源,而PUT往往用来修改资源
幂等性:https://developer.mozilla.org/zh-CN/docs/Glossary/%E5%B9%82%E7%AD%89
状态码
告知从服务器返回的请求结果
| 类别 | 信息 | |
|---|---|---|
| 1XX | Informational(信息性状态码) | 接收的请求正在处理 |
| 2XX | Success(成功状态码) | 请求正常处理完毕 |
| 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
| 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
状态码:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
- 200 OK
- 204 No Content 处理成功,但没有资源可返回
- 206 Partial Content 对请求的部分资源正确返回
- 301 Moved Permanently 永久重定向
- 302 Found 临时重定向
- 304 Not Modified 资源已找到,但未符合请求条件
- 307 Temporary Redirect 临时重定向
- 308 Permanent Redirect 永久重定向
- 400 Bad Request 语义有误,当前请求无法被服务器理解
- 401 Unauthorized 当前请求需要用户验证
- 403 Forbidden 服务器已经理解请求,但是拒绝执行它
- 404 Not Found 服务器没有请求的资源
- 500 Internal Server Error 服务器内部错误
- 503 Service Unavailable 服务器没有准备好处理请求,如服务器超负荷运行
http首部
首部字段:https://cloud.tencent.com/developer/article/1185497
WEB服务器
- 一台主机可以虚拟多个服务器,如何区分?虚拟主机技术:IP对应或域名对应或端口号对应
- 除了客户端和服务器,在其中间还可能有代理、网关和隧道
- 代理:转发功能,将请求或响应转发给响应的另一端。代理又分为前向代理和反向代理,前向代理一般是透明代理(不对报文做任何处理),反向代理一般是缓存代理(如有资源的副本,则直接回应给客户端,不继续发送给服务器)。使用代理后,请求头至少会发生两点变化:
- 请求的资源URI变成了完整路径,即由根目录 / 变成了 https://www.example.com/
- Connection 头变为了 Proxy-Connection头
- Via可出现在请求头中,表示经过的服务器,由代理服务器进行追加,一般与TRACE一起使用
- 网关:网络默认出口
- 网关可以将http请求转换为其他协议进行通信
- 可在客户端与网关之间的通信线路进行加密以确保连接安全
- 隧道:安全的通信线路,是透明的(不改变任何东西)
- 代理:转发功能,将请求或响应转发给响应的另一端。代理又分为前向代理和反向代理,前向代理一般是透明代理(不对报文做任何处理),反向代理一般是缓存代理(如有资源的副本,则直接回应给客户端,不继续发送给服务器)。使用代理后,请求头至少会发生两点变化:
https
http缺点
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
https
- https = http + 通信线路加密(SSL) + 认证(证书) + 消息完整性保护(消息摘要)
- https不是新的协议,只是http协议的通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替,现在一般是HTTP+TLS1.2
- SSL独立于HTTP,故其他协议如SMTP或Telnet等也可以搭配SSL来使用
- SSL采用混合加密:共享密钥加密(对称加密)和公开密钥加密(非对称加密)。
- 数据传输用对称加密
- 为解决对称加密密钥的交换问题,一开始对称加密的密钥使用非对称加密进行传输
- 为确保一开始传输的非对称加密的公开密钥的确是服务器的,通过使用权威第三方的数字证书解决,数字证书中含有服务器的公钥,数字证书是第三方颁发给服务器的,如下图

HTTPS通信机制:




总结:

身份认证
http/1.1认证方式:
- BASIC认证(基本认证) 几乎不用了
- WWW-Authenticate:Basic 要求用户提供用户名和密码,客户端对其进行base64编码后发送给服务端,明文没有加密
- DIGEST认证(摘要认证) 几乎不用了
- 不发送明文密码,而是发送响应码(相当于密码摘要吧)

- DIGEST认证提供了高于BASIC认证的安全等级,但是和HTTPS的客户端认证相比仍旧很弱。DIGEST认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。
- SSL客户端认证 不常用
- 从使用用户ID和密码的认证方式方面来讲,只要二者的内容正确,即可认证是本人的行为。但如果用户ID和密码被盗,就很有可能被第三者冒充。利用SSL客户端认证则可以避免该情况的发生。
- SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书(同服务端证书一样,需要认证购买)认证,服务器可确认访问是否来自已登录的客户端。
- FormBase认证(基于表单认证) 常用
- 用户在网页的登录表单中输入用户名和密码后,交给服务器来进行验证
- 因HTTP无状态,已认证成功的用户状态无法保存,所以一般会使用Cookie来管理Session(会话)。当用户认证成功后,服务器在Cookie中加入Session ID字段。为减轻跨站脚本攻击(XSS)造成的损失,建议事先在Cookie内加上httponly属性。
http新增功能
之前http面临的问题与解决方法:
- HTTP每次都返回完整页面,即使只有一点改变。解决:Ajax -> 返回更新的局部页面,减少性能损耗
- HTTP只能从客户端发起连接,所以让服务器通知客户端不可行。解决:Comet -> 延迟响应,当客户端建立连接后,Comet将响应置于挂起状态,当服务器端有内容更新时,再返回该响应
以上两种方式虽然一定程度上使HTTP得到改善,但其并没有改变http协议
SYPD
SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与运输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY规定通信中使用SSL。
SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。因此,可照常使用HTTP的GET和POST等方法、Cookie 以及HTTP报文等。
SYPD的功能:

QUIC
Quick UDP Internet Connections
WebSocket协议
WebSocket是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。
一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON(键值)、XML(简化版html)、HTML或图片等任意格式的数据。

