UNP Chapter 10 - IPv4和IPv6的互操作性

时间:2021-05-09 22:11:14

10.1 概述

本章中假定所有的主机上都运行着双重协议栈(dual stacks)。

10.2. IPv4客户和IPv6服务器

拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射的IPv6地址实现的。

UNP Chapter 10 - IPv4和IPv6的互操作性

在一个双重协议栈的主机上,根据接收套接口的类型(TCP或UDP),对一个收到的IPv4或IPv6数据报进行处理的流程:

UNP Chapter 10 - IPv4和IPv6的互操作性

 

10.3. IPv6客户与IPv4服务器

UNP Chapter 10 - IPv4和IPv6的互操作性

客户与服务的组合情况总结

UNP Chapter 10 - IPv4和IPv6的互操作性

 

10.4. IPv6地址测试宏

有一小部分IPv6应用程序必须知道与其通信的对方是否使用IPv4协议,这些应用程序需要知道对方的地址是不是一个IPv4映射的IPv6地址。为测试IPv6地址的某些特性共定义了12个宏:

#include <netinet/in.h>
int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr * aptr);
int IN6_IS_ADDR_LOOPBACK(const struct in6_addr * aptr);
int IN6_IS_ADDR_MULTICAST(const struct in6_addr * aptr);
int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_SITELOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_V4MAPPED(const struct in6_addr * aptr);
int IN6_IS_ADDR_V4COMPAT(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr * aptr);
//返回值:非零表示IPv6地址是指定类型的,否则返回零

 

10.5. IPV6_ADDRFORM套接口选项

IPV6_ADDRFORM套接口选项能把一个套接口从一种类型转变成另一中类型,它受到以下限制:

1. 一个IPv4套接口总能转变为IPv6套接口。所有与该套接口关联的IPv4地址被转换成IPv4映射的IPv6地址。

2. 一个IPv6套接口只有在与之关联的地址是IPv4映射的IPv6地址的情况下才能转变成IPv4套接口。

 

10.6. 源代码可移植性

10.7. 小结