Linux——广播

来源:互联网 发布:电玩巴士淘宝3ds 编辑:程序博客网 时间:2024/05/16 07:12

 

缅怀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_inservaddr;

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_tlen;

struct sockaddr*preply_addr;

 

recvfrom(sockfd, recvline, MAXLINE, 0,preply_addr, &len);//preply_addr返回 发送数据主机的地址,len是地址的大小。

 

 

 

 

原创粉丝点击