网络协议总结

前端主要关注于应用层 HTTP 协议,传输层 TCP 协议,断舍离一下,就主要总结这两种协议了。

前端主要关注于应用层的 HTTP 协议,传输层的 TCP 协议,断舍离一下,就主要总结这两种协议了。

OSI 参考模型 与 TCP/IP 五层模型

网络分层模型

我们主要关注于 TCP/IP 五层模型应用层传输层 就足够了。

应用层:

  • 作用:为应用程序提供服务。
  • 常见协议:HTTPHTTPSFTPPOP3SMTP等。

传输层:

  • 作用:实现应用程序之间的数据传输。
  • 协议:UDPTCP

UDP 与 TCP

UDP

UDP 是面向无连接的协议,它只会把数据传递给接收端,但不会关注接收端是否已经正确接收了数据,所以有时候 UDP 会被认为是不可靠的数据报协议。但这种特性反而适合多播,实时的视频和音频传输。

优点:

  • 无需建立连接(减少了延迟)
  • 实现简单(效率高)
  • 头部开销小( 8 字节)
  • 没有拥塞控制(更好的控制发送时间和速率)

缺点:

  • 没有建立连接(数据想发就发,不可靠)
  • 没有拥塞控制(网络条件不好时会导致丢包)

TCP

TCP 是面向有连接的协议,在使用 TCP 协议 传输数据之前一定需要在发送方和接收方之间建立连接。建立连接三次握手,断开连接四次挥手~

TCP 建立连接三次握手

三次握手

第一次握手:

客户端服务端发送一个 SYN(Seq=X) 包,客户端进入 SYN-SENT 状态,等待服务端ACK(Ack=X+1)回复。
ps: Seq 是序号,Ack 是确认序号。

第二次握手:

服务端根据接收到客户端发来的 SYN(Seq=X) 包后返回一个 ACK(Ack=X+1) 以及 SYN(Seq=Y) 包给客户端服务端进入 SYN-RECIVED 状态,等待客户端ACK(Ack=Y+1) 回复。

第三次握手:

客户端接收到 ACK(X+1) 后,进入 ESTABLISHED 状态。根据服务端发来的 SYN(Y) 返回一个 ACK(Y+1) 包给服务端
服务端 接收 ACK(Y+1)后进入 ESTABLISHED 状态。此时连接建立成功。

这个过程可以用以下三句形象表示:

  1. (客户端):我想建立连接了,服务端你能听到吗?
  2. (服务端):我听得到,你这边听得到吗?
  3. (客户端):我也听得到。

TCP 关闭连接四次挥手

四次挥手

这个过程可以用以下四句句形象表示:

  1. (客户端):我想关闭连接了,你工作完了吗?
  2. (服务端):我知道了,等等。
  3. (服务端):我现在准备关闭连接了,ok 吗?
  4. (客户端):ok,你关闭吧。

UDP 与 TCP 的区别

  • UDP 协议是面向无连接的,它不能保证数据有序且不丢失的传到对端,但是 UDP 比 TCP 更高效。
  • TCP 协议是面向有连接的,建立和断开连接都需要握手,在传输数据的过程中,通过滑动窗口(流量控制)、拥塞处理(慢开始,拥塞避免,快速重传,快速恢复),能够正确处理丢包问题,保证接收方能够收到数据,与此同时还能够有效利用网络带宽。

HTTP

HTTP (HyperText Transfer Protocol) 超文本传输协议 是一个基于 TCP (传输层) 的应用层协议,是客户端与服务端之间请求和响应的标准。

主要特点

  • 简单快速

    客户端向服务器请求服务时,只需请求方法和请求路径。

  • 无状态

    客户端再次向服务器请求服务时,服务器并不知道客户端之前是否请求过。

  • 无连接

    每次请求都会建立一个 TCP 连接,请求处理完成后连接断开。

HTTP 报文

HTTP报文

请求行:

GET https://www.baidu.com/ HTTP/1.1 由请求方法、URL、协议版本组成

响应行:

HTTP/1.1 200 OK
协议版本、状态码、状态信息组成

HTTP 请求方法

请求方法分为很多种,最常用的也就是 GETPOST 了。虽然请求方法很多,但更多的是为了传达语义。更多的方法的语义描述可以阅读 文档

GET 和 POST 的区别

  • GET

    能缓存、请求长度限制、 有历史记录

GET 多用于 无副作用(不修改资源)、幂等(请求次数与资源无关)的场景。

  • POST

    POST 相对 GET 安全一点点,因为 GET 请求发送的数据包含在 URL 里。

两者详细对比:
GET与POST

状态码

状态码表示了响应的状态,可以让我们知道这一次的请求是成功还是失败,如果失败,是什么原因导致的。

2XX 成功

  • 200 OK ,请求成功并返回数据
  • 204 No Content ,成功但无内容
  • 206 Partial Content ,范围请求

3XX 重定向

  • 301 永久重定向,表示资源已被分配了新的 URL
  • 302 临时重定向,资源临时被分配新的 URL
  • 304 资源未修改,可使用缓存

4XX 客户端错误

  • 400 请求语法错误
  • 401 要求身份认证
  • 403 请求被服务器拒绝
  • 404 资源不存在

5XX 服务器错误

  • 500 服务器错误
  • 503 服务器超负载或停机维护

HTTPS

更安全的网络传输协议

  • 需要安装证书(公钥)
  • 经过 SSL/TLS 协议 加密,传输的内容是经过加密的
  • 使用 443 端口

HTTP/2

  • 多路复用

    在同一个 TCP 连接上传输所有的请求数据,避免 队头阻塞(浏览器限制同一个域名下的连接数)问题

  • Header 压缩

    使用了 HPACK 压缩格式对传输的 header 进行编码,减少了 header 的大小。并在两端维护了索引表,用于记录出现过的 header ,避免 header 重复传输。

  • 二进制传输

    在之前的 HTTP 版本中,我们是通过文本的方式传输数据。在 HTTP/2 中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。

  • 服务端推送

    服务端可以在客户端的某个请求后,主动推送其他客户端在之后会用到的资源。省去了客户端重复请求的步骤,降低了延迟。

在浏览器输入 url 后会发生什么

  1. 浏览器会通过 url 拿到域名。
  2. 通过这个域名想拿到对应的服务器的 ip 地址

    1. 先在浏览器缓存中找
    2. 没找到就到操作系统缓存里找
    3. 在 host 文件找
    4. 向 DNS 服务器发起请求,拿到对应的 ip 地址
  3. 本地随机开个没占用的端口通过拿到的 ip 地址及 url 中的端口号与服务器建立 TCP 连接

  4. 浏览器通过这个连接通道向服务器发送 http 请求
  5. 服务器处理请求并返回 HTTP 响应报文
  6. 浏览器解析渲染页面
  7. 断开 TCP 连接
© 2019 墨夜 All Rights Reserved.
Theme by hiero