UDP小结(一)

本文主要介绍了运输层的UDP协议,提供不可靠、无连接的服务。UDP仅包含复用/分解及少量差错检测功能,适合对实时性要求高的应用如DNS。与TCP相比,UDP无需连接建立,无连接状态,分组首部开销小,适用于对效率和速度有高要求的场景。

运输层概述

运输层位于应用层和网络层之间,是分层网络体系结构中的重要部分,该层为在运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。通常我们比较关注的就是TCP和UDP运输层协议。

网络层的两个端系统之间的交付服务扩展到运行在两个不同端系统上的应用层进程之间的交付服务。两个主要的问题就是:1.两个实体怎样才能在一种会丢失或损失的媒体上可靠的通信。2.控制运输层实体的传输速率以避免网络中的拥塞,或从拥塞中恢复过来。

网络应用程序可以使用多种的运输层协议,例如因特网有两种协议,即TCP和UDP,每种协议都能为条用应用程序提供一组不同的运输层服务。这些协议一种是UDP(用户数据报协议)它为调用他的应用程序提供了一种不可靠,无连接的服务。另外一种是TCP(传输控制层协议)它为调用他的应用程序提供了一种可靠的,面向连接的服务。

UDP-用户数据报协议

UDP服务模型提供了一种不可靠的,无连接的服务。在设计这种服务的时候,也许首先考虑使用一个无所事事的运输层协议,特别是在发送方一侧,考虑将来自应用进程的数据直接交给网络层;在接收方一侧,考虑从网络层到达的数据直接交付给网络层。运输层最低限度必须提供一种复用/分解(多路复用/多路分解)服务,以便在网络层与正确的应用级进程之间传递数据。

UDP只是做了运输协议能够做的最少工作,除了复用/分解功能以及少量的差错检测外,它几乎没有对IP增加别的东西。UDP从应用进程得到数据,附加上用于多路复用/分解服务的源和目的端口号字段,以及两个其他的小字段,然后将形成的报文段交给网络层。网络层将该运输层报文段封装到一个IP数据报中。然后尽力而为的将此报文段交付给接收主机。如果该报文段到达接受主机,UDP使用目的端口号将报文中的数据交付给正确的应用进程。需要注意的是,使用UDP时,发送报文段之前,发送方和接收方的运输层实体之间没有握手,正因为如此,UDP被称为无连接的。

DNS是使用UDP的应用层协议。当一台主机的DNS应用程序需要进行一次查询时,它构造了一个DNS查询报文,并将其交给UDP,无须执行任何与运行在目的端系统中的UDP实体之间的握手,主机端的UDP为此报文添加首部字段,然后将形成的报文段交给网络层,网络层将此UDP报文段封装进一个IP数据报中,然后将其发送给一个名字服务器。在查询主机的DNS应用程序则等待对该查询的响应。如果没有收到响应(可能是由于底层网络丢失了查询或响应)要么试图向另一个名字服务器发送该查询,要么通知调用它的应用程序它不能获得响应。

为啥是UDP

虽然在校招面试中常会问TCP的知识,但这并不代表TCP比UDP应用的更加广泛。有许多应用更适合UDP而不是TCP,主要原因如下:

1、关于何时、发送什么数据的应用层控制更为精细。

采用UDP时,只要应用进程将数据传递给UDP,UDP就会将次数据打包进UDP报文段,并立即将其传递给网络层,在另一方面,TCP有一个拥塞控制机制,以便当源和目的主机间的一条或多条链路变得极度拥塞时来遏制运输层TCP发送方。TCP仍将继续重新发送数据包文段,直到目的主机收到此报文段并加以确认,而不管可靠交付需要用多长时间。因为实时应用通常要求最小的发送速率,不希望过分的延迟报文段的传送,切能容忍一些数据丢失,TCP服务模型并不是特别适合这些应用的需要。这时候这些应用可以使用UDP,并作为应用的一部分来实现所需的功能。

2.无需建立连接。TCP在开始数据传输之前要经过三次握手。UDP却不需要任何准备即可进行数据传输。因此UDP不会引入建立连接的时延。这可能是DNS运行在UDP之上而不是运行在TCP之上的主要原因。(如果运行在TCP上,则DNS会慢很多)。HTTP使用TCP而不是UDP,因为对于具有文本数据的网页来说,可靠性是至关重要的。HTTP中的TCP连接建立时延对于与下载Web文档相关的时延来说是一个重要因素。

3.无连接状态。TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。要实现TCP的可靠数据传输服务并提供拥塞控制,这些状态信息是必要的。在另一方面,UDP不维护连接状态,也不跟踪这些参数。因此,某些专门用于某种特定应用的服务器当应用程序运行在UDP之上,而不是TCP之上时,一般都能支持更多的活跃客户。

4.分组首部开销小。每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销。

电子邮件、远程终端访问、Web及文件传输都运行在TCP之上。因为这些应用都需要TCP的可靠数据传输服务。无论如何,有很多重要的应用是运行在UDP上而不是TCP上,UDP被用于RIP路由选择表的更新。

但是,UDP的应用是可以实现可靠数据传输的。这可通过在应用程序自身建立可靠性机制来完成。

 

 

 

### UDP Ping 实验中服务器对丢失探测报文的处理小结UDP Ping实验中,由于UDP协议本身的特性以及其实现方式的不同,服务器对于客户端丢失探测报文的情况表现出特定的行为模式。以下是对此情况的小结: #### 1. **UDP协议的特点决定了服务器无法感知丢包** UDP种无连接、不可靠的传输协议[^1]。其设计初衷并不包含确认机制或重传功能。因此,当客户端发送的探测报文在网络中丢失时,服务器不会接收到该报文,也无法得知此事件的发生。这种行为是由UDP协议的本质决定的。 #### 2. **服务器仅能响应已接收的合法报文** 只有当服务器成功接收到客户端发送的有效探测报文时,才会执行相应的处理逻辑并返回应答消息[^1]。如果探测报文未到达服务器,则整个通信链路在此环节中断,服务器端没有任何操作会被触发。 #### 3. **应用层需额外实现可靠性保障机制** 为了弥补UDP缺乏内置可靠性的不足之处,在实际开发过程中通常会在应用层面上增加些自定义的功能模块来增强系统的鲁棒性。例如: - 设置合理的超时时间与最大重试次数; - 使用心跳检测或者周期性探活等方式维持双方连接状态正常运转; - 借助其他辅助手段如ICMP协议完成更深层次的状态监控等[^4]^。 #### 示例代码片段展示了基于Python语言编写的个简单版带有超时判断和多次尝试特性的UDP ping函数: ```python import socket import time def udp_ping(host='localhost', port=8080, timeout=5, retries=3): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) message = b'Ping' attempt = 0 while True: start_time = time.time() try: sent = sock.sendto(message, (host, port)) # Set the timer before waiting for response sock.settimeout(timeout) data, server_address = sock.recvfrom(4096) end_time = time.time() rtt = round((end_time - start_time) * 1000, 2) print(f'Received {len(data)} bytes from {server_address}. RTT={rtt}ms') break except socket.timeout as e: attempt += 1 if attempt >= retries: print('No more attempts available.') return None else: print(f'Timeout occurred ({attempt}/{retries}). Retrying...') udp_ping() ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值