网络模型
- 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 连接时,使用三次握手和四次挥手来确保连接的可靠性。让我为您简要描述一下这两个过程:
三次握手(Three-way Handshake):
- 客户端发送一个带有 SYN(同步)标志的数据包给服务器。
- 服务器收到后,回复一个带有 SYN 和 ACK(确认)标志的数据包给客户端。
- 客户端再次回复一个带有 ACK 标志的数据包给服务器,此时连接建立完成。
四次挥手(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 可以获取请求和响应报文
- 首部/头部 跟主体之间是通过一个
空行隔开
的
# 请求报文
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
自定义报文
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
优点:
- 任何格式的内容都可以发送。 依赖于 content-type
- 除了 GET 命令,还引入了 POST 命令和 HEAD 命令
- HTTP 请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据
- 新增功能还包括状态码(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 访问才行。
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;
}