ipv4的tcp客戶和乙個ipv6的tcp伺服器進行通訊的步驟如下:
1.ipv6伺服器啟動後建立乙個ipv6的監聽套接字,我們假定伺服器把通配位址**到該套接字
2.ipv4客戶呼叫gethostbyname找到伺服器主機的乙個a記錄。伺服器主機既有乙個a記錄,又有乙個aaaa記錄,因為它同時支援ipv4和ipv6,不過ipv4客戶需要的只是乙個a記錄
3.客戶呼叫connect,導致客戶主機傳送乙個ipv4 syn到伺服器主機
4.伺服器主機接收這個目的地為ipv6監聽套接字的ipv4 syn,設定乙個標誌指示本連線應使用ipv4對映的ipv6位址,然後響應以乙個ipv4 syn/ack。該連線建立後,由accept返回給伺服器的位址就是這個ipv4對映的ipv6位址
5.當伺服器主機往這個ipv4對映的ipv6位址傳送tcp分節時,其ip棧產生目的位址為所對映ipv4位址的ipv4載送資料報。因此,客戶和伺服器之間的所有通訊都使用ipv4的載送資料報。
ipv6的udp伺服器也有類似的情形,不過每個資料報的位址格式可能有所變動。舉例來說,如果ipv6伺服器收到來自某個ipv4客戶的乙個資料報,由recvfrom返回的位址將是該客戶的ipv4對映的ipv6位址。伺服器以這個ipv4對映的ipv6位址呼叫sendto給出對本客戶請求的響應。這個位址格式告知核心向客戶傳送乙個ipv4資料報。然而伺服器收到的下乙個資料報可能是乙個ipv6資料報,recvfrom將返回客戶的ipv6位址。如果伺服器給出響應,那麼核心將產生乙個ipv6資料報。
如果收到乙個目的地為某個ipv4套接字的ipv4資料報,那麼無需任何特殊處理。客戶和伺服器之間交換的是ipv4資料報。
如果收到乙個目的地為某個ipv6套接字的ipv6資料報,那麼無需任何特殊處理。客戶和伺服器之間交換的是ipv6資料報。
如果收到乙個目的地為某個ipv6套接字的ipv4資料報,那麼核心把與該資料報的源ipv4位址對應的ipv4對映的ipv6位址作為accept(tcp)或recvfrom(udp)返回的對端ipv6位址。客戶和伺服器之間交換的是ipv4資料報。
相反則是行不通,因為一般來說,乙個ipv6位址無法表示成乙個ipv4位址。
如果乙個ipv6的tcp客戶指定乙個ipv4對映的ipv6位址以呼叫connect,或者乙個ipv6的udp客戶指定乙個ipv4對映的ipv6位址以呼叫sendto,那麼核心檢測到這個對映位址後改為傳送乙個ipv4資料報而不是ipv6資料報。
不論呼叫connect還是呼叫sendto,ipv4客戶都不能指定乙個ipv6位址,因為16個位元組的ipv6位址超出了ipv4的sockaddr_in結構中的in_addr成員結構的4位元組長度。
大多數雙棧主機在處理監聽套接字時應使用以下規則:
1.ipv4監聽套接字只能接受來自ipv4客戶的外來連線。
2.如果伺服器有乙個繫結了通配位址的ipv6監聽套接字,而且該套接字未設定ipv6_v6only套接字選項,那麼該套接字既能接受來自ipv4客戶的外來連線,又能接受來自ipv6客戶的外來連線。對於來自ipv4客戶的連線而言,其伺服器端的本地位址將是與某個本地ipv4位址對應的ipv4對映的ipv6位址。
3.如果伺服器有乙個ipv6監聽套接字,而且繫結在其上的是除ipv4對映的ipv6位址以外的某個非通配ipv6位址,或者繫結在其上的是通配位址,不過還設定了ipv6_v6only套接字選項,那麼該套接字只能接受來自ipv6客戶的外來連線。
有一小類的ipv6應用程序必須清楚與其通訊的是不是ipv4對端。這些應用程式需要知道對端的位址是不是乙個ipv4對映的ipv6位址。
雙棧主機上的ipv6伺服器既能服務於ipv4客戶,又能服務於ipv6客戶。ipv4客戶傳送給這種伺服器的仍然是ipv4資料報,不過伺服器的協議棧會把客戶主機的位址轉換成乙個ipv4對映的ipv6位址,因為ipv6伺服器僅僅處理ipv6套接字位址結構。
類似地,雙棧主機上的ipv6客戶能夠和ipv4伺服器通訊。客戶的解析器會把伺服器主機所有的a記錄作為ipv4對映的ipv6位址返回給客戶,而客戶指定這些位址之一呼叫connect將會使雙棧傳送乙個ipv4 syn分節。
Linux 網路程式設計詳解九
tcp ip協議中sigpipe訊號產生原因 1.假設客戶端socket套接字close 會給伺服器傳送位元組段fin 2.伺服器接收到fin,但是沒有呼叫close 因為socket有快取區,所以伺服器仍然可以向客戶端傳送資料。3.如果這種狀態下伺服器向客戶端傳送資料,將會引起tcp ip協議進行...
九 Python入門 網路程式設計
總共65535 216 個埠 知名埠 0 1023 80 http服務 21 ftp服務 動態埠 1024 65535 不固定分配某種服務 分類 a類 b類 c類 d類,區分什麼類看子網掩碼 dns 網域名稱解析器 注 127.0.0.1表示本機ip tcp 傳輸控制協議 通訊之前必須建立可靠的連線...
OpenMP程式設計學習筆記九
openmp的execution model主要是幾個執行緒通過同時執行,從而完成乙個任務。與單核上的多執行緒併發執行是不同的,因為併發執行 實際上是執行緒在不同的時間段占有cpu。而openmp的執行緒,是在各自的cpu上執行,不存在各個執行緒在同乙個cpu上的排程。雖然有 多個cpu,但是記憶體...