第三章 網際協議

2022-05-06 02:24:11 字數 3385 閱讀 3201

3.1 ipv4

3.1.1 定址

3.1.1.1 單播

分配到單個計算機介面上的位址稱為單播位址。該位址僅可以分配到乙個介面上,如果網路上其他計算機也配置了該位址,就會發生錯誤,導致資料的錯誤傳輸。a,b,c三類位址組成ipv4的單播位址空間。

一般說來,為主機上的介面分配ipv4(單播)位址時,要麼靜態地配置,要麼由配置協議分配。

3.1.1.2 多播

多播位址未被分配到某個特定介面。相反,多個計算機可以「加入」乙個多播組,監聽某個特定的多播位址。加入該組的每個計算機都將收到發往該多播位址的任何資料。多播位址是d類位址。多播最大的乙個好處是,能將多播資料僅傳送到對該資料感興趣的那些計算機。

3.1.1.3 廣播

3.1.2 ipv4管理協議

3.1.3 winsock中的ipv4定址

struct sockaddr_in

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

3.2 ipv6

3.2.1 定址

3.2.1.1 單播

站點---本地位址

全球位址

相容位址

3.2.1.2 任播

任播是標識多介面的位址。使用這些位址的目的,是將指向乙個任播位址的資料報路由到最近的分配有該位址的介面。

3.2.1.3 多播

ipv6中的多播和ipv4中的類似。只要程序在某個特定介面加入多播組,就可收到發往該多播位址的資料。

3.2.2 ipv6管理協議

3.2.3 winsock中的ipv6定址

struct sockaddr_in6{

short sin6_family;    //位址族af_inet6

u_short sin6_port;  //埠號

u_long sin6_flowinfo; //用於為連線標記通訊量

struct in6_addr sin6_addr;  //乙個包含了二進位制ipv6位址的16位元組結構

u_long sin6_scope_id;  //指明位址所在的介面索引

3.3 位址及名稱解析

3.3.1 名稱解析例程

int getaddrinfo(

const char far *nodename,  //指定以空字元結束的主機名和文字位址

const char far *servname,  //是乙個包含埠號或服務名的以空字元結束的字串

const struct addrinfo far *hints,  

struct addrinfo far *far *res  //返回addrinfo結構的乙個鍊錶,該結構包含了由字串名稱解析而來的位址

int getnameinfo(

const struct sockaddr far *sa,  //套接字位址結構,名稱資訊將從這個引數中獲取

socklen_t salen,

char far *host,  //接收主機名稱的字元緩衝區,預設狀態下返回fqdn

dword hostlen,

char far *serv,  //接收服務(或埠)資訊的字元緩衝區

dword servlen,

int flags  //指明將如何解析套接字位址

3.3.2 簡單的位址轉換

int wsastringtoaddress(

lptstr addressstring,  //需要轉換的字串

int addressfamily,  //指明該字串所屬的位址族

lpwsaprotocol_info lpprotocolinfo,

lpsockaddr lpaddress,  

lpint lpaddresslength

int wsaaddresstostring(

lpsockaddr lpsaaddress,

dword dwaddresslength,

lpwsaprotocol_info lpprotocolinfo,

lptstr lpszaddressstring,

lpdword lpdwaddressstringlength

3.3.3 傳統名稱解析例程

struct hostent far *gethostbyname(

const char far *name

handle wsaasyncgethostbyname(

hwnd hwnd,

unsigned int wmsg,

const char far *name,

char far *buf,

int buflen

struct hostent far *gethostbyaddr(

const char far *addr,

int len,

int type

handle wsaasyncgethostbyaddr(

hwnd hwnd,

unsigned int wmsg,

const char far *addr,

int len,

int type,

char far *buf,

int buflen

getservbyname() , wsaasyncgetservbyname() , getservbyport() , wsaasyncgetservbyport()

getprotbyname() , wsaasyncgetprotobyname() , getprotobynumber() , wsaasyncgetprotobynumber()

3.4 編寫獨立於ip版本的程式

3.4.1 客戶機

1.使用getaddrinfo函式解析位址。hints結構不僅要包含套接字型別和協議,還應該包含af_unspec。這取決於客戶機是使用tcp通訊,還是使用udp通訊。

2.使用步驟1返回的addrinfo結構中的ai_family , ai_socktype 和 ai_protocol欄位來建立套接字。

3.使用addrinfo結構中的成員ai_addr來呼叫connect函式或sendto函式。

3.4.2 伺服器

1.用hints結構呼叫getaddrinfo函式,該結構包含ai_passive , af_unspec , 所需的套接字型別,協議及所需的本地埠(這個埠用來監聽或接收資料)。這個呼叫將返回兩個addrinfo結構:乙個包含用於ipv4的監聽位址,另乙個包含用於ipv6的監聽位址。

2.針對每個返回的addrinfo結構,建立乙個包含ai_family , ai_socktype 和 ai_protocol欄位的套接字,接著使用ai_addr和ai_addrlen成員呼叫函式bind。

第三章 IP網際協議

1.ip首部 ip資料報的格式如圖。普通的ip首部長為20位元組,除非含有選項字段 其中總長度欄位是指整個ip資料報的字段,以位元組為單位。利用首部長度和總字段長度,就可以知道ip資料報中資料內容的起始位置和長度。由於該字段長6位元,所以ip資料報最長可達65535位元組。2.ip路由選擇 ip路由...

TCP IP協議詳解 第三章 IP 網際協議

1.ip協議的特點 不可靠 無法保證ip資料報能成功地到達目的地 無連線 無法保證資料到來的先後順序 2.ip首部 3.4位版本號目前協議版本號是4 首部長度指的是首部佔 32 bit字的數目,包括任何選項。由於它是乙個 4位元字段,因此 首部最長為6 0個位元組。20 8 160 32 5 網路位...

TCP IP詳解,卷1 協議,第三章IP 網際協議

小結 1.對ip首部的講解。2.ip路由選擇 如果目的主機在直接相連的網路上,那麼就把資料報直接傳給目的主機,否則傳給預設路由器。3.在進行路由選擇決策時,主機和路由器都使用路由表。在表中有三種型別的路由 特定主機型 特定網路型和預設路由型。主機路由 網路路由 預設路由。4.ip路由是通過逐跳來實現...