> 技术文档 > 网络协议HTTP、TCP/UDP

网络协议HTTP、TCP/UDP


 概述

如何让数据具有自我描述性?

使数据携带自身的信息

为什么网络有层级的划分?

目的是通过通过模块化和分工协作,解决复杂的系统设计、管理和操作问题

交换机、路由器要不要阅读一个信息的头部?要不要阅读数据部分? 

要阅读头部,要知道数据从哪来,到哪去,但不用阅读数据部分

网卡:网卡可以完成帧的封装和解封装,工作在数据链路层。中继器:中继器以比特方式将网络信号进行再生和重定时,使其能够传输更长的距离。放大器集线器:集线器实际上就是一个多端口的中继器。网桥/桥接器:连接两个局域网的一种存储转发设备,可以将一个大的LAN分割为多个网段,或者将两个以上的LAN互联为一个逻辑LAN。交换机:交换机有一张交换表,可以记录MAC帧和对应端口。(相当于网桥+集线器) 路由器:路由选择、存储转发、连接外部网络

万维网

万维网(World Wide Web,简称 WWW)的诞生和发展依赖于以下三个核心要素,它们共同构成了现代互联网信息交互的基础:

1. URL(统一资源定位符)

作用:为网络中的资源(如网页、图片、API)提供唯一标识和访问地址

https://www.example.com:443/path/to/resource?query=value#fragment ↑      ↑              ↑   ↑               ↑          ↑协议    主机名         端口  路径            查询参数    片段 

以下是URL各组成部分的表格化总结:

组成部分 作用 示例 注意事项 协议(Scheme) 指定访问资源使用的应用层协议 https://ftp:// 后跟://,现代浏览器默认隐藏http://https:// 主机名(Host) 标识资源所在的服务器地址(域名或IP) www.example.com192.168.1.1 可包含子域(如blog.example.com端口(Port) 指定服务器服务的网络端口 :443(HTTPS)、:8080(自定义端口) 默认端口可省略(HTTP=80,HTTPS=443) 路径(Path) 标识服务器上资源的具体位置(类似文件路径) /articles/2023//index.html 区分大小写(取决于服务器配置) 查询参数(Query) 向服务器传递额外参数(以?开头,&分隔) ?id=123&lang=zh 常用于搜索(?q=keyword)、分页(?page=2片段(Fragment) 指向资源内的锚点(以#开头),仅客户端使用 #section-2/#/home(SPA路由) 不发送到服务器,用于页面内跳转或前端路由

2. HTTP(超文本传输协议)

HTTP 的中文全称是 超文本传输协议(HyperText Transfer Protocol)。

 超文本(HyperText)含义:超越普通文本的交互式文本,支持嵌入链接、图片、视频等多媒体资源。

  • GET:通过 URL 的查询字符串(?key=value)传递数据,可见且长度受限(约 2048 字符)。

  • POST:通过请求体(body)传输数据,不可见且支持大量数据(如文件上传)。

 发送

发送的HTTP请求一般称之为HTTP请求报文,分为请求行请求头/消息头空行请求体/请求正文四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开. 

 请求行(Request Line):第一行 

请求头(Request Headers):从第二行开始到空行前的所有内容均为请求头,用于传递附加信息

 响应

  

服务器发送的HTTP响应一般称之为HTTP响应报文,分为响应行响应头/消息头空行响应体四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.

状态码范围 类别 说明 常见例子 1XX 信息性状态码 请求已被接收,继续处理 101 Switching Protocols(协议切换) 2XX 成功状态码 请求已成功处理 200 OK(成功) 3XX 重定向状态码 需进一步操作以完成请求 301 Moved Permanently(永久重定向) 4XX 客户端错误 请求包含语法错误或无法完成 404 Not Found(资源不存在) 5XX 服务器错误 服务器处理请求失败 500 Internal Server Error(服务器内部错误)

 3. HTML(超文本标记语言)

三者的协作关系

1.浏览器输入URL → 2. DNS解析获取IP → 3. 建立TCP连接 → 4. 发送HTTP请求报文 → 5. 服务器返回响应 HTML

  DNS解析(Domain Name System Resolution)是将人类易读的域名(如 www.example.com)转换为机器可识别的IP地址(如 192.0.2.1)的过程。

不同的域名可以用同一个服务器?

 答案是肯定的! 多个域名可以指向同一台服务器,通过监视程序统一管理。

HTTPS

safe:安全的

