物联网LWIP网络开发7

D7广播与组播

7.1DNS域名解析

DNS作用

 访问网页的过程

DNS(域名系统,Domain Name System)的作用主要体现在以下几个方面:

一、域名解析

DNS的核心作用是将人们易于记忆的域名(如www.example.com)解析为计算机可以直接识别的IP地址(如192.0.2.1)。这一过程称为域名解析。通过DNS,用户无需记住复杂的IP地址,只需输入域名即可访问相应的网站或服务。

二、便于互联网访问

DNS作为互联网的一项核心服务,极大地便利了用户对互联网的访问。它构建了一个将域名和IP地址相互映射的分布式数据库,使得用户能够更加方便、快捷地访问互联网上的各种资源。

三、提高访问效率

DNS还通过缓存机制提高了访问效率。当用户首次访问某个域名时,DNS服务器会将其解析结果缓存起来。当用户再次访问该域名时,DNS服务器可以直接从缓存中返回解析结果,而无需再次进行解析,从而减少了查询时间和网络负载。

域名如何划分?

root level domain:根域名服务器

想使用DNS域名解析功能,必须要知道域名服务器地址,一般配置为路由器地址

DNS API

宏开关
//opt.h
/**
 * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS
 * transport.
 */

#if !defined LWIP_DNS || defined __DOXYGEN__
#define LWIP_DNS                        1
#endif

LWIP_DNS   0变为1 

配置DNS服务器
dns.c添加代码
/dns.c 需要手动添加
/** DNS server IP address */
#ifndef DNS_SERVER_ADDRESS
extern ip4_addr_t gw;   //网关地址
#define DNS_SERVER_ADDRESS(ipaddr)        (memcpy(ipaddr, &gw, sizeof(ip4_addr_t)))
#endif

#ifdef DNS_SERVER_ADDRESS
  /* initialize default DNS server address */
  ip_addr_t dnsserver;
  DNS_SERVER_ADDRESS(&dnsserver);
  dns_setserver(0, &dnsserver);
#endif /* DNS_SERVER_ADDRESS */
LWIP..c修改代码
/**
  * LwIP initialization function
  */
void MX_LWIP_Init(void)
{
  /* IP addresses initialization */
	..........
  /* IP addresses initialization without DHCP (IPv4) */
  IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);  
  /* Initilialize the LwIP stack with RTOS */
  tcpip_init( NULL, NULL );
   ...............
}
gethostbyname
//netdb.h
/** @ingroup netdbapi */
#define gethostbyname(name) lwip_gethostbyname(name)
struct hostent *lwip_gethostbyname(const char *name);
struct hostent {
    char  *h_name;      /* 正式主机名 */
    char **h_aliases;   /* 主机别名*/
    int    h_addrtype;  /* 主机IP地址类型 */
    int    h_length;    /* 主机IP地址字节长度*/
    char **h_addr_list; /* 主机的IP地址列表*/
};

第一步

文件夹Middlewares/LwIP找到sockets.c

第二步

 第三步

在opt.h全局搜索LWIP_DNS

使能为1 

第四步 

在Middlewares/LwIP找到dns.c进行操作

DNS实现

7.2 心跳及超时机制实现

心跳机制

定义与目的
心跳机制是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道自己仍然在线,以确保连接的有效性的机制。这种机制主要用于长连接的保活和断线处理,通过定期发送心跳包来检测对方是否仍然在线,从而避免因网络故障或节点故障导致的连接中断。

实现方式

  1. 客户端发起心跳:客户端每隔一段时间发送心跳包给服务器,如果服务器在一定时间内没有收到客户端的心跳包,则认为客户端可能已经断开连接,进而采取相应的处理措施,如关闭连接、释放资源等。
  2. 服务器发起心跳:服务器也可以设置超时机制,主动向客户端发送心跳包,并等待客户端的应答。如果客户端未在规定时间内返回应答包,服务器将认为客户端异常,关闭与客户端的连接。

