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 心跳及超时机制实现
心跳机制
定义与目的:
心跳机制是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道自己仍然在线,以确保连接的有效性的机制。这种机制主要用于长连接的保活和断线处理,通过定期发送心跳包来检测对方是否仍然在线,从而避免因网络故障或节点故障导致的连接中断。
实现方式:
- 客户端发起心跳:客户端每隔一段时间发送心跳包给服务器,如果服务器在一定时间内没有收到客户端的心跳包,则认为客户端可能已经断开连接,进而采取相应的处理措施,如关闭连接、释放资源等。
- 服务器发起心跳:服务器也可以设置超时机制,主动向客户端发送心跳包,并等待客户端的应答。如果客户端未在规定时间内返回应答包,服务器将认为客户端异常,关闭与客户端的连接。
应用场景:
心跳机制广泛应用于需要保持长连接的场景,如即时通讯软件、在线游戏、远程桌面控制等。这些场景需要实时检测连接的存活状态,以确保数据的正常传输和用户的良好体验。
超时机制
定义与目的:
超时机制是指在网络通信或系统调用中,如果某个操作(如发送数据、接收数据、远程服务调用等)在预定时间内没有完成,则触发超时处理逻辑,以避免系统资源被长时间占用或导致死锁等问题。
分类:
- 连接超时(Connection Timeout):在网络通信中,如果建立连接的时间超过了预定时间,则认为是连接超时。此时,系统会放弃建立连接,并返回错误信息给调用者。
- 读取超时(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的工作原理
- 数据包捕获:Wireshark通过网络接口捕获网络上的数据包,可以实时监控数据流量,并将其转化成可读的数据格式。
- 数据包分析:对捕获的数据包进行解析,包括源位置、目的位置、协议类型等信息,方便用户理解和判断网络通信情况。
- 数据包展示:提供直观的图形化界面,将捕获的数据包以列表和流的形式展示,方便用户观察和分析。
三、Wireshark的使用步骤
- 启动Wireshark:安装完成后,根据操作系统的不同,通过相应的搜索或命令启动Wireshark。
- 选择网络接口:启动后,Wireshark会显示所有可用的网络接口,用户需要选择想要捕获数据包的网络接口。
- 开始捕获:点击“开始捕获”按钮,Wireshark会开始捕获数据包。
- 分析数据包:捕获到的数据包会在Wireshark的主界面中显示,用户可以通过双击数据包查看其详细信息,并使用过滤器等工具进行进一步分析。
- 保存结果:用户可以将捕获到的数据包保存到文件中,以便后续分析或共享。
四、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