用户数据包协议(user datagram protocol)——UDP

用户数据报协议(User Datagram Protocol,UDP)是无连接不可靠传输层协议。它不提供主机到主机通信,它除了提供进程到进程之间的通信之外,就没有给 IP 服务增加任何东西。此外,它进行非常有限的差错检验。如果 UDP 功能是如此之差,那么为什么进程还要使用它?它有缺点也有优点。UDP 是一个非常简单的协议,开销最小。如果一个进程想发送很短的报文,而且不在意可靠性,就可以使用 UDP。使用 UDP 发送一个很短的报文,在发送方和接收方之间的交互要比使用 TCP 时少得多。

 

用户数据报

UDP 分组称为用户数据报(user datagram),有 8 字节的固定头部,这个头部由 4 个字段组成,每个字段 2 字节(16 位)。

头两个字段定义了源和目的端口号。第三个字段定义了用户数据报的总长,即头部加数据的长度。16 位可以定义的总长度范围是 0 到 65 535。然而,总长度需要更小一些,这是因为 UDP数据报存储在总长度为 65 535 的 IP数据报中。最后一个字段可以携带可选校验和。

用户数据包协议(user datagram protocol)——UDP

用户数据包协议(user datagram protocol)——UDP

 

 

UDP服务

进程到进程的通信
UDP 使用套接字地址提供进程到进程通信,这是 IP 地址和端口号的组合。
 

无连接服务
UDP 提供无连接服务。这就是表示 UDP 发送出去的每一个用户数据报都是一个独立的数据报。不同的用户数据报之间没有关系,即使它们都是来自相同的源进程并发送到相同的目的程序。用户数据报不进行编号。此外,也没有像 TCP 协议那样的连接建立和连接终止,这就表示每一个用户数据报可以沿着不同的路径传递

 无连接的一个结果就是使用 UDP 的进程不能够向 UDP 发送数据流,并期望它将这个数据流分割成许多不同的相关联的用户数据报。相反,每一个请求必须足够小,使其能够装入用户数据报中,只有那些发送短报文的进程才应当使用 UDP。短报文小于 65 507 字节(65 535 减去 UDP 头部的 8字节再减去 IP 头部的 20 字节)
 

流量控制
UDP 是一个非常简单的协议。它没有流量控制(flow control),因而也没有窗口机制。如果到来的报文太多时,接收方可能会溢出。缺乏流量控制意味着如果需要的话,使用 UDP 的进程应该提供这个服务

差错控制
除校验和外,UDP 也没有差错控制(error control)机制,这就表示发送方不知道报文是丢失还是重传。当接收方使用校验和检测出差错时,它就悄悄地将此用户数据报丢弃。缺乏差错控制意味着如果需要的话,使用 UDP 的进程应该提供这个服务。

校验和
UDP 校验和包含三部分:伪头部、UDP 头部和从应用层来的数据。伪头部(psedoheader)是 IP 分组的头部的一部分,其中有些字段要填入 0,用户数据报分装在 IP 分组中(见图 3-40)。

用户数据包协议(user datagram protocol)——UDP

如果校验和不包括伪头部,用户数据报也可能是安全完整地到达。但是,如果 IP 头部受到损坏,那么它可能被提交到错误的主机。
增加协议字段可确保这个分组是属于 UDP,而不是属于其他传输层协议。如果一个进程既可用 UDP 又可用 TCP,则端口号可以是相同的。UDP 的协议字段值是 17
如果在传输过程中这个值改变了,在接收端计算校验和时就可检测出来,UDP 就可丢弃这个分组。这样就不会传递给错误的协议。


可选校验和
UDP 分组的发送方可以选择不计算校验和。这种情况下,在发送前,校验和字段就全填入 0。在发送方决定计算校验和的情况下,如果碰巧结果全是 0,那么在发送前校验和全改为 1。换言之,发送方填充两次校验和。注意,这不会产生混淆,因为校验和的值在正常情况下不会全为 1(见例3.12)。

用户数据包协议(user datagram protocol)——UDP

拥塞控制
由于 UDP 是无连接协议,它不提供拥塞控制。UDP 假设被发送的分组很小且零星,不会在网络中造成拥塞。今天当 UDP 被用做音频和视频的交互实时传输时,这个假设可能对也可
能不对。


封装和解封装
要将报文从一个进程发送到另一个进程时,UDP 协议就要对报文进行封装和解封装。排队我们已经讨论过端口,但是没有讨论端口的实际实现。在 UDP 中,队列是与端口联系在一起的。在客户端,当进程启动时,它从操作系统请求一个端口号。有些实现是创建一个入队列和一个出队列与每一个进程相关联。而有些实现只创建与每一个进程相关的入队列。

多路复用与多路分解
在运行 TCP/IP 协议簇的主机上只有一个 UDP,但可能有多个想使用 UDP 服务的进程。处理这种情况,UDP 采用多路复用和多路分解。

UDP 和通用简单协议比较
我们可以将 UDP 与之前讨论的无连接简单协议进行比较。唯一的区别就是 UDP 提供可选校验和来在接收端发现被破坏分组。如果校验和被加入分组,接收 UDP 可以检测分组,如果分组被破坏可以丢弃它。然而,没有反馈被发向发送方。

      UDP 是我们之前讨论的无连接简单协议的一个例子,区别在于它为差错检测加入了可选校验和

