关于网际协议

1. IPv4

l IPv4:32位数表示,通常表示为点分十进制。地址中的每8位字节被转换成一个十进制数。

l 单播:分配到单个计算机接口上的地址称为单播地址,该地址仅可以分配到一个接口上。如果网络上其他计算机也配置了该地址,就会发生错误;

l 多播:多个计算机可以加入一个多播组,监听某个特定的多播地址。加入该组的每个计算机将收到该多播地址的任何数据。多播地址是D类地址;

l 广播:IPv4支持数据广播。这就意味着发送到受限广播地址255.255.255.255的广播数据将被局域网内的每个计算机接收并处理。

通常,采用子网广播数据。例如发送到172.31.28.255。

IPv4依赖的相关协议:

l ARP(地址解析协议);

l ICMP(控制消息协议);

l IGMP(Internet组管理协议);

2. IPv6

l IPv6:128位数表示,大小是IPv4的四倍;

l 单播:单播地址标识单个地址,但对于IPv6而言,一个接口往往分配了多个单播地址;

l 任播:标识多个接口的地址;

l 多播:和IPv4中的多播类似;

3. 地址及名称解析

名称解析API:getaddrinfo、getnameinfo;--<WSPIAPI.H> + <WS2TCPIP.H>

文字地址和套接字地址转换API:WSAAddressToString、WSAStringToAddress;

l getaddrinfo提供了独立于协议的名称解析:

Ø nodename:主机名或文字地址,如果是主机名则自动获取主机地址,无论是IPv4或是IPv6,这种情况下,result将包含由ai_next字段链接的额外的addrINFO结构;如果在使用主机名的前提下只想提取IPv4地址,则在ai_family设置为AF_INET;当然也可以直接使用文字地址,比如“172.16.80.80”或“ef80::1234”分配到套接字地址参数中,此时,ai_flags设置为AI_NUMERICHOST,主机名是设置为AI_CANONNAME;

Ø servname:指定端口号或服务名;

Ø Hints:是一个结构,传递一个或多个选项,这些选项将影响到名称解析的执行方式;

Ø Result:返回一个addrINFO结构链表,该地址包含了由字符串名称解析而来的地址;

 

用于socket创建:result->ai_family、result->ai_socktype、result->ai_protocol;

用于connect连接:result->ai_addr、result->ai_addrlen;

同样bind、sendto等等;

4. 编写独立于IP地址的程序

目的在于不关注IPv4和IPv6的差异,首先要使用新的名称解析API函数:

getaddrinfo()、getnameinfo()、还要重新调整winsock调用方式;

新的套接字地址结构SOCKADDR_STORAGE(隐藏SOCKADDR_IN和SOCKADDR_IN6的差异)。

 

clip_image007

原文地址:https://www.cnblogs.com/davidsguo008/p/3595795.html