菜单

Q
发布于 2025-09-11 / 7 阅读
0
0

计网基础:从TCP/UDP到HTTP/3

第一部分:传输层的两大支柱 —— TCP与UDP

想象一下你要寄送一份非常重要的文件。你有两种选择:

  1. A公司:这家公司提供“签收回执”服务。他们会先给你打电话确认地址,确保有人接收。运输过程中,他们会将文件打包并编号,对方收到后会按顺序签收,并给你发送确认回执。如果中途包裹丢失,他们会负责重发。这个过程万无一失,但流程多,速度稍慢。

  2. B公司:这家公司主打“极速闪送”。你把文件交给他们,他们会用最快的速度直接送到目的地,但不会提前联系,也不保证对方一定能收到,更不保证包裹的先后顺序。这种方式非常快,但有丢失的风险。

在网络世界里,A公司就是TCP,B公司就是UDP

1. TCP (Transmission Control Protocol) - 可靠的信使

TCP,即传输控制协议,是一种面向连接、可靠的、基于字节流的传输层协议。它的设计目标是,在不可靠的互联网上提供可靠的数据传输服务。

核心特点与机制:

  1. 面向连接 (Connection-Oriented):在发送数据之前,必须先在发送方和接收方之间建立一个连接。这个过程被称为**“三次握手” (Three-Way Handshake)**。

    • 第一次握手 (SYN):客户端发送一个带有SYN(同步)标志的数据包给服务器,请求建立连接。

    • 第二次握手 (SYN+ACK):服务器收到请求后,回传一个带有SYNACK(确认)标志的数据包,表示同意建立连接。

    • 第三次握手 (ACK):客户端收到服务器的同意后,再发送一个ACK数据包,表示“好的,我知道你准备好了”,此时连接正式建立。

    • 这个过程就像打电话:“喂,听得到吗?” -> “听得到,你呢?” -> “我也听得到,那我们开始说吧。”

  2. 可靠传输 (Reliable):TCP通过多种机制保证数据不丢失、不重复、无差错且按序到达。

    • 序列号 (Sequence Number):TCP将数据分割成多个数据段(Segment),并为每个字节都编上一个唯一的序列号。接收方可以根据序列号对数据进行排序和重组。

    • 确认应答 (Acknowledgement, ACK):接收方每收到一个数据段,都会发送一个ACK包给发送方,告诉它“我已经收到了编号为X的数据,下次请从编号Y开始发”。

    • 超时重传 (Timeout Retransmission):发送方在发送数据后会启动一个计时器。如果在规定时间内没有收到对方的ACK,就会认为数据丢失,并重新发送该数据段。

  3. 流量控制 (Flow Control):TCP使用**滑动窗口 (Sliding Window)**机制。接收方会告诉发送方自己还能接收多少数据(即窗口大小)。如果接收方处理不过来,窗口就会变小,发送方就会减慢发送速度,防止把接收方“撑爆”。

  4. 拥塞控制 (Congestion Control):TCP不仅关心接收方的状态,还关心整个网络的状况。当网络出现拥堵时,TCP会主动降低发送速率,以缓解网络压力。这主要通过慢启动、拥塞避免、快重传等算法实现。

  5. 断开连接 - 四次挥手 (Four-Way Wave)

    • 数据传输完毕后,任何一方都可以发起断开连接的请求。这个过程需要四步,以确保双方都没有数据要发送了。

应用场景: 对数据可靠性要求极高的场景,如:

  • 网页浏览 (HTTP/HTTPS)

  • 文件传输 (FTP)

  • 电子邮件 (SMTP/POP3)

2. UDP (User Datagram Protocol) - 迅捷的快递员

UDP,即用户数据报协议,是一个无连接的、不可靠的传输层协议。它追求的是速度和效率,而不是可靠性。

