UDP协议基本原理
前言
? ? ? ? 本文主要讲解传输层中的UDP协议,我准备从UDP的特点出发,深入理解UDP协议,从UDP协议的结构推出UDP协议的特点;
一、理解端口号
? ? ? ? 前面我们总是说用IP加端口号的方式定位全网的唯一进程,通常在TCP/IP中,我们使用(源IP、源端口号、目的IP、,目的端口号、协议号)这样的一个五元组来标识一个通信;其中源IP与源端口号告诉对端发送方的主机与主机上哪一个进程,目的IP与目的端口了解我要去哪一台主机和主机上哪一个进程,协议号标识我们使用哪一种协议;
1、端口号的划分
? ? ? ? 我们在使用端口号时,并不是所有端口号我们都可以使用,有一类端口号被称之为熟知端口号,这类端口号的范围是1~1023,我们可以在Linux机器上的 /etc/services 中查看这些端口号;
????????另一类叫做登记端口号,这种端口号数值范围为1024~49151,要使用这类端口号必须在IANA按照规定的手续登记;
? ? ? ? 最后一类就是客户端使用的端口号,数值范围为49152~65535,这类端口号就是临时端口号,因此又叫做短暂端口号,留给客户进程选择临时使用,用完后归还;
2、netstat的使用
? ? ? ? netstat是我们进行网络编程的一个非常重要指令,该指令可以当前机器的网络状态;
常用选项:
n:拒绝显示别名,能显示数字就显示数字
l:仅列出处于监听(listen)状态的服务状态
p:显示建立相关连接的程序名
t:显示tcp相关选项
u:显示udp相关选项
a:显示所有选项,默认不显示listen相关;
二、UDP协议
1、UDP协议的特点
? ? ? ? 首先补充以下UDP协议的特点,以下为UDP协议特点;
(1)无连接
(2)不可靠
(3)面向数据报
? ? ? ? 前面的文章我们也有简单提过UDP的这三个特点,下面我们来详细解剖UDP的特点;
2、UDP协议格式
? ? ? ? UDP报文格式如下图所示;
源端口:发送方的端口号;
目的端口:接收方的端口号;
UDP长度:包括首部长度和数据长度;
UDP校验和:判断整个报文是否正确,若报文有误则直接抛弃;
????????首先我们要考虑的是如何实现UDP报文的封装和分离;仔细观察UDP报头的格式,我们发现报头的首部长度为固定的8字节,因此,我们可以首先提取出首部,然后我们再读取其中UDP长度字段,然后减去首部长度,剩下就是我们应该提取数据的长度;封装就更简单了,我们首先计算出数据长度,然后填充报头中字段;
? ? ? ? 看了上面的内容有没有想到UDP面向数据报的特点,正是因为我们对UDP报文长度是可预知的,我们可以提取出整个报文长度,所以我们可以将整个数据报整体发送,整体接收;
3、UDP的缓冲区
????????从某种意义上来说UDP协议并没有发送缓冲区,当我们上层调用sendto接口时,到了传输层这里,若为使用UDP协议,则封装完报头后直接发送了,并不需要发送缓冲区;但UDP有接收缓冲区,不过UDP的接收缓冲区一旦满了以后,收到任何UDP报文都直接丢弃;
? ? ? ? UDP的socket既能读也能写,且能同时进行,是全双工通信方案;
? ? ? ? 从上面种种来看,UDP协议设计的非常简单,从校验和检测不对直接丢弃,到接收缓冲区满后也直接丢弃,种种来看,UDP是一种“不可靠”的协议;这里的不可靠千万不能理解成贬义词,这里的不可靠为中性词,也正是UDP的这种简单不可靠,免去了UDP在维护可靠性所花费的成本,如UDP无连接,而后面所学习的TCP有连接正是维护可靠性所花费的成本;
4、理解UDP报文本身
????????我们可以以下面这种方式来理解UDP报文;
struct Udp_header
{
uint16_t _src_port;
uint16_t _dst_port;
uint16_t _udp_len;
uint16_t _udp_check;
};
? ? ? ? 所谓封装就是填充上述结构体后,在加上上层该付给该层的消息;所谓分离,我们可以理解为去掉前面报头的长度,也就是8字节,然后提取内容,内容的大小为 _udp_len - 8 ;
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!