应用场景
心跳机制广泛应用于需要保持长连接的场景,如即时通讯软件、在线游戏、远程桌面控制等。这些场景需要实时检测连接的存活状态,以确保数据的正常传输和用户的良好体验。

超时机制

定义与目的
超时机制是指在网络通信或系统调用中,如果某个操作(如发送数据、接收数据、远程服务调用等)在预定时间内没有完成,则触发超时处理逻辑,以避免系统资源被长时间占用或导致死锁等问题。

分类

  1. 连接超时(Connection Timeout):在网络通信中,如果建立连接的时间超过了预定时间,则认为是连接超时。此时,系统会放弃建立连接,并返回错误信息给调用者。
  2. 读取超时(Read Timeout):在读取数据时,如果一定时间内没有读取到任何数据,则认为是读取超时。这通常发生在读取网络数据或文件数据时。

实现方式
超时机制通常通过设置超时时间来实现。在发送请求或进行某个操作时,系统会记录一个开始时间,并在预定时间内等待结果。如果超时时间到达时仍未收到结果,则触发超时处理逻辑。

 setsockopt

//功能说明:  
/*
获取或者与某个套接字关联的选 项。选项可能存在于多层中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须给出。例如,为了表示一个选项由协议解析,层应该设定为协议 号TCP。
*/
//函数原型
int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
//参数:  
/*
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
optname:需要访问的选项名。
optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。
optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。
*/
//返回说明:  
成功执行时,返回0。失败返回-1
    
//参数详细说明:
/*
level指定控制套接字的层次.可以取三种值:
1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项. 

选项名称        说明                     数据类型
=====================================================================
            SOL_SOCKET
---------------------------------------------------------------------
SO_BROADCAST      允许发送广播数据            int
SO_DEBUG        允许调试                int
SO_DONTROUTE      不查找                   int
SO_ERROR        获得套接字错误             int
SO_KEEPALIVE      保持连接                int
SO_LINGER        延迟关闭连接              struct linger
SO_OOBINLINE      带外数据放入正常数据流         int
SO_RCVBUF        接收缓冲区大小             int
SO_SNDBUF        发送缓冲区大小             int
SO_RCVLOWAT       接收缓冲区下限             int
SO_SNDLOWAT       发送缓冲区下限             int
SO_RCVTIMEO       接收超时                struct timeval
SO_SNDTIMEO       发送超时                struct timeval
SO_REUSERADDR      允许重用本地地址和端口         int
SO_TYPE         获得套接字类型             int
SO_BSDCOMPAT      与BSD系统兼容              int
========================================================================
            IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL       在数据包中包含IP首部          int
IP_OPTINOS       IP首部选项               int
IP_TOS         类型
IP_TTL         生存时间                int
========================================================================
            IPPROTO_TCP
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大数据段的大小           int
TCP_NODELAY       不使用Nagle算法             int
=====================================================================


*/

心跳检测

TCP keepalive

 setsockopt 参数
#define SO_KEEPALIVE   0x0008  /* 保持连接 */  					val = int
#define TCP_KEEPIDLE   0x03    /* 发送心跳空闲周期 S*/			 val = int
#define TCP_KEEPINTVL  0x04    /* 发送心跳间隔 S */			   val = int
#define TCP_KEEPCNT    0x05    /* 心跳重发次数 */				   val = int  //一般是3次

 

optname= SO_KEEPALIVE   

宏开关
/**
 * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT
 * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set
 * in seconds. (does not require sockets.c, and will affect tcp.c)
 */
#if !defined LWIP_TCP_KEEPALIVE || defined __DOXYGEN__
#define LWIP_TCP_KEEPALIVE              0
#endif

 在opt.h里面全局搜索KEEPALIVE

7.3广播与组播基础知识

广播和组播

广播和组播是网络通信中的两种重要组网方式,它们在数据传输、资源利用和通信效率方面具有显著的区别。以下是关于这两种组网方式的详细解析:

