广播 组播
广播 ===》只能用UDP协议形式发送数据 ===》不要求客户端一定在线。
特点: 必须要发送的广播地址 ===》局域网中的最大地址。
必须要设置广播端程序的套接字属性允许发送广播。
流程:
发送端:
sokcet()===>setsockopt() ===>sendto() ===>close()
1、setsockopt() ====>允许发送广播
原型:int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
功能:通过该函数可以设置指定的sockfd 套接字的属性。
参数:sockfd要操作的套接字id
level 套接字的协议类型
SOL_SOCKET 通用套接字
IPPROTO_IP IP 协议
IPPROTO_TCP TCP协议
IPPROTO_UDP udp协议
optname 套接字的控制方式:
SO_REUSEADDR ===>地址重用
SO_BROADCAST ===>允许广播
SO_RCVTIMEO ===>接收数据超时
SO_SNDTIMEO ===>发送数据超时
optval 设置属性实际值
optlen 属性设置的长度
返回值:成功 0 失败-1
2、发送数据的目标不再是具体的主机,而是广播地址。
sockaddr_in bro_addr;
bro_addr.sin_family = PF_INET;
bro_addr.sin_port = htons(6666);
bro_addr.sin_addr.s_addr = inet_addr("192.168.0.255");
接收端:
socket()==>bind()===>recvfrom()===>close()
注意:bind() 的地址应该是bind到本地的广播地址+广播端口上。
缺点:
1、可能造成广播风暴
2、范围过大导致发送的消息不受控。
组播 ==》多播 ===》小范围广播
组播占用ip地址划分的D类网络地址:224.0.0.1 ---239.255.255.255
大致对以上地址有如下约定:
1、局部地址
224.0.0.1 -- 224.0.0.255
2、预留地址
224.0.1.0 -- 238.255.255.255
3、管理地址
239.0.0.0 --239.255.255.255
常用组播地址:
224.0.0.1 ===》所有支持组播的主机
224.0.0.2 ===》所有支持足部的路由器
224.0.0.5 ===》ospf 路由器
224.0.0.9 ===》RIP 路由器
224.0.0.18 ===》VRRP 协议组播地址
组播发送和接受:
发送端:
socket()===>sendto() ===>close()
注意:sendto的目标必须是组播地址+组播端口
接收端:
socket()===>加入多播组 ==>bind===》recvfrom ===》close
注意:bind 必须是组播地址+组播端口
加入多播组:
1、定义组播结构体
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.100");
mreq.imr_interface.s_addr = inet_addr("192.168.0.100");
2、修改属性加入多播
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
3、bind组播地址
struct sockaddr_in myaddr;
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(5555);
myaddr.sin_addr.s_addr = inet_addr("224.0.0.100");
bind(sockfd,(struct sockaddr*)&myaddr,sizeof(myaddr));
4、recvfrom().....
=============================================================================
域内套接字 ===》socket 单机进程间通信
0、头文件: sys/un.h
1、TCP
1.1 socket()的第一个参数由:PF_INET 该为: PF_UNIX/PF_LOCAL
1.2 sockaddr_in 类型调整为 sockaddr_un
struct sockaddr_un
{
sa_family_t sun_family; 协议族
char sun_path[108]; socket套接子的文件路径+名称
};
1.3 操作流程 完全类似网络程序。
客户端:socket===>connect==>send/recv ===>close
服务器端:socket==>bind===>listen===>accept===>recv/send ==>close
以上通信过程会在文件系统中生成一个套接字文件,所有的域内通信都是
基于该文件传送。
练习:
用以上套接字方式完成两个父子进程见的通信,并找出套接字文件的创建函数。
注意:套接字文件是由服务器端的bind函数创建。
客户端必须在服务器端启动之后才能链接。
如果多次启动必须要在bind之前卸载文件。 unlink(xxx);
2、UDP
1、socket() 的参数1 需要调整为: AF_UNIX PF_LOCAL
2 SOCK_DGRAM
2、UDP的服务器端和客户端:
bind函数以及sendto函数的参数addr都需要调整为域内套接字。
struct sockaddr_un;
服务器: socket==>bind ===>recvfrom==>close
客户端: socket==>sendto===>close
练习:选取任意一种域内套接字方式完成,进程1 给进程2 发送文件
并将文件内容打印输出到屏幕。
grep -r 'abc' ./
递归查找当前路径下文件中包含abc字符的所有文件并列出文件名称
vim 的替换:
:g/s1/s//s2/g
将当前文件中所有的s1字符串替换为s2
===============================================================
协议分析 ===> 《TCP/IP 详解 卷一》
协议分析网
从下层的物理链路层 ===》上层的传输层协议组成。
数据包长度: 46 -- 1500 字节
46:最小报文长度
1500 MTU 最大传输控制单元
所有的数据包中在TCP/IP协议中都有各自的头部数据。
物理链路层:以太网头部 ===》14+4 字节构成。
前14字节的头部信息
前6字节: 目的MAC
中6字节: 源MAC
后2字节: 向上一层协议的类型
0x0800 IP协议
0x0806 ARP协议
后4字节的尾部校验位;
网络层:====》RFC 791===》默认长度20字节
第1字节:前4bit位表示的是当前网络协议版本:
如果是4 表示IPV4
如果是6 表示IPV6
后4bit位 表示的是当前层协议的数据
长度,以4字节为单位。4*5 =20字节
第二字节:TOS 服务类型
TOS(3bit 优先级,4bit (最大吞吐 最小延迟 最高可靠性 最小费用),1bit扩展未用)
第三 、四字节:两个字节表示当前协议最大数据容量:65536 字节
第五、六 字节:编码格式
第七字节:前3bit 0x80 0x00 不用
0x40 不分片
0x20 滑动窗口
第七字节:后5bit+第八字节: 片内偏移量。
第九字节:生存时间 unix 255 liunx 64 windows 128
第十字节:向上一层协议的类型: 0x11 udp 0x06 tcp
第十一 十二 字节:TCP协议头部校验位。
第十三。。十六字节: 源ip地址
第十七. . 二十字节: 目的ip地址