与我们所熟知的 TCP(传输控制协议)协议一样,UDP 协议直接位于 IP(网
际协议)协议的顶层。根据 OSI(开放系统互连)参考模型,UDP 和 TCP 都属于
传输层协议。
UDP 协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数
据报就是一个二进制数据的传输单位。每一个数据报的前 8 个字节用来包含报头信
息,剩余字节则用来包含具体的传输数据。
UDP 协议使用端口号为不同的应用保留其各自的数据传输通道。UDP 和 TCP
协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数
据发送一方(可以是客户端或服务器端)将 UDP 数据报通过源端口发送出去,而
数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注
册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为 UDP
报头使用两个字节存放端口号,所以端口号的有效范围是从 0 到 65535。一般来说,
大于 49151 的端口号都代表动态端口。
数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是
固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据
报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的
最大长度为 65535 字节。不过,一些实际应用往往会限制数据报的大小,有时会降
低到 8192 字节。
UDP 协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方
通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数
据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方
的校验计算值将不会相符,由此 UDP 协议可以检测是否出错。这与 TCP 协议是不
同的,后者要求必须具有校验值。
2. UDP 编程基础
由于 UDP 协议并不需要建立一个明确的连接,因此建立 UDP 应用要比建立
TCP 应用简单得多。WinSock 提供了对 UDP(用户数据报协议)的支持,通过
UDP 协议可以向指定 IP 地址的主机发送数据,同时也可以从指定 IP 地址的主机接
收数据,发送和接收方处于相同的地位没有主次之分。利用 CSocket 操纵无连接