一、广播(Broadcast)

1. 定义与特点

广播是一种“一对所有”的通信模式,即网络中的主机向所有其他主机发送数据。在这种模式下,网络中的交换机和路由器会对数据进行无条件复制并转发,使得所有主机都能接收到信息,无论它们是否需要这些信息。然而,广播通常被限制在局域网(LAN)范围内,以防止广播数据影响大面积的主机,造成广播风暴。

2. 应用场景

  • 局域网内的设备发现和服务发现,如DHCP(动态主机配置协议)使用广播来让设备找到可用的IP地址。
  • 局域网内的通知和消息广播,如网络广播系统用于播放背景音乐、紧急通知等。

3. IP地址

广播通信通常使用特定的广播IP地址,如全网广播地址255.255.255.255,以及局域网内的段内广播地址(如C类地址的192.168.1.255)。

二、组播(Multicast)

1. 定义与特点

组播是一种“一对一组”的通信模式,即数据只发送给加入了特定组的主机。在这种模式下,网络中的交换机和路由器会智能地复制并转发数据,只将组播数据包发送给那些已经加入该组的主机。这样既能保证数据的有效传输,又能避免不必要的网络带宽浪费。

2. 应用场景

  • 多播流媒体服务,如网络电视、在线视频会议等,这些应用需要将相同的视频或音频数据同时发送给多个接收者。
  • 内容分发网络(CDN),组播可以用于分发大型文件或流媒体内容,以减少网络流量和带宽需求。

3. IP地址

组播通信使用特定的组播IP地址范围,即D类地址空间,范围从224.0.0.0到239.255.255.255。这些地址用于标识不同的组播组。

三、广播与组播的比较

组网方式

 广播应用场景

串口以太网服务器配置参数

组播应用场景

广播和组播IP地址划分

MAC地址(数据链路层)

MAC地址,全称为媒体访问控制地址(Media Access Control Address),是用于标识网络设备的唯一地址。以下是对MAC地址的详细解析:

一、定义与功能
  • 定义:MAC地址是网络设备(如网卡)在物理层上的唯一标识符,由IEEE(电气与电子工程师协会)定义。
  • 功能:MAC地址用于在局域网中唯一标识一台设备,以便其他设备可以向它发送数据帧。它类似于网络设备的“身份证号码”,在局域网中起到了识别和定位设备的重要作用。
二、格式与组成
  • 长度:MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如00-16-EA-AE-3C-40。
  • 组成:MAC地址由6组由16进制数表示的2位字符组成,中间用冒号或破折号分隔。前三个字节称为组织唯一标识符(Organizationally Unique Identifier,简称OUI),用于标识设备的制造商;后三个字节是由制造商分配的设备唯一标识符(Device Unique Identifier,简称DUI),用于标识具体的设备。
三、工作原理
  • 在局域网中,当一台计算机需要发送数据帧到另一台计算机时,它首先需要确定目标计算机的MAC地址。计算机会发送一个ARP(地址解析协议)请求到网络上,请求其他设备告知目标设备的MAC地址。
  • 一旦计算机知道了目标设备的MAC地址,它就可以发送数据帧到目标设备。数据帧在网络中传输时,每个设备都会检查数据帧中的目标MAC地址,如果目标地址与自己的MAC地址不一致,就会丢弃该数据帧。

  IP层的组播和广播要蔓延到MAC的组播和广播

广播IP地址
全网广播地址

255.255.255.255

局域网广播地址
/*
	网关地址:192.168.1.1
	子网掩码:255.255.255.0
	段内广播地址:192.168.1.255
*/
/*
	网关地址:192.168.1.1
	子网掩码:255.255.0.0
	段内广播地址:192.168.255.255
*/
 组播IP地址

IP组播地址用于标识一个IP组播组。IANA把D类地址空间分配给组播使用,范围从224.0.0.0到239.255.255.255。

