广播组播、本地套接字通信、wireshark、以太网帧格式、三次握手四次挥手

广播(使用 UDP 套接字)

广播地址:主机号最大的地址。
广播:给所在局域网的所有主机发送数据报。(之前的数据报发送方式是单播。)

以下情况中使用广播: 局域网 搜索协议。
比如家中的智能产品, 使用手机可以搜索出附近的智能产品,这就是一个局域网搜索协议。

基于 setsockopt 实现广播

广播发送者(客户端):

1、创建一个数据报套接字;

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

2、setsockopt(sockfd, 协议层, 选项名, 数据类型, 大小);

int opt = 1;	// 非0即可 
setsockopt(sockfd, **SOL_SOCKET**, SO_BROADCAST, &opt, sizeof(op)); 

在这里插入图片描述

3、填充结构体;

struct sockaddr_in addr; 
addr.sin_family = AF_INET; 
addr.sin_addr.s_addr = inet_addr(argv[1]); 
addr,sin_port = htons(atoi(argv[2])); 

4、发送数据报;

sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&addr, sizeof(addr));

广播接收者(服务器):

1、创建一个数据报套接字;

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

2、绑定广播IP;

struct sockaddr_in saddr, caddr; 
saddr.sin_family = AF_INET; 
saddr.sin_port = htons(atoi(argv[2])); 
saddr.sin_addr.s_addr = inet_addr("0.0.0.0"); 	// 广播地址 或 0.0.0.0 
socklen_t length = sizeof(caddr); 
if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){...} 

3、等待接收数据;

recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&caddr, &length); 

缺点:

广播发送给所有主机,过多的的网络会发送大量的网络带宽,造成广播风暴。
广播风暴: 网络长时间被大量数据包占用,无法通信,网络会变得缓慢,甚至崩溃。

机制: 通过向广播地址发送UDP数据包,将数据包发送给网络中的所有主机。当一个主机发送广播消息时,该消息会被路由器转发到网络中的所有子网。然后,每个子网上的主机都会接收到该广播消息,并转发给它们的相邻主机。这个过程会一直持续下去,直到广播消息传播到整个网络中的所有主机,如果这个现象一直循环如此,则会造成广播风暴。

广播:给发送者设定相应的权限;
组播:接收者要加入到多播组;

组播(使用 UDP 套接字)

组播地址(D类IP):224.0.0.1 ~ 239.255.255.255

基于 setsockopt 实现组播

// 多播结构体
struct ip_mreq{struct  in_addr  imr_multiaddr;   // 指定多播组IP struct  in_addr  imr_interface;   // 本地IP,通常指定为 INADDR_ANY--0.0.0.0
}struct in_addr{_be32  s_addr;  					// IP地址(大端)
}

组播接收者(服务器):

1、创建数据报套接字;

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

2、加入多播组(仅限于接收者);

// 核心代码 ------------------------------------
struct ip_mreq mreq;			// 定义组播的结构体变量
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); 			// 填充多播组IP
mreq.imr_interface.s_addr = inet_addr("0.0.0.0");  			// 自动获取本机IP// 改变套接字属性
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

在这里插入图片描述

3、填充结构体,绑定 组播IP 和 端口;

struct sockaddr_in saddr, caddr;
saddr.sin_family = AF_INET; 
saddr.sin_port = htons(atoi(argv[2]));
saddr.sin_addr.s_addr = inet_addr("0.0.0.0"); 			// 组IP
socklen_t length = sizeof(caddr);if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){...}

4、等待接收数据;

recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&caddr, &length); 

组播发送者(客户端):

1、创建数据报套接字
2、指定接收方地址为 组播地址,设置端口信息
3、发送数据报

广播和组播的区别:

● 广播方式:将数据报发给所有的主机。过多的广播会占用大量网络带宽,造成广播风暴,影响通信。
● 组播(又称为多播)是一种折中的方式。只有加入某个多播组的主机才能收到数据。
● 组播方式既可以发给多个主机,又能避免像广播那样带来过多的负载。

本地套接字通信

· unix 网络编程:最开始都是一台主机内进程和进程之间的编程。(本地通信)
· socket:可以用于本地间进程通信,创建套接字时使用本地协议 AF_LOCALAF_UNIX

特点:

本地通信不需要IP和端口,无法进行两个主机通信;
分为流式套接字和数据报套接字; // 可以使用 流式套接字 或者 数据包套接字
和其他进程间通信相比,使用方便、效率更高,常用于前、后台进程通信;
unix 域套接字编程,实现本间进程的通信,依赖的是 s 类型的文件;

