思维导图:
课程笔记:5.2 用户数据报协议UDP
5.2.1 UDP概述
一、UDP基本概念
- 无连接协议:UDP是一个简单的面向数据报的传输层协议,不需要在数据传输前建立连接,故减少开销和延迟。
- 复用/分用:UDP允许多个应用层服务通过不同端口使用同一UDP服务。
- 差错检测:提供错误检查功能,但不提供错误修正。
二、UDP的特点
- 无连接:无需连接建立、维护和拆除过程,适用于简单请求/应答模式,如DNS查询。
- 尽力而为服务:不保证数据包的可靠到达,也无拥塞控制,简化了协议的复杂性。
- 面向报文:
- 应用层数据传给UDP多长,UDP就保持原样传输,不合并也不分割。
- 报文边界保留:应用层可以更好地控制要发送的数据和数据格式。
- 报文长度选择的重要性:太长可能导致IP层分片,效率降低;太短可能导致首部开销大,也降低效率。
- 无拥塞控制:适用于实时应用,例如IP电话、视频会议,要求稳定速率发送,可接受一定数据丢失,不容忍大时延。
- 通信方式多样:支持一对一、一对多、多对一和多对多交互通信。
- 首部开销小:只有8字节,较TCP的至少20字节首部轻便。
三、问题与应对
- 网络拥塞问题:由于UDP缺乏拥塞控制,高速传输的实时视频等应用可能导致网络严重拥塞。
- 提高可靠性:一些实时应用可能在不牺牲实时性的情况下,增加如前向纠错或重传机制,以减少数据丢失。
图例解析:图5-4展示了UDP面向报文的特性,展现了从应用层到传输层再到网络层的数据传递过程。
笔记总结:
- UDP是一个简单、高效但不可靠的协议。
- 它主要用于那些对时延敏感、能容忍数据丢失的应用,例如流媒体。
- UDP在首部开销和传输时延上有优势,但在网络可靠性和拥塞控制方面存在劣势。
- 实际应用中,可能需要在应用层引入额外的机制以补偿UDP的不可靠性。
我的理解:
想象一下你正在玩一个快节奏的篮球比赛,篮球比赛的特点可以帮助我们理解UDP的特性:
-
无连接:
- 篮球比赛: 当你有球时,你不需要告诉队友“我现在要传球”,你只是直接将球扔给他们。
- UDP: 就像这种直接传球,UDP发送数据时不需要先建立连接,直接将数据包发送出去。
-
尽力而为服务:
- 篮球比赛: 你传球时,球可能会被对手拦截或你的队友没接住,但你仍会不断尝试传球。
- UDP: 类似地,UDP在发送数据包时,不保证每个数据包都能成功到达,有的可能会丢失,但它不会停下来修正这个问题。
-
面向报文:
- 篮球比赛: 每一次传球就像是一个完整的动作,你不会将球切成几部分传递给队友。
- UDP: 同样,UDP处理数据时,会将每一段数据作为一个独立的整体(报文)发送,而不会将它拆分或合并。
-
无拥塞控制:
- 篮球比赛: 不管场上多拥挤,你还是会以相同的方式传球,不会因为对方防守紧就放慢游戏节奏。
- UDP: 即使网络状况拥堵,UDP也会以原定速率发送数据,不会调整发送速度来适应网络状况。
-
效率与轻量级:
- 篮球比赛: 篮球运动装备简单,只需要球衣、短裤和球鞋,让运动员能够快速移动。
- UDP: 类似地,UDP的头部信息简单,仅8个字节,使得处理起来既快速又轻便。
-
多种通信方式:
- 篮球比赛: 你可以选择传球给任何一个队友(一对多),或者多个队友集中传球给你(多对一)。
- UDP: 这反映了UDP的灵活性,可以支持一对一、一对多、多对一、多对多的通信模式。
-
差错检测:
- 篮球比赛: 如果裁判看到一个违规动作,他会吹哨示意,但不会干预游戏结果(比如不会取消得分)。
- UDP: 类似的,UDP有差错检测功能,可以发现数据包中的错误,但它不会尝试修正错误,只是简单地丢弃有错误的数据包。
5.2.2 UDP首部格式
基本结构
UDP(用户数据报协议)的首部非常简洁,总共只有8个字节。首部包括四个字段,每个字段长度为2个字节。
字段详解
-
源端口(Source Port)
- 用于标识发送端应用程序的端口号。
- 如果不需要接收方回复消息,可以设置为全0。
-
目的端口(Destination Port)
- 用于识别接收端应用程序的端口号。
- 这个字段在数据报到达目的地时必须被使用,以确保数据能被正确交付给应用层。
-
长度(Length)
- 表示UDP数据报的总长度,包括首部和数据载荷。
- 最小值是8字节(即只有首部,没有数据)。
-
检验和(Checksum)
- 用于检测数据在传输过程中的任何变化。
- 如果发现错误,接收端将丢弃该数据报。
伪首部(Pseudo Header)
- 在计算检验和时,需要在UDP数据报前加上一个12字节的伪首部,但这不是UDP数据报的实际一部分,不会传输。
- 伪首部包括:源IP地址、目的IP地址、保留字段(全零)、协议类型(对于UDP是17)以及UDP长度。
检验和计算
- UDP检验和计算涉及伪首部和UDP数据报(首部+数据)。
- 数据部分不是偶数字节时,需要填充一个全零字节来计算检验和,但这个字节不会实际发送。
- 使用二进制反码运算求和,然后对结果取反码作为检验和。
数据交付和分用
- 当IP层接收到UDP数据报,会根据首部中的目的端口号,将数据报传递到对应端口的应用程序。
- 如果目的端口号不正确或不存在,数据报将被丢弃,并可能通过ICMP发送一个“端口不可达”的消息给发送方。
注意事项
- UDP通信是无连接的,不需要像TCP一样在通信双方之间建立一个连接。
- UDP适用于不需要可靠传输的应用场景,如视频流或在线游戏。
图解
- 图5-5展示了UDP数据报的首部和伪首部结构。
- 图5-6展示了UDP基于端口的分用过程。
我的理解:
UDP(User Datagram Protocol,用户数据报协议)首部格式是指在UDP数据报中用于标识不同通信信息的部分,其结构简洁但承载了传输过程中的关键信息。为了更形象地理解UDP首部格式,我们可以借助一些比喻和类比:
比喻1:邮件系统
可以将UDP比作邮政系统中的一封普通信件:
- 源端口:这就像是信封上的发件人地址。如果你希望对方回信,你会写上你的地址;如果不期待回信,那么这个地方可以不填写。
- 目的端口:类似于收件人地址。没有正确的收件地址,邮件就无法送达目的地。
- 长度:这就好比信封的大小,它告诉邮局这封信的总重量(即首部加上信件内容的总长度)。
- 检验和:就像是一种检查机制,确认信件在途中没有被破坏。如果邮局发现信件损坏,它就会丢弃它,因为它无法确认信的内容是否完整。
总结:
重点:
- 首部结构:理解UDP首部的基本结构,包括它的四个字段:源端口号、目的端口号、长度和检验和。
- 端口功能:
- 源端口号:通常用于接收回复,如果不需要回复,则可以设置为零。
- 目的端口号:用于指定接收数据报的应用程序,对于数据报的正确路由至关重要。
- 长度字段:包括首部和数据两部分的总长度,它的最小值为8字节(只有首部时)。
- 检验和:用于检测数据在传输过程中的任何错误。如果检验和不匹配,接收方将丢弃该数据报。
难点:
- 检验和的计算:理解检验和如何计算是较难的部分,因为它不仅包括UDP首部和数据部分,还包括一个伪首部。
- 伪首部的概念:伪首部在计算检验和时使用,但它实际上并不是UDP数据报的一部分。理解它的作用和构成是理解UDP检验和计算的关键。
- 检验和的验证:在接收方,如何利用接收到的检验和进行验证,以确定数据是否完整。
易错点:
- 伪首部的忽略:学习者可能会忽视伪首部的重要性或者误以为它是UDP数据报的实际组成部分。
- 长度字段误解:可能会误认为长度字段只包括数据部分的长度,而实际上它包括首部加数据的总长度。
- 端口号的混淆:不清楚源端口和目的端口的区别和用途可能导致混淆。例如,认为目的端口在发送方是不必要的或者源端口在接收方不重要。
- 检验和的计算错误:在检验和的计算过程中,由于涉及多个步骤和对伪首部的使用,易于出现错误。特别是在手动计算或模拟过程中,错过任何一个步骤都会导致计算结果不正确。
- 检验和的二进制反码理解:在计算检验和时,二进制反码计算可能会让人感到困惑,特别是对于不熟悉二进制操作的学习者。
在学习UDP首部格式时,理解每个字段的作用及其在数据传输中的意义,以及如何正确计算和验证检验和,是确保掌握这一节内容的关键。