❣️关注专栏:JavaEE
传输层虽然是操纵系统内核已经实现好了的,但是我们程序猿写代码要调用系统提供的 socket API 完成网络编程,其中 socket 就属于传输层部分。
上图就是UDP协议报文结构。
下面这里使用更加简洁明了的图文表示传输层报文结构:
UDP报头里边包含了一些特定的属性,携带了一些重要的信息。不同的协议,功能不同,报头中携带的属性信息就不同,对于UDP来说,报头一共是8个字节,分成4个部分,每个部分2个字节。2字节 源端口,2字节 目的端口,2字节 UDP报文长度,2字节 校验和。我们可以将这个报文想象成搬家时候的货拉拉:
总结下来就是 ---- 发送方:把要发送的数据计算出校验和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
知道对端的IP和端口号就直接进行传输,不需要建立连接
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并
UDP的socket既能读,也能写,这个概念叫做 全双工
UDP只有接收缓冲区,没有发送缓冲区:
UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议
进行后续的传输动作;UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。
UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。