跳到主要内容

网络基础

HTTP

超文本传输协议。建立在 TCP 连接上的。

  • 协议
  • 传输。有请求方和响应方。
  • 超文本

HTTP 无状态: 协议自身只有一个来回,来不及记录状态。

HTTP/1.0 与 HTTP/1.1

连接:http1.0 默认使用非持久连接,http1.1 默认使用持久连接,多个 http 请求可复用同一个 TCP 连接,用于避免使用非持久连接时每次都需要建立连接的时延。

请求资源:http 1.1 在请求头引入了 range ,可以部分返回,请求码是 206,节省带宽,也利于传输大文件。

缓存:增加缓存管理和控制。响应头添加 Cache-Control。

备注

Keep-Alive

HTTP 1.0 默认短连接,默认是在每次请求/应答,客户端和服务器都要新建一个连接,完成之后立即断开连接。

HTTP1.1 默认长连接。数据传输完成了保持 TCP 连接不断开,等待在同域名下继续用这个通道传输数据。

特点:

  • 较少的 CPU 和内存使用,同时打开的连接减少了。
  • 请求和应答 HTTP 管线化,请求串行,有队头阻塞的问题。
  • 减少了后续请求延迟。无需再次进行握手。
  • 长时间 TCP 连接容易导致浪费系统资源。

短链接长连接

短链接:每次 http 请求都新建一个 TCP 连接,每次都经历三次握手四次挥手

长连接: http /1.1 的 Keep-Alive。多次请求和响应基于一条 TCP 连接,有一定保持时间。

HTTP/1.1 与 HTTP/2.0

HTTP/2.0

  • 二进制协议。

  • 多路复用。同一个 TCP 连接中,客户端和服务端都可发起多个请求,多个响应,不需要按照顺序处理,废弃管道。避免队头堵塞的问题。

    http2 对于同一域名只需要创建一个连接,而不是像 http/1.1 那样创建 6~8 个连接,不需要进行域名分片了。

  • 压缩头部,减少数据传输量。

  • 允许服务器主动向客户端推送数据,用于服务器在客户端缓存中填充数据。

    HTTP/2.0 下服务器主动推送的是静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。

    nginx.conf
      location = /index.html {
    http2_push /css/style.css;
    http2_push /img/avatar.jpg;
    }

HTTP/3

放弃 TCP,转而使用基于 UDP 的 QUIC (快速 UDP 互联网连接)协议。

  • 要求加密后才能建立连接
  • 解决 TCP 丢包阻塞的问题

HTTPS

走在安全协议上的 http。

  • http 协议信息是明文传输的,https 是具有安全性的 SSL 加密的传输协议,具有身份验证、信息加密、完整性校验等功能。
  • http 默认端口是 80 ,https 默认端口是 443。

加密原理

握手的是非对称加密,握手完成以后是对称加密,非对称加密解密时间较久。基于散列函数验证信息的完整性。

TLS 协议:证书链,即信任链。

  • 对称加密:加密与解密使用相同的密码。

  • 非对称加密:用公钥加密,需要使用对应的私钥解密。

中间人攻击

把 HTTP 通信中的公钥换掉,可以解密通信双方所发送的数据。

需要安全的第三方颁发证书(CA),证明身份。

防止 CA 被篡改:数字签名,对证书再次加密得到数字签名。

HTTP 状态码

响应消息的状态码

101 协议升级,比如在 HTTP 基础上改为 WebSocket

206 部分返回,响应头通常有 Content-Range,表示响应 body 数据的具体范围。

301 永久重定向,以后访问都是请求新地址。比如 http 变为 https 需要配置 301 跳转,搜索引擎收录。

302 暂时重定向,以后访问还是请求原地址。比如业务中活动页重定向,未登录重定向到首页。

以上重定向需要配合响应头 location:uri 表示跳转地址

