赞
踩
- UDP报文主体分为两个部分:UDP报头(占8个字节)+UDP数据/UDP载荷
- UPD报头:源端口号+目的端口号+包长度+校验和
1.源端口号:一般是客户端程序程序请求时,由系统自动指定,端口号范围是0~65535, 0 ~ 1023为知名端口号——占16位,也就是2个字节
2.目的端口:一般是服务器的端口,一般通过程序员自己指定,这样客户端才能根据ip地址和port成功访问服务器——占16位,也就是2个字节
3.UDP长度:是指整个UDP数据报的长度,包括报头+载荷;16个字节
4.UDP校验和:用于检查数据在传输过程中是否出错,是否出现bit反转的问题,当进行校验时,需要在UDP数据报之前增加临时的伪首部;
UDP 传输的过程类似于寄信。
知道对端的 IP 和端口号就直接进行传输,不需要建立连接;
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方, UDP 协议层也不会给应用层返回任何错误信息,即无法知道数据是否传输到.
应用层交给 UDP 多长的报文, UDP 原样发送,既不会拆分,也不会合并;
用 UDP 传输 100 个字节的数据:
如果发送端一次发送 100 个字节,那么接收端也必须一次接收 100 个字节;而不能循环接收 10 次,每次接收 10 个字节。大小不能变
UDP 没有真正意义上的 发送缓冲区 。发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;UDP 具有接收缓冲区,但是这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致;如果缓冲区满了,再到达的 UDP 数据就会被丢弃;
UDP | TCP | |
是否需要建立连接 | 否 | 是 |
通信方式 | 一对一,一对多,多对一,多对多交互通信 | 每条TCP连接只能有两个端点,只能是一对一通信,可以建立多条连接来实现一对多,多对一,多对多等交互通信 |
对报文的处理 | 面向数据报 | 面向字节流 |
传输是否可靠 | 不可靠,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
大小是否受限 | 是 | 否 |
适用场景 | 实时性要求高,允许少量丢包 | 可靠性比较高的地方 |
- TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景;
- UDP用于对高速传输和实时性要求较高的通信领域,例如,早期的QQ,视频传输等。另外UDP可以用于广播;
这是一个经典面试题:
UDP本身是无连接,不可靠,面向数据报的协议,如果要基于传输层UDP协议,来实现一个可靠传输,应该如何设计?
UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计?
以上两个问题答案类似,都可以参考 TCP 的可靠性机制在 应用层 实现类似的逻辑:
例如:
- 应用层(自己写代码)来实现类似TCP的可靠机制;
- 引入序列号,保证数据顺序;
- 引入确认应答,确保对端收到了数据;
- 引入超时重传,如果隔一段时间没有应答,就重发数据;
- ......
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。
如果需要这些细节控制,那么不得不交给由采用UDO的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。