reference:

https://blog.csdn.net/qiuchangyong/article/details/79945630

https://seanwangjs.github.io/2017/10/19/udp-protocol-checksum.html

关于udp传输的不可靠性,用过这个的人都知道会丢包。具体细节可能就不清楚了,经过我的理解和总结,有以下两点:

1)udp包的大小可以达到64k,但实际上mtu大小只有1k多,如果直接发一个超过mtu大小的包,就会在协议层被分片,这样的问题是,如果只要有一个分片在传输中出错了即校验不正确(这是较容易发生的),整个传输的udp包就被丢弃。注意是整个而不是单个分片。这就是为什么发送udp包通常也是1k多大小的原因,rtp是在udp之上的协议,也考虑了这个问题。

2)实际上收到的数据都是经过校验的,不存在传错的问题,即在应用层调用udp传输时,不会出现发送了"ABCD",收到的却是"ABED"的情况,只有丢包或乱序的问题。而udp接收缓冲区过小也是造成丢包的原因,适当增大udp缓冲区能够降低丢包率。

在实际应用中,比如流媒体传输中,就要对接收的乱序的包进行重排(重排时间的长短又是一个关键),这时候发现某个包丢了(前提是要加一个序号,这个rtp包头里面有),还需要做重传的工作,然而udp协议就是为了传输的实时性而生的,所以这里面就有一个权衡的问题,既不能全部都重传,也不能不重传。如果全部都重传,那就和TCP没有区别了;如果不重传,丢包就会导致流媒体的不完整性,需要做的处理就是错误修复或隐藏,对于音频和视频都有一些算法,由于信息丢失,这些算法也只能做一些弥补,但对于无法进行重传的情况,比如播放基于udp的ts节目流,这些纠错算法的好坏就是关键。

45 00 00 2e----4表示ip版本号为ip第4版;5表示首部长度为5个32 bit字长,即为20字节;00 2e表示ip总长度为46字节,其中ip数据部分为26字节。 
be 55 00 00----be 55表示标识符;00 00表示3 bit标志及13 bit片偏移量; 
7a 11 51 ac----7a表示ttl值为122;11表示协议号为17的udp协议;51 ac表示16 bit首部检验和值; 
de b7 7e e3----表示32 bit 源ip地址为222.183.126.227 
c0 a8 12 7a----表示32 bit 目的ip地址为192.168.18.122

-------------------------------------------------------------------------------------------

检验和计算: 
首先,把检验和字段置为0。 
45 00 00 2e 
be 55 00 00 
7a 11 00 00<----检验和置为0 
de b7 7e e3 
c0 a8 12 7a 
其次,对整个首部中的每个16 bit进行二进制反码求和,求和值为0x3_ae50,然后3+ae50=0xae53(这是根据源代码中算法 cksum = (cksum >> 16) + (cksum & 0xffff) 进行的 ) 
最后,ae53+51ac=ffff。因此判断ip首部在传输过程中没有发生任何差错。

"二进制反码求和" 等价于 "二进制求和再取反"
从源代码看,很关键的一点是二进制求出的和如果大于16位时所做的操作,用和值中高16位加上低16位的值作为最终的和值,然后再做取反运算.


对于TCP和UDP的数据报,其头部也包含16位的校验和,校验算法与IPv4分组头完全一致,但参与校验的数据不同。这时校验和不仅包含整个TCP/UDP数据报,还覆盖了一个虚头部。虚头部的定义如下:

0         7 8   15 16   23 24       31 
                    +--------+--------+--------+------------+
                    |             source address              |
                       +--------+--------+--------+---------+
                    |           destination address          |
                    +--------+--------+--------+------------+
                    |  zero  |protocol| TCP/UDP length  |
                    +--------+--------+--------+------------+

其中有IP源地址,IP目的地址,协议号(TCP:6/UDP:17)及TCP或UDP数据报的总长度(头部+数据)。将虚头部加入校验的目的,是为了再次核对数据报是否到达正确的目的地,并防止IP欺骗攻击(spoofing)。

以及这段信息的十六进制表示

有了以上这些内容,剩下的就是对照着最开始的图表来寻找各个参数的值了( wireshark 一个十分好用的功能就是点选上面的人类可读内容,其十六进制值会在下面高亮显示)。我用下表来表示

key human hex
Source 192.168.1.106 c0a8 016a
Destination 11.111.111.111 0b6f 6f6f
Protocol UDP(17) 11
Length 17 11
Source Port 63549 f83d
Destination Port 12345 3039
Length 17 11
Checksum 0xb12d b12d
Data hello UDP 6865 6c6c 6f20 5544 5000

然后就可以开始着手校验和的计算了,但在这之前还应注意,上表中有一项 Checksum ,这是发送方根据发送内容计算出来校验和,接受方需要根据收到的内容重新计算一遍校验和,然后再对比两者。所以在接收方计算时应该忽略这里 Checksum 项。

