目录
前言
udp协议是一种面向无连接的,简单的传输层协议,也没有提供向tcp协议那样复杂的特性。更加关注的传输的效率和速度。虽然udp比较简单,但是在一些特定的场景下更有优势。udp协议常用于视频观看,网络游戏,DNS等等。
udp的报文格式
上图可以看出udp数据报整体来说还是比较简单的。
主要分为报头部分和数据部分。报头由4个部分组成,其中源目端口分别由16位bit也就是2个字节来表示,还有16位的udp数据包长度(包含数据部分),16的校验和组成。
源端口
端口就是标识在网络某个主机的具体应用程序,一个应用程序可以绑定多个端口,但是一个端口只能被一个应用程序所绑定。
源端口由16位组成,也就是2个字节,所能表示的范围就是0-65535,也就是说,发送端的端口号也就必须是0-65535这个范围之中。
源端口用来标识某台主机的某个应用程序所发送出来的信息。
目的端口
目标端口用来标识发送端发送的数据要发给接收端具体那个应用程序。
目标端口也由16bit组成,同样是2个字节,表示范围也是0-65535,接收端的端口号也要必须在0-65535之间。
UDP长度
长度字段同样占用16bit,表示UDP数据包的总长度(包括UDP头部和数据部分)。
16bit -> 2个字节,2个字节所能表示的范围0-65535,也就是64字节。也就是说一个udp最大报文长度就是64个字节。如果超出这个限制,那么接收端就直接丢弃这个数据。
需要注意的是在我们使用udp协议编程的时候,udp报文不能太长,不能超过64字节,否则就会有问题。
校验和
校验和用来检测数据在传输的过程中是否发生了变化或者发生了错误。
网络环境中是非常复杂的,同时也不是很稳定,可能就会出现数据在传输的过程中发生了错误的情况。
例如 通过网线传输的过程中,因为网线传输的是电信号,那么如果附近有强磁场之类的,那就会导致电信号发送紊乱。同时传输的数据也就发生了错误。
校验和存在的意义,就是用来判断当前传输的数据是否发生了错误。
在发送端发送数据的时候,会使用校验和算法来计算出来一个16位的校验和值,接收端在接收数据的时候,使用同样的校验和算法也计算出来一个16位的校验和值,然后进行比价,如果两端的校验和值不一致,那么就说明数据在发送的过程中产生了错误。这是接收端就是直接丢弃该数据包。
需要注意的是即使两端计算出来的校验和完全一致,但是也不能一定就群定这个数据就是正确的,因为校验和只能检测出部门错误,不能完全的检测出所有的错误,例如在数据发送的时候产生的错误,校验和就检测不出来。
udp的特点
udp的传输过程类似于寄信。
- 无连接:在数据传输过程前不需要建立连接,找到对方的IP地址和端口号就可以直接传输。可以快速的发送小量数据。
- 不可靠:udp没有任何的安全机制,发送端在发送数据之后,就不在进行任何操作,也不需要关心接收端是否收到。
- 面向数据报:应用层给udp给多长的数据报,udp就发送多长的数据报,不会进行拆分,也不会进行合并。
- 大小受限:udp在发送和接收数据的时候,只能发送和接收64字节以下的数据。
- 缓冲区:udp没有发送缓冲区的,但是有接收缓冲区。
发送的数据就会直接交给系统内核,由系统内核将数据交给网络层进行处理。
udp具有接收缓冲区,但是这个缓冲区不能保证数据的顺序。如果这个缓冲区满了,再到的数据报就直接丢弃。
总结
归根结底,TCP和UDP都是程序员的工具,什么时机用,具体怎么用,还是要根据具体的需求场景去判断。