想知道UDP层发现收到的包校验位错之后是怎么处理的,简单抛弃吗?如果是那样,是否说明:应用层可能收不到此包,但是只要收到,这个包就不可能有错,因为UDP层已经校验过了。如果答案是“是”的话,那么,考虑一个大UDP包被分为多个小包的情况。上面说的那个校验位是针对每一个小包的吧?那么可惜,这个校验位还是没能保证UDP包的完整性。每一个小包被完整收到,并不说明大包就完整了。那么,这个校验位对我们应用层编程有什么帮助?如果没有,要它干嘛?

解决方案 »

  1.   

    对于udp协议来说包就是那么大,没有大小之分。校验就是为了保证一个传输包的正确性。upd 本来就是不可靠的传输协议吗,应用层编程也主要是传输一些对数据完整性要求不高的数据,比如图像声音等。
      

  2.   

    1、数据在传输过程中,可能会人为或者非人为的发生改变,有的改变方式会导致校验和变化,有的则不会,所以目前的校验和方式只是尽可能的去发现错误,但无法保证数据正确性。2、至于分片的问题那是ip层的任务,当你收到一个udp包时,即使它曾经被分为好多小包,但是到你面前的已经是一个被ip层组合过的包了。
    至于每个小包的校验和,那也是ip层的任务了,如果ip层发现小包总数目不对,或者校验和有问题,那么会将所有分片丢弃,你是收不到任何东东的……小弟初学协议,如果有理解和描述错误,望各位大侠指正……
      

  3.   

    to:limin(我好笨我好困) 
    UDP包会被人为改变,对的,那么UDP层发现UDP包被改变后(即校验通不过的时候),究竟怎么处理这个包的?分片只在IP层进行,原来如此,多谢了!
      

  4.   

    to skyMountain(天山)
    如果发现校验和错误,那么只能要求重发了,因为校验和只是尽量帮助发现错误,但是没有办法纠正错误。
      

  5.   

    to:limin(我好笨我好困)
    你的意思是说,我需要在应用层中手工检验这个校验和?UDP层没有自动校验和丢弃脏数据包的功能?
    咱们不是在设计UDP层,而只是在使用UDP层提供的服务而已啊。
      

  6.   

    udp的效验和是可选的,而tcp是必须的当接收端发现效验和有差错,那么udp数据报就要被丢弃,这和ip效验是一样的
      

  7.   

    to skyMountain(天山)sorry,我刚才说的有些歧意。
    如果udp包有问题,那么会被直接丢弃,不会到达你的应用程序。
      

  8.   

    看来UDP有很大优点啊,报文只要收到就不会有错,而且报文大小也是可以知道的,编程方便多了。
    明白很多了,多谢上面各位帮助。明天结贴。
      

  9.   

    非也……并非报文只要接到就不会有错的,校验和只能检测部分类型的错误,无法保障数据正确性。
    校验和错误说明数据一定错误,但校验和正确不能说明数据一定正确。另外,udp相比tcp而言也有许多弱势,比如你给对方发udp包,你无法确认对方是否收到,tcp却可以,还有流量控制等等
      

  10.   

    UDP校验和一般是什么算法?循环CRC吗?按我的经验来看,数据包丢失的概率已经很小,数据包损坏的概率就更小了,包损坏、且又校验不出来的概率,应该是微乎其微。
      

  11.   

    不是用的循环crc,关于校验和的算法,引用《TCP/IP详解》第一卷中文版第26页的一段话:为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何查错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成查错报文,由上层去发现丢失的数据报并进行重传。ICMP、IGMP、UDP和TCP都采用相同的检验和算法,但是选用哪些部分的数据有所差别。
    但是这种算法不能检查出所有类型的错误,举一个例子,如果我将2个16 bit组进行互换,那么换之前和换之后计算所得校验和是一样的,显然通过现行算法是无法检查出这种错误的。
    当然,为了保证安全性,我们可以用更加复杂的算法,比如干脆算一个md5,不过算法太复杂,代价太大,会影响对每个数据报的处理速度。关于数据报出错的概率问题,的确,目前的网络相比n年以前来说,稳定性是好多了,出错几率小了很多很多,但是如果是人为篡改呢?不过这个纯属假设,我也不知道有没有人会在相关网络上这么干。