用户数据报协议(User Datagram Protocol,UDP)是无连接不可靠传输层协议。它不提供主机到主机通信,它除了提供进程到进程之间的通信之外,就没有给 IP 服务增加任何东西。此外,它进行非常有限的差错检验。如果 UDP 功能是如此之差,那么为什么进程还要使用它?它有缺点也有优点。UDP 是一个非常简单的协议,开销最小。如果一个进程想发送很短的报文,而且不在意可靠性,就可以使用 UDP。使用 UDP 发送一个很短的报文,在发送方和接收方之间的交互要比使用 TCP 时少得多。

 

用户数据报

UDP 分组称为用户数据报(user datagram),有 8 字节的固定头部,这个头部由 4 个字段组成,每个字段 2 字节(16 位)。

头两个字段定义了源和目的端口号。第三个字段定义了用户数据报的总长,即头部加数据的长度。16 位可以定义的总长度范围是 0 到 65 535。然而,总长度需要更小一些,这是因为 UDP数据报存储在总长度为 65 535 的 IP数据报中。最后一个字段可以携带可选校验和。

用户数据包协议(user datagram protocol)——UDP

用户数据包协议(user datagram protocol)——UDP

 

 

UDP服务

进程到进程的通信
UDP 使用套接字地址提供进程到进程通信,这是 IP 地址和端口号的组合。
 

无连接服务
UDP 提供无连接服务。这就是表示 UDP 发送出去的每一个用户数据报都是一个独立的数据报。不同的用户数据报之间没有关系,即使它们都是来自相同的源进程并发送到相同的目的程序。用户数据报不进行编号。此外,也没有像 TCP 协议那样的连接建立和连接终止,这就表示每一个用户数据报可以沿着不同的路径传递

 无连接的一个结果就是使用 UDP 的进程不能够向 UDP 发送数据流,并期望它将这个数据流分割成许多不同的相关联的用户数据报。相反,每一个请求必须足够小,使其能够装入用户数据报中,只有那些发送短报文的进程才应当使用 UDP。短报文小于 65 507 字节(65 535 减去 UDP 头部的 8字节再减去 IP 头部的 20 字节)
 

流量控制
UDP 是一个非常简单的协议。它没有流量控制(flow control),因而也没有窗口机制。如果到来的报文太多时,接收方可能会溢出。缺乏流量控制意味着如果需要的话,使用 UDP 的进程应该提供这个服务

差错控制
除校验和外,UDP 也没有差错控制(error control)机制,这就表示发送方不知道报文是丢失还是重传。当接收方使用校验和检测出差错时,它就悄悄地将此用户数据报丢弃。缺乏差错控制意味着如果需要的话,使用 UDP 的进程应该提供这个服务。

校验和
UDP 校验和包含三部分:伪头部、UDP 头部和从应用层来的数据。伪头部(psedoheader)是 IP 分组的头部的一部分,其中有些字段要填入 0,用户数据报分装在 IP 分组中(见图 3-40)。

用户数据包协议(user datagram protocol)——UDP

如果校验和不包括伪头部,用户数据报也可能是安全完整地到达。但是,如果 IP 头部受到损坏,那么它可能被提交到错误的主机。
增加协议字段可确保这个分组是属于 UDP,而不是属于其他传输层协议。如果一个进程既可用 UDP 又可用 TCP,则端口号可以是相同的。UDP 的协议字段值是 17
如果在传输过程中这个值改变了,在接收端计算校验和时就可检测出来,UDP 就可丢弃这个分组。这样就不会传递给错误的协议。


可选校验和
UDP 分组的发送方可以选择不计算校验和。这种情况下,在发送前,校验和字段就全填入 0。在发送方决定计算校验和的情况下,如果碰巧结果全是 0,那么在发送前校验和全改为 1。换言之,发送方填充两次校验和。注意,这不会产生混淆,因为校验和的值在正常情况下不会全为 1(见例3.12)。

用户数据包协议(user datagram protocol)——UDP

拥塞控制
由于 UDP 是无连接协议,它不提供拥塞控制。UDP 假设被发送的分组很小且零星,不会在网络中造成拥塞。今天当 UDP 被用做音频和视频的交互实时传输时,这个假设可能对也可
能不对。


封装和解封装
要将报文从一个进程发送到另一个进程时,UDP 协议就要对报文进行封装和解封装。排队我们已经讨论过端口,但是没有讨论端口的实际实现。在 UDP 中,队列是与端口联系在一起的。在客户端,当进程启动时,它从操作系统请求一个端口号。有些实现是创建一个入队列和一个出队列与每一个进程相关联。而有些实现只创建与每一个进程相关的入队列。

多路复用与多路分解
在运行 TCP/IP 协议簇的主机上只有一个 UDP,但可能有多个想使用 UDP 服务的进程。处理这种情况,UDP 采用多路复用和多路分解。

UDP 和通用简单协议比较
我们可以将 UDP 与之前讨论的无连接简单协议进行比较。唯一的区别就是 UDP 提供可选校验和来在接收端发现被破坏分组。如果校验和被加入分组,接收 UDP 可以检测分组,如果分组被破坏可以丢弃它。然而,没有反馈被发向发送方。

      UDP 是我们之前讨论的无连接简单协议的一个例子,区别在于它为差错检测加入了可选校验和