卷2 第23章 UDP:用户数据报协议

23.1 引言

UDP是面向数据报的简单运输层协议。

23.2 代码介绍

  • netinet/udp.h:UDP首部
  • netinet/udp_var.h:UDP定义
  • netinet/udp_usrreq.c:UDP函数

23.3 UDP的protosw结构

  • 类型:SOCK_DGRAM
  • 协议:IPPROTO_UDP(17)
  • 输入:udp_input
  • 用户请求:udp_usrreq

23.4 UDP的首部

struct udphdr {
    u_short uh_sport;
    u_short uh_dport;
    u_short uh_ulen;
    u_short uh_sum;
};

23.5 udp_init函数

初始化UDP PCB表

23.6 udp_output函数

处理流程 丢弃控制信息

临时连接(如果需要)

添加IP/UDP首部

计算检验和(伪首部)

调用ip_output

伪首部 “text +--------+--------+--------+--------+ | 源IP地址 | +--------+--------+--------+--------+ | 目的IP地址 | +--------+--------+--------+--------+ | 0 | 协议 | UDP长度 | +--------+--------+--------+--------+


## 23.7 udp_input函数
验证
长度检查

检验和验证

分用

单播处理
检查高速缓存

搜索PCB

生成ICMP端口不可达

广播/多播处理
交付所有匹配插口

不生成ICMP差错

## 23.8 udp_saveopt函数
保存目的地址作为控制信息

## 23.9 udp_ctlinput函数
处理ICMP差错

调用udp_notify

## 23.10 udp_usrreq函数
请求处理
PRU_ATTACH:分配PCB

PRU_DETACH:释放PCB

PRU_BIND:in_pcbbind

PRU_CONNECT:in_pcbconnect

PRU_DISCONNECT:in_pcbdisconnect

PRU_SEND:udp_output

## 23.11 udp_sysctl函数
控制UDP检验和

## 23.12 实现求精
高速缓存
单入口高速缓存效率低

哈希表可提高性能

检验和优化
复制+检验和合并

## 23.13 小结
UDP是简单无连接协议。输入分用支持单播、广播和多播。