Linux——廣播

 

緬懷Stevens大師。

最好的參考資料:

1.師從互聯網。

2.UNP v1第20章 。

第一條:概述

(0)廣播用途:

(0.1):資源發現 resource discovery:在知道我們所要訪問的主機A(一般是服務器)位於本地子網絡的前提下,但是我們不知道這個主機A的單播IP地址(就是平時用的IP地址呵呵),我們就可以通過發送廣播分組給主機A,從而獲得主機A 的IP地址。

 

(0.2):減少網絡分組流通:在多個客戶主機與一個服務器主機通信的局域網環境中,儘量減少分組流通。

(1)出於這兩個用途使用廣播而開發的應用(協議):

(1.1)ARP:Address Resolution Protocol,地址解析協議。ARP是IPv4的基本組成部分之一。ARP使用鏈路層廣播而不是IP層廣播。用來在局域網上我們已知某臺主機A的IP地址時,通過給主機A發送廣播分組獲得主機A的硬件地址。

(1.2)DHCP:Dynamic Host Configuration Protocol,動態主機配置協議。在本地子網上有一個DHCP服務器主機或中繼主機的前提下,使用DHCP的客戶主機向廣播地址(通常時255.255.255.255)發送自己的請求,在發送這個請求之前客戶主機不知道自己的IP地址、子網掩碼、本地子網的受限廣播地址。

(1.3)NTP:Network Time Protocol,網絡時間協議。

(1.4)路由守護進程:Routed是最早實現且最常用的路由守護進程之一。他在局域網上廣播自己的路由表。這樣連接到這個局域網上的所有其他路由器都可以接收到這個路由的通告,從而管理員無需事先爲每個路由器配置其鄰接的路由器的IP地址。

注:多播可以替代廣播的上述兩個用途。

由於IPv4時代廣播帶來的問題,IPv6不提供廣播的支持。廣播只能用於UDP 或 原始IP;他們不能用於TCP,因爲TCP是面向連接的。

原始IP就是 raw socket,參見UNPv1 第28章。

第二條:廣播地址

(0)IPv4地址:{子網ID,主機ID}。

子網ID:和子網掩碼(或CIDR前綴)一樣長的連續位。

主機ID:32位IP地址中減去子網掩碼長度剩下的連續位。

(1)子網定向廣播地址:{子網ID,-1},-1表示全部爲1的連續位。列如子網ID爲192.168.42/24,其中24是子網IP的位數,可以不是2的倍數。對應的子網定向廣播地址:192.168.42.255.(11000000.10101000.00101010.11111111).路由器通常不轉發這種廣播,可配置開啓,不宜開啓,因爲會促成稱爲放大攻擊(amplification)的一類拒絕服務攻擊。

(2)受限廣播地址:{-1,-1}即:255.255.255.255。路由器從不轉發這類宿地址(目的地址)的IP數據報。

第三條:廣播套接口

int sockfd=socket(AF_INET, SOCK_DGRAM, 0);

 

struct sockaddr_in servaddr;

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(13); /* 13 is standard daytime server *///13可自己定義

inet_pton(AF_INET, “192.168.42.255”, &servaddr.sin_addr);//廣播地址也可自己定義

int on=1;

setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));//開啓廣播

int len=0;

sendto(sockfd, sendline, strlen(sendline), 0, servaddr, sizeof(servaddr));//發送,servaddr是廣播地址

char recvline[MAXLINE+1];//加1是爲了NULL。

 

socklen_t len;

struct sockaddr *preply_addr;

 

recvfrom(sockfd, recvline, MAXLINE, 0,preply_addr, &len);//preply_addr返回 發送數據主機的地址,len是地址的大小。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章