RTEMS项目之IPv4和IPv6的研究
文章目录
前言
本片本章主要记录一些对于IPv4和IPv6的研究以及它们在RTEMS上的运用
一、IPv4
IPv4 全称为 Internet Protocol version 4,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,IP 地址是一个 32 位的二进制数,算下来其实也只有 2^32 个地址,这些地址中有分为 A、B、C、D、E 5 类,而比较常用的只有 B 类 和 C 类。
1、IPv4地址
当网络中的两台主机要进行通信时,必须知道双方各自的IP地址,TCP/IP协议通过IP地址来识别网络中不同的主机。IP地址由32位二进制数组成,为了方便记忆,将IP地址32位进制数进行分段,每段8位,共4段,然后将每段8位二进制转换为十进制数,中间点号分割。这种表达方式称之为点分十进制。
IP地址示例:192.168.1.1
2、IPv4地址分类
每个IP地址内部分成两部分,即网络号和主机号。
网络号:也叫网络地址,用于标识大规模TCP/IP网际网络内的单个网段(即由网络组成的网络)。
主机号:也叫主机地址,用于识别每个网络内部的TCP/IP节点,如工作站、服务器、路由器或其它TCP/IP设备。
3、特殊IP地址
(1)广播地址
一个子网内的所有网络接口都能收到此广播消息。
直接广播:带目标网络号,主机地址二进制全1的地址。
有限广播:网络号和主机地址二进制全为1的地址(即255.255.255.255)。
(2)组播地址
可实现跨网段的组播(多播)地址。
D类地址,主要用于视频广播和视频点播系统
地址范围从 224.0.0.0 到 239.255.255.255
224.0.0.1 指所有主机,224.0.0.2 指所有路由器
(3)环回地址
网络地址是 127 的 IP 地址成为环回地址或回送地址,主要用于对本地回路测试及实现本地机器进程间的通信。
在实际中经常使用的环回地址是 127.0.0.1 ,它还有一个别名叫做 localhost。
(4)私有地址
IP 地址是由网络信息中心统一管理并分配给提出注册申请的组织机构的,这类 IP 地址成为公有地址。
而私有地址属于非注册地址,专门为组织机构内部网络使用。
私有 IP 地址分类:
私有地址类别 范围
A 类 10.0.0.0 ~ 10.255.255.255
B 类 172.16.0.0 ~ 172.31.255.255
C 类 192.168.0.0 ~ 192.168.255.255
特殊 IP 地址汇总:
网络地址 主机地址 地址类型 用途
全 0 全 0 本机地址 启动时使用
有网络号 全 0 网络地址 标识一个网络
有网络号 全 1 直接广播地址 一个网段内广播
全 1 全 1 有限广播地址 一个网段内广播
127 任意 环回地址 回送本机测试
4、IPv4地址分配方式
由于IPv4地址空间有限,IPv4地址分配已经逐渐耗尽。IPv4地址通常由互联网服务提供商(ISP)或网络管理员分配,采用动态主机配置协议(DHCP)进行动态分配,或者采用静态分配方式进行固定分配。
二、IPv6
IPv6全称为 Internet Protocol version 6,是用于替代 IPv4 的下一代 IP 协议,IPv6 地址长度是 128 位,长度是 IPv4 地址的 4 倍,形象点说,IPv6 可以为全世界每一粒沙子分配一个地址。
IPv6地址示例:2001:0db8:85a3:0000:0000:8a2e:0370:7334
1.IPv6地址
128 位的 IPv6 地址由 64 位网络地址和 64 位主机地址组成。其中,64 位的网络地址又分为 48 位的全球网络标识符和 16 位的本地子网标识符。IPv6 地址采用十六进制的表示方法,共 128 位,分 8 组表示,每组 16 位,每组表示 4 个十六进制数。各组之间用 “ : ”号隔开。在 IPv6 地址段中有时会出现连续的机组0,为了简化书写,这些 0 可以用“ : : ”代替,但一个地址中只能出现一次“ : : ”。IPv6 包含 IPv4 地址:在某些情况下,IPv4 地址需要包含在 IPv6 地址中,这时,IPv6 的最后两组用现在习惯使用的 IPv4 地址的十进制表示法,前6组用 IPv6表示。
IPv6地址示例:2001:0db8:85a3:0000:0000:8a2e:0370:7334
2、IPv6地址分配方式
IPv6:IPv6地址空间庞大,具有丰富的地址资源。IPv6地址通常由ISP或网络管理员分配,采用自动配置方式进行动态分配,或者采用静态分配方式进行固定分配。
三、IPv6和IPv4的简单运用
1.配置IPv4地址
IP_ADDR4(&ipaddr, 192, 168, 1, 2);
IP_ADDR4(&netmask, 255, 255, 255, 0);
IP_ADDR4(&gw, 192, 168, 1, 1);
2.配置IPv6地址
IP_ADDR6(
&ipaddr, // 目标地址变量
0xa0606666, // Block1: a060:6666
0x00000000, // Block2: 0000:0000
0x86994522, // Block3: 8699:4522
0xffffffff // Block4: ffff:ffff
);
IP_ADDR6(
&netmask, // 目标地址变量
0xffffffff, // Block1: ffff:ffff
0xffffffff, // Block2: ffff:ffff
0xffffffff, // Block3: ffff:ffff
0x00000000 // Block4: 0000:0000
);
IP_ADDR6(
&gw, // 目标地址变量
0xa0606666, // Block1: a060:6666
0x00000000, // Block2: 0000:0000
0x86994522, // Block3: 8699:4522
0xfffffffe // Block4: ffff:fffe
);
3.打印IPv4地址
#define print_ip( tag, ip ) \
printf( \
"%s: %" PRId32 ".%" PRId32 ".%" PRId32 ".%" PRId32 "\n", \
tag, \
( ntohl( ip.addr ) >> 24 ) & 0xff, \
( ntohl( ip.addr ) >> 16 ) & 0xff, \
( ntohl( ip.addr ) >> 8 ) & 0xff, \
ntohl( ip.addr ) & 0xff \
);
static int shell_main_netinfo(
int argc,
char **argv
)
{
print_ip6( "IP", net_interface.ip_addr.u_addr.ip6 );
print_ip6( "Mask", net_interface.netmask.u_addr.ip6 );
print_ip6( "GW", net_interface.gw.u_addr.ip6 );
return 0;
}
4.打印IPv6地址
#define print_ipv6(tag, ip6) \
do { \
char ip_str[INET6_ADDRSTRLEN]; \
const char* result = inet_ntop(AF_INET6, &(ip6), ip_str, sizeof(ip_str)); \
printf("%s: %s\n", tag, result ? ip_str : "invalid address"); \
} while(0)
static int shell_main_netinfo(
int argc,
char **argv
)
{
print_ip6("IPv6 Address", net_interface.ip_addr.u_addr.ip6);
print_ip6("IPv6 Netmask", net_interface.netmask.u_addr.ip6);
print_ip6("IPv6 Gateway", net_interface.gw.u_addr.ip6);
return 0;
}
总结
上述就是IPv4和IPv6协议的简单介绍以及在rtems上的简单配置。