HTTP HTTPS 安全性 不安全 安全(加密+身份验证) 默认端口 80 443 加密

SSL/TLS

对称加密(如 AES)传输数据 

非对称加密(如 RSA)交换密钥

速度 更快 稍慢(可忽略)

 HTTPS 通过 数字证书 验证服务器身份

对称加密(如 AES)与非对称加密(如 RSA)在 HTTPS 中的协作流程 

  1. 客户端 → 服务器:Hello,支持 HTTPS 吗?

  2. 服务器 → 客户端:这是我的证书(含公钥)

  3. 客户端 验证证书有效性(如是否过期、是否受信任)。

  4. 客户端 生成随机 AES 密钥,用服务器公钥加密后发送。

  5. 服务器 用私钥解密,获取 AES 密钥。

  6. 双方 使用 AES 密钥加密所有后续通信。

特性 对称加密(AES) 非对称加密(RSA) 速度 快(适合大数据量) 慢(仅用于小数据) 密钥管理 同一密钥加密/解密 公钥加密,私钥解密 用途 加密实际数据 安全交换对称密钥 算法举例 AES, ChaCha20 RSA, ECC(椭圆曲线)

 TCP

长连接 和 短连接的区别

类型 定义 典型应用场景 短连接 每次通信后立即断开连接,下次通信需重新建立TCP连接。 HTTP/1.0、简单的请求-响应模型(如早期Web) 长连接 建立连接后保持连接不关闭,允许多次数据传输(通过心跳保活)。 HTTP/1.1、数据库连接、实时通信(如WebSocket)

TCP头部结构 

(共20字节基础长度 + 可选选项)

字段名 位数 作用说明 示例/备注 源端口(Source Port) 16 bit 发送方的端口号。 如 80(HTTP服务端口) 目的端口(Destination Port) 16 bit 接收方的端口号。 如 54321(客户端临时端口)
序列号(Sequence Number) 32 bit 当前数据段的第一个字节的序列号,用于数据排序和重组。 初始值随机生成(ISN),后续累加数据长度。 确认号(Acknowledgment Number) 32 bit 期望收到的下一个字节的序列号(仅当ACK=1时有效)。 如收到seq=1000,则回复ack=1001数据偏移(Data Offset) 4 bit TCP头部的长度(以4字节为单位),用于定位数据开始位置。 最小值为5(20字节头部)。 保留(Reserved) 6 bit 保留字段,必须置0。 未来扩展使用。 控制标志(Flags) 6 bit 控制连接状态的关键标志位: - URG Urgent 1 bit 紧急指针有效(高优先级数据)。 如Telnet中断命令。 - ACK Acknowledgment 1 bit 确认号有效(建立连接后通常为1)。 三次握手中第二次开始ACK=1。 - PSH Push 1 bit 接收方应立即将数据推送给应用层(避免缓冲区延迟)。 如实时聊天消息。 - RST 1 bit 重置连接(异常终止)。 收到无效报文时强制断开。 - SYN  :Synchronize 1 bit 同步序列号(用于建立连接)。 三次握手中前两次SYN=1。 - FIN 1 bit 终止连接(正常关闭)。 四次挥手中FIN=1。 窗口大小(Window Size) 16 bit 接收方的可用缓冲区大小(流量控制),表示当前能接收的字节数。 动态调整(滑动窗口机制)。 校验和(Checksum) 16 bit 校验头部和数据部分的完整性(包括伪头部)。 防止传输错误。 紧急指针(Urgent Pointer) 16 bit 当URG=1时有效,指向紧急数据的末尾偏移量。 需配合URG标志使用。 选项(Options) 可变 可选字段(长度由数据偏移决定),用于扩展功能: - MSS(Maximum Segment Size) 可变 协商最大报文段大小(通常1460字节,以太网MTU=1500)。 三次握手时协商。 - SACK(Selective ACK) 可变 选择性确认,支持部分重传。 提高重传效率。 - 时间戳(Timestamp) 可变 计算RTT(往返时间)和防止序列号回绕。 高带宽网络必备。 填充(Padding) 可变 确保TCP头部长度是4字节的整数倍。 选项字段不足时补0。

 三次握手

  1. 第一次握手(SYN)

    • 客户端发送SYN,携带自己的初始序列号ISN(Sequence Number:857960100)。

    • 目的:告知服务端“我想建立连接,我的序列号是X=857960100”。

  2. 第二次握手(SYN-ACK)

    • 服务端返回SYN-ACK,携带自己的初始序列号ISN(Sequence Number:304853757),并确认客户端的ISN ( ACK=X+1),也就是ACK=857960100+1。

    • 目的:回应客户端“我收到你的SYN了,我的序列号是Y=304853757,下次请发X+1”。

  3. 第三次握手(ACK)

    • 客户端发送ACK,确认服务端的ISN(ACK=Y+1)也就是304853757+1。

    • 目的:告知服务端“我收到你的SYN-ACK了,下次请发Y+1”。

