一、UDP协议的特点
- 按照报文来分割发送。
- 不需要建立连接和维护连接。
- 不需要接收确认。
- 速度较快。
- 不确保接收的顺序和发送顺序一样。
- 每个接收端支持一对多的发送和接收通信。
二、用UDP实现可靠通信的思路
(一)如何确保对方接收成功
1、接收方在接收成功时回复一个确认报文。
2、发送方收到确认报文,就认为对方已经成功收到本次报文。
(二)每个报文腾出空间放置序号
1、发送时按照数据报发送顺序设置序号,接收时根据数据报序号来进行排序。
2、序号确保发送顺序和接收顺序相同。
(三)发送方超时重发
1、如果在规定时间内发送方没有收到对方的接收确认报文,那么进入超时状态。
2、发送方认为数据报丢失,会重发一次当前报文。
(四)如果接收方缓冲区满了,可以告诉发送方停止发送
1、接收方每次接收后统计剩余接收缓存空间。
2、接收方回复接收确认报时告诉发送方剩余的接收缓冲空间个数。
3、发送方就会根据对方剩余接收空间字节数,来判断是否发送数据报。
目的是防止超出对方的接收能力,导致数据丢失。
(五)如何提高速度
采用连续批次发送。
具体做法:
1、发送方可以一次连续发送多个数据报。
2、发送一个批次后再统计对方的接收成功情况(如果成功,对方会回复一个接收确认报)。
3、重发那些没有被接收成功的数据报。
(六)如何实现数据流的方式
1、需要发送方和接收方建立一个缓冲区(包括发送和接收两种)。
2、提供大数据块进行分段发送和小数据报连接读取的操作。
3、给高层应用提供流的读写方法接口。
(七)如何实现可靠关闭
1、双方需要实现监听对方发来的关闭数据报。
2、双方都可以主动发送关闭数据报给对方,代表我要关闭(也需要对方确认收到关闭报文,或者超时重发关闭报文)。
3、主动关闭后,后台还需要处理缓存中剩余的等待发送的数据。
一般有继续全部发送、规定时间发送、直接丢弃等关闭模式。
三、参考的协议
1、协议头
发送方ID(16位) #标识发送方的身份。
标志(8位) #确定用途,分为:握手、握手回复、数据、回复确认、重发、结束输出、关闭、备用等等。
序号(16位) #表示发送时的编号。
确认号(16位) #等于序号加1,代表确认(相加可能会溢出)。
剩余空间(16位) #告诉发送方剩余的接收空间。
保留(8位) #扩展使用。
校验和(16位) #用于校验是否错误。
2、协议体
负载数据(800字节以内,可选的) #存放高层应用数据
UDP报文可以每次固定长度发送。