由於網際網路終端不斷增加,ipv4 位址長度(32位)已不能夠滿足要求,所以出現了 ipv6位址(128位),但是現有應用程式大部分還是採用 ipv4 位址形式,所以必須解決 ipv4 與 ipv6 之間的相互操作,使現有基於 ipv4 的應用程式能夠與基於 ipv6 的應用程式相互通訊。那麼我們怎麼實現 ipv4 客戶端與 ipv6 伺服器、ipv6 客戶端與 ipv4 伺服器之間的通訊。
假設我們主機是執行雙棧,即存在 ipv4 協議棧和 ipv6 協議棧,雙棧主機上的 ipv6 伺服器既能處理 ipv4 客戶端,也能處理 ipv6 客戶端,因為 ipv4 可以對映成 ipv6 位址。下圖是 ipv4 客戶端與 ipv6 伺服器之間的通訊過程:
ipv6 伺服器程式建立的套接字繫結到 ipv6 通配位址和 tcp 埠號 9999。假設客戶端和伺服器主機都處於同乙個乙太網,當左側兩個客戶端都傳送 syn 報文段請求與伺服器建立連線時,ipv4 客戶端主機在乙個 ipv4 資料報中載送 syn,ipv6 客戶端主機在乙個 ipv6 資料報中載送 syn。在乙太網線上包含乙太網首部、ip 首部、tcp 首部以及 tcp 資料,根據乙太網首部中包含的型別字段區分 ip 型別是為 ipv4 還是 ipv6,因此 ip 首部中的目的 ip 位址格式根據乙太網型別字段分為 ipv4 位址和 ipv6 位址。兩者的 tcp 首部是一樣的,tcp 首部中包含目的埠號(即 ipv6 伺服器的埠號 9999)。
伺服器的接收資料鏈路通過檢視乙太網型別欄位把每幀傳遞給相應的 ip 模組。ipv4 模組結合其上的 tcp 模組檢測到 ipv4 資料報的目的埠對應的是乙個 ipv6 套接字,於是把該資料報 ipv4 首部中的源 ipv4 位址轉換成乙個等價的 ipv4 對映的 ipv6 位址。當 accept 系統呼叫把這個已經接受的 ipv4 客戶端連線返回給伺服器程序時,這個對映後的位址將作為客戶的 ipv6 位址返回給伺服器的 ipv6 套接字(也就是說伺服器根本不知道自己是在跟 ipv4 客戶端通訊,客戶端也不知道自己和 ipv6 的伺服器通訊),該連線上其餘的資料報都是 ipv4 資料報。對於 ipv6 客戶端,當 accept 系統呼叫把接受的 ipv6 客戶端連線返回給伺服器程序時,該客戶的 ipv6 位址就是原來 ipv6 首部中的源位址,不需要進行對映,該連線上其餘的資料報都是 ipv6 資料報。
ipv4 的 tcp 客戶端與 ipv6 的 tcp 伺服器之間通訊的步驟如下:
首先啟動 ipv6 伺服器,建立乙個 ipv6 的監聽套接字,並且該伺服器把通配位址和埠號 9999 繫結到該套接字上;
ipv4 客戶端呼叫 gethostbyname 函式找到伺服器主機的乙個 a 記錄,伺服器同時包含 a 記錄和 aaaa 記錄,即同時支援 ipv4 和 ipv6,對於 ipv4 客戶端來說只需要 a 記錄即可;
ipv4 客戶端呼叫 connect 函式向伺服器發出連線請求,即客戶端主機向伺服器主機傳送乙個 ipv4 的 syn 資料報(該 ipv4 的 syn 中的目的地是 ipv6 套接字);
伺服器主機接收到來自客戶端的 ipv4 的 syn 資料報後,設定乙個標誌指示本連線應使用 ipv4 對映的 ipv6 位址,並響應乙個 ipv4 的syn 和 ack 資料報。當該鏈結建立後,由 accept 函式把這個 ipv4 對映的 ipv6 位址返回給伺服器;
當伺服器主機往這個 ipv4 對映的 ipv6 位址傳送 tcp 報文段時,其 ip 棧產生目的位址為所對映 ipv4 位址的 ipv4 載送資料報。即客戶端和伺服器之間所有通訊都使用 ipv4 的載送資料報;
ipv6 的 tcp 客戶端與 ipv4 的 tcp 伺服器之間通訊的步驟如下:
首先啟動 ipv4 伺服器,建立乙個 ipv4 的監聽套接字;
ipv6 客戶端呼叫 getaddrinfo 函式查詢 ipv6 位址;
ipv6 客戶端在作為函式引數的 ipv6 套接字位址結構中設定這個 ipv4 對映的 ipv6 位址後呼叫 connect 函式向伺服器發出連線請求,核心檢測到這個對映位址後,自動向伺服器主機傳送乙個 ipv4 的 syn 資料報;
伺服器主機接收到來自客戶端的 ipv4 的 syn 資料報後,響應乙個 ipv4 的syn 和 ack 資料報。連線通過使用 ipv4 資料報建立;
雙棧主機上的 ipv6 伺服器既能服務於 ipv4 客戶,又能服務於 ipv6 客戶。ipv4 客戶傳送給這種伺服器的仍然是 ipv4 資料報,不過伺服器的協議棧會把客戶主機的位址轉換成乙個 ipv4 對映的 ipv6 位址。類似地,雙棧主機上的 ipv6 客戶能夠與 ipv4 伺服器通訊,客戶的解析器會把伺服器主機所有的 a 記錄作為 ipv4 對映的 ipv6 位址返回給客戶,而客戶指定這些位址之一呼叫 connect 將會使雙棧傳送乙個 ipv4 的 syn 資料報。為了使套接字程式設計具有可移植性,在程式設計實現過程中,盡量避免使用 gethostbyname 和 gethostbyaddr 函式,而應該使用 getaddrinfo 和 getnameinfo 函式。
《網路程式設計》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有什麼區別。目前的全球網際網...