核心特点:

  1. 无连接 (Connectionless):发送数据前不需要建立连接(没有三次握手),拿来就发,极大地减少了开销和延迟。

  2. 不可靠 (Unreliable):UDP不保证数据能否成功到达、是否按序到达,也不进行重传。它只是尽最大努力(Best-Effort)地交付数据。

  3. 开销小,速度快:UDP的头部(Header)只有8个字节,相比TCP的20+字节要小得多。没有复杂的连接管理和确认机制,处理速度非常快。

  4. 面向数据报 (Datagram-Oriented):应用层传下来多大的数据包,UDP就直接打包发送,不会进行拆分或合并。

应用场景: 对实时性要求高,可以容忍少量丢包的场景,如:

  • 视频/音频流媒体:偶尔丢失一两帧画面或一点声音,用户几乎无法察觉,但卡顿是无法忍受的。

  • 在线游戏:需要快速地将玩家的操作发送到服务器,延迟是头号大敌。

  • DNS (域名系统):一次查询请求和响应的数据量很小,使用UDP可以快速完成解析。

  • VoIP (网络电话)

3. TCP vs. UDP

特性 (Feature)

TCP (传输控制协议)

UDP (用户数据报协议)

连接性

面向连接 (三次握手,四次挥手)

无连接 (直接发送)

可靠性

可靠 (确认、重传、排序机制)

不可靠 (尽力而为)

有序性

保证有序

不保证有序

速度

较慢

非常快

头部开销

较大 (至少20字节)

小 (仅8字节)

流量/拥塞控制

有 (滑动窗口,拥塞算法)

应用场景

网页、文件传输、邮件

视频流、游戏、DNS

总结: 没有绝对的好坏,只有合适的场景。需要可靠性时选TCP,需要低延迟和高速度时选UDP。


第二部分:应用层的演进 —— HTTP的前世今生

如果说TCP/UDP是“快递公司”,那么HTTP(超文本传输协议)就是规定“快递单怎么写、包裹怎么打包”的规则。它是构建万维网(World Wide Web)的基石。随着互联网的发展,HTTP也在不断进化,以满足我们对更快、更安全、更高效网络体验的追求。

1. HTTP/1.0 (1996) - 蛮荒时代

这是HTTP协议的第一个正式版本,奠定了基础,但设计非常简单。

核心特点:

  • 短连接 (Short-lived Connections):每个请求/响应周期都会建立一个新的TCP连接,完成后立即断开。

  • 请求-响应模型:客户端发送一个请求,服务器返回一个响应。

致命缺陷: 想象一下,加载一个包含10张图片、1个CSS文件和1个JS文件的网页。使用HTTP/1.0,浏览器需要:

  1. 建立TCP连接 -> 请求HTML -> 收到HTML -> 断开TCP连接

  2. 建立TCP连接 -> 请求图片1 -> 收到图片1 -> 断开TCP连接

  3. 建立TCP连接 -> 请求图片2 -> 收到图片2 -> 断开TCP连接 ... 总共需要建立和断开13次TCP连接!每次TCP连接都需要三次握手,这带来了巨大的延迟和服务器资源消耗。

2. HTTP/1.1 (1999) - 承前启后的经典

HTTP/1.1是目前使用最广泛的版本,它针对1.0的缺陷做了大量优化,是一个里程碑式的版本。

核心改进:

  1. 持久连接 (Persistent Connections):默认开启 Connection: keep-alive。一个TCP连接可以在多个请求/响应之间复用,避免了频繁建立和断开连接的开销。

  2. 管道化 (Pipelining):允许客户端在收到上一个响应之前,就连续发送多个请求。这在一定程度上减少了等待时间。

    • 但是,它存在一个严重问题:队头阻塞 (Head-of-Line Blocking, HOL Blocking)。服务器必须按照接收请求的顺序依次返回响应。如果第一个请求处理得很慢,后续所有请求的响应都会被阻塞,即使它们已经处理完了。就像超市结账,前面的人东西多,后面的人就算只买一瓶水也得等着。

  3. Host头字段:允许一台服务器上托管多个不同域名的网站(虚拟主机)。

  4. 更丰富的缓存控制:引入了 Cache-Control, ETag 等字段,让缓存策略更加灵活。

  5. 分块传输编码 (Chunked Transfer Encoding):允许服务器在内容完全生成之前就开始向客户端发送数据,提高了响应速度。

