UDP 和 TCP 之间最大的区别:
TCP 是一个面向连接的协议,TCP 在 IP 报文的基础上,增加了诸如重传、确认、有序传输、拥塞控制等能力,通信的双方是在一个确定的上下文中工作的。
UDP 是一个面向报文的协议,UDP 没有这样一个确定的上下文,它是一个不可靠的通信协议,没有重传和确认,没有有序控制,也没有拥塞控制。(在 IP 报文的基础上,UDP 增加的能力有限)
既然如此,为什么还要使用 UDP 协议呢?
因为 UDP 比较简单,适合的场景还是比较多的,我们常见的 DNS 服务,SNMP 服务都是基于 UDP 协议的,这些场景对时延、丢包都不是特别敏感。另外多人通信的场景,如聊天室、多人游戏等,也都会使用到 UDP 协议。
UDP编程
recvfrom和sendto是 UDP 用来接收和发送报文的两个主要函数:
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags,
struct sockaddr *from, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,
const struct sockaddr *to, socklen_t addrlen);
recvfrom 函数:
sockfd参数:本地创建的套接字描述符。
buff参数:指向本地的缓存。
nbytes参数:表示最大接收数据字节。
flags参数:和I/O相关,暂时还用不到,设置为 0。
from参数:对端发送方的地址和端口等信息。 (这和 TCP 非常不一样,TCP 是通过 accept 函数拿到的描述字信息来决定对端的信息。另外 UDP 报文每次接收都会获取对端的信息,也就是说报文和报文之间是没有上下文的。)
addrlen参数:from指向的结构体的字节大小。
返回值:实际接收的字节数。
sendto函数:
sockfd参数:本地创建的套接字描述符。
buff参数:指向发送的缓存。
nbytes参数:表示发送数据字节。
flags参数:和I/O相关,暂时还用不到,设置为 0。
from参数:发送的对端地址和端口等信息。
addrlen参数:from指向的结构体的字节大小。
返回值:实际发送的字节数。
TCP 的发送和接收每次都是在一个上下文中,类似这样的过程:
A 连接上: 接收→发送→接收→发送→…
B 连接上: 接收→发送→接收→发送→ …
UDP 的每次发送和接收都是一个独立的上下文,类似这样的过程:
接收 A→发送 A→接收 B→发送 B →接收 C→发送 C→ …
本文由 在线网速测试 整理编辑,转载请注明出处。