文章目录
一、UDP的概念及前置知识储备
1. UDP基本概念
UDP协议是传输层的一个协议,传输层负责保证数据能够从发送端传输到接收端,是整个网络体系结构中的关键层次之一,主要负责向两个主机中进程之间的通信提供服务。在这一层,信息传送的协议数据单元称为段或报文。
百度百科中如此解释UDP:Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
2. OSI协议模型中的传输单位
- 比特流(bit):物理层/一层。
- 数据帧(frame):数据链路层/二层。
- 数据包/报文分组(packet):网络层/三层。
- 数据报(datagram):传输层 UDP/四层。
- 数据段(segment):传输层 TCP/四层。
- 消息/报文(message):三层以上,通常指应用层/七层。
3. 端口
传输层负责向两个主机中进程之间的通信提供服务,那么如何找到它们的进程呢?这就要用到端口。
3.1 端口号范围划分
0 - 1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的。
1024 - 65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围分配的。
3.2 认识知名端口号(Well-Know Port Number)
有些服务器是非常常用的,为了使用方便,人们约定一些常用的服务器,都是用以下这些固定的端口号:
FTP服务器:21
SSH服务器:22
Telnet服务器:23
SMTP服务器:25
DNS服务器:53
HTTP服务器:80
HTTPS服务器:443
2.3 关于端口号的两个小疑问
1.一个进程是否可以bind多个端口号?
答:可以。
2.一个端口号是否可以被多个进程bind?
答:不可以。
二、UDP协议
1. UDP协议端格式
前言
任何一层协议,都应该解决两个问题:
1.报头和有效载荷进行分离的问题
2.将自己的有效载荷交付给上层的问题
1.如何将UDP的报头和有效载荷分离:
答:UDP是定长报头,大小为8字节,分别包含了“16位源端口号”、“16位目的端口号”、“16位UDP长度”、“16位UDP检验和”。因为UDP是定长的,所以当拿到UDP报文只需读取前8个字节(报头),后面的内容就是有效载荷。
2.如何将自己的有效载荷交付给上层:
答:当UDP取得有效载荷后,要将有效载荷交付给应用层所绑定的某一个进程,如何知道是哪一个进程呢?在报头中,“16位目的端口号”就对应了相应的进程。实际上,在内核中,UDP的底层是用Hash算法实现的,系统内核为了将进程管理起来,根据端口号利用Hash算法构建一张Hash表,最后直接根据端口号定位到进程。
16位UDP长度:表示整个数据报(UDP报头+UDP有效载荷)的最大长度,所以当我们知道16位UDP长度时,用其减去8字节就是UDP有效载荷的长度。
16位UDP校验和:如果校验和出错,就会直接丢弃。丢弃后UDP不会做出任何反馈,不关心。
1.1 UDP16位校验和的具体使用
16位UDP校验和目的:提供差错检测功能,在传输的报文段中检测“差错”(如比特翻转)
1.1.1 发送方
1.将报文段的内容处理为16bit整数的序列
2.校验和计算:
a:计算所有整数的和
b:进位加在和的后面(最高位进比特位的进位需要加到结果中)
c:将得到的值按位求反,得到校验和
3.发送方将校验和放入校验和字段
由图可知,两个16bit整数相加后最高位有一位进位为1,需要再次进行运算,将其加到末尾,最后按位取反。
1.1.2 接收方
发送方完成报文段的发送后,接收方不能无动于衷。那么接收方接收到报文段后又会采取什么操作来证明接受到的数据在网络传输过程中是否出现了差错呢?
1.计算收到报文段数据部分的校验和
2.核对计算的校验和是否等于校验和字段的值:
a.No-检测到差错
b.YES-没有检验到差错
由图可知,当接受方完成计算并与原校验和一一比对,相同为1,不同为0,可看出接受方所接受到的报文段是出现差错的。
2. 基本特征
2.1 无连接
知道对端的IP和端口号就直接进行传输,不需要建立连接。
2.2 不可靠
没有确认机制,没有重传机制。如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
2.3 面向数据报
对于UDP来说,比如我们要读取一个报文,那么就一定要读取完整,不能只读报头而不读它的数据,UDP不能灵活的控制读写数据的次数和数量。UDP是很有原则的,它对于上层即应用层交付的报文,既不会拆分,也不会合并。当使用UDP传输的数据时,假如发送端调用sendto一次发送了100个字节,那么接收端也必须只调用recvfrom一次接收100个字节,而不能每次接收10个字节,重复10次。
3. UDP的缓冲区
3.1 发送缓冲区和接受缓冲区
发送缓冲区:UDP严格意义上来讲没有发送缓冲区,因为它不保证可靠性,对于接受到的数据会调用sendto直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。
接受缓冲区:UDP具有接受缓冲区,可是UDP是不可靠的,所以这个接受缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致。一旦缓冲区满了,再到达的UDP就会被丢弃。
3.2 全双工
百度百科:全双工(Full Duplex)是通讯传输的一个术语。通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。单工就是在只允许甲方向乙方传送信息,而乙方不能向甲方传送 。(比喻汽车的单行道。)
UDP既能读也能写,所以它是全双工的。
4. UDP使用的注意事项
我们注意到,UDP协议首部中有一个“16位UDP长度”,也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。然而64K在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。
5.基于UDP的应用层协议
1.NFS:网络文件系统
2.TFTP:简单文件传输协议
3.DHCP:动态主机配置协议(路由器便是基于DHCP协议的,并且已经初步具备了应用层功能,当用户通过路由器上网时,路由器通过DHCP会在本身所建立的局域网当中选择一个未被使用的IP发给用户)
4.BOOTP:启动协议(用于无盘设备启动)
5.DNS:域名解析协议
6.自定义的应用层协议