核心步骤:

#include <sys/socket.h>
#include <sys/un.h>struct sockaddr_un {sa_family_t sun_family;               	/* 本地协议 AF_UNIX */char        sun_path[UNIX_PATH_MAX];  	/* 本地路径 s类型的套接字文件 */
};unix socket = socket(AF_UNIX, type, 0); 	// type 可以为流式套接字或数据包套接字// unix 写为 int 就可以struct sockaddr_un myaddr;
myaddr.sun_family = AF_UNIX; 				// 填充 UNIX 域套接字
strcpy(saddr.sun_path,"./myunix"); 			// 创建套接字的路径

相关代码

receiver
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <poll.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <string.h>int main(int argc, char const *argv[])
{// 1.创建套接字int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);if (sockfd < 0){perror("sock is err:");return -1;}system("rm ./myunix -f");unlink("./myunix");// 2. 填充结构体struct sockaddr_un saddr;saddr.sun_family = AF_UNIX;strcpy(saddr.sun_path, "./myunix");if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){perror("bind is err:");    return -1;}if (listen(sockfd,5) < 0){perror("listen is err:");  return -1;}int acceptfd = accept(sockfd, NULL, NULL);if (acceptfd < 0){perror("acceptfd < 0");    return -1;}char buf[128] = "";int recvbyte;while(1){recvbyte = recv(acceptfd, buf, sizeof(buf), 0);if (recvbyte < 0){perror("recv is err:");   return -1;}else if (recvbyte == 0){printf("exit\n");break;}else{printf("buf: %s\n", buf);}}close(sockfd);close(acceptfd);return 0;
}
sender
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <poll.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <string.h>int main(int argc, char const *argv[])
{// 1.创建套接字int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);if (sockfd < 0){perror("sock is err:");return -1;}// 2. 填充结构体struct sockaddr_un saddr;saddr.sun_family = AF_UNIX;strcpy(saddr.sun_path, "./myunix");if (connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){perror("connect is err:");return -1;}char buf[128] = "";int recvbyte;while(1){fgets(buf,sizeof(buf),stdin);if(buf[strlen(buf) -1] == '\n')buf[strlen(buf) -1] = '\0';send(sockfd, buf, sizeof(buf), 0);}close(sockfd);return 0;
}

网络头协议分析

在这里插入图片描述

wireshark抓包工具

在这里插入图片描述

抓包工具的使用

虚拟机: sudo apt-get install wireshark
windows: 小飞机
(抓包的过程,就是抓取流经网卡的数据。如果不加 sudo 就找不到网卡,没有办法抓到数据。)
两台不同的主机通信 或 两台不同的操作系统(windows、linux)之间 才可以进行抓包。

步骤

1)运行 linux 下的服务器;
在这里插入图片描述

2)打开 windows 下的小飞机;
在这里插入图片描述
在这里插入图片描述

3)打开抓包工具;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4)过滤无关的包;
在这里插入图片描述

5)小飞机模拟客户端, 与 linux 下的服务器通信;

实现:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

包头分析在这里插入图片描述

以太网的完整帧格式

在这里插入图片描述

网络层最大数据帧长度是1500字节。(MTU: 最大传输单元)
链路层最大数据长度是1518字节。(网络层 1500 + 以太网 14 + CRC检错 4)
在这里插入图片描述
在这里插入图片描述

TCP 粘包、拆包 与 UDP丢包

