UDP-复用分用
核心思想:多路复用与多路分用
想象一下,一栋大楼(主机)里有很多个房间(应用程序/进程),每个房间都有一个唯一的门牌号(端口号)。邮递员(传输层)负责接收和发送信件(数据报)。
复用:大楼里不同房间的人要把信寄出去,他们都把信交给同一个邮递员。邮递员收集所有信件,统一从大楼的出口寄出。
分用:邮递员从外面收到一大堆信件,他查看每个信封上写的目标房间号,然后准确地将信件投递到对应的房间里。
这就是复用和分用的直观比喻。
1. UDP 分用
定义:当主机接收到一个UDP数据报时,传输层(这里是UDP)根据数据报头部的目的端口号,将数据正确地交付给指定套接字(Socket),进而传递给对应应用程序的过程。
过程详解:
主机从网络层接收到一个IP数据报,其载荷是一个UDP数据报。
操作系统(传输层)会解析UDP数据报的头部,提取出目的端口号字段。
系统会检查当前是否有应用程序创建了套接字并绑定(Bind)到了这个目的端口号。
如果找到:系统将UDP数据报的应用数据部分(即报文载荷)放入该套接字的接收缓冲区,等待应用程序来读取。
如果没找到:系统通常会丢弃这个数据报,并可能(取决于系统配置)向发送方回复一个“端口不可达”的ICMP错误消息。
关键点:
分用的依据是目的端口号。
UDP套接字是由一个二元组全面标识的:(目的IP地址,目的端口号)。这意味着,对于UDP来说,只要目的IP和目的端口相同,无论数据来自哪个源IP或源端口,都会被交付到同一个套接字。这与TCP的四元组标识不同。
分用示例:
假设你的主机(IP: 192.168.1.100)正在运行:
一个DNS客户端(使用端口号
53)一个视频播放器(正在从网络接收视频流)
当一个UDP数据报到达你的主机,其头部信息为:
目的端口:
5353
系统检查后发现端口5353被DNS客户端进程绑定,于是将数据交给DNS客户端处理。
当另一个UDP数据报到达,其头部信息为:
目的端口:
60000
系统检查后发现端口60000被视频播放器进程绑定,于是将数据交给视频播放器。
这个过程就是分用——将来自网络的数据流正确地分发给不同的应用程序。
2. UDP 复用
定义:当主机上的多个应用程序需要发送UDP数据时,它们都将数据交给传输层(UDP)。UDP为每个数据包封装上头部信息(主要是源端口号和目的端口号),然后交给网络层,由同一个IP协议发送出去的过程。
过程详解:
应用程序(如浏览器、游戏客户端)通过系统调用(如
sendto)将数据和目标地址(IP和端口)传递给UDP。UDP会为每个数据块创建一个UDP数据报。
在数据报头部填入应用程序指定的目的端口号。
填入数据来源的源端口号(这个端口号通常是应用程序绑定的端口,如果没绑定,则由系统自动分配一个)。
计算校验和等其他字段。
将这个封装好的UDP数据报交给网络层(IP层)。
IP层会进一步封装成IP数据报,并通过底层的网络接口发送出去。
关键点:
复用的体现是多个应用进程使用同一个传输层协议(UDP)和同一个IP协议发送数据。
源端口号非常重要,它告诉接收方“谁发送的”,以便接收方能够回复消息。
复用示例:
你的主机(IP: 192.168.1.100)上同时运行着:
一个浏览器(系统为其分配了源端口
54321),正在向DNS服务器(IP: 8.8.8.8, 端口53)发送查询。一个在线游戏(绑定了源端口
7777),正在向游戏服务器(IP: 1.2.3.4, 端口8888)发送位置数据。
浏览器进程和游戏进程都会调用UDP。UDP会为它们分别创建数据报:
数据报A(来自浏览器):
源端口:
54321目的端口:
53数据:DNS查询内容
数据报B(来自游戏):
源端口:
7777目的端口:
8888数据:游戏位置数据
然后,这两个数据报都被交给IP层。IP层不管它们来自哪个应用,只是将它们都从同一个网络接口(比如你的网卡)发送到互联网上。
这个过程就是复用——多个应用程序的数据流共享底层的传输层和网络层服务。
总结与对比TCP
| 特性 | UDP | TCP |
|---|---|---|
| 分用依据 | 目的端口号 | 四元组:(源IP,源端口,目的IP,目的端口) |
| 套接字标识 | 二元组:(目的IP,目的端口) | 四元组:(源IP,源端口,目的IP,目的端口) |
| 核心特点 | 无连接。来自不同客户的数据,只要目的IP和端口相同,就进入同一个套接字。 | 面向连接。每个TCP连接都由一个独立的套接字处理,即使目的IP和端口相同,来自不同源的数据也会进入不同的套接字。 |
一个形象的比喻来区分UDP和TCP的分用:
UDP像一个公共信箱:所有人都把寄给“A公司”(目的IP和端口)的信扔进同一个大信箱里。A公司的人从信箱里取信时,只看信是寄给“A公司”的,不关心是谁寄的。
TCP像公司的前台接待:每个来访者(客户端连接)都会被分配一个专门的接待员(套接字)。前台(TCP)会严格区分张三的接待员和李四的接待员,即使他们都是来找“A公司”的
