Eli's Blog

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结束。

都是为了解决HTTP无状态问题,发展出来的保存客户端状态的一种机制

  • 客户端机制,浏览器存储在用户电脑上的一小段文本文件
  • 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 证书认证

https

上图为单向认证,双向认证时,需要客户端把自己的证书发回服务端认证

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
    5
    Connection: 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一样,先建立连接,连接成功后才能相互通信。

 上一页