304 Not Modified,未修改 协商缓存相关

  • 协商缓存
    • If-Modified-Since(请求)/Last-Modified(响应): 自上次访问以来资源未更新,返回 304
    • If-None-Match(请求 /ETag(响应): 一个哈希值,如果这个值和服务器储存的对应值一样,表示资源未更新,返回 304
  • 强缓存 和 304 没有关系,主要是用于减轻浏览器负担
    • Expires: 过期时间,资源未过期都会储存在浏览器里,不用去加载
    • cache-control: 现在最常用的,可以在请求头里,也可以在响应头里,可以设置各种缓存,也可以设置为协商缓存;详细见 MDN

400 Bad Request,请求错误,通用状态码不具体

401 UnAuthorized, 未授权,当前请求需要用户验证

403 Forbidden,禁止访问

404 Not found 未找到,请求所希望得到的资源未被在服务器上发现

406 Not Acceptable 不能返回符合要求的数据,请求头的 Accept 有问题

452 Unavailable For Legal Reasons 非法资源,政治原因不可展示

500 Internal Server Error 服务器错误,通用

501 Not Implemented 未实现,此请求方法不被服务器支持且无法被处理

502 Bad Gateway 服务器作为网关或代理时返回的

503 Service Unavailable 服务器很忙,暂时无法响应

请求方法

get post

一般来说 get 用于获取数据,post 用于提交数据。

get 可以把参数放到 url,这种方式相对不安全。

get 一般没有 body ,post 一般有 body。

浏览器一般会对 get 请求做缓存,不会对 post 请求做缓存。

post put

post 一般用于创建资源,具有非幂等性。

put 用于更新资源,具有幂等性。

在 HTTP 规范中, POST 是非幂等的,多次调用会产生不同的结果, 比如:创建一个用户, 由于网络原因或是其他原因多创建了几次,那么将会有多个用户被创建.而 PUT id/1 则会创建一个 id 为 1 的用户,多次调用还是会创建的结果是一样的,所以 PUT 是幂等的。

攻击

XSS Cross-Site Scripting

跨站脚本攻击。代码注入,运行在客户端,可能盗取用户信息。

防御:

  • 不使用拼接字符串,做好充分的转义。
  • 使用 CSP 内容安全策略,建立白名单,告诉浏览器可以加载哪些外部资源。
  • 保护敏感信息。cookie 使用 http-only ,增加验证码等。

CSP 内容安全策略,建立白名单,告诉浏览器可以加载并执行哪些外部资源。可以通过 HTTP 请求头的 Content-Security-Policy 实现。

CSRF Cross-Site Request Forgery

跨站请求伪造攻击,冒充用户进行一些操作。比如诱导用户进入第三方站点,向被攻击网站发送跨站请求。

防御:

  • 进行同源检测,验证请求来源。通过 http 请求头的 referer/origin 来判断。缺点是可能屏蔽了搜索引擎的连接。
  • 设置 cookie 的 Samesite,限制 cookie 不能被第三方使用。

一些问题

在浏览器中输入 URL 都发生了什么

  • URL 解析,分析传输协议和路径。对非法字符转义。
  • DNS 解析,向多级服务器请求解析域名,获取 IP 地址。
    • 缓存判断:缓存也是多层的,比如浏览器缓存,系统缓存,路由器缓存,域名服务器缓存等
    • DNS 负载均衡。DNS 可以返回一个合适的机器的 IP 给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是 DNS 负载均衡
  • TCP 连接:三次握手
  • HTTPS 握手 TLS 协商
  • 返回数据
  • 页面渲染。 html 文件构建 DOM 树,css 文件构建 CSSOM 树,共同构建渲染树。根据渲染树进行页面绘制
  • TCP 四次挥手

TCP 三次握手四次挥手

至少要建立三次成功的单向通信才能确定双方都能收发信息。 TCP模型

四次挥手,在特定情况下可以是三次。

当服务端收到客户端的 FIN 连接请求报文后,可以直接发送 FIN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当服务端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉客户端,“你发的 FIN 报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送,故需要四次挥手。

TCP 使用四次挥手的原因是因为 TCP 的连接是全双工的,需要双方分别释放到对方的连接,单独一方的连接释放,只代表不能再向对方发送数据,连接处于的是半释放的状态。

WebSocket

应用层协议,用于浏览器与服务器进行全双工通信的技术。基于 TCP ,复用 HTTP 通道,完成一次握手就可以创建持久性的连接。

特点:服务器可以主动向客户端推送消息,客户端也可以主动向服务器推送消息。

  • 支持双向通信,实时性强
  • 没有同源限制,客户端可以与任意服务器通信
  • 较少地控制开销,连接创建后,数据包头部较小
  • 协议标识符为 ws,加密为 wss
  • 与 HTTP 协议有良好的兼容性,不容易被屏蔽

短轮询长轮询

都是客户端主动发起请求。

  • 短轮询:浏览器每隔一段时间发送一次 http 请求,服务端数据在收到请求后直接相应。客户端不断发送请求,模拟实时收到服务器端数据变化的过程。
    • 需要不断建立 http 连接,浪费资源,服务端压力大。
  • 长轮询:客户端发起请求,服务器不直接相应,判断数据是否有更新,如果有更新才进行响应,如果没有数据,到达一定时间才响应。
    • 减少了不必要的 http 请求次数,节约了资源
    • 服务器端压力大,频繁询问数据库

SSE

SSE(sever-sent events)服务器端推送事件,HTML5 新增的功能,服务器单向推送数据到客户端。

EventSource 实例,对 HTTP 开启持久化连接,一直保持开启直到被要求关闭。

Reference