关键点:第三次握手是客户端对服务端序列号的显式确认,确保双方序列号同步,且服务端知道客户端是活跃的。

TCP三次握手流程详解

步骤 发送方 报文内容 目的 第一次握手 客户端 SYN=1, seq=X 告知服务端:“我想建立连接,我的初始序列号是X”。 第二次握手 服务端 SYN=1, ACK=1, seq=Y, ack=X+1 回应客户端:“我收到你的SYN了,我的序列号是Y,下次请从X+1开始发数据”。 第三次握手 客户端 ACK=1, seq=X+1, ack=Y+1 确认服务端:“我收到你的SYN-ACK了,下次请从Y+1开始发数据”

为什么TCP需要三次握手?两次握手为什么不行?

两次握手:类似“你约朋友吃饭,朋友说‘好’,但你不确认他是否听到你的约定”。

风险:朋友可能没听清,但你默认他已同意。

三次握手:你约朋友 → 朋友说“好” → 你回复“收到”。

双方明确约定已达成。

TCP两次握手的问题 vs 三次握手的解决方案

问题分类 两次握手的缺陷 三次握手的解决方案 历史连接干扰 服务端收到旧SYN会直接建立连接,客户端因序列号不匹配拒绝,导致服务端资源浪费。 客户端通过第三次ACK确认有效性,服务端仅对有效ACK分配资源。 初始序列号(ISN)同步 服务端无法确认客户端是否收到自己的SYN-ACK(ISN可能丢失),后续数据传输不可靠。 客户端的第三次ACK显式确认服务端的ISN(ACK=Y+1),确保双方序列号同步。 重复SYN导致的资源浪费 服务端无法区分重复SYN(如网络重传),会为每个SYN创建连接,耗尽资源。 服务端仅在收到客户端的ACK后分配资源,避免无效连接。

四次挥手 

 发送方设置 PSH=1,要求接收方的 TCP 协议栈立即将当前数据段(Segment)提交给应用层(如 HTTP、FTP 等),而不是暂存在缓冲区等待更多数据。

为什么 TCP 断开连接需要四次挥手,而不是三次? 

TCP 连接是全双工的TCP 连接允许数据双向独立传输(客户端→服务端,服务端→客户端)。因此,关闭连接需要双向独立关闭

  • 客户端主动发起终止(发送 FIN)。

  • 服务端也需要独立发起终止(发送另一个 FIN)。

类比:就像两个人打电话,必须双方都明确说“再见”才能挂断。

如果合并为三次
服务端将 ACK 和 FIN 合并发送(即第二次挥手直接发 FIN + ACK),但前提是服务端没有剩余数据要发送。这种情况在 HTTP 短连接中常见(表现为“三次挥手”),但不是 TCP 的标准行为

下面就是合并为三次的情况

 

完整过程

TIME_WAIT=2MSL: 什么是MSL?为什么客户端最后还要等待2MSL? 

什么是MSL?
MSL是指TCP传输中,TCP报文段在网络中存在的最大生存时间。(MSL的主要目的是定义一个时间限制,以确保TCP报文段在网络中不会无限期地存在。是TCP允许不同的实现可以设置不同的MSL值)
为什么客户端最后还要等待2MSL?
确保对方收到最终ACK:TIME_WAIT状态确保连接的另一方(服务器)有足够的时间接收到最后一个ACK。因为如果服务器没有收到这个ACK,并且第三次挥手超时, 服务端可能认为它发送的第三次挥手失败(迷失在网络中), 服务器它会重新发送FIN报文段(第三次挥手)。客户端在TIME_WAIT状态可以处理这种情况,确保连接的可靠终止。
端口和资源的正确释放:这个等待期还允许操作系统正确地清理和释放用于连接的资源,如端口号。在2MSL结束后,相同的端口号可以安全地被新的连接使用,不会受到旧连接残留数据的影响。

 TCP协议如何保证数据的可靠传输?

