用户数据报协议
概述
传输层协议的功能
数据的最终目的地应该是主机上的某个特定的应用程序
UDP的使用场景
DNS DHCP IGMP SNMP
传输层协议
- 为通信的进程提供链接机制,识别2个正在通信的进程,将IP层的数据报交给应用程序
- 差错校验
- 提供可靠传输:流量控制如 数据确认,重传等
UDP协议特点
无连接不可靠的协议: 没有流量控制 没有数据报确认
完成从一个进程到另外一个进程的交互
没有确认机制,确保报文到达
不对收到的报文排序
无反馈信息控制报文,在2个程序之间的流动速度
无连接:UDP发送的每一个报文互相独立,互不影响,因此不能使用UDP发送数据流
总结:UDP报文可能出现:丢失 重复 无序等情况
端口号
UDP报文的目的地: 进程
但:进程的创建与销毁是动态的,UDP发送端无法知道 对方进程的状态
所以: UDP数据包中不能通过进程ID,识别进程,引入端口
解决: 引入一个16位数值[端口],进程和端口绑定,UDP报文与端口绑定
总结: IP层通过IP地址找到目标主机, 传输层通过端口号找到进程
关键:
如果收到没有进程绑定对应端口时,丢弃报文,并返回ICMP报告端口不可达
UDP传输中客户端与服务器的端口可以不一致,服务器端的端口必须提前绑定
客户端发送的UDP报文中会携带端口信息,告诉服务器
UDP数据结构
控制块
描述一个UDP链接需要的所有信息,UDP协议的核心就是UDP控制块
1 |
|
next
: 所有的UDP 控制块都链接在一个链表中
flag
: 1: 是否需要计算校验和 2: 是否处于链接状态[记录了上方的IP与端口,刚上电时只知道自己的]
local_port
: 收到数据包时,遍历UDP_TCP链表,找到与报文对应的TCB
recv
: 找到对应的TCB后,调用 recv进行处理:应用程序与内核交互的纽带,创建TCB时传入用户的回调函数
图12-4 很清楚的描述了控制块
控制块操作函数
流程简单:
根据报文中的目的端口号,遍历UDP_PCB , 并调用对应的 recv回调函数
如果注册的函数为空,则丢掉数据包
如果找不到UDP_TCB ,则返回端口不可达的ICMP 差错报告报文