1. HTTP
1.1 特性
- 构建在TCP上的应用层协议
- 无连接无状态
1.2 状态码
200 OK301 Moved Permanently永久重定向,后续请求直接发往新地址302 Moved Temporarily临时重定向304 Not Modified文件未修改,直接使用缓存文件400 Bad Request客户端请求有语法错误401 Unauthorized请求未经授权403 Forbidden认证通过,但无权限访问资源404 Not Found请求的资源不存在405 Method Not Allowed500 Internal Server Error502 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-AliveHTTP/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一样,先建立连接,连接成功后才能相互通信。