【Java】传输层UDP

传输层UDP

  • UDP基本特点
    • 无连接
    • 不可靠
    • 面向数据报
    • 缓冲区
    • 大小受限
  • UDP协议端格式
    • 16位UDP长度
    • 16位UDP检验和

UDP基本特点

UDP传输的过程类似于寄信

无连接,不可靠传输,面向数据报,全双工

无连接

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

不可靠

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

面向数据报

应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
用UDP传输100个字节的数据:

如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节;而不能循环接收10次, 每次接收10个字节

缓冲区

UDP只有接收缓冲区,没有发送缓冲区:

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

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

大小受限

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

UDP协议端格式

【Java】传输层UDP_第1张图片
其中十六位源端口号和十六位目的端口号很好理解

16位UDP长度

UDP数据报中的16位UDP长度占据16个比特位,总共能表示2^16-1的数据,此处单位使用字节,也就是UDP数据报的最大长度是64kb,超过这个长度的UDP报文会被拆分为多个片段进行传输和重新组装

16位UDP检验和

在网络传输数据的过程中,如果收到了外界的干扰,数据可能会出现错误

再网络传输中,数据往往是通过光信号,电信号,电磁波作为介质来传播的,如果此时遭受到了一些磁场或者高能粒子射线等能够影响这些信号传播,此处数据就会出现错误,可能会导致出现比特翻转这样的现象

在接受方收到数据之后,需要先确认这个数据是否是一个错误的数据,此时通过校验和是最简单有效的方式

UDP的校验和使用的一种简单粗暴的CRC校验算法(循环冗余校验和)

CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的错误检测技术,用于验证数据在传输或存储过程中是否发生了错误或篡改。

CRC基于多项式除法,它通过对待发送的数据进行一系列的异或运算,生成一个固定长度的校验码。这个校验码会被附加到原始数据中一起进行传输。接收方在接收到数据后,再次进行一系列的异或运算计算校验码,并与接收到的校验码进行比较。如果两者不一致,就说明数据发生了错误。

如果数据相同,则校验和相同
但是此时,校验和相同,代表的数据不一定相同,因为会存在偶然情况,在两个不同的数据报进行计算校验和时,产生了相同的校验和,但是在工程上,往往可以忽略这个误差

如果出现了校验和检验不通过,这个数据报就会被丢弃

你可能感兴趣的:(网络,Java,java,udp,开发语言)