理解什么是DSR,嗅探器视角下的IP和MAC地址识别(C/C++代码实现)

网络嗅探器是监控和分析网络流量的一种工具,它能够捕获数据包并提取出关键的信息,比如IP地址和MAC地址。

网络嗅探器工作原理基于网卡的工作模式。正常情况下,网卡只处理发送给它的数据包,忽略其他数据。但是,如果将网卡设置为“混杂模式”,那么它可以接收到网络上所有的数据包,而不仅仅是发给它的数据包。网络嗅探器就是利用了这一特性来捕获网络上的数据交换。

数据包是网络通信的基本单位,包含了传输数据和控制信息。在数据包中,源IP地址、目标IP地址、源MAC地址和目标MAC地址是关键字段,用于标识数据包的出发点和目的地。以下是这些字段的分析:

  1. MAC地址

MAC地址是硬件地址,通常指网络接口卡(NIC)的地址。它是独一无二的,由6字节(48位)组成,通常表示为12位十六进制数(例如:00:1A:2B:3C:4D:5E)。在数据包中,MAC地址用于在局域网(LAN)中定位设备。

  1. 以太类型

以太类型字段指示了数据包中上层协议的类型。例如,如果此字段的值为0x0800,则表示网络层协议为IPv4;0x0806表示ARP。

  1. IP地址

IP地址是网络层(OSI模型的第三层)的地址,用于在不同网络间路由数据包。每个IP数据包头部包含源IP地址和目标IP地址,各为4字节(32位)长。

  1. 协议

此字段指明了传输层的协议类型。例如,值6表示TCP,值17表示UDP。

当网络嗅探器捕获到数据包后,它会解析出这些关键字段。这允许管理员或安全专家进行进一步的分析,如检测网络中的异常活动、性能问题或安全隐患。

为了更深入地理解这个过程,可以想象一个简单的场景,假设在一个局域网内,一台机器(我们称其为A)想要与另一台机器(称为B)通信。

  1. 机器A知道机器B的IP地址,但不知道其MAC地址。因此,它首先发送一个ARP请求来查询B的MAC地址。

  2. ARP请求被网络嗅探器捕获,嗅探器读取其中的MAC和IP地址信息。

  3. 一旦得到响应,ARP响应也会被嗅探器捕获。此时,嗅探器可以记录B的MAC和IP地址。

  4. 知道了MAC地址后,机器A开始向B发送数据包。这些数据包同样会被嗅探器捕获,嗅探器从中提取出IP和MAC地址信息。

嗅探器工作机制的详细介绍

  1. 混杂模式
    • 嗅探器通过将网卡设置为“混杂模式”,使其能接收通过网络的所有数据包,而不仅仅是发给自己的数据包。
    • 在这种模式下,嗅探器可以全面监控网络流量,从而更全面地了解网络活动情况。
  2. 数据包解析
    • 嗅探器对捕获到的数据包进行解析,提取关键信息如源地址、目标地址、协议类型等,以便后续分析和处理。
    • 解析过程中,嗅探器会还原出IP头、TCP头或UDP头等数据内容,从而得到数据包中的重要信息。
  3. 网络流量分析
    • 通过对捕获的数据包进行深入分析和统计,嗅探器可以检测异常流量、识别网络攻击、监测网络性能等。
    • 这些分析结果为网络管理和安全提供重要参考,帮助发现并解决潜在问题。
  4. 数据包抓取
    • 嗅探器采用多种技术和策略来确保能抓到所需的数据包,例如黑白名单过滤、持续抓包和确认应答技术。
    • 这些技术帮助嗅探器在复杂的网络环境中有效工作,提高抓包的准确性和效率。
  5. 数据包解析
    • 对于已捕获的数据包,嗅探器通过解码压缩、数据包分割、标识符过滤和重组数据包等多种解包技术进行解析。
    • 这些技术帮助嗅探器从数据包中提取有用信息,并对数据进行深入分析。

DSR 的工作原理、主要特点、应用场景以及优缺点

