DELPHI学习之构建安全UDP协议
UDP协议不是安全的网络协议,它和TCP协议正好相反,不做数据检查,容易丢包,而且发送后的顺序无法确定。但它的优点也很突出,就是简单,高效。
UDP的丢包与处理问题
一、发送端的原因
1、数据包过大导致丢包:从加快数据发送的角度考虑,希望把数据包分得大一些,以减少发送的动作次数,提高发送速度。或者出于对网络的不了解,而随便处理数据包的大小,以至于数据包过大,导致丢包。
通常情况下,我们会创建一个字节数组作为发送的缓冲区,这个缓冲区的大小,就是我们要发送数据包的大小。我们要先把数据写入这个缓冲区中,然后调用SendTo方法,把缓冲区中的数据发送出去。
如果这个字节数组也就是缓冲区,设置的过大。也就相当于我们要发送的数据包设置的过大,就会导致UDP数据报被分成若干片,一片一片的发送,接收方再把接收到的一片一片的数据进行重组。这样的结果,因为增加了接收端的工作量,毫无疑问将会降低接收端的处理速度,更为严重的是,由于UDP是不安全的协议,它并不检查数据的顺序和完整性。如果接收的这些数据片中,有一片未收到,接收端就会把整个数据包丢弃,这就造成了我们常说的UDP丢包现象。
既然如此,我们使用UDP发送数据的时候,数据包多大才比较合适呢?这个答案通常是不固定的。要找到合适的UDP数据包大小,我们应当先来了解一下TCP/IP网络协议。
(1)局域网,它属于以太网(Ethernet)。以太网数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定。因此,1500个字节,被称为以太网链路层的最大传输单元(即MTU)。这个1500,并非全部都可以为我们的数据所用,它还要包括IP数据报的首部20个字节,UDP数据报的首部8个字节。因此,UDP数据报的数据最大长度,是1500 - 20 - 8 = 1472字节。
所以,答案就是,在局域网中,UDP数据报的数据大小,最好不要超过1472个字节。
(2)互联网,互联网上由大量各种各样的网络设备联络而成。其中,包括了大量的路由器,各个路由器的最大传输单元即MTU,可能各不相同。但是,互联网上标准MTU的值为576字节,我们在互联网上使用UDP传输数据,应当以这个值作为标准。和局域网环境一样,也要减去IP数据报的首部20字节,UDP数据包的首部8个字节。UDP数据报的数据大小,是576 - 20 - 8 = 548 字节。
在互联网环境中,UDP数据报的数据大小,最好不要超过548个字节。
2、发送端发送数据的频率过快:虽然数据包的大小设置合理,但大量的数据包同时发送,也有可能导致丢包。这个时候,应当在每个包发送的中间,适当停顿一下,用Sleep方法,让发送线程休眠几毫秒。具体休眠多长时间,应当在实际开发中,多设置一些值来测试,取最优值。
二、接收端的原因
1、接收端处理时间过长导致丢包:如果数据格式复杂,并且经过了加密处理,这个时候,接收端接收到数据包后,就需要花费一些时间来处理。如果处理时间过长,也会导致丢包。
这个时候,应当把接收的数据包先放入缓冲区,同时再开一个线程专门取出数据进行处理,不要在一个线程中既要接收,又要处理。
2、对于UDP接收端,可以把系统的接收缓冲区设置得大一些,这个方法,有时候,非常管用。
使用下面的API函数,设置接收缓冲区大小
MSDN中API函数原型
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
转换成Delphi语言则后的函数原型
function setsockopt(sockfd: Integer; level: Integer; optname: Integer; optval: PAnsiChar, optlen: Integer): Integer;
参数列表
sockfd:套接字
level: 设置影响的级别:可以是SOL_SOCKET, IPPROTO_TCP, IPPROTO_IP,和IPPROTO_IPV6
optname: 设置得具体内容 SO_RCVBUF(接收缓冲区),SO_SNDBUF(发送缓冲区)
optval: 指向新设置缓冲区大小的指针
optlen: 缓冲区类型的大小,这里是整数的大小,32位系统中占4个字节
三、创建自己的安全UDP协议
UDP丢包是正常现象,我们不能因为它丢包,就忽视了UDP的其它优势。简单,快捷是UDP的突出优点。但是,我们为了避免,或者减轻UDP丢包,乱序的毛病,就需要创建自己的UDP协议。
说是创建,有点小题大作了,其实是对UDP协议的使用,加以限制和协调。
1、正式传递数据前,先发送一系列预先定义的常量,告知接收端,所发送数据包的类型,数据总的大小,总的包数等等这些基本信息。同时,接收端接收后,立即发送回执信息。
2、发送端接收到回执信息后,开始发送第一包数据,数据始终都是一问一答的方式,一包一包的发送。每发送一包,挂起线程,等接收端发过来一个回执,接收到回执,发送方唤醒线程,发送下一包数据。
红橙色更易招蚊子2007年3月14日,乌拉圭卫生工作人员在首都蒙得维的亚的一处公园辨认蚊子种类。(新华社发)新华社北京2月6日电(记者李雯)英国自然通讯杂志日前刊载的一项研究显示,蚊子偏爱红色橙色
数字化影响制造业的六种方式气候和地缘政治事件一般会暴露制造业流水线的弱点。20202021年的芯片短缺,是制造业过去二十年来弱点累积的后果。值得庆幸的是,数字化赶上了全球电子元器件需求骤增的班车,以下是数字
世界首富承认错误,特斯拉进军氢能源马斯克曾经不止一次的公开diss燃料电池技术路线,经典的话语包括但不限于Fuelcellsfoolsells,foolcells,mindbogglingstupid,incred
被抢断货,中国画质天花板X11,开年迎来大好市场表现22年的第一季度对于家电圈来说真可谓是热闹非凡,各大厂家纷纷发布各种新品,简直是让人眼花缭乱。各种QDMiniLED的产品,各种大屏产品,各种激光产品。其中显示领域最惹人瞩目的无出
差点被骗!二手平台乱象,雅马哈假货横飞你是否曾因为囊中羞涩无法购买心仪的物品而苦恼?你是否曾因为剁手一时爽,转眼吃土忙?有人心心念念想要的东西,在另一个人手里却是碍眼的累赘,于是,为了让每件物品回到属于它的位置上,二手
静态体验Polestar2,配置丰富,车评人都说好,到底好在哪里?现在各大汽车产商开始往电动化方向发展,随着新能源的普及,现在国内市场纯电动汽车越来越成熟,Polestar是由吉利和沃尔沃共同控股的豪华电动车品牌,2021款Polestar2共推
郭台铭说大陆离不开富士康,结果被打脸,郭台铭认清现实了?在小米华为等手机品牌崛起之前,中国手机的半壁江山,曾被苹果牢牢占据。十年前,一部苹果4的价格相当于一台电视机的价格,尽管贵,但在一部分年轻人的心中,,拥有一台苹果手机,象征着走上了
小米12ProDXOMARK相机成绩出炉131根据DXOMARK官网显示,近日小米12Pro的拍照评分已经正式出炉,总分获得了131分,目前位列第14名。据悉,小米12Pro是小米12系列目前最强机型,拍照方面也是目前该系列最
近期好价!RedmiK40S顶配版仅需2399元最近有选购手机需求的,可以看看这款RedmiK40S,京东目前售价非常划算,顶配版12GB256GB到手价只要2399元。该款RedmiK40S搭载骁龙870处理器,采用三星E4旗
App用户协议需要中篇小说那么长?多款下载量过亿次的手机App,平均每款需要用户阅读并同意的协议内容有2。7万字。近日媒体所作网络调查显示,7成以上受访者,很少或从未读过App用户协议隐私协议。2。7万字的用户协议
如何定义区块链?区块链的应用场景有哪些?现在很多人认为区块链是一种万能的技术,无所不能,多少有点把区块链技术神话了!在区块链技术的定义上,美国学者梅兰妮斯万在其著作区块链新经济蓝图及导读定义区块链技术是一种公开透明的去中