Unix网络编程卷一(笔记2)

来源:互联网 发布:网络视频存储服务器 编辑:程序博客网 时间:2024/06/05 06:26

一:IPv4 与 IPv6的互操作性

ipv4 client  to ipv6 server : 通过使用ipv4映射的ipv6地址来实现的。

ipv6 client to ipv4 client    :

前提条件是:client/ server主机要支持双栈协议:即系统要同时支持ipv4协议,也支持ipv6协议。而且路由器也应该要支持双栈协议才行。

* 地址映射之后,就做为该地址来进行数据的传输。

服务端:accept() recvfrom() 会在内部吧地址转换映射好。内核会吧地址映射好,在这两个函数内部。

客户端:connect() sendto() 用ipv4映射好的ipv6地址传入作为参数,通过之前调用getaddrinfo(),设置好AI_V4MAPPED标志,函数返回的映射。(前提是支持双栈协议)

*除非显示检查这个IPv6地址是不是一个IPv4映射的IPv6地址,IN6_IS_ADDR_V4MAPPED宏,否则它永远也不知道自己是在与一个ipv4客户通信。客户也不知道是在与一个ipv6服务通信。

ipv6地址是无法表示一个ipv4地址的,因为ipv4的范围不够大。ipv4程序是不能指定一个ipv6的地址,他搞不定。只有ipv6的程序才能够变通为ipv4 or ipv6.so,之后的程序最好写成ipv6程序,这样即可以支持ipv4服务,也可以支持ipv6服务。   

* ipv6客户可以指定一个ipv4,但是ipv4客户是不能指定一个Ipv6地址,即使他是双栈主机。

* 设置了IPV6_V6ONLY,那么表示它只接收ipv6对端信息。 如果没有设置,则表示ipv4,ipv6都接收。

*我的理解:

*只有ipv6的程序,不管是服务端还是客户端,他都是可以根据对端ip来判断他是否要转换成对应的ip;

  然而ipv4的程序(即使他支持双栈),不管是服务端还是客户端,他都木有能力去转换成ipv6的格式,即使他支持双栈。

ipv6支持隐射,

ipv4不支持映射。


二。IPv6地址测试宏: <netinet/in.h> 

#include <netinet/in.h> 由于有些程序是需要清楚对方的ip协议是ipv4还是ipv6,比如ftp的指令格式因4/6而不同。所以需要做不同处理。

int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *aptr);

int                            _LOOPBACK

                                _MULTICAST

_LINKLOCAL

_SITELOCAL

_V4MAPPED ipv6客户能够调用此来测试由解析器返回的ipv6地址。,可以判断对端是否在使用ipv4.

_V4COMPAT

以上前7个宏测试ipv6地址的基本类型。


以下5个宏测试ipv6多播地址的范围

_MC_NODELOCAL

        _LINKLOCAL

        _SITELOCAL

        _ORGLOCAL

       _GLOBAL


三:

应该尽量使用ipv6,因为他支持ipv6也支持ipv4.


================

ipv4改成ipv6,对于简单的程序,差不多只需要改改 :

AF_INET6协议域,和地址结构struct sockaddr_in6 servaddr;   servaddr.sin6_family , servaddr.sin6_port serveaddr.sin6_addr.