卷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是简单无连接协议。输入分用支持单播、广播和多播。