计算udp校验和例子_计算机网络自学笔记:差错检测和纠错技术

差错检测和纠错是链路层提供的两种服务。

差错检测和纠正的一般过程:

在发送节点,为了避免比特差错,使用差错检测和纠错位 EDC 来增强网络层传递下来需要通过链路传输的数据报 D。链路层帧中的 D 和 EDC 都被发送到接收节点。在接收节点, 接收到比特序列 D’和 EDC’。注意到因传输中 0/1 翻转所致,D’和 EDC’可能与初始的 D 和 EDC不同。

接收方面临的问题是,在它只收到 D’和 EDC’的情况下来判决 D’是否和初始的 D 相同。

在数据传输中检测差错的 3 种技术:

1 奇偶校验

要发送的信息 D 有 d 个比特。在偶校验方案中,发送方只需包含一个附加的比特,选择附加比特的值,使得这 d+1 个比特(初始信息加上一个校验比特)中 1 的总数是偶数。

接收方的操作也很简单。接收方只需要数一数接收的 d+1 比特中 1 的个数。

如果发现了奇数个值为 1 的比特,接收方知道了至少出现了一个比特差错。更确切的说法是,出现了奇数个差错比特。但是如果出现了偶数个比特差错,显然这种方法无法检测这种错误。

二维单比特奇偶校验方案中,D 中的 d 个比特被划分为 i 行 j 列。对每行和每列计算奇 偶值。产生的 i+j+1 奇偶比特构成了链路层帧的差错检测比特。这种方法可以检测和纠正 1 比特的错误。

2 校验和

在 TCP 和 UDP 协议中,对所有字段(包括首部和数据字段)都计算校验和。

IP 协议只对头部计算校验和。

3 循环冗余检测

计算机网络中广泛应用的差错检测技术是循环冗余校验编码 CRC。

CRC 编码也称为多项式编码,因为该编码将要发送的比特

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP校验和计算方法比较简单,下面是一个计算UDP校验和例子: ```python import socket import struct def checksum(data): # 如果数据长度为奇数,补一个字节的0 if len(data) % 2 != 0: data += b'\x00' # 将数据按每两个字节一组进行分组 words = struct.unpack('>' + 'H' * (len(data) // 2), data) # 将所有的16位的数相加 total = sum(words) # 将进位的16位加回到低16位 total = (total >> 16) + (total & 0xffff) # 取反得到校验和 checksum = (~total) & 0xffff return checksum # 构造UDP数据包 src_ip = '192.168.0.1' dst_ip = '192.168.0.2' src_port = 12345 dst_port = 54321 data = b'Hello, world!' # 构造UDP头部 udp_header = struct.pack('!HHHH', src_port, dst_port, len(data) + 8, 0x0000) # 计算校验和 pseudo_header = struct.pack('!4s4sBBH', socket.inet_aton(src_ip), socket.inet_aton(dst_ip), 0x00, socket.IPPROTO_UDP, len(udp_header) + len(data)) checksum_data = pseudo_header + udp_header + data udp_checksum = checksum(checksum_data) # 构造完整的UDP数据包 udp_packet = udp_header + struct.pack('!H', udp_checksum) + data # 打印UDP数据包的十六进制表示 print('UDP packet:', udp_packet.hex()) ``` 这个例子中,我们先构造了一个UDP数据包,然后计算了它的校验和计算校验和的过程分为以下几步: 1. 将数据按每两个字节一组进行分组。 2. 将所有的16位的数相加。 3. 将进位的16位加回到低16位。 4. 取反得到校验和。 需要注意的是,计算校验和时,需要先构造一个伪头部,伪头部中包含源IP地址、目的IP地址、协议号和UDP头部+数据的长度,然后将伪头部、UDP头部和数据拼接起来,计算校验和。这是因为UDP校验和不仅要校验UDP头部和数据,还要校验IP头部和UDP伪头部。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值