7.4广播与组播实现

广播实现

setsockopt参数
//SOL_SOCKET
#define SO_BROADCAST   0x0020 /* 广播许可 */				
//val = int

组播实现

//IPPROTO_IP
#define IP_ADD_MEMBERSHIP  3	/*加入组播*/
#define IP_DROP_MEMBERSHIP 4	/*退出组播*/
#define IP_MULTICAST_IF    6	/*组播默认网卡选择*/
#define IP_MULTICAST_LOOP  7	/*组播默认回环*/

//val
typedef struct ip_mreq {
    struct in_addr imr_multiaddr; /* IP multicast address of group */
    struct in_addr imr_interface; /* local IP address of interface */
} ip_mreq;

7.5 wireshark抓包验证

 wireshark抓包工具

Wireshark是一款功能强大的网络抓包工具,它通过网络接口捕获网络上的数据包,并对其进行解析和展示,以便用户进行网络问题的诊断和分析。以下是关于Wireshark抓包工具的详细介绍:

一、Wireshark的基本信息
  • 定义:Wireshark是一个网络封包分析软件,能够捕获网络数据包,并尽可能详细地显示网络封包资料。
  • 特点:多协议支持、灵活性、开源免费、跨平台性。
  • 下载与安装:https://www.wireshark.org/download.html

二、Wireshark的工作原理
  1. 数据包捕获:Wireshark通过网络接口捕获网络上的数据包,可以实时监控数据流量,并将其转化成可读的数据格式。
  2. 数据包分析:对捕获的数据包进行解析,包括源位置、目的位置、协议类型等信息,方便用户理解和判断网络通信情况。
  3. 数据包展示:提供直观的图形化界面,将捕获的数据包以列表和流的形式展示,方便用户观察和分析。
三、Wireshark的使用步骤
  1. 启动Wireshark:安装完成后,根据操作系统的不同,通过相应的搜索或命令启动Wireshark。
  2. 选择网络接口:启动后,Wireshark会显示所有可用的网络接口,用户需要选择想要捕获数据包的网络接口。
  3. 开始捕获:点击“开始捕获”按钮,Wireshark会开始捕获数据包。
  4. 分析数据包:捕获到的数据包会在Wireshark的主界面中显示,用户可以通过双击数据包查看其详细信息,并使用过滤器等工具进行进一步分析。
  5. 保存结果:用户可以将捕获到的数据包保存到文件中,以便后续分析或共享。
四、Wireshark的过滤器使用

Wireshark提供了捕获过滤器和显示过滤器两种类型的过滤器,以帮助用户快速定位和分析特定的数据包。

  • 捕获过滤器:在抓取数据包前设置,用于减少捕获的数据量,提高分析效率。例如,可以设置只捕获特定IP地址或端口的数据包。
  • 显示过滤器:在抓取数据包后设置,用于在已捕获的数据包列表中筛选出符合特定条件的数据包。例如,可以筛选出特定协议或包含特定内容的数据包。

 

 wireshark使用方法  

 使用流程

选择网卡->过滤配置 

过滤器使用方法

比较运算符

  eq, ==    Equal
    ne, !=    Not Equal
    gt, >     Greater Than
    lt, <     Less Than
    ge, >=    Greater than or Equal to
    le, <=    Less than or Equal to

协议字段

#以太网过滤
eth.dst eq ff:ff:ff:ff:ff:ff
#IP地址过滤
ip.dst eq 192.168.1.10
ip.src == 192.168.1.1
#TCP过滤
tcp.port == 6666
# UDP过滤
udp.port == 6666
# http过滤
http.request.method == "POST"

 位域操作

# TCP SYN
tcp.flags & 0x02

 逻辑表达式

    and, &&   Logical AND
    or,  ||   Logical OR
    not, !    Logical NOT
   # tcp.port == 80 and ip.src == 192.168.2.1

广播与组播验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值