UDP

      最后更新:2022-02-23 23:55

      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→ …











      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类