传输层协议——UDP协议

❣️关注专栏:JavaEE


传输层虽然是操纵系统内核已经实现好了的,但是我们程序猿写代码要调用系统提供的 socket API 完成网络编程,其中 socket 就属于传输层部分。

  UDP协议

1 UDP协议端格式

传输层协议——UDP协议_第1张图片

 上图就是UDP协议报文结构。

下面这里使用更加简洁明了的图文表示传输层报文结构:

传输层协议——UDP协议_第2张图片

UDP报头里边包含了一些特定的属性,携带了一些重要的信息。不同的协议,功能不同,报头中携带的属性信息就不同,对于UDP来说,报头一共是8个字节,分成4个部分,每个部分2个字节。2字节 源端口,2字节 目的端口,2字节 UDP报文长度,2字节 校验和。我们可以将这个报文想象成搬家时候的货拉拉:

传输层协议——UDP协议_第3张图片

  1.  UDP载荷:UDP就会把载荷数据通过 UDP socket ,也就是 send 方法得到的数据,在其基础上再到前面拼装上几个字节的报头,拼装就相当于是字符串拼接(此处是二进制的,不是文本的)。
  2. (1)其中的源端口和目的端口在TCP和UDP协议报头中都会有,都是用2字节:16bit位来表示的,一个端口号的取值范围是:0-65535,但是我们自己写程序的时候绑定的端口号是从1024开始的,因为0-1023这个范围的端口称为“知名端口号/具体端口号”,这些端口号是属于已经分配给了一些知名的广泛使用的应用程序了。1023以下的端口不是完全不能用,只是不建议使用,这些端口虽然被分配给了特定的程序,但是这个程序具体在你的电脑上是否运行着,电脑是否安装了这些程序,都是不一定的。那么如果写代码的时候你非要绑定一个1023以内的端口号的话,先要保证两点:(1)先确定你使用的这个端口确定没有程序在绑定(2)确定你有管理员权限。
  3. UDP报文长度也是2个字节表示,2个字节表示的范围是:0-65535,换算单位是64KB,一个UDP数据报,最大只能传输64KB的数据。这个64KB是非常小的,想象一下我们用手机拍的照片就是几个MB呢。如果应用数据报,超过了64KB怎么办呢?(1)在应用层通过代码的方式针对应用层数据进行手动的分包,拆分成多个包通过多个UDP数据报进行传输(本来是send一次就好了,现在需要 send 多次了),但是使用这个方案,需要写很多的代码,还要进行测试,处理bug...这就相当于是搬家的时候,货拉拉一次拉不完,所以需要多装几个车,但是约车,装车,清点都是非常麻烦的,所以干嘛不叫一个大一点的车一次性装完呢?所以就有了(2)不用UDP,直接换成TCP(TCP没有传输大小的限制)
  4. 校验和:作用是验证传输的数据是否正确。网络传输过程中,可能会受到一些干扰,在这些干扰下就可能出现“比特翻转”的情况,1->0,0->1的情况。网络传输,本质上就是光信号/电信号,这些信号可能会受到一些物理环境的影响,所以会导致一些数据发生改变,因此就引入了检验和来鉴别。校验和就是针对数据内容进行一系列的数学运算,得到一个比较短的结果(比如2字节),如果数据内容相同,得到的校验和结果就是一定的,如果数据内容改变,得到的校验和就变了。通过图示展示如何校验:

传输层协议——UDP协议_第4张图片

总结下来就是 ---- 发送方:把要发送的数据计算出校验和1;接收方:把收到的数据按照同样的方法再计算一次校验和2,然后比较校验和1和校验和2是否相同。

  •  针对网络传输的数据来说,生成校验和的算法有很多种,比较知名的是:

(1)CRC:循环冗余校验。简单粗暴,把数据的每个字节循环网上累加,如果累加溢出了,高位就不要了。虽然好算,但是校验和不是很理想,万一数据变动了2个bit位(前一个字节少1,后一个字节多一),就会出现了内容变了,CRC没变这样的情况。

(2)MD5:MD5不是简单地相加,有一系列的公式,来进行更复杂的数学运算.

算法特点:

1)定长:无论原始数据多长,得到的MD5值都是固定长度(有4字节版本、也有8字节版本.....)

2)冲突概率很小:原始数据哪怕只变动了一个地方,算出来的MD5值都会差别很大,让MD5结果更加分散。

3)不可逆:通过原始数据计算MD5容易,通过MD5还原成原始数据很难,理论上是不可实现的。

MD5这样的特点,就让它的作用更多了,校验和、作为计算hash值得方式、加密

(3)SHA1

2 UDP特点

2.1 无连接

知道对端的IP和端口号就直接进行传输,不需要建立连接

2.2 不可靠传输

没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;

2.3 面向数据报

应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并

2.4 全双工

UDP的socket既能读,也能写,这个概念叫做 全双工

2.5 缓冲区

UDP只有接收缓冲区,没有发送缓冲区:
UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议
进行后续的传输动作;UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。

2.6 大小受限

UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
 

你可能感兴趣的:(JavaEE,udp,java-ee,网络协议)