《網路程式設計》IPv4 與 IPv6 相互操作

2021-09-07 14:21:35 字數 2711 閱讀 5788

因為網際網路終端不斷新增。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之間通訊的過程例如以下:

首先啟動 ipv6 server,建立乙個 ipv6 的監聽套接字,而且該server把通配位址和port號 9999 繫結到該套接字上;

ipv4 client呼叫 gethostbyname 函式找到server主機的乙個 a 記錄。server同一時候包括 a 記錄和 aaaa 記錄,即同一時候支援 ipv4 和 ipv6,對於 ipv4 client來說僅僅須要 a 記錄就可以;

ipv4 client呼叫 connect 函式向server發出連線請求,即client主機向server主機傳送乙個 ipv4 的 syn 資料報(該 ipv4 的 syn 中的目的地是 ipv6 套接字);

server主機接收到來自client的 ipv4 的 syn 資料報後,設定乙個標誌指示本連線應使用 ipv4 對映的 ipv6 位址。並響應乙個 ipv4 的syn 和 ack 資料報。當該鏈結建立後。由 accept 函式把這個 ipv4 對映的 ipv6 位址返回給server;

當server主機往這個 ipv4 對映的 ipv6 位址傳送 tcp 報文段時,其 ip 棧產生目的位址為所對映 ipv4 位址的 ipv4 載送資料報。即client和server之間全部通訊都使用 ipv4 的載送資料報。

ipv6 的 tcp client與 ipv4 的 tcp server之間通訊的過程例如以下:

首先啟動 ipv4 server,建立乙個 ipv4 的監聽套接字。

ipv6 client呼叫 getaddrinfo 函式查詢 ipv6 位址。

ipv6 client在作為函式引數的 ipv6 套接字位址結構中設定這個 ipv4 對映的 ipv6 位址後呼叫 connect 函式向server發出連線請求。核心檢測到這個對映位址後,自己主動向server主機傳送乙個 ipv4 的 syn 資料報;

server主機接收到來自client的 ipv4 的 syn 資料報後。響應乙個 ipv4 的syn 和 ack 資料報。連線通過使用 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 網路程式設計》

《網路程式設計》IPv4 與 IPv6 相互操作

由於網際網路終端不斷增加,ipv4 位址長度 32位 已不能夠滿足要求,所以出現了 ipv6位址 128位 但是現有應用程式大部分還是採用 ipv4 位址形式,所以必須解決 ipv4 與 ipv6 之間的相互操作,使現有基於 ipv4 的應用程式能夠與基於 ipv6 的應用程式相互通訊。那麼我們怎麼...

IPv4與IPv6的互操作性

雙棧主機的乙個基本特性是其上的ipv6伺服器既能處理ipv4客戶,也能處理ipv6客戶,這是通過ipv4對映ipv6位址實現的 ipv6伺服器建立乙個ipv6監聽套接字,ipv4客戶端通過gethostbyname找到伺服器的乙個a記錄,雖然ipv6伺服器有a記錄和aaaa記錄 ipv4客戶端只使用...

IPV4與IPV6的區別

在windows 7以上系統中,在設定本地ip位址的時候經常會看到同事含有ipv4協議項與ipv6協議項,並不同於以往windows xp系統中僅有tcp ip協議項,不少朋友都覺得比較奇怪,詢問編輯ipv4與ipv6的區別,下面編輯就為大家權威的介紹下ipv4與ipv6有什麼區別。目前的全球網際網...