1. HTTP
1.1 特性
- 构建在TCP上的应用层协议
- 无连接无状态
1.2 状态码
200 OK
301 Moved Permanently
永久重定向,后续请求直接发往新地址302 Moved Temporarily
临时重定向304 Not Modified
文件未修改,直接使用缓存文件400 Bad Request
客户端请求有语法错误401 Unauthorized
请求未经授权403 Forbidden
认证通过,但无权限访问资源404 Not Found
请求的资源不存在405 Method Not Allowed
500 Internal Server Error
502 Bad Gateway
与upstream建立了连接,但响应超时。可能原因:后端代码执行超时、数据库响应慢等 (received an invalid response from the upstream server)503 Service Unavailable
服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。(The server cannot handle the request, because it is overloaded or down for maintenance, generally this is temporary state.)504 Gateway Time-out
完全无法与upstream建立连接,一般是nginx配置错误 (did not receive a timely response from the upstream server)
1.3 持久连接
请求头:
Connection: Keep-Alive
HTTP/1.1默认HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。
HTTP 长连接不可能一直保持,例如
Keep-Alive: timeout=5, max=100
,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开。
1.4 Transfer-Encoding
用来标示 HTTP 报文传输格式,默认chunked,表示消息体由数量未定的块组成,并以最后一个大小为0的块为结束。
每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。
1.5 Cookie & Session
都是为了解决HTTP无状态问题,发展出来的保存客户端状态的一种机制
1.5.1 Cookie
- 客户端机制,浏览器存储在用户电脑上的一小段文本文件
- http请求时,会将这些信息发生至服务器,服务器可根据这些信息来识别不同的用户
- 客户端可禁用Cookie
- 缺点:
- 不良站点用Cookie收集用户隐私信息
- Cookie窃取,黑客可通过Cookie来模拟用户的请求行为(跨站脚本攻击XSS)
1.5.2 Session
- 服务端机制,服务器使用一种类似散列表的结构来保持信息,当客户端请求时,创建一个session请发给客户端,下一次客户端请求,服务端首先去检查这个请求是否包含了session标识
- 具体实现方式:
- Cookie方式:服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求时,将在Cookie头重携带这个JSESSIONID,这样服务器就能够找个这个客户端对应的Session
- URL回写:服务器在发送给浏览器页面的所有链接中都携带JSESSIONID参数,这样客户端点击任何一个链接都会把JSESSIONID带回服务器
1.6 跨站攻击
1.6.1 CSRF (XSRF)
Cross-site Request Forgery, 跨站请求伪造
伪造请求,冒充用户在站内的正常操作。用户点击链接时,恶意js伪造请求,比如删除、转账、该密码、发送邮件等操作
预防 CSRF 攻击:
- 关键操作使用 POST 请求
- 验证码
- 检测 Referer,关联的请求地址应该一致
- Token
1.6.2 XSS
Cross Site Scripting, 跨站脚本攻击
客户端提交含有 js 的内容文本,但服务器没有过滤或转义掉这些脚本,当内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。
预防 XSS 攻击:
- 将用户输入的内容进行 HTML escape 转义
2. HTTPS
HTTPS: HTTP over TSL
TSL: Transport Layer Security, SSL的后续版本
SSL: Secure Socket Layer
2.1 证书认证
上图为单向认证,双向认证时,需要客户端把自己的证书发回服务端认证
2.2 中间人攻击
中间人攻击 (MITM, Man In The Middle Attack): 攻击者与通信的两端分别建立独立的连续,并交换其所收到的数据,使通信的两端都认为他们正在进行一个私密的连接与对方直接对话。
3. HTTP2
影响一个HTTP网络请求的因素主要有两个:带宽和延迟
带宽:当前的互联网已解决
延迟:
浏览器阻塞(HOL blocking): 同一个域名,浏览器同时只能有 4 个连接(不同内核可能不同),超过最大连接数限制,后续请求将被阻塞
DNS查询(DNS Lookup): 解析域名为IP需要耗费一定的时间,通常可以利用DNS缓存解决
建立连接(Initial connection): HTTP基于TCP协议,浏览器最快也要进行三次握手才能将HTTP请求报文发往服务器,但建立的连接无法复用。
HTTP2.0新特性:
新的二进制格式 (Binary Format)
HTTP1.x的解析基于文本,但文本协议存在多种格式,需要考虑的健壮性问题较多。二进制则不同,只认0和1组合。
多路复用(MultiPlexing)
连接共享,每个request对应一个id,这样一个连接就可以承载多个request
header压缩 (HPACK)
使用encoder来减少需要传输的header大小,通信双发各自cache一份header fields表,既避免了重复的header传输,又减小了传输字节数
服务器推送 (server push)
服务器可以向浏览器发生请求之外的内容,比如正在请求一个页面时,服务器会把页面相关的logo,CSS等文件直接推送到客户端。
4. Web 缓存
缓存:保存在浏览器中的数据,再次请求服务时,如果相同的URL,直接使用浏览器中的缓存响应访问请求,不会再次向服务器发送请求
三种情况:
未找到缓存(黑色线)
缓存未过期(蓝色线)
缓存已过期(红色线)缓存过期判断服务器文件是否更新的两种方法:
将本地文件的最后修改时间发会服务器,check下文件是否已更新,如果没有,不下载新的文件,只需要更新本地缓存文件的过期时间
客户端文件有版本好,当服务器更新了版本,再次请求时,服务器根据版本判断缓存是否需要更新
通过HTTP-HEADER控制缓存:
- Expires和Cache-Control: HTTP1.0使用Expires,1.1为Cache-Control:max-age规定了缓存的有效时间
- Last-Modified/If-Modified-Since: 缓存过期后,check服务端文件是否更新的第一种方式
- ETag/If-None-Match: 缓存过期时check服务端文件是否过期的第二种方式
无法被浏览器缓存的请求:
HTTP头中:Cache-Control:no-cache, pragma:no-cache (HTTP1.0), Cache-Control:max-age=0
需要根据Cookie,认证信息等决定输入内容的动态请求不能被缓存
POST请求无法被缓存
5. HTTP & WebSocket
5.1 协议
HTTP 1.0: 在一次 TCP 连接中只能完成一个 HTTP 请求
HTTP 1.1: keep-alive,在一次 TCP 连接中完成多个 HTTP 请求
Websocket: 借用HTTP协议来完成握手
1
2
3
4
5Connection: Upgrade
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: km9iqxp+3H2ndD5zXkAczA==
Sec-WebSocket-Version: 13
Upgrade: websocket
5.2 通信方式比较:
- ajax轮询:浏览器隔几秒向服务器发起一个请求,询问服务器是否有新信息。需要服务器有很快的处理速度和资源。(速度)
- long poll:采用阻塞模式,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。需要有很高的并发,也就是说同时接待客户的能力。(场地大小)
- WebSocket:一次HTTP握手后,整个通讯过程是建立在该连接状态中。服务器可主动推送消息给客户端。
WebSocket和HTTP最大不同:
- WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;
- WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。