想知道UDP层发现收到的包校验位错之后是怎么处理的,简单抛弃吗?如果是那样,是否说明:应用层可能收不到此包,但是只要收到,这个包就不可能有错,因为UDP层已经校验过了。如果答案是“是”的话,那么,考虑一个大UDP包被分为多个小包的情况。上面说的那个校验位是针对每一个小包的吧?那么可惜,这个校验位还是没能保证UDP包的完整性。每一个小包被完整收到,并不说明大包就完整了。那么,这个校验位对我们应用层编程有什么帮助?如果没有,要它干嘛?
调试欢乐多
至于每个小包的校验和,那也是ip层的任务了,如果ip层发现小包总数目不对,或者校验和有问题,那么会将所有分片丢弃,你是收不到任何东东的……小弟初学协议,如果有理解和描述错误,望各位大侠指正……
UDP包会被人为改变,对的,那么UDP层发现UDP包被改变后(即校验通不过的时候),究竟怎么处理这个包的?分片只在IP层进行,原来如此,多谢了!
如果发现校验和错误,那么只能要求重发了,因为校验和只是尽量帮助发现错误,但是没有办法纠正错误。
你的意思是说,我需要在应用层中手工检验这个校验和?UDP层没有自动校验和丢弃脏数据包的功能?
咱们不是在设计UDP层,而只是在使用UDP层提供的服务而已啊。
如果udp包有问题,那么会被直接丢弃,不会到达你的应用程序。
明白很多了,多谢上面各位帮助。明天结贴。
校验和错误说明数据一定错误,但校验和正确不能说明数据一定正确。另外,udp相比tcp而言也有许多弱势,比如你给对方发udp包,你无法确认对方是否收到,tcp却可以,还有流量控制等等
但是这种算法不能检查出所有类型的错误,举一个例子,如果我将2个16 bit组进行互换,那么换之前和换之后计算所得校验和是一样的,显然通过现行算法是无法检查出这种错误的。
当然,为了保证安全性,我们可以用更加复杂的算法,比如干脆算一个md5,不过算法太复杂,代价太大,会影响对每个数据报的处理速度。关于数据报出错的概率问题,的确,目前的网络相比n年以前来说,稳定性是好多了,出错几率小了很多很多,但是如果是人为篡改呢?不过这个纯属假设,我也不知道有没有人会在相关网络上这么干。