LWIP-UDP

用户数据报协议

概述

  1. 传输层协议的功能

    数据的最终目的地应该是主机上的某个特定的应用程序

  2. UDP的使用场景

    DNS DHCP IGMP SNMP

  3. 传输层协议

    • 为通信的进程提供链接机制,识别2个正在通信的进程,将IP层的数据报交给应用程序
    • 差错校验
    • 提供可靠传输:流量控制如 数据确认,重传等
  4. UDP协议特点

  • 无连接不可靠的协议: 没有流量控制 没有数据报确认

  • 完成从一个进程到另外一个进程的交互

  • 没有确认机制,确保报文到达

  • 不对收到的报文排序

  • 无反馈信息控制报文,在2个程序之间的流动速度

  • 无连接:UDP发送的每一个报文互相独立,互不影响,因此不能使用UDP发送数据流

    ​ 总结:UDP报文可能出现:丢失 重复 无序等情况

  1. 端口号

    UDP报文的目的地: 进程

    但:进程的创建与销毁是动态的,UDP发送端无法知道 对方进程的状态

    所以: UDP数据包中不能通过进程ID,识别进程,引入端口

    解决: 引入一个16位数值[端口],进程和端口绑定,UDP报文与端口绑定

    总结: IP层通过IP地址找到目标主机, 传输层通过端口号找到进程

    关键:

    • 如果收到没有进程绑定对应端口时,丢弃报文,并返回ICMP报告端口不可达

    • UDP传输中客户端与服务器的端口可以不一致,服务器端的端口必须提前绑定

      客户端发送的UDP报文中会携带端口信息,告诉服务器

UDP数据结构

控制块

描述一个UDP链接需要的所有信息,UDP协议的核心就是UDP控制块

1
2
3
4
5
6
7
8
9
10
11

struct udp_pcb {
IP_PCB;
struct udp_pcb *next;
u8_t flags;
u16_t local_port, remote_port;
void (* recv)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
struct ip_addr *addr, u16_t port);
/* user-supplied argument for the recv callback */
void *recv_arg;
};

next : 所有的UDP 控制块都链接在一个链表中

flag: 1: 是否需要计算校验和 2: 是否处于链接状态[记录了上方的IP与端口,刚上电时只知道自己的]

local_port: 收到数据包时,遍历UDP_TCP链表,找到与报文对应的TCB

recv: 找到对应的TCB后,调用 recv进行处理:应用程序与内核交互的纽带,创建TCB时传入用户的回调函数

图12-4 很清楚的描述了控制块

控制块操作函数

流程简单:

根据报文中的目的端口号,遍历UDP_PCB , 并调用对应的 recv回调函数

如果注册的函数为空,则丢掉数据包

如果找不到UDP_TCB ,则返回端口不可达的ICMP 差错报告报文

报文处理函数

undefined