《网络协议》UDP 协议

概述

UDP 是无连接、不可靠的数据报传输层协议,为应用程序发送和接收数据报,只是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,任何必须的可靠性都由应用程序提供。在 UDP 情况下,虽然可以确保发送消息的大小,却不能保证消息一定会达到目的端。没有超时和重传功能,当 UDP 数据封装到 IP 数据报传输时,如果丢失,会发送一个 ICMP 差错报文给源主机。

即使出现网络阻塞情况,UDP 也无法进行流量控制。此外,传输途中即使出现丢包,UDP 也不负责重发,甚至当出现包的到达顺序杂乱也没有纠正的功能。若需要这些细节控制,则必须交给 UDP 的应用程序去处理。

UDP 首部

UDP 首部由源端口号、目标端口号、UDP 包长度以及检验和组成。UDP 首部只有 8 字节,每个部分 占 16 位。其结构如下图所示:

--源端口号:表示发送端的端口号,字段长度为 16 位。该字段是可选的,有时可能不会设置源端口号,没有源端口号时该字段的值设为 0。此时,可用于不需要返回的通信中;

--目标端口号:表示接收端的端口号,字段长度为 16 位;

--UDP 包长度:该字段保存了 UDP 首部的长度与 UDP 数据的字节长度之和,该字段的最小值为 8 字节,IP 数据报是指数据报总的长度,因此,UDP 数据报长度是总的长度减去 IP 首部的长度;

--检验和:检验和是为了提供可靠的 UDP 首部和数据而设计;

检验和

首先先说明计算 UDP 检验和引入 UDP 伪首部的原因。在前面介绍《TCP 与 UDP 协议基本概述》中说到,为了防止相同端口号之间通信混乱,TCP/IP 或 UDP/IP 通信中通常采用 5 个信息来识别一个通信。它们分别是“源 IP
地址”、“目的 IP 地址”、“协议号”、“源端口号”、“目标端口号”。只要其中某一项不同,则被认为是其他通信。然而在 UDP 首部中只有源端口号和目的端口号,余下的 3 项都包含在 IP 首部中。假如其他 3 项信息(协议号、源 IP 地址、目的 IP 地址)被破坏,可能会导致无法正确接收到所需要的包(即可能收不到需要的包,而收到不该收的包)。为了避免这类问题的出现,有必要验证一个通信中必要的 5 项识别码是否正确。因此,在检验和的计算中引入了伪首部信息,UDP 伪首部为 12 字节,它包含 IP 首部的一些字段,其目的是让
UDP 两次检查数据是否已正确到达目的地。

在 IP 首部的检验和中,只需对 IP 首部进行检验,而 UDP 和 TCP 的检验和,对 UDP 首部和 UDP 数据或者 TCP 首部和 TCP 数据都进行检验。UDP 的检验和是可选的,而 TCP 的检验和是必须的。

UDP 检验和是一个端到端的检验和,它由发送端计算,然后由接收端验证。其目的是为了发现 UDP 首部和数据在发送端到接收端之间发生变化。如果 UDP 数据报的发送端没打开 UDP 校验和,而接收端计算校验和有差错,那么 UDP 数据报将会被丢掉,不产生任何差错报文。

最大 UDP 数据报长度

理论上 IP 数据报的最大长度为 65535 字节,去除 20 字节的 IP 首部和 8 个字节的 UDP 首部,因此 UDP 数据报的最大长度为 65507 字节。但是,大多数实现所提供的长度比这个最大值小。由于 UDP 最大数据报的限制,大于这个限制的数据报会被截断,从而发生数据丢失,且不会有任何数据丢失的通知。一般有两个因素的限制:

  1. 应用程序可能会受到其程序接口的限制,一些 API 的实现中可能有限定 UDP 数据报的最大长度。另外,现在大部分系统都默认提供了可读写大于 8192 字节的 UDP 数据报。
  2. 受限于 TCP/IP 内核的实现,可能存在一些实现特性,使 IP 数据报长度小于 65535 字节。

UDP 优点:在少量数据的传输时,使用 UDP 协议传输信息流,可以减少 TCP 连接的过程,提高工作效率;

