TCP和UDP根本的区别是连接方式和可靠性。 TCP 是一个面向连接的协议,通信双方在真正传输数据之前必须先通过三次握手建立一条连接,结束通信时还要通过四次挥手释放连接。而UDP是无连接的,发送方随时可以把数据包扔到网络上,无需任何前置协商,也不管对方是不是在线。
在可靠性上两者截然不同。 TCP 提供可靠传输:它会为每一个发送的报文段编号,并要求接收方确定;如果一定时间内没有收到确定,TCP 会自动重传。同时 TCP 还能检测出损坏、丢失、重复或乱序的数据包,并做相应处理(比如重组乱序数据)。UDP 则完全不提供可靠性保证,数据包发出后,既不会重传丢失的包,也不会通知发送方“对方没收到”,丢包、乱序、重复都是允许的。
数据边界和传输形态也不同。 TCP 是字节流协议,它把应用层交给它的数据看作一连串无结构的字节,不保留应用层消息之间的边界。这就导致经典的“粘包”和“拆包”问题-发送端两次send的内容,接收端可能一次recv就全部读走。UDP 是数据报协议,每个 UDP 包独立传输,接收端每次recvfrom恰好读到一个完整的原始报文,消息边界被保留下来。
控制机制和开销差距很大。 TCP 内建了流量控制(滑动窗口)和拥塞控制(慢启动、拥塞避免等),会根据网络状况主动调整发送速率,避免压垮网络或接收方。这些机制带来了额外的计算和内存开销,TCP 头部至少 20 字节,且需要维护连接状态表。UDP 没有流量控制和拥塞控制,头部仅有 8 字节,不维护任何连接状态,所以处理速度更快,系统开销更小。
这些差别决定了它们各自擅长的场景。 TCP 适用于那些数据必须完整、顺序无误、不能丢失的应用,比如网页浏览、文件下载、邮件、数据库交易等。UDP 则用在可以容忍少量丢包或乱序,但对实时性要求很高的场合,如视频直播、网络电话、在线游戏、DNS 查询等。
从测试工程师的角度看,当你遇到连接超时、数据顺序错乱、粘包问题、或者需要模拟高吞吐量时,应该优先怀疑 TCP 特性是不是被正确实现;而当发现丢包不重传、没有连接拒绝现象、或者抓包看到无握手过程时,那很可能是 UDP 在起作用。理解这能帮你快速判断问题是出在传输层还是应用层。