端口号我们都熟悉,取值是0~65535,最多占用16个比特位,因此用16个比特位,即2个字节表示端口号。
UDP长度表示整个数据报的最大长度(报头+载荷部分),最大值为65535,单位是字节,即一个UDP数据报的最大长度是64kb;
校验和用来检测网络数据在传输的过程中,是否发生差错,即发送的数据和接收的数据是否相同。
UDP校验和使用CRC算法(循环冗余校验)来检测:把UDP报文中的每一个字节的值进行累加,并把加和放到一个大小为2个子节的数字中,不关心加和溢出问题~最终得到的结果就是校验和。
发送方发送的时候,会先计算一个校验和存放在报头中,接收方收到数据后,按照同样的规则再计算一次校验和,然后比较两个校验和是否相同,相同则接收数据;不同则直接丢弃数据。
客户端只要知道服务器的IP和地址,就可以直接进行数据传输,不需要建立连接。
发送端发送数据报以后,如果因为网络故障等问题无法发送给接收端,UDP协议也不会给应用层返回任何错误信息。
接收和发送数据的单位是一个数据报。应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。
例如:发送端一次发送500个字节的数据,那么接收端也必须一次接收500个字节;不能分成多次接收:100*5,250*2,20*25......
UDP的Socket既能写数据,也能读数据。
UDP只有接收缓冲区:
注意:网络传输环境错综复杂,可能会出现先发后至,后发先至的情况,UDP的接收缓冲区不能保证收到的UDP数据报的顺序和发送方发送数据报时的顺序一样;
如果接收缓冲区满了,后序到达缓冲区的UDP数据将会被丢弃。
UDP没有发送缓冲区:
UDP发送的数据会直接交给操作系统内核,再由内核将数据传给网络层协议进行后续的操作;