UDP 缺点:当使用 UDP 协议传输信息流时,用户应用程序必须负责解决数据报排序,差错确认等问题;

参考资料:

《TCP/IP 详解》

《图解 TCP/IP》

时间: 2024-12-25 13:21:43

《网络协议》UDP 协议的相关文章

网络 基于UDP协议的socket编程

一.UDP协议        UDP协议的特点:用户数据包协议             1.UDP协议是无连接的.也就说在数据发送之前并不需要建立连接(当然,在发送数据结束的时候也就不存在链接的释放),因此减少了开销和数据发送之前的时延.             2.UDP使用尽最大努力的交付,但是不保证可靠性的交付,因此主机不需要维持复杂的链接状态表.(网上的的可靠性建立在应答的基础上,不提供可靠性交付,即不需要应答,因此不需要维护状态表)             3.UDP是面向报文.发送方

Java 网络编程 UDP协议

网络编程 TCP/IP协议:多台计算机网络连接的规则 包括:TCP协议.IP协议.UDP协议和其它协议的协议组 层次结构: 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤.网线提供的驱动.硬件方面的 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络. 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议. 应用层:主要负责应用程序的协议,例如HTTP协议.F

网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

UDP协议 (了解) 称之为数据包协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需先启动服务端再启动客户端 优点: - 传输速度快 - 能支持并发 - 不会粘包 缺点: - 数据不安全, 容易丢失 应用场景: 早期的QQ聊天室. # server端 import socket # socket.SOCK_DGRAM ---> UPD协议 server = socket.socket(type=s

python网络编程(通过tcp或者udp协议通信)

1.基于tcp协议传送文件: 客户端: import socketimport osimport jsonimport structclient = socket.socket()client.connect(('127.0.0.1',8080)) # 文件大小file_size = os.path.getsize(r'F:\老男孩Python7期\day32\视频\02TCP发送大文件.mp4') # 文件名字file_name = 'TCP发送大文件.mp4'# 定义一个字典d = { 'f

理解TCP和UDP协议

目录 TCP 协议 UDP协议 TCP和UDP的区别 TCP和UDP的使用场景 一 TCP协议 1.TCP的头部格式 理解TCP协议,首要的就是TCP协议的头部格式 ·        Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号:用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接: ·        Sequence Number:用来标识从T

协议系列之UDP协议

上节说的TCP协议虽然提供了可靠的传输,但是也有一个缺点,发送速度慢.那么有没有一种协议能快速发送的呢?这节要讨论的就是UDP协议,它提供了更加快的发送速度,但也牺牲了可靠性,它是一种无连接的传输协议.比起TCP,UDP更像是我们用手机发送短信,只管发送出去,但不能保证对方收到,不会建立连接,也没有确认环节. 图2-2-4-1为UDP协议报文结构.比起TCP,UDP报文的结构相对简单,只有源端口.目的端口.报文长度.校验和四个字段.其中源端口跟校验和是可选的,由于UDP不用接收端回复确认信息,所

udp协议基础(转自疯狂java讲义)

第17章  网络编程 17.4  基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送.接收的数据报. 17.4.1  UDP协议基础 UDP协议是英文User Datagram Protocol的缩写,即用户数据报

python网络(2)_Udp协议

udp协议 循环通信服务端 import socket #基于网络的udp协议的socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(("127.0.0.1",8888)) while 1: print("开启UDP协议服务端") from_client_data=server.recvfrom(1024)#阻塞等待客户链接 print(f'来自客户端{from_clien

JavaSE——UDP协议网络编程(二)

在 UDP 网络编程中,发送方与接收方没有建立联系,没有明显的服务器端和客户端的区别. 类 DatagramSocket: 此类表示用来发送和接收数据报包的套接字. 主要的构造方法: DatagramSocket():创建实例,绑定本机的默认IP地址,随机选择端口.通常用于客户端编程,没有特定监听的端口,仅仅使用一个临时的.  DatagramSocket(int port):创建实例,指定端口号,即固定监听Port端口的报文.  DatagramSocket(int port, InetAdd

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③