Direct Server Return (DSR) 是一种网络通信优化技术,主要用于改善数据中心的网络性能和减少延迟。DSR 通过允许服务器直接响应客户端的请求,跳过不必要的网络跳转,从而提高数据传输效率。这项技术在处理大规模、高流量的网络环境中尤其有效,例如在 Kubernetes 集群或负载均衡器配置中。

  1. 工作原理
    • 传统模式下的工作方式:在传统的网络架构中,一个来自客户端的请求先到达服务器节点,如果该请求的处理服务器不在同一节点上,请求会被重定向到另一个节点。这种重定向通常会导致额外的网络跳转,增加延迟并降低效率。
    • DSR 模式下的工作方式:启用 DSR 后,请求仍然首先到达入口节点,但处理请求的服务器直接向客户端返回数据,不再经过入口节点。这样可以减少一跳,从而减少延迟和提高数据传输速度。
    • 保持源 IP 地址:在 DSR 模式下,由于避免了额外的跳转,因此可以保持客户端的源 IP 地址不变。这对于某些需要IP透明性的应用场景(如某些安全监控和日志记录)非常重要。
  2. 主要特点
    • 减少延迟:由于避免了网络中的额外跳转,DSR 显著减少了数据传输的延迟。这对于延迟敏感的应用(如在线游戏、实时视频会议等)尤其重要。
    • 提高效率:DSR 通过优化数据传输路径,提高了网络资源的利用效率。这不仅提高了单个请求的响应速度,还有助于整个网络环境的负载均衡和管理。
    • 增强安全性:保持源 IP 地址不变有助于实现更安全的网络监控和审计。因为源 IP 地址的真实性得到了保证,安全人员可以更准确地追踪和防范潜在的网络攻击。
  3. 应用场景
    • 数据中心:在大规模的数据中心环境中,DSR 能够显著优化跨服务器的通信效率,减少因数据包多次转发引起的延迟。
    • 云服务:对于提供云服务的平台,DSR 可以提高云内部处理的效率,特别是在处理大流量和高并发请求时。
    • 负载均衡器:结合负载均衡器的使用,DSR 可以在多个服务器之间智能分配请求,同时确保每个请求都能获得最优的响应路径。
  4. 优缺点
    • 优点
      • 减少延迟:通过跳过入口处的再次转发,直接从服务器返回响应给客户端,可以显著减少请求的响应时间。
      • 提高效率:优化了数据传输路径,使网络资源的利用率更高,从而提高整体网络效率。
      • 保持源 IP 地址:有助于进行更真实的网络监控和安全防护,因为通信的源 IP 地址不会被改变。
      • 负载均衡效果提升:可以在复杂的负载均衡场景中更高效地分配请求,避免单点过载。
    • 缺点
      • 兼容性问题:在某些特定的网络环境下(如使用 VXLAN 模式),可能无法使用 DSR。
      • 配置复杂性:尽管能带来许多好处,但 DSR 的配置和使用比传统模式更复杂,需要更多的网络知识和配置工作。
      • 受限于供应商及平台:某些公共云提供商的环境可能需要特别配置才能正常使用 DSR。
  5. 案例分析
    • Cilium DSR 模式配置:从 Cilium 1.7 版本开始,引入了基于 eBPF 的 DSR 模式,加速南北向流量的通信效率,并且能够保留客户端源 IP 特性。这种模式通过绕过不必要的网络跳转,大幅度提升了数据处理速度。
    • F5 LTM+CentOS 配置:通过对 F5 LTM(本地流量管理器)结合 CentOS 进行 DSR 配置,可以实现高效的负载均衡和网络性能优化。这种配置不仅提高了网络的吞吐能力,还增强了系统的灵活性和可扩展性。
char *ansi_color (char *str, unsigned int color, unsigned int bold);
void signal_handler(int signo);
unsigned short in_cksum(const u_short *addr, int len, u_short csum);
int send_icmp(char *host);
char *find_macaddr(char *host);
char *inet_ntoa64(struct in_addr ina);
void sniff_callback(u_char *user_arg, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data);
void sniff_packet_ipmac(const u_char *pkt_data);
void sniff_packet_verbose(const u_char *pkt_data);

