UDP与TCP的区别
-
连接方式
- TCP是面向连接的协议,通信前需通过三次握手建立连接。
- UDP是无连接的协议,直接发送数据,无需建立连接。
-
可靠性
- TCP提供可靠传输,通过确认、重传、流量控制等机制确保数据完整有序。
- UDP不保证可靠性,数据可能丢失或乱序。
-
效率
- TCP因复杂控制机制,传输效率较低,延迟较高。
- UDP无控制开销,传输效率高,延迟低。
-
数据边界
- TCP是字节流协议,无明确消息边界。
- UDP保留数据包边界,发送和接收次数一致。
-
拥塞控制
- TCP动态调整传输速率以避免网络拥塞。
- UDP无拥塞控制,可能加剧网络拥塞。
TCP建立到结束过程
建立连接(三次握手)
- 客户端发送
SYN=1, seq=x
的同步报文。 - 服务端回复
SYN=1, ACK=1, seq=y, ack=x+1
。 - 客户端发送
ACK=1, seq=x+1, ack=y+1
确认。
数据传输
- 发送方按需分割数据并编号,接收方确认后窗口滑动。
- 通过超时重传、流量控制等机制确保可靠性。
断开连接(四次挥手)
- 主动方发送
FIN=1, seq=u
。 - 被动方回复
ACK=1, ack=u+1
。 - 被动方发送
FIN=1, seq=v
。 - 主动方回复
ACK=1, ack=v+1
并等待超时关闭。
UDP建立到结束过程
无连接通信
- 发送端直接构造数据包(源/目标端口、长度、校验和),通过Socket发送。
- 接收端监听端口,接收数据包并处理。无确认或重传机制。
无明确结束流程
- 通信双方随时可停止发送或关闭Socket。
应用场景
TCP适用场景
- 需要可靠传输:网页浏览(HTTP)、文件传输(FTP)、邮件(SMTP)。
- 长连接交互:数据库连接、远程登录(SSH)。
UDP适用场景
- 实时性优先:音视频流(RTP)、在线游戏、VoIP。
- 广播/多播:DNS查询、DHCP、网络发现协议。
Unity中的使用场景
TCP应用
- 需同步状态的回合制游戏或策略游戏,如棋牌类。
- 玩家数据持久化,如登录验证或存档上传。
UDP应用
- 实时动作类游戏(如FPS、MOBA),低延迟优先。
- 高频小数据包传输,如玩家位置同步。
Unity实现示例
csharp
// TCP客户端示例
TcpClient client = new TcpClient();
client.Connect("127.0.0.1", 8080);
NetworkStream stream = client.GetStream();
byte[] data = Encoding.UTF8.GetBytes("Hello TCP");
stream.Write(data, 0, data.Length);
// UDP客户端示例
UdpClient udpClient = new UdpClient();
byte[] udpData = Encoding.UTF8.GetBytes("Hello UDP");
udpClient.Send(udpData, udpData.Length, "127.0.0.1", 9090);
注意事项
- Unity主线程中需避免阻塞,建议异步处理网络通信。
- UDP需自行处理丢包和乱序,如添加序列号或冗余校验。