一、 UDP基础
UDP不提供复杂的控制协议,依靠IP协议提供无连接的通信服务。
UDP的头部非常简单只有8个字节:
- 源端口和目标端口:主要是告诉UDP协议要把数据发给哪个进程
- 包长度:该字段保存了UDP首部长度和数据长度总和
- 校验和:是为了提供可靠的UDP 首部和数据而设计的
二、 TCP和UDP的区别:
1. 连接
- TCP是面向连接的传输层协议,即传输数据前需要先建立连接。
- UDP是面向无连接的传输层协议,即刻传输数据。
2. 服务对象
- TCP是一对一的两点服务,即一条连接只有两个端点。
- UDP可以实现一对一、一对多、多对多的交互通信。
3. 可靠性
- TCP是可靠的传输协议,可以保证数据传输的无差错、不丢失、不重复、按需到达。TCP采用确认和重传机制、流量控制机制和拥塞控制机制来确保数据的可靠传输,并且可以解决网络传输中可能出现的问题。
- UDP是尽最大努力,但是保证不了数据的可靠性交付。
4. 拥塞控制和流量控制
- TCP有拥塞和流量控制机制保证数据传输的安全性。
- UDP没有,即使网络非常拥堵了也不影响UDP的发送速率
5. 首部开销
- TCP的首部开销较大,在没有使用选项字段的时候是20个字节,如果使用了就会变得更长。
- UDP的首部开销较小只有8个字节。并且是固定不变的。
6. 传输方式
- TCP是流式传输,没有边界,但保证顺序和可靠。
- UDP是一个包一个包的发送,是有边界的,但是可能会丢包还有乱序。
7. 分片不同
- TCP发送数据如果大于MSS,那么会在传输层进行分片,接收端同样会在传输层进行数据片重组,如果丢失了某个分片那么只需要重发丢失的分片即可。
- UDP的数据大小如果大于MTU大小,就会在IP层进行分片。接收端在收到数据时同样会在IP层进行组装数据,接着再传给传输层,但是如果中途丢失一个分片,实现可靠的UDP传输就需要重传所有的数据包,这样传输效率非常差,所有UDP的报文应该小于MTU大小。
三、TCP和UDP的应用场景
由于TCP是面向连接的,能保证数据的可靠性交付,因此常用于:
- FTP传输
- HTTP/HTTPS
由于UDP是面向无连接的,随时都可以发送数据,再加上UDP本身就处理既简单就高效,因此常用于: - 包含较少的通信的,如DNS、SNMP等
- 视频、音频等多媒体通信
- 广播通信
四、首部差异解释
为什么UDP头部没有首部长度字段,而TCP有呢?
因为TCP的头部有可变长度的选项字段,UDP头部没有可变长度的字段。所有TCP头部有首部长度字段UDP没有。
为什么UDP头部有包长度字段,而TCP头部没有呢?
TCP计算负载数据长度的方式:
TCP数据的长度 = IP总长度 - IP首部长度 - TCP首部长度
IP总长度 、 IP首部长度 、TCP首部长度都是已知的,IP总长度和IP首部长度在IP首部的格式中。TCP首部长度在TCP首部中。这样就可以计算出RCP数据的长度。
然而对于UDP来说,似乎也可以通过类似的公式计算出来,为什么还需要头部长度字段呢?如此说来UDP首部的包长度字段岂不是冗余的。**因为为了网络设备硬件处理和设计的方便,首部长度需要是4字节的整数倍。**所有有一种说法是UDP首部的包长度字段是为了字节补全设计的,使得首部的字节长度是4的整数倍。