UDP使用场景:
UDP三种性质:
1.尽力可靠:发送方和接收方的数据尽量到达(中间丢一些包不影响) --->微信音视频通话
2.无序可靠:迅雷下载,整个文件是做了分片 --->(保证数据完整性)
3.有序可靠:(银行转账) 数据需要先转出去---才可以转给别人。
1音视频通话(udp) 接收端需要缓存(可能出现延时) 目的是对包进行排序,解决传输乱序的问题。
2游戏开发 : 棋牌游戏没必要用udp , 王者荣耀(即使战略游戏)
3物联网: 桥梁传感器 (使用电池)十秒检测一下桥梁状态然后上报,接着休眠
4服务器状态集中监测: 手机状态集中监测,做服务器检测(100万台) udp比较省电
udp总结: (能够使用tcp解决的场景尽量不要挑战udp,udp真的不好用)
1.实时性要求
2.节约资源。(省电)
TCP UDP (user自己写的协议)可靠性UDP
应答机制 没有 (user层) 应答机制
包带序号 没有 (user层) 设计协议,加上序号
拥塞控制 没有 1.定义窗口,设计拥塞控制
2.发送包的时候有间隔
send,recv sendto ,recvfrom
send(10k) ---> recv(500) sendto(30k)(不可以,必须分片) recvfrom(500)
UDP传输原理
TCP协议(Transmission Control Protocol,传输控制协议)为应用层提 供可靠的、面向连接的和基于流(stream)的服务。使用超时重传、数 据确认等方式来确保数据包被正确发送至目的地。
UDP分片原理
UDP和MTU的关系
MTU:以太网(Ethernet) 数据帧的长度必须在46-1500字节之间,这是由以太网的 物理特性决定的. 这个1500字节被称为链路层的MTU(最大传输单元)。
单个UDP传输的最大内容 1472(1500-20-8, 如果有可选字节>28)字节,但由于不同的网络中转设备设置的MTU值并不相同。Internet上的标准MTU值为576字节, 建议在进行Internet的UDP编程时.最好将UDP的数据长度控制在548字节(576-20-8) 以内(腾讯游戏 MTU 500+)。
真的是1472或者576吗? (<=1472 , ip头是至少20字节不是至多,运营商也会在前面加PPPOE的协议 , 在发送的时候推荐用1400 )
IP协议+PPPOE协议
推荐的MTU 设计为 500+字节,应用逻辑保证数据包大小不超过 MTU,避免拆包。 局域网:1400 公网:500+(腾讯游戏推荐), 音视频: 1400
TCP是流式传输,一次收多少都是可以的,大不了多收几次。更多次数的内核态和用户态的切换。
UDP是报文传输,recvfrom每次都是需要接收一个完整的报文,如果不接收完,剩余部分就会被丢掉。(报文都是放到一个链表里面一个一个取出来的,下一次取的就是下一个报文了)
TCP send(1000) --------------------> recv(1000) 不一定收1000 可能会分片
UDP sendto(1000) --------------------> recvfrom(1000) 也不一定收1000 有可能会丢包
UDP分片机制设计的重点
要传输的一段数据
UDP分片机制设计的重点
1. 分片最大长度的确定
2. 分片帧头的设计 ◼ 同步字 ◼ 所有分片数据的总大小 ◼ 分片数量 ◼ 分片编号 ◼ 当前分片数据的大小
3. 重组异常的处理