TCP和UDP的区别
1 连接性
TCP是面向连接的协议。 在数据传输之前,通信双方必须通过三次握手建立一条稳定的连接通道。传输结束后,还需要通过四次挥手来释放连接。
UDP是无连接的协议。 发送数据之前不需要建立连接,可以直接发送。它只是简单地把数据包扔给网络,不关心对方是否收到。
2 可靠性
TCP提供可靠的数据传输服务。 它通过确认应答、超时重传、流量控制、拥塞控制等一系列机制来保证数据无差错、不丢失、不重复且按序到达。
UDP提供不可靠的传输服务。 它“尽力而为”地交付数据,但不保证数据一定能到达接收方。发送端无法知道数据包是否成功送达、是否丢失或乱序。
3 数据传输方式
TCP是面向字节流的。 它把应用层交下来的数据看作一连串无结构的字节流,没有边界。TCP会根据网络情况和窗口大小来决定如何拆分和组装数据包。接收方收到的字节流与应用方发送的字节流完全一样。
UDP是面向报文的。 它对于应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。一次发送一个完整的报文,接收方也必须一次接收整个报文。因此,应用程序必须选择合适大小的报文,否则IP层需要分片,会降低效率。
4 首部开销
TCP首部开销大,最小20字节。 它的首部包含了许多用于保证可靠性和控制机制的字段,如序列号、确认号、窗口大小、校验和等选项。
UDP首部开销小,固定8字节。 只有源端口、目的端口、长度和校验和四个字段,非常简洁。
5 吞吐量和效率
TCP的机制复杂,延迟较高,吞吐量动态变化。 由于需要建立连接、确认、重传、流量和拥塞控制,其传输效率相对较低,网络开销大。
UDP机制简单,延迟低,吞吐量稳定。 没有复杂的控制机制,传输速度非常快,实时性更好。
6 拥塞控制和流量控制
TCP有完善的拥塞控制和流量控制。 通过滑动窗口机制进行流量控制,通过慢启动、拥塞避免、快重传、快恢复等算法进行拥塞控制,能有效减少网络拥堵。
UDP没有拥塞控制。 它会以恒定的速率发送数据,即使网络状况很差,这可能会加剧网络拥塞。
7 应用场景
TCP适用于对可靠性要求高的场景。 例如:网页浏览、文件传输、电子邮件等。
UDP适用于对实时性和速度要求高,可以容忍少量数据丢失的场景。 例如:视频会议、语音通话、在线直播、DNS查询等。
TCP三次握手
根本目的是为了同步序列号和建立可靠的双向通信通道。
客户端发送 SYN 给服务器端,表示希望建立连接;
服务器端接收到消息之后,回应一个 SYN 和 ACK(确认应答)给客户端;
客户端收到服务器端的 SYN 报文之后,回应一个 ACK 报文。

为什么是三次?两次不行吗?
防止已失效的连接请求报文突然又传到了服务器,导致错误和资源浪费。
三次握手是双方相互确认通信能力的最低次数。确认对方的 “收” 和 “发” 的能力。
TCP四次挥手
由于TCP连接是全双工的(即数据可以双向独立传输),因此每个方向都必须单独进行关闭。这个过程的目标是优雅地关闭连接,确保双方的数据都已完成传输。