● 发生 TCP 粘包或拆包 有很多原因,常见的有以下几点:
1、待发送数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包。
2、待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。
3、待发送数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包。
4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
● TCP 粘包的 解决办法:
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
2、发送端将每个数据包封装为固定长度(不够的可以通过补 \0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。
在这里插入图片描述

以太网头

以太网中封装了 目的mac地址 以及 源mac地址、IP 类型,以太网头又称为 mac头。
切换网络时,IP地址会改变,Mac地址不会改变。
在这里插入图片描述

type 类型
0x0800 ——> 只接收发往 本机MAC 的 IP类型的数据帧;
0x0806 ——> 只接收发往 本机 ARP类型 的数据帧;
0x8035 ——> 只接收发往 本机 RARP类型 的数据帧;
0x0003 ——> 接收发往 本机MAC 的所有类型:IP, ARP, RARP 数据帧,接收从本机发出去的数据帧,
当混杂模式打开的情况下,会接收到非发往本地的 MAC 数据帧。
ARP:ARP协议用于将 IP地址 解析为 MAC地址。当一台计算机向另一台计算机发送数据时,它需要知道目标计算机的 MAC地址,而不是 IP地址。
RARP:RARP协议则是与 ARP 相反的过程,它用于将 MAC地址 解析为 IP地址。

IP头

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

UDP头

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP头

在这里插入图片描述
在这里插入图片描述

三次握手

服务器必须准备好接受外来的连接。这通过调用 socket、 bind 和 listen 函数来完成,称为被动打开(passive open)。
第一次握手:客户通过调用 connect 进行主动打开(active open)。客户端发送一个SYN(表示同步)
分节(SYN=J),它告诉服务器客户将在连接中发送到数据的初始序列号。并进入 SYN_SEND 状态,
等待服务器的确认。
第二次握手:服务器必须确认客户的 SYN,同时自己也得发送一个 SYN 分节,它含有服务器将在同一连接
中发送的数据的初始序列号。服务器以单个字节向客户发送 SYN 和 对客户 SYN 的 ACK(表示确认)
此时服务器进入 SYN_RECV 状态。
第三次握手:客户收到服务器的 SYN+ACK。向服务器发送确认分节,此分节发送完毕,客户服务器进入
ESTABLISHED(确认)状态,完成三次握手。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四次挥手

第一次挥手:主动关闭方发送一个 FIN 给被动方,进入 FIN_WAIT 状态;
第二次挥手:被动方接收到 FIN 包,给主动方发送一个 ACK 包;并进入 CLOSE_WAIT 状态,主动方接收
到 ACK 包后,如果有数据没有发送完毕,则继续发送,一直到发送完毕;
第三次挥手:被动方发送一个 FIN 包,进入 LAST_ACK 状态。
第四次挥手:主动关闭方收到 FIN 包,回复一个 ACK包。被动关闭方收到主动关闭方的 ACK后关闭连接。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/162384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

局域网共享打印机共享,简单至简至一键处理011bDll等问题

一、电脑系统是否激活&#xff08;可选&#xff09; 二、确保主客户端PC在同一局域网内&#xff08;可选&#xff09; 可以通过ping 目标地址 如ping 192.168.1.202&#xff1b;看是否可以正常通信 下面是惠普类型打印机共享问题关键&#xff08;文本记得保存&#xff09; …

双11再创新高!家电行业如何通过矩阵管理,赋能品牌增长?

双11大促已落下帷幕&#xff0c;虽然今年不再战报满天飞&#xff0c;但从公布的数据来看&#xff0c;家电行业整体表现不俗。 根据抖音电商品牌业务发布的收官战报&#xff0c;家电行业创造了成交新纪录&#xff0c;整体同比增长125%。快手官方数据显示&#xff0c;消电家居行业…

深入理解JMM以及并发三大特性(1)

文章目录 1. 并发与并行2. JMM3. 并发三大特性4.总结 1. 并发与并行 并行&#xff1a;指在同一时刻&#xff0c;有多条指令在多个处理器上同时执行。所以无论从微观还是宏观来看&#xff0c;二者都是一起执行的。 并发&#xff1a;指在同一时刻只能有一个指令执行&#xff0c;…

基于springboot实现校园在线拍卖系统项目【项目源码】

基于springboot实现校园在线拍卖系统演示 Javar技术 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&…

Modbus转Profinet改变局面,PLC与电力仪表秒级响应

Modbus转Profinet改变了传统的局面&#xff0c;实现了PLC与电力仪表之间的秒级响应。在过去&#xff0c;由于Modbus通信协议的限制&#xff0c;PLC与电力仪表之间的数据传输速度受到了很大的限制&#xff0c;无法满足工业自动化领域对实时性的要求。然而&#xff0c;随着Modbus…

【云原生 Prometheus篇】Prometheus架构详解与核心组件的应用实例(Exporters、Grafana...)

Prometheus Part1 一、常用的监控系统1.1 简介1.2 Prometheus和zabbix的区别 二、Prometheus2.1 简介2.2 Prometheus的主要组件1&#xff09;Prometheus server2&#xff09;Exporters3&#xff09;Alertmanager4&#xff09;Pushgateway5&#xff09;Grafana 2.3 Prometheus的…

openGauss学习笔记-130 openGauss 数据库管理-参数设置-重设参数

文章目录 openGauss学习笔记-130 openGauss 数据库管理-参数设置-重设参数130.1 背景信息130.2 GUC参数设置130.3 操作步骤130.4 示例 openGauss学习笔记-130 openGauss 数据库管理-参数设置-重设参数 130.1 背景信息 openGauss提供了多种修改GUC参数的方法&#xff0c;用户可…

【网络】数据链路层协议

数据链路层协议 一、链路层解决的问题二、以太网协议1、局域网技术2、令牌环网&#xff08;了解&#xff09;3、以太网通信原理4、 MAC地址5、以太网帧格式6、碰撞避免7、最大传输单元MTU 二、ARP协议1、ARP数据的格式2、ARP协议的工作流程3、ARP缓存表4、ARP协议中的一些问题7…

11月23日星期四今日早报简报微语报早读

11月23日星期四&#xff0c;农历十月十一&#xff0c;早报微语早读。 1、我国5G基站总数达321.5万个&#xff1b; 2、2023年两院院士增选结果揭晓&#xff0c;共133人当选&#xff1b; 3、北京低保标准提升至每人每月1395元&#xff1b; 4、上海制定体育发展条例&#xff1a…

[Linux] shell脚本之循环

一、循环定义 一组被重复执行的语句称之为 循环体,能否继续重复,决定循环的终止条件。 循环语句 是由循环体及循环的终止条件两部分组成的。 二、for循环 2.1 带列表循环 语法 for 变量名 in 取值列表do 命令序列 done 花括号用法&#xff1a; 花括号{ }和seq在for循环…

年轻有为!2023两院院士增选揭榜 45岁颜宁当选

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 通常&#xff0c;两…

BTS-GAN:基于MRI和条件对抗性网络的乳腺肿瘤计算机辅助分割系统

BTS-GAN: Computer-aided segmentation system for breast tumor using MRI and conditional adversarial networks BTS-GAN&#xff1a;基于MRI和条件对抗性网络的乳腺肿瘤计算机辅助分割系统背景贡献实验方法Parallel dilated convolution module&#xff08;并行扩展卷积模块…

逸学java【初级菜鸟篇】9.5枚举

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 枚举是信息的标志和分类 当一个变量有几种固定可能的取值时&#xff0c;就可以将它定义为类型的枚举。 优点&#xff1a;代码可读性好&#xff0c;入参约束严谨&#xff0c;代码优雅&#xff0c;是最好的信息分类技术&#x…

【AI读论文】AutoML的8年回顾:分类、综述与趋势

论文标题&#xff1a;Eight years of AutoML: categorisation, review and trends 论文链接&#xff1a;https://link.springer.com/article/10.1007/s10115-023-01935-1 本文主要围绕自动机器学习&#xff08;AutoML&#xff09;展开了系统性的文献综述&#xff0c;总结了该领…

【文末送书】重磅!这本30w人都在看的Python数据分析畅销书:更新了!

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

div中添加el-loading(局部loading的使用)

效果&#xff1a;在div中实现el-loading <div class"content-main">{{ hotList }}</div>getHotList(columnType) {this.$nextTick(() > {var loading this.$loading({lock: true,text: "努力加载中...",spinner: "el-icon-loading&qu…

揭示卡尔曼滤波器的威力

一、说明 作为一名数据科学家&#xff0c;我们偶尔会遇到需要对趋势进行建模以预测未来值的情况。虽然人们倾向于关注基于统计或机器学习的算法&#xff0c;但我在这里提出一个不同的选择&#xff1a;卡尔曼滤波器&#xff08;KF&#xff09;。 1960 年代初期&#xff0c;Rudol…

开始通过 Amazon SageMaker JumpStart 在亚马逊云科技上使用生成式 AI

目前&#xff0c;生成式 AI 正受到公众的广泛关注&#xff0c;人们围绕着许多人工智能技术展开讨论。很多客户一直在询问有关亚马逊云科技生成式 AI 解决方案的更多信息&#xff0c;本文将为您进行解答。 这篇文章通过一个真实的客户使用案例概述了生成式 AI&#xff0c;提供了…

感恩节99句祝福语,感恩父母老师朋友亲人朋友们,永久快乐幸福

1、流星让夜空感动&#xff0c;生死让人生感动&#xff0c;爱情让生活感动&#xff0c;你让我感动&#xff0c;在感恩节真心祝福你比所有的人都开心快乐。 2、感恩节到了&#xff0c;想问候你一下&#xff0c;有太多的话语想要说&#xff0c;但是不知从何说起&#xff0c;还是用…

让SOLIDWORKS Composer动画在PPT中随意转换

SOLIDWORKS Composer作为一款易学易用的技术图解软件&#xff0c;非常适合用来给客户展示自己的产品。这里我们教大家如何将Composer文件插入大PPT中&#xff0c;并任意切换文件&#xff0c;用以给客户展示不用的方案和产品。 1.首先大家要安装SOLIDWORKS Composer Player 这个…