Skip to content

网络模型

  • TCP/IP (网络接口、网络层、传输层、应用层)
  • OSI (物理、链路,网络,传输,会话、表示、应用)

TCP/IP, UDP

  • UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,快,不代表稳定
  • TCP 传输控制协议(Transmission Control Protocol),稳定

TCP 简介

  • TCP/IP 传输协议,即传输控制/网络协议,具有网络数据信息及时、完整传输的两个重要的特性
  • 四层的体系结构

层级介绍

  • 应用层:用来接收来自传输层的数据 或者 按不同应用要求与方式将数据传输至传输层,e.g. http、FTP、SMTP
  • 传输层:使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享,主要协议:TCP、UDP
  • 网络层:负责网络中数据包的传送, 主要协议 IP
  • 数据链路层:网络访问层,也叫网络接口层或数据链路层、提供链路管理错误检测

TCP 的三次握手四次挥手

当建立或终止 TCP 连接时,使用三次握手和四次挥手来确保连接的可靠性。让我为您简要描述一下这两个过程:

  1. 三次握手(Three-way Handshake):

    • 客户端发送一个带有 SYN(同步)标志的数据包给服务器。
    • 服务器收到后,回复一个带有 SYN 和 ACK(确认)标志的数据包给客户端。
    • 客户端再次回复一个带有 ACK 标志的数据包给服务器,此时连接建立完成。
  2. 四次挥手(Four-way Handshake):

    • 客户端发送一个带有 FIN(结束)标志的数据包给服务器,表示不再发送数据。
    • 服务器收到后,回复一个带有 ACK 标志的数据包给客户端,确认收到 FIN。
    • 服务器发送一个带有 FIN 标志的数据包给客户端,表示服务器不再发送数据。
    • 客户端收到后,回复一个带有 ACK 标志的数据包给服务器,确认收到 FIN,此时连接关闭。

HTTP

HTTP 与 TCP 的联系?

TPC/IP 协议是传输层协议,主要解决数据如何在网络中传输,而 HTTP 是应用层协议,主要解决如何包装数据。让用户更简单的认识

HTTP1.1 报文:

  • 所有的 HTTP 报文都可以分为两类,请求报文响应报文
  • curl -i www.baidu.com 可以获取响应报文
  • curl -v www.baidu.com 可以获取请求和响应报文
  • 首部/头部 跟主体之间是通过一个空行隔开
conf
# 请求报文
GET / HTTP/1.1
Host: baidu.com


# 响应报文
HTTP/1.1 200 OK  #起始行,中间是首部
Content-Length: 133
Content-Type: text/html; charset=utf-8
Date: Fri, 31 Dec 2021 04:19:14 GMT
Connection: keep-alive
Keep-Alive: timeout=5
  #空行,下面是 响应的主体
hello http

自定义报文

js
const fs = require("fs");
// 先引入系统模块http
const http = require("http");
// 创建web服务器
const app = http.createServer();
const port = 3000;
// 为服务器添加请求事件,也就是request事件
// 参数res就是响应对象
app.on("request", (req, res) => {
  // 参数res对象下有一个方法:writeHead()
  // 该方法的第一个参数是状态码,默认是200
  // 第二个参数是一个对象,是响应报文信息
  res.writeHead(200, {
    // 指定类型是纯文本,那么就会输出<h1>Welcome to Homepage</h1>,而不是把h1当作标签执行
    "content-type": "text/plain",
  });
  // 获取请求地址 req.url
  if (req.url == "/index" || req.url == "/") {
    res.end("<h1>Welcome to Homepage</h1>");
    // 获取文件系统:fs需要导入
    // res.end(fs.readFileSync("./index.html"));
  } else if (req.url == "/list") {
    res.end("Welcome to ListPage");
  } else {
    res.end("Not Found Page");
  }
});
app.listen(port);
console.log(`网站服务器启动成功,运行在 ${port}端口`);

HTTP 各版本特性:

HTTP0.9

  • 只有一个命令 GET。协议规定,服务器只能回应 HTML 格式的字符串,不能回应别的格式
  • 服务器发送完毕,就关闭 TCP 连接。

HTTP1.0

优点:

  1. 任何格式的内容都可以发送。 依赖于 content-type
  2. 除了 GET 命令,还引入了 POST 命令和 HEAD 命令
  3. HTTP 请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据
  4. 新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)

缺点:

  • 每个 TCP 连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接(代价太高)

HTTP 1.1:

优点

  • 管道化(Pipelining):

    管道化方案解决连接延迟,设置 Connection: keep-alive 来让连接延迟关闭时间,但因为浏览器自身的 Max-Connection 最大连接限制一般 6 个,所以我们一般只能通过多开域名来实现

  • 缓存处理:

    强缓存、协商缓存、不缓存

  • 错误通知(状态码的增加)

缺点:

  • 头部信息冗余:由于无状态,大量冗余的头部信息,头部信息包括大量 COOKIE 信息

  • 超文本协议:报文是以文本格式,压缩优化不好

  • 队头阻塞:

    管道化通过延迟连接关闭的方案,虽然可同时发起对服务端的多个请求,但服务端的 response 依旧遵循 FIFO(先进先出)规则依次返回。

    举个例子客户端发送了 1、2、3、4 四个请求,如果 1 没返回给客户端,那么 2,3,4 也不会返回。这就是所谓的「队头阻塞」,高并发高延迟的场景下阻塞明显。

2.0:优点

  • 多路复用:

    • 1.1 中可以通过多开 TCP 链接来处理
    • 2.0 一个域只要一个 TCP 连接,实现真正的并发请求,降低延时,提高了带宽的利用率。
  • 二进制协议

  • 头部压缩

    采用 HPACK 压缩,节省了报文头占用流量。 1.相同的头部信息不会通过请求发送,延用之前请求携带的头部信息。 2.新增/修改的头部信息会被加入到 HEAD 中,两端渐进更新。

  • 服务端推送

    客户(服务)端发送(接收)数据时,会将数据打散乱序发送,接收数据时接收一端再通过 streamID 标识来将数据合并。二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。

2.0 缺点

因为 HTTP2 将多个 HTTP 流放在同一个 TCP 连接中,遵循同一个流量状态控制。只要第一个 HTTP 流遇到阻塞,那么后面的 HTTP 流压根没办法发出去,这就是「行头阻塞」

3.0 特性:

  • 采用 QUIC 协议,基于 UDP 协议,让不同的流之间真正的实现相互独立传输,互不干扰。
  • 避免了 TCP 协议的一些缺点,采用 TLS1.3 将 HTTPS 所需的 RTT 降至最少为 0。
  • 切换网络时的连接保持:(wifi 切 4G) ip 更换 ,重新连接

升级到 HTTP2

由于 HTTP2.0 基本上只支持 https 协议,所以要确保网站必须支持 https 访问才行。

conf
server {
  listen 443 ssl http2;
  server_name 域名;

  ssl_certificate             /root/your.cert;
  ssl_certificate_key         /root/your.key;
  ssl_session_timeout         10m;
  ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers                 HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
  ssl_prefer_server_ciphers   on;
}