1. 端口号
端口号标识了一个主机上运行的不同程序。在TCP/IP协议中,使用"源IP地址"、"源端口号"、"目的IP地址"、"目的端口号"和"协议号"这样一个五元组来标识一个通信。
端口号划分:
- 0 - 1023:知名端口号,HTTP,FTP,SSH等这些使用广的应用层协议,他们的端口号都是固定的。
- 1024 - 65535:操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个方法分配的。
2. UDP协议
UDP协议格式:
- 源端口号(16位):源端口标识发送方的应用程序。
- 目的端口号(16位):目的端口标识接收方的应用程序。
- 数据报长度(16位):指定UDP数据报的长度(包括UDP头部和数据)。
- 校验和(16位):用于检验UDP数据报是否有误。如果校验和为0,说明数据报没有发生错误。
- 数据区:包含应用程序要发送的数据。
UDP头部共计8个字节,其中前4个字节为源端口号、目的端口号,,后4个字节为校验和、数据报长度。
由于协议报头中使用两个字节来存端口号,所以端口号范围是 0 到 65535.
同样,数据报长度也是使用两个字节来存储,所以,UDP数据报最长只能有 65535 个字节,每个UDP数据报能携带的最大数据是 64kb左右。
校验和:
由于我们的数据在传输过程中可能受到某些因素的干扰,导致数据损坏,校验和的作用,就是检擦当前传输的数据是否存在问题,如果数据损坏了,则会把这个数据报丢弃。
校验和是数据在发送前,把要传输的数据通过一定的算法计算出来的,等数据传输到了目标端口,再次通过该算法计算一次接收到的数据,把两次计算的结果作比较,如果相同则视为数据报完整,不相同则视为数据报损坏。校验和的计算算法有多种。
UDP中,校验和使用的是CRC算法,循环冗余校验:
用一个short变量,循环取出数据报中每一个字节的值,加到该short变量中(数据溢出也继续加)。
当然上述方法,也可能出现损坏的数据报和未损坏的数据报计算出来的结果相同,但是这样的情况概率比较低,可以忽略不记。如果希望有更高的精度可以使用更严格的校验和算法,例如md5算法和sha1算法。
我们简单了解一下md5算法的特点:
- 定长:无论数据有多长,通过md5计算出来的值都是固定长度,常见的md5有16,32,64位版本。
- 分散:计算md5过程中,数据只要变化一点,计算出来的结果差异就会很大,所以md5也可以作为字符串的哈希函数。
- 不可逆:通过md5的值无法还原为原字符串。