int main(int argc, char **argv)
{
...

    if (argc == 1) usage(argv[0]);

    memset(filter_exp, 0x00, sizeof(filter_exp));

    while ( (opt = getopt(argc, argv, "hc:i:vnm:")) != -1 ) {
        switch(opt) {
            case 'c' :
                loop_counter = atoi(optarg);
                break;
            case 'i' :
                device = optarg;
                break;
            case 'v' :
                user_arg = 0x01;
                break;
            case 'n' :
                ansi_flag = 0;
                user_arg = 0x02;
                break;
            case 'm' :
                printf("%s's mac address is %s\n", optarg, ansi_color(find_macaddr(optarg), GREEN, UNBOLD));
                exit(EXIT_SUCCESS);
            case '?' :
                usage(argv[0]);
            default :
                usage(argv[0]);
        }

        if (argc > optind) {
            strncpy(filter_exp, argv[optind], strlen(argv[optind])+1);
        } else {
            usage(argv[0]);
        }
    }

    if (!filter_exp[0]) {
        strncpy(filter_exp, argv[1], strlen(argv[1])+1);
    }

    memset(errbuf, 0x00, sizeof(errbuf));

    /* 如果未在命令行上指定,请查找捕获设备 */
    device =  (device == NULL) ? pcap_lookupdev(errbuf) : device;
    if (device == NULL) {
        fprintf(stderr, "pcap_lookupdev : %s\n", errbuf);
        exit(EXIT_FAILURE);
    }

    /* 获取与捕获设备关联的网络号码和掩码 */
    if (pcap_lookupnet(device, &netp, &maskp, errbuf) == -1) {
        fprintf(stderr, "pcap_lookupnet : %s\n", errbuf);
        exit(EXIT_FAILURE);
    }

    p = pcap_open_live(device, SNAPLEN, PROMISC, TO_MS, errbuf);
    if (p == NULL) {
        fprintf(stderr, "pcap_open_live(): %s\n", errbuf);
        exit(EXIT_FAILURE);
    }

    /* 确保我们在以太网设备上进行捕获[2] */
    if (pcap_datalink(p) != DLT_EN10MB) {
        fprintf(stderr, "pcap_datalink(): %s is not an Ethernet\n", device);
        exit(EXIT_FAILURE);
    }

    /* 编译筛选器表达式 */
    if (pcap_compile(p, &fp, filter_exp, 0, netp) == -1) {
        fprintf(stderr, "pcap_compile(): %s: %s\n", filter_exp, pcap_geterr(p));
        exit(EXIT_FAILURE);
    }

    /* 应用已编译的筛选器 */
    if (pcap_setfilter(p, &fp) == -1) {
        fprintf(stderr, "pcap_setfilter():  %s: %s\n", filter_exp, pcap_geterr(p));
        exit(EXIT_FAILURE);
    }

    printf("# Interface: %s\n\n", device);
    if (!user_arg) {
        printf("%-43s%s\n", "SOURCE", "DESTINATION");
    }

    /* 设置回调函数 */
    pcap_loop(p, loop_counter, sniff_callback, &user_arg);

    pcap_freecode(&fp);
    pcap_close(p);

    return(EXIT_SUCCESS);
}

运行结果:




If you need the complete source code, please add the WeChat number (c17865354792)

总结

Direct Server Return (DSR) 是一项强大的网络通信优化技术,它通过减少不必要的网络跳转来显著降低延迟并提高效率。

网络嗅探器通过监听网络上的数据包并解析它们来捕获IP和MAC地址。这一过程对于网络调试、性能分析及安全监控等方面极为重要,也有助于揭示网络通信的基本工作机制。

We also undertake the development of program requirements here. If necessary, please follow the WeChat official account 【程序猿编码】and contact me

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值