UDP
介绍
- UDP是一个简单地面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据包
- 这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系
- UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地、
- 应用程序必须关心IP数据报的长度。如果它超过网络的MTU,那么就要对IP数据报进行分片
UDP和TCP特点区别
UDP每个包只执行一个任务
TCP可能把一些小的包封装成一个包发送
UDP三大典型运用
- 查询类DNS
- 没有TCP三次握手过程,快
- 多个DNS同时查询
- 数据传输:TFTP
- 停止等待协议,慢(需要运用层确认数据)
- 适合于无盘工作站
- 语音视频流
- 支持广播和组播
- 支持丢包,保障效率
UDP首部
- 端口号表示发送进程和接收进程
- TCP端口号和UDP端口号是相互独立的(rsh和syslog = 514)
- 尽管相互独立,如果TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求
- UDP长度字段指的是UDP首部和UDP数据的字节长度,该字段最小为8字节
UDP校验和
- 校验和用于检验是否丢包、运输过程中是否被修改
- UDP检验和覆盖UDP首部和UDP数据
- UDP的检验和是可选的,TCP校验和是必须的
- IP计算检验和和UDP计算检验和之间存在不同之处:
- UDP数据报的长度可以为奇数字节
- 检验和算法是吧若干个16bit字相加
- 解决方法是在必要时在最后增加填充字节0。这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)
- UDP数据报和TCP段都包含一个12字节长的伪首部,他是为了计算检验和而设置的。伪首部包含IP首部和一些字段,其目的是让UDO两次检查数据是否已经正确到达目的地(伪首部并不存在,只是计算时加入)
- 校验和并不完全正确,如发出去的跟回应的,源IP地址和目的IP地址交换了顺序,但由于校验和算法,每16位相加,所以校验和结果是一样的
- 哈希校验改变顺序结果就会变
最大UDP数据报长度
- 发送IP数据报的最大长度是65535字节
- 第一个限制:应用程序可能会受到其程序接口的限制,socket API提供了一个可提供应用程序调用的函数,以设置接收和发送缓存的长度
- 第二个限制:TCP/IP的内核实现
数据报拦截
UDP接口允许应用程序指定每次返回的最大字节数。如果超过,会数据报拦截
ICMP源站抑制
- 路由器快进慢出时会导致缓存满,此时再进包就会导致益处丢包
- 丢包时会发送ICMP,示意下降速度
- UDP可能会收不到,因为UDP发完包进程就结束,所以收到源站抑制ICMP也没用
- TCP一般会用,因为TCP丢包必须重发
- 如果是到达目的地(如目的路由器),但目的地缓存满丢包,则不会发送ICMP,因为已经到了目的地
IP分片
基本介绍
- IP把MTU与数据报长度(IP头部+IP数据)进行比较(在出接口)
- 如果需要则进行分片。分片可以发生在原始发送端主机上**,也可以发生在中间路由器上**
- 把一份IP数据报分片以后,只有到达目的地才进行重新组装
- 重新组装有目的端的IP层来完成,其目的是使分片和中心组装过程对运输层(TCP和UDP)是透明的(TCP只发送和收到完整数据报,不关心是否被分片过)
- 已经分片过的数据报有可能会再次进行分片
分片相关字段图解+介绍
IP首第二行:
- 16位标识:对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。该值在数据报分片是被复制到每个片中
- CU :暂时没用,为0
- DF: 1是不接受分片,0是接受
- 如果超出MTU,则直接丢包并发送ICMP差错报文给起始端
- 其中,第7,8个字节存储了路径mtu
- MF:
- 1:后面还有分片
- 0: 后面没有分片
- 13位偏移: 偏移量,用来确定分片位置
- 即使丢失一篇数据也要重传整个数据报
- IP层本身没有超时重传的机制—由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有。一些UDP应用程序本身也执行超时和重传)。
- 如果数据报分片的是中间路由器,而不是起始端系统,那么起始段系统就无法知道数据报是如何被分片的,就这个原因,经常要避免分片。
分片
-
IP数据报 = IP首部(20)+数据(如UDP首部+UDP数据)
-
IP数据报长度<MTU(一般数据报不超过1500字节)
-
图
-
在分片时,除了最后一片外,其他每一片的数据部分(除IP首部意外)必须是8字节的整数,同时总长度(IP首部+数据)小于MTU
-
最后一片总长度应该大于46(IP数据报规定46~1500),即如果数据部分不满26字节,需垫片(补0)
-
IP首部每个分片都有,但是UDP首部在数据中心,因此只在第一个分片中被发现,即端口号也只能在第一个分片中
-
IP数据报是指IP层端到端的传输单元(在分片值钱和重新组装之后),分组是在IP层和链路层之间传送的数据单元。一个分组可以是一个完整的IP数据报,也可以是IP数据报的一个分片
广播与多播
简介
- 三种IP地址:单播地址、广播地址和多播地址
- 广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要(UDP三种都行)
- TCP是一个面向连接的协议,它意味着分别运行于两主机(由IP地址确定)内的两进程(由端口号确定)间存在一条连接(TCP仅单播)
- 有时一个主机要像网上的所有其他主机发送帧,这就是广播。通过ARP和RARP可以看到这一过程
- 多播处于单播和广播之间:帧仅传送给属于多播组的多个主机
广播、多播
- 广播传送到UDP层,检测端口号,判断本机该端口号没有监听时丢掉
- 多播在设备驱动程序(链路层)时就会判断,如果没有上层信息或者不属于某个多播地址,即丢弃(多播省资源)