一、TCP
TCP 最核心的价值是提供了可靠性,而 UDP 最核心的价值是灵活,你几乎可以用它来做任何事情。例如:HTTP 协议 1.1 和 2.0 都基于 TCP,而到了 HTTP 3.0 就开始用 UDP 了。
https://www.yuque.com/linhe-8mnf5/fxyxkm/wstoq2
二、UDP
1. UDP的目标能力
UDP(User Datagram Protocol),目标是在传输层提供直接发送报文(Datagram)的能力。UDP 协议不会帮助拆分数据,它的目标只有一个,就是发送报文。
2. 为什么不直接调用IP协议
这是因为传输层协议在承接上方应用层的调用,需要提供应用到应用的通信——因此要附上端口号。每个端口,代表不同的应用。传输层下层的 IP 协议,承接传输层的调用,将数据从主机传输到主机。IP 层不能区分应用,导致哪怕是在 IP 协议上进行简单封装,也需要单独一个协议。这就构成了 UDP 协议的市场空间。
3. UDP 的封包格式
UDP 的报文非常简化,只有 5 个部分。
- Source Port 是源端口号。因为 UDP 协议的特性(不需要 ACK),因此这个字段是可以省略的。但有时候对于防火墙、代理来说,Source Port 有很重要的意义,它们需要用这个字段行过滤和路由。
- Destination Port 是目标端口号(这个字段不可以省略)。
- Length 是消息体长度。
- Checksum 是校验和,作用是检查封包是否出错。
- Data octets 就是一个字节一个字节的数据,Octet 是 8 位。
三、TCP和UDP的区别
1. 目的差异
- TCP 协议的核心目标是提供可靠的网络传输。
- UDP 的目标是在提供报文交换能力基础上尽可能地简化协议轻装上阵。
2. 可靠性差异
- TCP 核心是要在保证可靠性提供更好的服务。TCP 会有握手的过程,需要建立连接,保证双方同时在线。而且TCP 有时间窗口持续收集无序的数据,直到这一批数据都可以合理地排序组成连续的结果。
- UDP 并不具备以上这些特性,它只管发送数据封包,而且 UDP 不需要 ACK,这意味着消息发送出去成功与否 UDP 是不管的。
3. 连接 vs 无连接
- TCP 是一个面向连接的协议(Connection-oriented Protocol),传输数据必须先建立连接。
- UDP 是一个无连接协议(Connection-less Protocol),数据随时都可以发送,只提供发送封包(Datagram)的能力。
4. 流控技术(Flow Control)
- TCP 使用了流控技术来确保发送方不会因为一次发送过多的数据包而使接收方不堪重负。TCP 在发送缓冲区中存储数据,并在接收缓冲区中接收数据。当应用程序准备就绪时,它将从接收缓冲区读取数据。如果接收缓冲区已满,接收方将无法处理更多数据,并将其丢弃。
- UDP 没有提供类似的能力。
5. 传输速度
UDP 协议简化,封包小,没有连接、可靠性检查等,因此单纯从传输速度上讲,UDP 更快。
6. 场景差异
第一类:TCP 场景
- 远程控制(SSH)
- File Transfer Protocol(FTP)
- 邮件(SMTP、IMAP)等
- 点对点文件传出(微信等)
第二类:UDP 场景
- 网络游戏
- 音视频传输
- DNS
- Ping
- 直播
第三类:模糊地带
- HTTP(目前以 TCP 为主)( HTTP 协议,如果考虑请求/返回的可靠性,用 TCP 比较合适。但是像 HTTP 3.0 这类应用层协议,从功能性上思考,暂时没有找到太多的优化点,但是想要把网络优化到极致,就会用 UDP 作为底层技术,然后在 UDP 基础上解决可靠性。)
- 文件传输(如果考虑希望文件无损到达,可以用 TCP。如果考虑希望传输足够块,就可能会用 UDP。)