欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP/IP协议族【第14章用户数据报协议UDP】

程序员文章站 2022-03-16 11:04:15
...

14.1 引言

UDP协议 (User Datagram Protocol, UDP)是一个简单的面向无连接的,不可靠的数据报的传输层(transport layer)协议,IETF RFC 768是UDP的正式规范。

缺点也可以看做优点:非常简单,额外开销小。

TCP/IP协议族【第14章用户数据报协议UDP】

14.2 用户数据报

UDP分组叫用户数据报(user datagrams),它有8个字节的固定首部。

TCP/IP协议族【第14章用户数据报协议UDP】
源端口号:16位长,2字节,可选范围0-65535,在客户端主机,UDP软件选择是临时端口号,在服务端端口号是一个熟知的端口号。
目的端口号:16位长,2字节。
总长度: 16位长,标识首部+数据的总长度,理论值是0-65535,实际上用户数据报被封装在一个IP数据报中,所以
UDP总长度 = IP长度-IP首部长度。
校验和:校验整个用户数据报(首部+数据)出现的差错。

14.3 UDP提供的服务

14.3.1 进程到进程的通信

TCP/IP协议族【第14章用户数据报协议UDP】

14.3.2 无连接的服务

每个用户数据报是独立的,使用UDP进程不能发送数据流到UDP,
所以只有短报文的进程才能使用UDP<65507字节(65535-20(IP首部)-8(UDP首部))。

14.3.3 流量控制

没有流量控制

14.3.4 差错控制

除校验和外,没有其他差错控制

TCP/IP协议族【第14章用户数据报协议UDP】

伪首部(pseudoheader)

包含了源IP和目的IP,若首部收到损伤,可能交付到错误的主机。类型17,表示是UDP协议。

14.3.5 拥塞控制

没有拥塞控制

14.3.6 封装和解封

TCP/IP协议族【第14章用户数据报协议UDP】TCP/IP协议族【第14章用户数据报协议UDP】

封装:当进程有报文要通过UDP发送时,它就将此报文连同一对插口地址以及数据的长度传递给UDP。UDP收到数据后就加上UDP首部。然后UDP就将这用户数据报连同插口地址一起传递给IP。IP加上自己的首部,在协议字段使用值17,指出这数据是从UDP协议来的。这个IP数据报在传递给数据链路层。数据链路层收到IP数据报后,加上自己的首部(可能还有尾部),再传递给物理层。物理层将这些比特编码为电信号或光信号将其发送到远程的机器上。

解封:当这个报文到达目的只及时,物理层对信号解码,将其变为比特,传递给数据链路层。数据链路层使用其首部(和尾部)检查数据。若无差错,则剥去首部和尾部,并将数据报传递给IP,IP软件进行它的检查。若无差错,就剥去首部,将用户数据报连同发送端和接收端的IP地址一起传递给UDP,UDP使用检验和对整个用户数据报进行检查。若无差错,则剥去首部,将应用数据连同发送端的插口地址一起传递给接收进程。在需要回答收到的报文时,就应将发送端的插口地址传递给进程

14.3.7 排队

在客户端,进程启动时从操作系统处请求得到(临时)端口号,并最终有一个入和一个出队列 
在服务器端,在它开始运行时就请求为它的熟知端口创建入队列和出队列 
若报文到达端口没有对应的出队列则通过ICMP发送端口不可达报文 
TCP/IP协议族【第14章用户数据报协议UDP】

14.3.8 复用和分用

当主机运行TCP/IP协议族时,只有一个UDP,但可能会有多个进程想要使用DUP的服务,UDP可以进行复用和分用。

复用:在发送端,有多个进程需要发送用户数据报,但是只有一个UDP,需要复用。

分用:接收端也只有一个UDP,可能有多个进程需要接收用户数据报。需要分用。

14.3.9 UDP与简单协议的比较

UDP在分组的基础上增加了一个可选的校验和用于差错检测,但是并没有反馈给发送方。

14.4  UDP的应用

  1. 无连接服务:DNS
  2. 缺少差错控制:视频传输
  3. RIP路由表定期更新

14.5 UDP软件包

包括一个控制块表、若干个输入队列、一个控制块模块、一个输入模块和一个输出模块。

14.5.1 控制模块表

*********************************************************************

UDP有一个控制块表来记录打开的端口。表中的每一个项目最小有4个字段:状态(可以使FREE或IN-USE)、进程ID、端口号以及相应的丢列号。

14.5.2 输入队列

TCP/IP协议族【第14章用户数据报协议UDP】

每个进程对应一个输入队列。

14.5.3 控制块模块

控制块模块负责管理控制块表。当系统启动时,它就从操作系统要一个端口号。进程将进城ID和端口号传递给控制块模块,以便在表中为该进程创建一个项目。这个模块不创建队列。

udp_control_block_module(ip,port){
 查找控制块表的free表项
  if(未找到)
    预定义策略删除表项
   创建状态为INUSE的新表项
   输入进程ID和端口号
   return
}

14.5.4 输入模块

输入模块从IP接收用户数据报。它查找控制块表,寻找具有具有和这个用户数据报同样端口号的项目。若这道这样的项目,模块就利用这项目中的信息将这个数据放入队列。若未找到这样的项目,它就产生ICMP报文。

14.5.5 输出模块

输出模块负责创建和发送用户数据报。
*********************************************************************
上面是纯理论,下篇我们写个demo测试下、


相关标签: UDP