3. HTTP/2.0 (2015) - 二进制革命

进入移动互联网时代,网页内容越来越复杂,HTTP/1.1的队头阻塞等问题变得愈发突出。HTTP/2应运而生,其目标是“更快、更高效、更安全”。

革命性变革:

  1. 二进制分帧 (Binary Framing):这是HTTP/2的基石。它将所有传输的信息(HTTP头、消息体)分割成更小的消息和帧(Frame),并采用二进制编码。这为后续的多路复用等功能提供了基础。

  2. 多路复用 (Multiplexing)完美解决了HTTP/1.1的队头阻塞问题。在一个TCP连接上,客户端和服务器可以同时发送和接收多个请求/响应的帧,这些帧可以交错传输,然后在另一端根据**流ID (Stream ID)**重新组装。

    • 这就好比以前一条单车道(HTTP/1.1),一辆车慢了,后面全堵死。现在变成了一条拥有多个车道的高速公路(HTTP/2),不同车辆(请求/响应)可以在各自车道上并行行驶,互不干扰。

  3. 头部压缩 (Header Compression - HPACK):由于同一客户端的多个请求通常包含大量重复的头部信息(如User-Agent, Accept等),HTTP/2使用HPACK算法来压缩头部,维护一个动态字典,只发送差异部分,极大地减少了请求的开销。

  4. 服务器推送 (Server Push):服务器可以“主动”向客户端推送它认为客户端会需要的资源,而无需客户端明确请求。例如,客户端请求了 index.html,服务器可以主动将 style.cssscript.js 一起推送过来,减少了请求的往返次数。

遗留问题: HTTP/2虽然解决了应用层的队头阻塞,但它依然建立在TCP协议之上。TCP本身也有队头阻塞问题:如果一个TCP数据包在传输中丢失,TCP会暂停该连接上的所有数据流,直到这个丢失的包被重传并确认为止。对于HTTP/2这种单连接多路复用的场景,一个丢包就会“阻塞”所有并行的HTTP请求。

4. HTTP/3.0 (2022) - 迈向QUIC

为了彻底解决TCP的队头阻塞问题,HTTP/3做出了一个大胆的决定:抛弃TCP,改用一个全新的基于UDP的协议——QUIC (Quick UDP Internet Connections)

核心优势:

  1. 基于QUIC,解决TCP队头阻塞:QUIC是在UDP之上实现的可靠多路复用传输协议。QUIC中的“流”是独立的,如果一个流中的某个数据包丢失,它只会影响那一个流,而不会阻塞其他流的传输。这才是真正意义上的彻底解决了队头阻塞。

  2. 更快的连接建立:QUIC集成了TLS(传输层安全协议),将TCP的三次握手和TLS的加密握手过程合并。对于首次连接,通常只需要1个往返时间(1-RTT)即可建立安全连接。对于已有连接,甚至可以实现0-RTT。

  3. 连接迁移 (Connection Migration):TCP连接是基于“源IP:源端口-目标IP:目标端口”这个四元组来标识的。一旦你的网络环境发生变化(例如手机从Wi-Fi切换到4G),IP地址改变,TCP连接就会中断。而QUIC使用一个64位的连接ID来标识连接,即使IP地址改变,只要连接ID不变,连接就可以无缝迁移,不会中断。

HTTP版本演进总结

版本

核心机制

关键特性

解决的问题

新的/遗留的问题

HTTP/1.0

短连接

请求-响应模型

-

性能低下,高延迟

HTTP/1.1

持久连接

持久连接、管道化、Host头

解决了短连接的开销

应用层队头阻塞

HTTP/2.0

TCP + 二进制分帧

多路复用、头部压缩、服务器推送

解决了应用层队头阻塞

TCP层队头阻塞

HTTP/3.0

UDP + QUIC

基于QUIC、0-RTT、连接迁移

解决了TCP层队头阻塞

QUIC协议较新,普及需要时间


评论