文章目录
📎 前言
传输层可以负责数据能够从发送端传输接收端. 其中有两个特别重要的协议, 一个是UDP协议, 一个是TCP协议. 本文我们介绍其中的UDP协议.
1. UDP协议的特点
学习一个协议, 当然要掌握这个协议的特性. UDP传输的过程类似于寄信. 特点大概可以分为以下几点.
1.1 无连接
知道对端的IP和端口号就直接进行传输,不需要建立连接
1.2 不可靠
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
1.3 面向数据报
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并
如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节. 而不能循环接收10次,每次接收10个字节。
1.4 全双工
数据传输时, UDP的socket面对双方既能被读取, 也能被写入.
1.5 缓冲区
UDP只有接收缓冲区,没有发送缓冲区.
UDP没有真正意义上的发送缓冲区. 发送的数据会直接交给内核, 由内核将数据传给网络层协议进行后续动作.
UDP具有接收缓冲区, 但是不能保证收到的数据报顺序与发送时的顺序一致; 而且如果缓冲区满了, 再到达的数据会自动丢弃.
1.6 传输时大小受限
UDP协议首部中有一个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部).
2. UDP协议端格式
- 下图为UDP协议报文格式:
- 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度;
- 如果校验和出错,就会直接丢弃;
- 由于端口号是16bit长度, 因此合法的端口号长度也就是0~65535. 不会再长了. 而且实际开发中 0 也是不会实际使用的.
- 而1-1024这些端口号也被系统赋予了特定的含义. 也就是知名端口号
3. UDP校验和实现方法
通过UDP协议报文格式我们看到UDP协议存放着校验数据是否准确的UDP校验和区域. 那么这是如何实现的呢?
UDP为了校验数据的准确性, 使用了一种简单粗暴的方式–CRC校验算法
(循环冗余校验和).
简单来说就是把UDP数据报中的每个字节都依次进行累加. 把结果保存到2个字节的变量中得到校验和. 传输数据时与原始数据一起传递过去. 接受方收到数据后按照相同的方式算一遍, 将新的校验和与收到的校验和进行比对. 若相同则认为数据是正确的. 否则则认为传输过程中出错了.
注意: 用CRC校验算法判断校验和是否相同是不严谨的. 但是在实际工程中也是完全够用. 并且在得到数据不同时, UDP会直接丢弃掉. 这同时也是不可靠性的一种体现.
4. 基于UDP协议的应用层相关协议
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
当然也包括我们写代码时自定义的协议.
🎉 总结
🎇到这里本篇文章就结束了,感谢大家的阅读。非常希望大家可以提出宝贵的建议!!
这篇文章主要介绍了网络协议中传输层的相关协议–UDP协议。 后续还会介绍到更多关于网络中的相关协议与知识.
🎇本篇文章是博主对自己学习中所学知识的个人理解。日后我也将不断更新自己学习过程以达到温故知新。更多相关知识请关注博主其他文章.
🎇希望大家可以点赞+收藏+评论支持一下噢!
🎇继续保持关注~