1. 面向字节流(TCP)
TCP 把数据当成"一串连续的字节流"来看待,没有明确的"消息边界"。
特点:
-
接收端不知道你什么时候"发了一条完整的消息"
-
多条消息可能粘在一起(粘包)或拆成多段(拆包)
-
数据是连续的流,你只能靠协议去切割
举个比喻:
就像一条长长的"传送带 ",你把数据一段段放上去,
对方只能看字节流,不知道哪一段是一个完整的箱子(消息)。容易导致粘包。
2. 报文级(UDP)
UDP 是"报文(包)"为单位的协议 ,一条 sendto()
对应一条完整的 recvfrom()
。
特点:
-
发多少就收多少,一次
recvfrom()
只对应一条完整的 UDP 包 -
不会出现粘包或拆包问题
-
单个包大小有限制(最多 65,535 字节)
类比:
就像一个个快递包裹 ,每次都独立寄送,接收方一包一包地收,
你永远不会把两包收到一块,也不会收到半包。所以不会出现粘包问题。
总结对比表:
特性 | TCP(字节流) | UDP(报文) |
---|---|---|
数据组织方式 | 连续的字节流 | 一包一包,带边界 |
是否有粘包/拆包 | ✅ 有,需手动处理 | ❌ 没有,收多少就是发多少 |
是否可靠传输 | ✅ 有保证(重传 + 有序) | ❌ 不保证 |
是否面向连接 | ✅ 需要连接(3次握手) | ❌ 无连接,直接发 |
适合场景 | 文件传输、网页、聊天、数据库等 | 音视频、游戏、广播、小数据通信 |