这篇文章和大家聊聊所谓的传输层协议,全是干货,速记!
数据报文传输的流程
我们首先需要了解一下数据报文的传输流程:
电脑的信息 => dns 域名解析 => 在电脑中转化成二进制 => 报文(头:携带数据的基本信息;体:数据体) => 传输协议(UDP、TCP)=> 传输数据给另一台设备
UDP 协议
用户数据报协议(UDP,User Datagram Protocol)是一种简单的、面向数据报的传输层协议。它提供了一个无连接的通信方式,主要特点包括:
- 面向无连接:UDP 不需要在发送数据之前建立连接,知道了对面的 ip (dns 解析)后就直接传输数据。
- 只做数据报文的搬运工:不增加额外的报文,头部只有八个字节
- 不保证数据包的有序性:
- 不保证数据的可靠性:UDP 不保证数据包的顺序和完整性,可能会出现丢包或乱序的情况。
- 没有拥塞控制:
- 高效:由于没有连接建立和维护的开销,UDP 的传输效率较高,适用于实时应用。
常见的应用场景:直播,视频,实时性要求高的应用
TCP 协议:从物理层贯穿到应用层
-
可靠的、面向连接:在传输数据之前,TCP 需要建立一个连接,并在传输结束后释放连接。
-
慢启动、拥塞控制:TCP 通过拥塞避免算法,动态调整发送速率,避免网络拥塞。
-
有序的
-
流量控制:TCP 通过滑动窗口机制,控制数据的发送速率,防止网络拥塞。
-
头部信息多:
-
Sequence Number(序列号)
-
Acknowledgment Number(确认号)
-
Window Size(窗口大小:网络环境支持传输多少字节的数据)
-
标识符
- URG=1 紧急报文
- ACK:1 确认报文
- PSH:1 接收端应立即将数据传给应用层
- RST:1 需要重连
- SYN:1 请求建立连接
- FYN:1 关闭连接
-
常见的应用场景:ajaxs、实时性要求不高的应用。
http 协议 数据传输
三次握手
- (SYN):客户端向服务器发送一个 SYN(同步序列号)报文(客户端进入 SYN-SEND 状态)
- (SYN-ACK):服务器收到 SYN 报文后,向客户端发送一个 SYN-ACK 报文(服务端进入 SYN-RECEIVED)
- (ACK):客户端收到 SYN-ACK 报文后,向服务器发送一个 ACK 报文,确认收到服务器的 SYN 报文(客户端和服务端进入到 ESTABLISHEN)
为什么有三次握手
- 假设客户端像服务端发送一个连接请求 A,但是网络环境差导致 A 报文丢失,TCP 的超时重传会让客户端会重新再发一个连接请求 B,此时服务端顺利接收到 B 报文,然后服务端回复一个确认报文,如果此时连接就建立成功的话,客户端和服务端就开始通信,通性结束后断开连接。但 A 报文有可能在再次出现在网络环境中被服务端接收到,此时服务端会回复一个确认报文并进入到 ESTABLISHEN 状态,而客户端已经下线,服务端会一直等待客户端的数据通讯,造成资源浪费。
四次挥手
- (FIN):客户端向服务器发送一个 FIN(终止连接)报文,表示客户端不再发送数据,但仍可以接收数据(客户端进入 FIN-WAIT-1 状态)。
- (ACK):服务器收到 FIN 报文后,向客户端发送一个 ACK 报文,确认收到客户端的 FIN 报文(服务器进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态)。
- (FIN):服务器向客户端发送一个 FIN 报文,表示服务器也不再发送数据,但仍可以接收数据(服务器进入 LAST-ACK 状态)。
- (ACK):客户端收到服务器的 FIN 报文后,向服务器发送一个 ACK 报文,确认收到服务器的 FIN 报文(客户端进入 TIME-WAIT 状态,服务器进入 CLOSED 状态)。客户端在经过一段时间(通常是 2MSL,最大报文段生存时间)后,进入 CLOSED 状态。
http 0.9
- 传输体积很小的 html 超文本
- 特点
-
只有请求行,没有请求头,没有请求体
例如:www.baidu.com/images/inde...,images/index.js 是请求行
-
服务端没有返回头信息
-
返回的内容以 ASCII 字符流传输
http 1.0
-
万维网联盟(W3C)和 http 工作组成立
-
浏览器展示的不仅是 html,还有 js,css,图片,音频,视频等等
-
HTTP 需要支持不仅限于 ASCII 的编码,还需要支持多种的编码类型
-
特点:增加了请求头,响应头 key-value
-
1.0 需要解决的问题
- 浏览器需要知道服务器返回的内容是什么类型
- 浏览器需要知道服务器用的是什么压缩方式(文件越来越大需要压缩)
- 浏览器要能告诉服务器自己需要的语言类型
- 浏览器需要知道文件的编码类型
-
请求头
- accept:text/html (浏览器能接受的类型)
- accept-encoding:gzip,deflate,br,zstd (浏览器能接受的压缩方式)
- accept-language:zh:CN,zh;q=0.9 (浏览器能接受的语言类型)
- accept-charset:UTF-8,TSO-8859-1;q=0.9(浏览器能接受的编码类型)
-
响应体
- content-type(服务器返回的类型)
- content-encoding(服务器用的压缩方式)
- content-language(服务器用的语言类型)
-
状态码
- 2xx 成功
-
200 成功
-
204 成功,但是没有内容
-
205 成功,报文没有实体
-
206 成功,报文只含有实体的一部分
- 3xx 重定向
-
301 永久重定向(请求能走,没有资源,这个资源被放在别的URL了)
-
302 临时重定向(请求的资源临时被移动到新的 URL)
-
303 临时重定向(请求的资源可以在另一个 URL 处找到,客户端应使用 GET 方法请求新的 URL)
-
304 协商缓存 (表示请求的资源未被修改,客户端应继续使用缓存的版本。)
- 4xx 客户端错误
-
400(请求无效或格式错误,服务器无法理解请求)
-
401(未授权)
-
403(禁止访问)
-
404(服务器无法找到请求的资源,通常是因为 URL 错误或资源已被删)
- 5xx 服务器错误
- 500 内部服务器错误(服务器遇到错误,无法完成请求)
- 501 未实现(服务器不具备完成请求的功能)
- 502 错误网关(服务器作为网关或代理,从上游服务器收到无效响应)
- 503 服务不可用(服务器暂时无法处理请求,通常是由于过载或维护)
-
Cache 缓存机制(强缓存和协商缓存)
-
用户代理:通过请求头的 User-Agent 字段传递
User-Agent: Mozilla/5.0 (平台信息) 引擎/版本 产品/版本 [扩展信息]
http 1.1
-
1.0 缺陷:每一次请求都要重新建立连接,浪费资源
-
1.1 的特点
- 增加了 TCP 的持久连接(一个 TCP 连接中可传输多个 HTTP 请求)
- 允许同时建立 6 个 TCP 持久连接
- 增加了带宽优化机制(文件切片)
- 增加了 Host 字段(主机名)
- 客户端增加了 cookie
-
问题:队头阻塞(一个 TCP 连接中,前面的请求没有返回,后面的请求就会阻塞)
http 2.0
-
1.1 的缺陷
-
队头阻塞
-
带宽利用率低 (100M应该有12.5M/s,但是只有2.5M/s),是因为
- TCP 的慢启动
- 同时建立了 6 个 tcp 连接,导致每个连接之间竞争带宽
- http队头阻塞
-
-
2.0 多路复用--解决队头阻塞
- 一个域名下,只需要一个 TCP 连接
- 二进制分帧层:将请求全部打包成帧,帧与帧之间互不干扰,并打上编号,服务端可以根据编号的优先级来处理加急请求
HTTPS 和 HTTP 的区别
-
https 是 http 的安全版本。(https = http + TLS + SSL)
-
TLS加密:
-
对称加密:两边拥有相同的密钥,两边都知道如何解密
-
非对称加密:为了让两边拥有相同的密钥
- 客户端生成 密钥
- 服务端生成 公钥+私钥
- 服务端将 公钥 发送给客户端
- 客户端利用 公钥 加密 密钥 并传输给服务端
- 服务端用私钥解开 公钥 得到 密钥
-
这个大家可以发挥一下自己的想象力,
服务端就像银行金库,有一个特殊的保险柜:
-
公钥:银行给客户的 "锁",只能用来锁保险柜
-
私钥:银行自己的 "钥匙",只能用来打开保险柜
客户端就像客户:
- 客户把贵重物品(密钥)放进保险柜
- 用银行给的锁(公钥)锁住保险柜
- 保险柜运输到银行
- 银行用自己的钥匙(私钥)打开保险柜
HTTP 3.0
-
2.0 缺陷
- TCP 的队头阻塞(超时重传):注意这是TCP的对头阻塞,和 http 队头阻塞的不一样
- TCP 的慢启动
- TCP 建立连接和关闭连接(耗时)
-
QUIC:传输层协议
- 基于UDP协议
- 多路复用
- 有序性
- 快速握手
- 可靠性
- 加密传输
- 流量控制
通过独立流(Stream)和包号(Packet Number)设计解决TCP队头阻塞,例如:
QUIC为每个数据流分配独立编号,即使某个流出现丢包,其他流的传输不受影响,彻底规避TCP的全局重传阻塞问题。
-
难以普及的原因:
- TCP 协议僵化:指由于 TCP 协议在互联网基础设施中被广泛应用已久,导致对其进行任何实质性改进或修改变得极其困难的现象
- 设备更换根本导致 3.0 没有普及开来
HTTP/1.1 = HTTP 协议 + TCP 传输层
HTTP/2 = HTTP 协议改进版 + TCP 传输层
HTTP/3 = HTTP 协议进一步改进 + QUIC 传输层 (基于 UDP)
面试考点
- UDP 和 TCP 区别
- TCP 为什么是三次握手
- 状态码
- http 队头阻塞,怎么解决
- TLS 加密手段(http和https的区别)
- HTTP 3.0的认识