为什么客户端最后要等待2MSL(TIME-WAIT状态)?
MSL是报文最大生存时间。等待2MSL主要有两个目的:
可靠地终止连接: 确保主动方发送的最后一个ACK报文能到达被动方。如果这个ACK报文在网络中丢失,处于
LAST-ACK状态的被动方会因超时而重发它的FIN报文。主动方在TIME-WAIT状态下收到这个重发的FIN后,会重发ACK报文,并重置2MSL计时器。如果没有这个状态,主动方直接关闭,若ACK丢失,被动方将一直处于LAST-ACK状态,无法正常关闭。让旧的报文在网络中消散: 等待
2MSL时间,可以确保本次连接持续时间内所产生的所有报文都从网络中“消失”,这样在建立新的连接时,就不会收到属于上一次连接的、迟到的旧报文,从而避免了新旧数据混淆的问题。
TCP拥塞控制
主要目的是防止过多的数据注入网络,避免网络中的路由器或链路过载,从而保证整个网络的畅通。
CP的拥塞控制不是一个单一的算法,而是一个由四大核心算法组成的框架:慢启动、拥塞避免、快重传和快恢复。它们通过动态调节一个叫做拥塞窗口 的状态变量来控制发送速率。
核心概念-拥塞窗口
拥塞窗口:表示在未收到对方确认的情况下,发送方最多能发送多少数据包。它是发送方根据自己感知到的网络拥塞程度而设置的窗口值。
发送窗口:最终决定发送速率的窗口大小 =
min(拥塞窗口, 接收方通告的接收窗口)。这体现了流量控制和拥塞控制的结合。慢启动阈值:一个状态阈值,达到前使用慢启动算法,达到后使用拥塞避免算法。
四大核心算法
慢启动:初始阶段,在不清楚网络状况的情况下,以一种指数级增长的方式快速探测出网络的可用容量。
拥塞避免:当窗口达到一定大小后,从激进指数增长转为保守的线性增长,避免很快再次触发拥塞。
快重传:发送方一旦收到3个重复的ACK,就推断出这个报文段已经丢失,立即重传该报文,而无需等待其超时。
快恢复:在触发快重传后,不是直接回到慢启动,而是平滑地降低发送速率。这是对原有TCP Tahoe算法的改进。
检测到拥塞
发生超时重传(严重拥塞),重新开始慢启动。
收到3个重复ACK(轻微拥塞),执行快重传,立即重发丢失的包;执行快恢复,进入拥塞避免阶段。
TCP流量控制
核心目的是解决发送方和接收方之间速度不匹配的问题,防止发送方发送数据太快、太多,导致接收方的缓冲区溢出的现象。
流量控制的实现依赖于一个叫做滑动窗口协议的机制,而这个窗口的大小是由接收方来主导控制的。
接收缓冲区: 接收方操作系统内核中会为每个TCP连接维护一个接收缓冲区。应用进程可能不会立即来读取数据,所以数据会暂时存放在这个缓冲区里。
接收窗口: 接收方在每次发送确认报文时,都会通过TCP首部中的
窗口大小字段,告诉发送方自己当前接收缓冲区还有多少剩余空间。这个值就被称为接收窗口。发送方的限制: 发送方在传输数据时,必须保证已发送但未收到确认的数据量不能超过接收方通告的这个接收窗口的大小。这样就确保了发送的数据不会淹没接收方。
接收方通过ACK报文首部的 窗口大小 字段通告给发送方的那个值,就是当前的通告窗口大小,送方根据这个值来动态调整自己的发送窗口,从而控制发送速率。
介绍QUIC协议,为什么它选择UDP而不是TCP?
QUIC不是简单地用UDP取代TCP,而是在UDP之上重新实现了一套集成了安全、可靠传输、多路复用、拥塞控制等功能的现代化传输协议。它吸取了TCP几十年来的经验和教训,系统地解决了TCP的诸多痛点,特别适合当今互联网(尤其是移动互联网)对低延迟、高可靠和安全性的严苛要求。这正是HTTP/3选择QUIC作为基础的原因。它的核心目标是显著降低连接延迟,并改善整体网络体验。
QUIC选择UDP而非TCP,核心是为了突破TCP的固有缺陷,实现更快的迭代和更优的性能。
减少延迟: 将传输和加密合并,首次连接1-RTT,再次连接可实现0-RTT,远超TCP+TLS的2-RTT以上延迟。
解决队头阻塞: 在应用层为每个流实现可靠传输,一个流丢包不影响其他流,彻底解决了TCP中因单个包丢失阻塞整个连接的问题。
无缝连接迁移: 使用独立Connection ID标识连接,网络切换(如WiFi变5G)时连接不断,TCP基于IP和端口,网络一变就断。
快速迭代: 在用户空间实现,无需操作系统内核更新,就能快速部署新的拥塞控制算法等优化。TCP的改进需内核升级,部署极慢。
避免中间设备干扰: 新TCP选项常被防火墙等中间设备干扰或丢弃。UDP被广泛放行,QUIC在UDP“信封”内创新,穿透性更好。
评论区