当前位置:   article > 正文

Java基于UDP实现 客户端/服务器_java udp server

java udp server

UDP协议

  • 无连接

  • 不可靠传输(传出去了不管有没有接受到,容易数据丢失)

  • 面向数据报

  • 全双工

UDP协议端格式

UDP协议报文结构,这个图在很多计算机网络教科书上都有,而且都是这么在花,但是实际这么画不够严谨

个人理解图应该如下:

  1. 源端口:源端口号。在需要对方回信时选用。不需要使用时可用 0 填充。

  1. 目的端口:目的端口号。这在终点交付报文时必须使用。

  1. 长度:UDP 用户数据报的长度,其最小值是 8(即仅有首部部分),单位:字节。

  1. 校验和:检测 UDP 用户数据报在传输过程中是否出错。有错就丢弃。

UDP报头里包含了一些特殊的属性,携带了一些重要的信息
不同的协议功能不同,报头中带有的属性信息就不同
对于UDP来说,报头一共就是八个字节,分成四个部分(每个部分都是均衡的两字节)

UDP 报头:8个字节,4个字段.

  • 2字节 源 端口 + 发送方端口

  • 2字节 目的端口 + 接受方端口

  • 2字节 UDP报文长度 (范围:0 -> 65535) (一个UDP数据报,最长就是65535字节)

  • 2字节 校验和 (发送方把要发送的数据计算出校验和(checksum1),接收方收到数据把数据按照同样的方式再计算一次校验和(checksum2),同时接受方也收到了checksum1,接受方比对checksum1和checksum2是否相同)

类比货拉拉搬家环节

买家叫车时,根据需要决定定什么样的车

车厢用来装货的部分就叫做 "载荷"

车头用来标识这辆车的身份,是大型车还是中型车,货车还是客车

UDP会把载荷数据通过UDP Socket,通过send方法拿来的数据的基础上在前面拼接几个字节的报头(相当于字符串拼接,此处是二进制的,不是文本的)

一次网络通信涉及到

五元组(源IP,源端口,目的IP,目的端口,协议类型)(两字节)

UDP报文长度(数据范围0->65535,64KB)(两字节)

Tips:

一个UDP数据报最大只能传输64KB的数据这是大呢还是小呢?如果应用层数据超过了64KB怎么办?
1. 就需要在应用层,通过代码的方式针对应用层数据报进行手动的分包, 拆成多个包,通过多个UDP数据报进行传输(本来send一次,现在send多次),就跟搬家的时候东西太多,一车装不下,就分多车装
2. 不用UDP,(因为使用如果使用上一条UDP传输拆分方案就得写很多代码很得进行多次测试处理bug,工作量大大增加,程序员的幸福感就降低了)直接换成TCP就没有这种限制.

校验和:验证传数的数据是否正确,网络传输的本质是光信号和电信号的转换,在这过程中,可能会受到一些物理环境干扰如电场,磁场,高能射线等,导致出现"比特翻转"(1->0,0->1)状况,数据一旦发生了改变,对数据的含义来说是致命的,例如在很多程序中经常使用1表示某功能的开启,0表示关闭.本来网络数据报是想开启这个功能,结果因为比特翻转导致变成了关闭...这后果可想而知是非常严重的!但这样的现象又是客观存在的,不可避免,程序员能做的就是能及时识别出错误信息!

因此就映入了校验和来进行鉴别

大致的鉴别方式如下:针对数据内容进行一系列数学运算,得到一个比较短的结果(比如两个字节的数据),如果数据内容一定,得到的校验和结果就一定,如果数据有变化,得到的校验和也就跟着与原来不同,所以只要前后内容是相同的,按照同样的算法得到的校验和也应该是相同的

但是实际的网路传输过程是把所有的字节都参与生成校验和运算,这样任何一个字节出了问题,都能及时的被发现!

Tips:

如果内容相同,得到的校验和一定相同(肯定的),但有时候不同内容按照相同的计算法则计算出的校验和可能相同(存在极小概率).但是在工程实践中,这种情况就忽略不计了,一般认为,校验和相同原始内容也相同
例子:就像我妈叫我去买"葱,姜,蒜",并最后嘱咐一共要三样!我由于没见过蒜长啥样,买回去了"葱,姜,辣椒"也是三样.这例子中的"三样"就相当于我与我妈之间数据传输的"校验和"但是在传输过程中出现了干扰使得我最终得到的信息内容不一样,就产生了错误!

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

  1. CRC 循环冗余校验

简单粗暴,把数据的每个字节都循环的往上"累加",如果累加溢出了,截出高位不要.

此方法好计算,但是有相应的弊端,如果数据同时变动两个bit位(前一个字节少1,后一个字节多1)就会出现内容变了,但是CRC结果没有变这种情况

  1. MD5

此方法不是简单的累加,有一系列公式来进行更复杂的数学运算(数学逻辑不过多介绍)

MD5算法的特点:

  • 定长:无论原始数据多长,得到的MD5值都是固定的长度(4/8字节)

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

  • 不可逆:通过原始数据计算MD5值很容易,但是通过MD5还原成原始数据(找到那个数据生成了次MD5值)就很难,理论上是不可实现的计算量极大,但也有很多解码网站他们的原理大多以"打表"的方式,把一些常用的数据计算出MD5值存储下来,用户输入MD5再在他的数据里面去一一核对(我们常见的WiFi万能

    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/146638
推荐阅读
相关标签