UDP协议(20250303)

server/2025/3/5 10:50:03/

1. UDP

UDP:用户数据报协议(User Datagram Protocol),传输层协议之一(UDP,TCP)

2. 特性         

  1. 发送数据时不需要建立链接,节省资源开销
  2. 不安全不可靠的协议        //一般用在实时性比较高的广播,组播//VNC
  3. 面向报文。
  4. 资源开销小

3.框架

3.1 C/S模式

有一个专用的客户端  client----server

传输方式:用户主机1--->服务器---->用户主机2

框架设计

  • server:socket() ===>bind()===>recvfrom()===>close()
  • client:socket() ===>(bind())===>sendto() ===>close()

3.2 B/S模式

有一个通用的客户端浏览器

browser----server

client:socket() ===>sendto() ===>close()

4. API接口

4.1 socket函数

套接字:通信对象的抽象, 网络通信的端口,一个通信链的句柄。
        int socket(int domain, int type, int protocol);
功能:
        创建一个用来通信的接口(文件描述符)
参数:
        domain:通信的协议族(AF_INET:IPv4协议族)
type:
        SOCK_DGRAM:数据报套接字    (UDP使用此类型)
        SOCK_STEAM:流式套接字    (TCP使用此类型)
        SOCK_RAW:原始套接字
protocol:
        默认传0 按照协议的默认属性创建
返回值:
        成功返回用来进行通信的文件描述符
        失败返回-1

IPv4地址形式:
        struct sockaddr_in {
           sa_family_t    sin_family; /* AF_INET */
           in_port_t      sin_port;   /* 端口 */
           struct in_addr sin_addr;   /* IP地址 */
       };

       /* Internet address. */
       struct in_addr {
           uint32_t       s_addr;     /* address in network byte order */
       };

端口转换:htons函数

地址转换:inet_addr函数

4.2 sendto函数
      ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
功能:
        向一个IP地址和端口发送数据信息
        端口号:区分一台主机不同的应用程序(0 - 65535)
参数:
        sockfd:套接字文件描述符
        buf:发送数据空间首地址
        len:发送数据的长度
        flags:发送数据属性(默认为0)
        dest_addr:目的IP地址和端口
        addrlen:目的IP地址和端口的长度
返回值:
        成功返回实际发送字节数
        失败返回-1 

 4.3 htons函数

        主机转网络字节序

  • 主机:小端   host
  • 网络:大端   network

四种不同的转化函数

  1. uint32_t htonl(uint32_t hostlong);          主机转网络
  2. uint16_t htons(uint16_t hostshort);         主机转网络
  3. uint32_t ntohl(uint32_t netlong);           网络转主机
  4. uint16_t ntohs(uint16_t netshort);          网络转主机

        h:host        n:net         l:long         s:short 

4.4 inet_addr函数

        in_addr_t inet_addr(const char *cp);
功能:
        将字符串IP地址转换成二进制IP地址形式

        char *inet_ntoa(struct in_addr in);
功能:
        将二进制ip转换成字符串

4.5 bind
        int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
参数:
        sockfd:套接字文件描述符 
        addr:IP地址和端口号结构体首地址
        addrlen:长度
返回值:
        成功返回0
        失败返回-1 

4.6 recvfrom

      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
功能:
        接收网络发送的数据信息
参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        len:最大能够接收的数据个数
        flags:属性默认为0
        src_addr:存放发送端IP地址信息的空间首地址
        addrlen:想要接收的数据长度的空间首地址
返回值:
        成功返回实际接收字节数
        失败返回-1 

具有阻塞功能(直到接收到数据,才会继续向下执行)

 5. UDP报文头

        UDP首部有8个字节,由4个字段构成,每个字段都是两个字节

  1. 源端口: 源主机的应用程序使用的端口号
  2. 目的端口:目的主机的应用程序使用的端口号 
  3. 长度:是指UDP头部和UDP数据的字节长度。因为UDP头 部长度为8字节,所以该字段的最小值为8
  4. 差错检测,检测UDP数据报在传输中是否有错,有错则丢弃

 总结

  1. 无连接
  2. 尽最大努力交付(不安全,不可靠(丢包、乱序))
  3. 面向数据报
  4. 机制简单,传输效率高

应用场景:要求实时性高,但是允许数据丢失的场合(直播,VNC) 


http://www.ppmy.cn/server/172581.html

相关文章

《基于Selenium的网页聊天室自动化测试实战报告》

一、项目背景与技术选型 项目简介 目标系统:基于WebSocket的实时聊天室 核心功能:用户注册/登录、会话框发送信息、好友列表、信息发送 技术栈:html Springboot MySQL数据库 为什么选择Selenium 支持多浏览器兼容性测试(Chr…

权限系统设计方案实践(Spring Security + RBAC 模型)

前言 权限系统设计基本上是所有项目中都会涉及的一个重要部分。通过权限系统,我们将对用户角色、功能模块访问进行限制,从而保证系统安全性。本文将介绍中大型项目中常用的一套权限系统设计方案,通过 SpringSecurity 安全管理框架&#xff0c…

利用Git和wget批量下载网页数据

一、Git的下载(参考文章) 二. wget下载(网上很多链接) 三、git和wget结合使用 1.先建立一个文本,将代码写入文本(代码如下),将txt后缀改为sh(download_ssebop.sh&#xf…

centos搭建 Node.js 开发环境

Node.js ,通常简称为Node,是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Chrome V8引擎,具备速度快、性能强等特点,可用于搭建各类网络应用,及作为小程序后端服务环境。npm 和 npx 都是和 Node.js 相关的…

C语言文件操作学习笔记:从基础到实践

在C语言的知识体系中,文件操作是极为关键的一环,它赋予了程序存储和读取外部数据的能力,对于开发各类实用程序至关重要。近期,借助课程的学习,我对C语言文件操作进行了系统且深入的学习,下面将我的学习心得…

DeepSeek发布开源第五弹!AI 时代的极速存储引擎【3FS】

3FS(Fire-Flyer File System)是 DeepSeek 开源的一款高性能分布式文件系统,专为 AI 训练、大规模数据处理和推理优化设计。它采用 链式复制 (Chain Replication) CRAQ 技术,实现了强一致性和高吞吐的分布式存储架构,同…

复试准备日常

实验室面前投了 aiot 这周四 532图像处理实验室(我的项目大多也是图像处理的)(预计下周末)提前到3.4号下午6点 我不在第一批里面 软专不知道要几个 研二好像要去绍兴??? 感知计算面试预计明后天…

栈与队列_逆波兰表达式求值

栈与队列_逆波兰表达式求值 一、leetcode-150二、题解1.引库2.代码 一、leetcode-150 逆波兰表达式求值 逆波兰式(Reverse Polish Notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后&am…