机制 解决的问题 实现方式 三次握手 可靠连接建立 SYN、ACK同步序列号 序列号与确认号 数据顺序、丢包检测 每个字节标记序列号,ACK确认接收范围 超时重传 丢包恢复 RTO超时未收到ACK则重传 滑动窗口 流量控制 动态调整发送窗口大小(RWND) 拥塞控制 网络拥塞避免 慢启动、拥塞避免、快重传、快恢复

 下面表格通过举例说明了超时重传、滑动窗口动态调整大小和快重传机制

步骤 发送方(Client) 接收方(Server) 机制触发 1 发送seq=1~1000 未收到(丢包) 超时重传(RTO触发) 2 超时后重传seq=1~1000 收到并回复ACK=1001, RWND=4096 滑动窗口更新 3 发送seq=1001~5000 收到但缓冲区满,回复ACK=5001, RWND=2048 流量控制(窗口调小) 4 发送seq=5001~7048(2KB) 收到seq=5001~7048,回复ACK=7049 正常传输 5 发送seq=8001~9000(丢包) 收到seq=9001~10000,回复3次ACK=8001 快重传 + 快恢复

发送方可能一次发送很多TCP报文, 目的方着急回复确认吗?  不着急,偶尔回复 

为什么发送数据时要携带源端口? 接收端需要知道从哪个端口回复

超时重传和快重传有什么区别?见上

UDP

UDP是一种保留消息边界的简单的面向数据报的传输层协议。

  1. 无连接:UDP是一种无连接协议。这意味着在数据包发送之前,发送方和接收方之间不需要建立连接。每个数据包之间独立发送,彼此之间没有依赖关系。
  2. 低开销:UDP协议头部较小,只有8字节,相比之下,TCP协议头部最少20字节。UDP的简单性使得它在传输数据时增加的开销更少。
  3. 不可靠传输:UDP不提供数据到达的保证。因为它不进行错误检查或者纠正,意味着网络上的数据包可能会丢失、重复或乱序到达,且发送方不会得到通知。
  4. 无拥塞控制:UDP不实现拥塞控制机制。它以相同的速度发送数据,不论网络条件如何。这可能导致在网络质量较差时数据包被丢弃。
  5. 快速传输:由于缺乏连接建立、确认响应、流量控制等机制,UDP可以更快速地传输数据(能不能到目的地是另外一件事)。

由于其特性,UDP通常用于那些对实时性要求高但对可靠性要求不高的应用,例如视频流、VoIP(语音通信)、在线游戏、早期的聊天软件等。

  

 补充:TCP协议核心术语对照表

英文缩写 英文全称 中文解释 TCP Transmission Control Protocol 传输控制协议,提供可靠的、面向连接的字节流服务。 IP Internet Protocol 网际协议,负责数据包的路由和寻址。 MTU Maximum Transmission Unit 最大传输单元,单次数据传输的最大长度(如以太网MTU=1500字节)。 MSS Maximum Segment Size 最大报文段长度,TCP数据段的最大负载(MSS = MTU - IP头 - TCP头)。 SYN Synchronize Sequence Numbers 同步序列号,用于建立连接(三次握手的第一步)。 ACK Acknowledgment 确认号,表示已成功接收数据(ACK=1时有效)。 FIN Finish 终止连接标志,用于正常关闭连接(四次挥手)。 RST Reset 重置连接标志,强制终止异常连接。 URG Urgent 紧急指针标志,表示数据需优先处理(如中断命令)。 PSH Push 推送标志,要求接收方立即将数据提交给应用层。 ISN Initial Sequence Number 初始序列号,TCP连接开始时随机生成的序列号。 RTT Round-Trip Time 往返时间,数据从发送到确认接收的时间。 RTO Retransmission Timeout 重传超时时间,超时未收到ACK则触发重传。 RWND Receive Window 接收窗口,接收方当前可用的缓冲区大小(流量控制)。 CWND Congestion Window 拥塞窗口,发送方根据网络拥塞程度动态调整的发送窗口。 SACK Selective Acknowledgment 选择性确认,允许接收方告知发送方哪些数据已收到(优化重传)。 MSS Maximum Segment Size 最大报文段长度,TCP单次传输的数据段最大值。 NAT Network Address Translation 网络地址转换,将私有IP映射为公有IP(解决IPv4地址不足)。 LAN Local Area Network 局域网,小范围内的私有网络(如家庭、办公室)。 WAN Wide Area Network 广域网,跨越长距离的网络(如互联网)。