网络协议是什么?
网络协议是计算机网络中设备之间通信时遵循的规则和约定,定义了数据格式、传输方式、错误处理等,确保不同设备能正确交换信息。
网络协议的分层(OSI/TCP-IP模型)
网络协议通常按分层模型归类,常用的是 TCP/IP四层模型 或 OSI七层模型,对应关系如下:
网络协议分层的设计是为了实现职责分离、模块化协作,提升系统的灵活性、可维护性和扩展性。
常见网络协议及特点
传输层:传输层为应用程序提供端到端的数据传输服务,负责数据的分段、传输控制、错误恢复和流量控制。它主要使用 TCP(传输控制协议)和 UDP(用户数据报协议)来实现这些功能。
| 协议 | 特点 | 应用场景 |
|---|---|---|
| TCP | 面向连接、可靠传输(确认重传)、流量控制、拥塞控制。 | Web(HTTP/HTTPS)、文件传输(FTP)、邮件(SMTP)。 |
| UDP | 无连接、不可靠(不保证顺序和到达)、低延迟、轻量级。 | 实时音视频(Zoom)、DNS查询、在线游戏。 |
典型场景举例
- 当你在浏览器中访问网页时,传输层(TCP)负责将完整的HTML文件拆分成多个报文段,确保它们按顺序到达服务器,并处理丢包重传。
- 玩在线游戏时,传输层(UDP)快速发送玩家的实时位置信息,允许偶尔丢包以降低延迟。
应用层:该层为用于通信的应用程序和用于消息传输的底层网络提供接口。 应用层协议为应用程序之间的通信提供规则(如HTTP/HTTPS用于网页浏览和API通信,HTTPS通过加密提升安全性为确保通信畅通),源主机和目的主机上所实现的应用层协议必须一致。
| 协议 | 特点 | 应用场景 |
|---|---|---|
| HTTP | 明文传输 | 静态网站浏览(不涉及敏感信息)、 内部系统通信(封闭网络环境)。 |
| HTTPS | 通过SSL/TLS加密 | 用户登录,支付等敏感操作、 所有现代网站(浏览器强制要求HTTPS)。 |
典型场景举例
- 当你在浏览器输入网址时,应用层(HTTP)定义如何向服务器请求页面,而传输层(TCP)确保请求可靠到达。
- 使用微信发送消息时,应用层协议定义消息格式(文本、图片等),传输层(可能用TCP或UDP)负责传输数据。
协作关系:以网页加载为例
- 应用层:浏览器生成HTTP请求(
GET /index.html),定义请求头和内容。 - 传输层:TCP将HTTP请求拆分为报文段,添加源端口(如5000)和目标端口(80),确保可靠传输。
- 网络层:IP协议将报文段封装为IP包,路由到目标服务器。
- 服务器端:传输层(TCP)重组报文段,应用层(HTTP)解析请求并返回HTML文件。
UDP协议
用户数据报协议 (User Datagram Protocol, UDP)是一个简单的面向无连接的,不可靠的数据报的传输层(transport layer)协议。 在TCP/IP模型中,UDP为网络层(network layer)以上和应用层(application layer)以下提供了一个简单的接口。UDP只提供数据的不可靠交付,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。由于缺乏可靠性,UDP应用一般必须允许一定量的丢包、出错和复制。
简单来说它无需建立连接即可直接发送数据,头部开销小,传输速度快,但不保证数据的可靠性、有序性或完整性,可能丢包或乱序。 就像寄明信片一样,写好地址就直接寄出去,不管对方收没收到。UDP支持单播、多播和广播,适合对实时性要求高的场景,比如视频直播、在线游戏或语音通话。
特点
它一种轻量级、高效的传输协议,牺牲了部分可靠性来换取速度和灵活性。
1. 面向无连接(知道了对面的 ip 后就直接传输数据):UDP不需要像TCP那样通过“三次握手”建立连接,也不需要维护连接状态。
2. 只做数据报文的搬运工(不增加额外的报文头部):UDP头部只有8字节,包含源端口、目标端口、长度和校验和,没有额外的控制字段(如序列号、确认号等)。
3. 不保证数据包的有序性:UDP没有序列号机制,数据包按照发送顺序传输,但可能因网络路径不同而乱序到达。
4. 不保证数据的可靠性(可能丢包):UDP没有确认机制(ACK)和重传机制,发送方不知道数据是否成功到达。
5. 没有拥塞控制:UDP不检测网络拥塞情况,也不会主动降低发送速率。
- 好处:在网络状况良好时,可以充分利用带宽,实现高吞吐量。
- 代价:在网络拥塞时,可能加剧问题,导致更多丢包。
6. 高效:UDP的设计目标是简单和快速,去掉了许多复杂的控制机制。
7. 支持单播、多播和广播:UDP的设计允许数据包发送给单个目标(单播)、多个目标(多播)或整个网络段(广播)。
应用场景
在线游戏:玩游戏时,玩家的操作需要瞬间传到服务器,延迟高了会让人觉得“反应慢半拍”。UDP速度快,即使偶尔丢包(比如角色突然“瞬移”一下),也比延迟高、操作不跟手要好。
流媒体分发:电视台通过多播同时向大量用户发送视频流,UDP支持多播,效率高,即使偶尔丢包(比如画面卡一下),比如你看电视直播时,画面突然卡住,但很快又恢复正常。
补充
- 应用层可靠性增强:某些基于UDP的协议(如QUIC/HTTP3、RTSP)在应用层实现了重传、校验等机制,弥补了UDP的不足。
- 与TCP对比:TCP通过握手、确认、重传等机制保证可靠性,但牺牲了速度和灵活性;UDP则通过“轻量化”换取极致效率。
TCP协议
传输控制协议(TCP,TransmissionControl Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP旨在适应支持多网络应用的分层协议层次结构,互连的计算机通信网络中成对的应用程序进程之间能够依靠TCP提供可靠的通信服务来传输字节流。TCP支持双向数据流,应用程序也可以仅单向发送数据。在主机之间,TCP使用端口号标识应用程序服务并且可以多路传输数据流。
特点
TCP是一种以可靠性为核心的传输协议,通过复杂机制保障数据质量,但牺牲了部分速度和灵活性。
1. 面向连接:通过三次握手建立连接(SYN、SYN-ACK、ACK),通过四次挥手(FIN、ACK)安全断开连接,确保双方通信状态同步。
2. 头部信息复杂:TCP头部至少20字节(可扩展至60字节),包含关键控制字段:
-
序列号(Sequence Number) :标识数据包顺序,解决乱序问题。
-
确认号(Acknowledgment Number) :告知发送方“已收到哪些数据”。
-
窗口大小(Window Size) :网络环境支持传输数据量多少字节的数据,动态调整发送速率,避免接收方缓冲区溢出。
-
标识符:
URG=1:紧急报文。ACK=1:确认报文。PSH=1:要求接收方立即将数据推送给应用层。RST=1:强制复位异常连接。SYN=1:发起连接请求。FIN=1:请求终止连接。
3. 数据有序可靠:
- 通过序列号和确认号保证数据按顺序到达。
- 自动重传丢失或损坏的数据包(超时重传 + 快速重传机制)。
超时重传:发送方在发送一个分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发该分片;
4. 流量控制与拥塞控制:
- 流量控制:采用了滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。通过滑动窗口机制,根据接收方处理能力动态调整发送速率。
滑动窗口:TCP连接每一方的接收缓冲空间大小都是固定的,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP通过滑动窗口机制提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
- 拥塞控制:采用了广受好评的TCP拥塞控制算法(也称AIMD算法)。包含慢启动、拥塞避免、快速恢复等算法,感知网络拥堵并降低发送速率,避免加剧网络拥塞。
慢启动: 每当建立一个TCP连接时或一个TCP连接发生超时重传后,该连接便进入慢启动阶段。进入慢启动后,TCP实体将拥塞窗口的大小初始化为一个报文,即:cwnd=1。此后,每收到一个报文的确认(ACK),cwnd值加1,即拥塞窗口指数增加。当cwnd值超过慢启动阈值(ssthresh)或发生报文丢失重传时,慢启动阶段结束。前者进入拥塞避免阶段,后者重新进入慢启动阶段。
简单来说,TCP 协议是一种面向连接的、可靠的传输层协议,通过三次握手建立连接、确认应答、超时重传和流量控制等机制,确保数据有序、完整地从一端传输到另一端。
应用场景
网页浏览(HTTP/HTTPS) :加载网页时,若图片或文本丢失会导致页面错乱。TCP确保所有数据完整到达,用户看到的内容始终一致。
文件传输 :下载文件时,即便网络波动,TCP也能通过重传保证文件完整无误,避免压缩包损坏。
金融交易:在线支付或股票交易中,TCP保证交易指令的完整性和顺序,防止金额错乱或重复提交。
三次握手
TCP使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方发来的 SYN 执行 ACK 确认。这种建立连接方法可以防止产生错误的连接。
最开始的时候客户端和服务器都是处于CLOSED关闭状态。主动打开连接的为客户端,被动打开连接的是服务器。 TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了 LISTEN 监听状态
- 客户端发送 SYN 报文,请求建立连接 (客户端进入 SYN-SEND 状态)
- 服务端收到 SYN 报文,回复 SYN+ACK 报文 (服务端进入 SYN-RECEIVED 状态)
- 客户端收到 SYN+ACK 报文,回复 ACK 报文 (客户端和服务端同时进入 ESTABLISHED 状态)
为什么需要三次握手?两次握手行不行?
- 防止历史连接干扰
假设客户端向服务端发送一个连接请求 A,但是网络环境差,导致 A 报文丢失,TCP 的超时重传会让客户端重新再发一个链接请求 B,此时服务端顺利接收到 B 报文,然后服务端回复一个确认报文,如果此时连接就建立成功的话,客户端和服务端就开始通信,通信结束后断开连接。但 A 报文,有可能再次出现在网络环境中被服务端接收到,此时服务端会再次回复一个确认报文,并进入ESTABLISHED状态,而客户端已经下线,服务端会一直等待客户端的数据通讯,造成资源浪费。
- 验证双向通信能力
第一次握手: 客户端向服务器端发送报文证明客户端的发送能力正常
第二次握手:服务器端接收到报文并向客户端发送报文证明服务器端的接收能力、发送能力正常
第三次握手:客户端向服务器发送报文证明客户端的接收能力正常
HTTP协议 数据传输
HTTP 协议的数据传输基于 TCP 连接,整体流程如下:
三次握手(TCP 连接建立) → HTTP 请求 → HTTP 响应 → 数据传输 → 四次挥手(TCP 连接关闭)
具体场景 HTTPS 加载网页的完整流程(分层 + 时序):
-
建立 TCP 连接:三次握手。
-
TLS 握手:协商加密参数(仅 HTTPS)。
-
HTTP 请求-响应(分层处理):
-
应用层:浏览器生成 HTTP 请求(如
GET /index.html)。 -
传输层:TCP 拆分请求为报文段,添加端口号,确保可靠传输。
-
网络层:IP 协议封装为数据包,路由到目标服务器。
-
服务器处理:
传输层重组 TCP 报文段 → 应用层解析 HTTP 请求 → 返回响应(如 HTML 文件)。
-
-
复用连接:浏览器解析 HTML,发现需加载 CSS/JS,通过同一 TCP 连接发送新请求。
-
关闭连接:四次挥手(当连接超时或主动关闭时)。
HTTPS简单来说HTTP的加密版,TLS,复用连接没听过没关系,下一篇来讲
四次挥手
- 客户端向服务端发送 FIN 报文,请求断开连接 (客户端进入 FIN-WAIT-1 状态)
- 服务端收到 FIN 报文,回复 ACK 报文 (服务端进入 CLOSE-WAIT 状态)
- 服务端将未传输完的数据传输完后,向客户端发送 FIN 报文,请求断开连接 (服务端进入 LAST-ACK 状态)
- 客户端收到 FIN 报文,回复 ACK 报文 (客户端进入 TIME-WAIT 状态,一段时间后CLOSEED) 此时服务端进入 CLOSEED 状态
面试1. 为什么 TCP 关闭连接需要四次挥手?
- 原因:服务器在收到客户端的 FIN 报文段后,可能还有一些数据要传输,所以不能马上关闭连接,但是会做出应答,返回 ACK 报文段,接下来可能会继续发送数据,在数据发送完后,服务器会向客户单发送 FIN 报文,表示数据已经发送完毕,请求关闭连接,然后客户端再做出应答,因此一共需要四次挥手。
面试2. 为什么 TIME-WAIT 状态要等待 2MSL?
-
原因:解决网络不可靠导致的最后一个
ACK丢失问题,并防止旧连接数据干扰新连接。 -
作用:
- 确保服务器收到
ACK:
若客户端ACK丢失,服务器会重发FIN,客户端在TIME-WAIT期间可重新回复ACK。 - 清除旧连接残留报文:
等待 2MSL(2MSL是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃)确保网络中旧连接的报文失效,避免与新连接冲突。
- 确保服务器收到
-
简答:
等待 2MSL 既保证连接可靠关闭,又避免旧数据干扰新连接,是 TCP 对网络不可靠性的容错设计。