在互联网通信的底层,传输层协议扮演着数据搬运工的角色。UDP和TCP作为两大核心协议,决定了数据如何高效、可靠地抵达目的地。本文将从报文结构、可靠性机制到拥塞控制,带你系统梳理这两大协议的关键知识点,助你构建扎实的网络基础。

UDP:简洁高效的不可靠传输

UDP(用户数据报协议)以无连接、不可靠著称,但正因如此,它拥有极低的延迟和开销。其报文结构非常精简,固定8字节的报头包含源端口、目的端口、报文总长和校验和,没有复杂的控制字段,适合对实时性要求高的场景。

UDP的不可靠体现在没有确认机制和重传机制,数据发出后若丢失,协议栈不会通知应用层。同时,UDP面向数据报,每次sendtorecvfrom都对应一个完整报文,不会拆分或合并。由于无需重传,UDP没有真正的发送缓冲区,但接收缓冲区仍然存在,用于暂存到达的数据。

UDP报文长度由16位字段限制,最大为64KB。若应用层数据超过此值,需在应用层手动分包发送,对端再合并。这种简单设计让UDP非常适合DNS、DHCP、TFTP等轻量级协议,以及实时音视频传输,因为在这些场景中,丢包重传反而会加剧延迟。

TCP报文结构:可靠传输的基石

TCP(传输控制协议)通过复杂的报头字段实现可靠传输。其报头最小20字节,最大60字节,包含源/目的端口、32位序列号与确认序列号、4位首部长度、6位标志位、16位窗口大小、校验和及紧急指针等。

6位标志位是TCP控制的核心:URG表示紧急指针有效,ACK确认号有效,PSH提示应用层尽快读取数据,SYN用于建立连接,FIN用于关闭连接。校验和覆盖首部和数据部分,接收端通过校验判断数据是否损坏。

TCP面向字节流,没有消息边界,但通过序列号确保数据顺序。紧急指针用于传输带外数据,例如用户按Ctrl+C中断远程命令时,紧急数据可优先处理。这些机制共同构成了TCP可靠性的基础。

确认应答与超时重传:可靠性双引擎

TCP的可靠性依赖于确认应答(ACK)机制。发送方每发送一段数据,接收方需回复ACK,确认序列号表示“该号之前的数据都已收到”。为提高效率,TCP允许累积确认——即使部分ACK丢失,只要收到最后一个ACK,发送方就认为所有数据已送达。

若数据或ACK丢失,TCP会触发超时重传。重传时间并非固定,而是动态计算,以适应网络波动。Linux中,重传超时以500ms为基数,每次重传后等待时间翻倍(指数退避),达到上限后则终止连接。接收方通过序列号去重,丢弃重复报文。

这种机制在保证可靠性的同时,也引入了延迟。因此,TCP还引入了滑动窗口,允许连续发送多个数据段而无需等待每个ACK,大幅提升吞吐量。窗口大小由接收方缓冲区决定,通过ACK报文中的窗口字段告知发送方。

连接管理:三次握手与四次挥手

TCP是面向连接的协议,建立连接需三次握手:客户端发送SYN,服务器回复SYN+ACK,客户端再发送ACK。关闭连接则需四次挥手,因为TCP支持半关闭,双方需各自发送FIN和ACK。

服务端状态从LISTEN到SYN_RCVD再到ESTABLISHED,最后经CLOSE_WAIT、LAST_ACK回到CLOSED。客户端则经历SYN_SENT、ESTABLISHED、FIN_WAIT_1/2、TIME_WAIT直至CLOSED。其中TIME_WAIT状态尤为重要,主动关闭方需等待2MSL(最大报文生存时间)才能关闭,以确保旧报文在网络中消失,避免干扰新连接。

TIME_WAIT会占用端口,若服务器频繁主动关闭连接,可能导致端口耗尽。可通过设置套接字选项SO_REUSEADDR解决,允许重用处于TIME_WAIT的端口。

int opt=1;
setsockopt(listendfd,SOL_SOCKET,SO_REUESADDR,&opt,sizeof(opt));

滑动窗口与流量控制:效率与公平的平衡

滑动窗口机制让发送方无需等待每个ACK即可连续发送数据,窗口大小表示“未确认数据”的最大容量。窗口越大,吞吐量越高,但需注意接收方缓冲区的限制。若发送速度超过接收方处理能力,会导致缓冲区溢出,引发丢包。

因此,TCP通过流量控制动态调整窗口大小:接收方在ACK中携带当前剩余缓冲区大小,发送方据此调整发送速率。当窗口为0时,发送方暂停发送,但会定期发送窗口探测报文,以获取最新窗口信息。

滑动窗口也解决了丢包重传的效率问题。当发送方连续收到3个相同的ACK(如“1001”)时,会立即重传该段数据,而非等待超时,这就是快速重传机制,能显著减少延迟。

拥塞控制:避免网络过载

即使接收方缓冲区足够大,若网络本身拥堵,盲目发送数据也会导致大量丢包。TCP通过拥塞控制机制,动态调整发送速率,主要依赖拥塞窗口(cwnd)。

核心算法是慢启动:初始cwnd=1,每收到一个ACK,cwnd翻倍(指数增长)。当cwnd达到慢启动阈值(ssthresh)后,转为线性增长(拥塞避免)。若发生超时重传,ssthresh减半,cwnd重置为1,重新慢启动。

实际发送窗口取拥塞窗口和接收窗口的较小值,兼顾网络容量和接收方能力。这种折中方案让TCP在高效传输与避免拥塞之间取得平衡。在现代网络中,TCP的拥塞控制算法不断演进,如CUBIC、BBR等,以适应高带宽、高延迟链路。

[AFFILIATE_SLOT_1]

总结与展望

UDP和TCP各有千秋:UDP以极低开销换取速度,适合实时应用;TCP以复杂机制换取可靠性,适合文件传输、网页浏览等。理解它们的核心机制,有助于在开发中做出正确选择。随着深度学习、AI技术的普及,网络传输的效率和稳定性愈发重要,例如在分布式神经网络训练中,TCP的拥塞控制直接影响通信耗时。无论是机器学习工程师还是后端开发者,掌握这些基础都将受益匪浅。

[AFFILIATE_SLOT_2]