ping6简单代码实现

这篇博客详细介绍了ipv6协议和icmpv6报头结构,探讨了ping6的工作原理,包括ipv6报头的固定结构和icmpv6报头的类型说明。此外,文章还分析了代码实现,涉及校验和计算、icmpv6报文的打包与解包、发送与接收过程,并提出了如何获取本机ipv6地址和选择发送接口的问题。
摘要由CSDN通过智能技术生成

目录

1、ping的原理及实现

2、ipv6

2.1、ipv6报头

2.2、Linux中ipv6头部结构

 3、icmpv6

3.1、icmpv6报头

3.2、Linux中icmpv6头部结构

4、代码分析

4.1、校验和

4.2、打包icmpv6报文

4.3、解包icmpv6报文

4.4、发送icmpv6报文

4.6、接收icmpv6报文

5、运行截图

 6、工程文件

7、问题

 


1、ping的原理及实现

关于ping的原理,我在这篇博客里说明ping的原理及实现,可以参考

2、ipv6

2.1、ipv6报头

上图是ipv6携带icmpv6报文(图片来源网络)

 

MAC帧

从上图我们可以看出ipv6

  1. 数据链路层(L2)的type字段标识为0x86dd,表示承载的上层协议为ipv6(ipv4的表示符为0x0800)

  2. ipv6的固定报头结构(40字节)

ipv6报头结构
  • Version字段表示版本号,ipv6中该字段必须为6
  • Traffic Class字段含义类似IPv4中的TOS(Type Of Service)
  • Flow Label字段用于标识同一业务流的包
  • Payload Length字段用于标识有效的负载长度,只计算报头后面的扩展和数据部分的长度,不包括ipv6(40字节)的长度。该字段最多表示长度为64KB有效负载长度
  • Next Header字段用于标识当前报头(或者扩展报头)的下一个头部类型,每种扩展报头都有其对应的值。
扩展报头值对应的头部类型(来源网络)
  •  Hop Limit字段与ipv4中的TTL字段,指定了报文可以有效转发的次数

2.2、Linux中ipv6头部结构

struct ip6_hdr
{
    union
    {
        struct ip6_hdrctl
        {
            uint32_t ip6_un1_flow;   /* 4 bits version, 8 bits TC, 20 bits flow-ID */
            uint16_t ip6_un1_plen;   /* payload length */
            uint8_t  ip6_un1_nxt;    /* next header */
            uint8_t  ip6_un1_hlim;   /* hop limit */
        } ip6_un1;
        uint8_t ip6_un2_vfc;       /* 4 bits version, top 4 bits tclass */
    } ip6_ctlun;
    struct in6_addr ip6_src;      /* source address */
    struct in6_addr ip6_dst;      /* destination address */
};
#define ip6_vfc   ip6_ctlun.ip6_un2_vfc//版本号以及通信类型
#define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow//流标签
#define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen//有效负载长度
#define ip6_nxt   ip6_ctlun.ip6_un1.ip6_un1_nxt
Pingpong Buffer, 或者称为Ping-Pong缓冲区,是一种用于在两个线程之间传输数据的高效方法。它使用两个缓冲区,一个用于入数据,一个用于读取数据。当一个线程完成数据入后,另一个线程可以开始读取数据,这样两个线程可以并行执行,提高了系统的效率。 下面是一个简单的Pingpong Buffer的代码实现: ```python from threading import Lock class PingPongBuffer: def __init__(self): self.buffer1 = [] self.buffer2 = [] self.current_buffer = 1 self.lock = Lock() def write(self, data): with self.lock: if self.current_buffer == 1: self.buffer1.append(data) else: self.buffer2.append(data) def read(self): with self.lock: if self.current_buffer == 1: data = self.buffer2.pop(0) self.current_buffer = 2 else: data = self.buffer1.pop(0) self.current_buffer = 1 return data # 在一个线程中入数据 def write_data(buffer, data): buffer.write(data) # 在另一个线程中读取数据 def read_data(buffer): data = buffer.read() print("Read data:", data) # 创建Pingpong Buffer实例 buffer = PingPongBuffer() # 创建两个线程并启动 import threading threading.Thread(target=write_data, args=(buffer, "Hello")).start() threading.Thread(target=read_data, args=(buffer,)).start() ``` 上述代码使用Python中的多线程模块,实现Pingpong Buffer的基本功能。其中,`write`方法用于向当前缓冲区入数据,`read`方法用于从另一个缓冲区读取数据。通过在不同线程中调用这两个方法,实现了数据的并行交换。 需要注意的是,为了避免数据竞争条件,我们使用了线程锁 (`Lock`) 来确保每个线程对缓冲区的访问是互斥的。当一个线程正在入数据时,另一个线程必须等待执行读取操作,反之亦然。 这只是一个简化的示例,实际的Pingpong Buffer实现可能会更加复杂,需要根据具体的应用场景进行调整。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值