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的差异)。