UDP:特点:无连接,不可靠传输
报头里面有啥呢?
那么首先我要先提问一下?2个字节,可以表示的数据范围有多大?(挺重要的需要记住)
1字节
有符号-128——+127
无符号 0——255
2字节
有符号 —32768——32767
无符号 0——65535
4字节
有符号-21亿——21亿
无符号0——42亿94万
报头的内部
合法的端口范围在:0——65535不能再大了,但是我们实际上不用0,1-1024这个范围大端口号,有特殊意义——叫做知名端口号(也不建议使用,1——1024这个范围大端口号有特殊意义,连mysql都是3306当然,你要是非想要的话,你需要有管理员权限,我们CURDboy这么会有管理员呢润)
一次通信,涉及五元组,源端口,目的端口,源IP,目的IP,协议类型,但是上面中名气比较大的服务器,都是上个世纪的情况(这里大部分服务器都已经过气,)
UDP报文长度->2字节换算成单位64kb 如今很小,当年很大(大佬们,也没想到互联网发展这么吊),此时我们该如何把这个报文长度改大呢?分配4个字节可以不呢——相当困难->主要原因政治上困难,网络通信,你改对端就需要改一系列东西,十分复杂(主要是你改动,别人改不改,一个地方不改,你就损失一大块蛋糕了)。
那么可能小可爱会问了,假如真超过64KB咋整啊~
改法1:
在应用层(代码中)把广告拆分成多组,通过多个UDP数据报进行传输
代码的改动会很多,很多地方要改,还要重新测试,拆分之后,传输过去,对面还要进行拼接,改这么拼?,顺序乱了怎么办,某部分丢失又怎么办
改法2:使用Tcp去代替UDP,TCP没有要求报文长度(多长都行)(更实用一些)
校验和:检察数据是否在网络运输的过程中出错了
一个结论:网络传输过程中,收到外界干扰,数据可能出错,本质上,光信号/电信号/电磁波/磁场,高能粒子射线(太阳耀斑这种)
可能你原先输入的是1,就会变成0,0变成1这种——》也叫做比特翻转
我们的校验和就是为了应对这个情况
接收方收到数据的时候,需要确认数据是否错误,校验和是最简单的方式
实际校验和,不仅仅是“长度”而是根据数据的内容生成的,当内容发生改变的时候,就能感知到错误,
UDP的校验和具体是怎么实现的呢,使用一种简单粗暴的CRC校验和算法(循环冗余校验和)
CRC会把累加结果,保存到2个字节的变量中,加着加着,可能就会溢出,溢出也无所谓,所有字节都加了一个遍,最终得到了校验和传输数据的时候,会把原始数据和校验和一起传递过去。接收方收到数据,同时也收到了发送端->送过来的校验和(旧的),接收方会同样再去算一遍,得到新校验和,如果旧的校验和和新的校验和相同,就可以视为数据传输的过程中,是正确的。
如果不同,则视为传输过程中数据出错了,数据相同->校验和不同,校验和不同也就是数据不同,(当然有一些算法进行校验,可以更高精确度,但是要付出更大的代价,简单粗暴就好)
假如说正好巧了,某个字节多了一个,后面一个字节少一个,两种相加,正好抵消(这也没有办法,不用特别严谨,项目中已经很够用了。出错就会进行丢弃。但TCP可要求对方重发数据(更可靠)——下一篇文章