标签:存在 资料 cep 建立连接 系统调用 建立 jsb 首部 动向
因为互联网终端不断添加。IPv4 地址长度(32位)已不可以满足要求。所以出现了 IPv6地址(128位)。可是现有应用程序大部分还是採用 IPv4 地址形式,所以必须解决 IPv4 与 IPv6 之间的相互操作,使现有基于 IPv4 的应用程序可以与基于 IPv6 的应用程序相互通信。那么我们怎么实现 IPv4 client与 IPv6 server、IPv6 client与 IPv4 server之间的通信。
如果我们主机是执行双栈,即存在 IPv4 协议栈和 IPv6 协议栈,双栈主机上的 IPv6 server既能处理 IPv4 client。也能处理 IPv6 client,由于 IPv4 能够映射成 IPv6 地址。下图是 IPv4 client与 IPv6 server之间的通信过程:
IPv6 server程序创建的套接字绑定到 IPv6 通配地址和 TCP port号 9999。
如果client和server主机都处于同一个以太网,当左側两个client都发送 SYN 报文段请求与server建立连接时,IPv4 client主机在一个 IPv4 数据报中载送 SYN,IPv6 client主机在一个 IPv6 数据报中载送 SYN。
在以太网线上包括以太网首部、IP 首部、TCP 首部以及 TCP 数据,依据以太网首部中包括的类型字段区分 IP 类型是为 IPv4 还是 IPv6,因此 IP 首部中的目的 IP 地址格式依据以太网类型字段分为 IPv4 地址和 IPv6 地址。两者的 TCP 首部是一样的。TCP 首部中包括目的port号(即 IPv6 server的port号 9999)。
server的接收数据链路通过查看以太网类型字段把每帧传递给相应的 IP 模块。IPv4 模块结合其上的 TCP 模块检測到 IPv4 数据报的目的port相应的是一个 IPv6 套接字,于是把该数据报 IPv4 首部中的源 IPv4 地址转换成一个等价的 IPv4 映射的 IPv6 地址。
当 accept 系统调用把这个已经接受的 IPv4 client连接返回给server进程时,这个映射后的地址将作为客户的 IPv6 地址返回给server的 IPv6 套接字(也就是说server根本不知道自己是在跟 IPv4 client通信。client也不知道自己和 IPv6 的server通信)。该连接上其余的数据报都是 IPv4 数据报。对于 IPv6 client,当 accept 系统调用把接受的 IPv6 client连接返回给server进程时。该客户的 IPv6 地址就是原来 IPv6 首部中的源地址,不须要进行映射。该连接上其余的数据报都是 IPv6 数据报。
IPv4 的 TCP client与 IPv6 的 TCP server之间通信的过程例如以下:
当该链接建立后。由 accept 函数把这个 IPv4 映射的 IPv6 地址返回给server;
IPv6 的 TCP client与 IPv4 的 TCP server之间通信的过程例如以下:
连接通过使用 IPv4 数据报建立。
双栈主机上的 IPv6 server既能服务于 IPv4 客户,又能服务于 IPv6 客户。
IPv4 客户发送给这样的server的仍然是 IPv4 数据报。只是server的协议栈会把客户主机的地址转换成一个 IPv4 映射的 IPv6 地址。类似地。双栈主机上的 IPv6 客户可以与 IPv4 server通信,客户的解析器会把server主机全部的 A 记录作为 IPv4 映射的 IPv6 地址返回给客户,而客户指定这些地址之中的一个调用 connect 将会使双栈发送一个 IPv4 的 SYN 数据报。为了使套接字编程具有可移植性。在编程实现过程中,尽量避免使用 gethostbyname 和 gethostbyaddr 函数,而应该使用 getaddrinfo 和 getnameinfo 函数。
參考资料:
《Unix 网络编程》
标签:存在 资料 cep 建立连接 系统调用 建立 jsb 首部 动向
原文地址:http://www.cnblogs.com/jhcelue/p/7399831.html