再次举例:

source ip

destination ip

protocol udp :固定为0x11

length*2 : length为:数据长度+8;

source port

destination port

data:从开头取16bit,当结尾为8bit,将低8bit设为0x00;当然0x00不能算为数据长度

上述计算完成后,将超过16bit的高位截取,加到低16bit中;再取反,即0xFFFF减去其即可。

C0A8_0003
C0A8_000A
11
10 (8+8)
10
8000
8000
1122_3344_5566_7788
----------------------
3_92E2
-------
92E5
------
6D1A

理解UDP协议的首部校验和校验和的更多相关文章

  1. UDP协议详解

    1.UDP协议的作用 IP协议无法区别同一个主机系统上的多个应用程序.UDP采用端口标识同一主机上的不同应用程序. 无法采取进程ID来标识不同应用程序的原因: 1)系统中应用程序的进程ID分配和销毁是 ...

  2. 网络编程懒人入门(六):深入浅出,全面理解HTTP协议

    本文引用了自简书作者“涤生_Woo”的文章,内容有删减,感谢原作者的分享. 1.前言 HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广 ...

  3. 理解传输层中UDP协议首部校验和以及校验和计算方法的Java实现

    UDP,全称User Datagram Protocol,用户数据报协议,是TCP/IP四层参考模型中传输层的一种面向报文的.无连接的.不能保证可靠的.无拥塞控制的协议.UDP协议因为传输效率高,常用 ...

  4. TCP/UDP协议、理解三次握手四次挥手、Socket

    一.什么是socket? 中文名叫套接字,是对底层的 TCP IP UDP 等网络协议进行封装,使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议. 在程序员的言论,他就是一个封装好的模块,要 ...

  5. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  6. TCP协议与UDP协议的区别

    TCP协议与UDP协议的区别(转) 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  7. (转)TCP协议与UDP协议的区别

    TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  8. TCP/IP协议---UDP协议

    UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都产生一个UDP数据报,并组装成一份待发送的IP数据报.UDP数据报是要依赖IP数据报传送的.UDP协议并不可靠,它不能保证发出去的包会被目 ...

  9. 面试:TCP和UDP协议

    目录 TCP 协议 UDP协议 TCP和UDP的区别 TCP和UDP的使用场景 一 TCP协议 1.TCP的头部格式 理解TCP协议,首要的就是TCP协议的头部格式 ·        Source P ...

随机推荐

  1. 用Tensorflow实现DCGAN

    1. GAN简介 最近几年,深度神经网络在图像识别.语音识别以及自然语言处理方面的应用有了爆炸式的增长,并且都达到了极高的准确率,某些方面甚至超过了人类的表现.然而人类的能力远超出图像识别和语音识别的 ...

  2. WEB API 系列(二) Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

  3. sublime 部分插件

    https://www.cnblogs.com/qingkong/p/5039527.html

  4. Kinect外包-就找北京动点飞扬软件(长年承接微软Kinect体感项目外包,有大型Kinect案例)

    承接Kinect体感企业项目.游戏项目外包 有丰富案例提供演示,可公对公签正规合同,开发票. 我们是北京的公司.专业团队,成员为专业WPF产品公司一线开发人员,有大型产品开发经验: 提供优质的售后服务 ...

  5. Axure 矩形交互样式与单选按钮组设置

    矩形交互样式: 场景:当点击昵称的时候,密码栏会显示红框,当点击密码的时候,昵称会显示红框 补充:昵称栏和密码栏的组成其实是一个矩形框和一个文本框,这样才可以设置出场景所示的样式 这里的设置只是简单的 ...

  6. L - Non-Prime Factors (质数筛选+因子分解)

    In many programming competitions, we are asked to find (or count the number of) Prime Factors of an ...

  7. mysql 表关联批量更新

    项目中最近遇到了需要手动修改某个表的某个字段的数据,但是这个数据是来自别的表,需要关联,所以需要用到关联的批量更新,特此记录一下. UPDATE t_account_trans_info AS iiI ...

  8. Linux基础命令mkdir

    mkdir  /home/ceshi   home目录下创建测试目录 mkdir  -p  /home/ceshi1/ceshi home目录下递归创建 mkdir     /home/ceshi2  ...

  9. vue中<select>绑定事件

    <div id="app"> <select v-model="selectItem" @change="selectFn($eve ...

  10. MATLAB 曲线形状,粗细,颜色使用大全

    通过改变R-G-B 的值改变线条的颜色: $$\tt\Large plot(x,y,'Color',[R~~G~~B]);$$ 通过改变$c\in[1,+\infty)$的值改变线条的粗细 $$\tt ...