1.什么是UDP协议
UDP(User Datagram Protocol)称为用户数据报协议,它位于传输层,目标是在传输层提供直接发送报文的能力。UDP传输数据的最小单位是Datagram,对于每次数据发送,它不会对发送内容进行拆分。
2. UDP报文格式
UDP报文格式非常简洁,分为下面5部分:
1)源端口号,占16bit , 用于区分数据来源端口,即用于区分数据来自哪个进程。
2)目的端口号, 占用16bit,标识接收方的端口,确定接收方的进程。
3)消息体长度,占用16bit, 所以一次能传输的数据最大长度为2^16(65535)-8(UDP头部占8个字节)字节。
4) 校验和,作用是检查报文是否有错误。数据报在传输过程出现了损坏,接收方可以通过校验和进行纠错或者修复。
5)数据字段,真正要传输的数据内容。
3. UDP与TCP的区别
•目的不同
TCP协议的核心目标是提供可靠的网络传输,UDP的目标是提供简洁快速的数据传输。
•可靠性不同
TCP协议要实现可靠的数据传输,在进行数据传输前要进行3次握手,在数据传输完成之后要进行4次挥手。要保证数据被对方接收到了,有ACK机制。对收到的乱序数据进行排序重组之后交付给应用层。UDP协议只管数据发送,并不保证数据被对方真正收到。
•是否先要建立连接
TCP是一个面向连接的协议,在传输数据之前必须先建立连接,UDP是一个无连接的协议,数据随时都可以发送,只提供发送封包的能力。
•流控技术
TCP使用了流量控制机制确保发送方不会因为一次发送过多的数据包而使接收方不堪重负。TCP在发送缓冲区中存储数据,并在接收缓冲区中接收数据。当应用程序准备就绪时,它从接收缓冲区获取数据,如果接收缓冲区已满,接收方将无法处理更多数据,并将其丢弃。UDP没有流控技术。
•传输速度
UDP协议只有5部分,协议非常简化,封包小,没有连接、可靠性检测,传输速度相比TCP更快。
•协议报文结构不同
TCP协议结构非常复杂,除了都有的源端口号、目的端口号, 还有序列号和确认序列号,报文标志等字段,UDP协议只有非常5部分,源端口号、目的端口号,报文长度,校验和和数据部分。
•socket API 不同
UDP发送 sendto函数, 接收数据用recvfrom函数。
•使用场景不同
TCP每个数据封包都需要确认,不适应高速数据传输场景,比如观看视频、网络游戏。音视频传输允许一定的丢包率,ping和DNS查询,只需要一次简单的请求和返回,不需要建立连接,用UDP就够了。
4.UDP socket API
1)recvfrom
代码语言:javascript复制ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen)
参数 | 含义 |
---|---|
sockfd | 创建的套接字描述符 |
buff | 本地接收缓存 |
nbytes | 最大接收数据字节 |
flags | I/O相关的参数 |
from | 对端发送方地址和端口 |
addrlen | 地址信息长度 |
2)sendto
代码语言:javascript复制ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t *addrlen)
参数 | 含义 |
---|---|
sockfd | 创建的套接字描述符 |
buff | 本地发送缓存 |
nbytes | 发送字节数 |
flags | I/O相关参数 |
to | 发送的对端地址和端口 |
addlen | 地址长度 |
5.UDP应用场景
•网络游戏
•音视频传输
•DNS
•直播