Linux系统的回环测试接口是,回环接口(loopback)

1 引子

最近搭建web集群环境,采用了LVS+Keepalived+Nginx+Tomcat的框架。在Realserver端需要用到回环接口(loopbak)。这里就简单介绍一下Linux和windows下的回环接口。

2介绍

Loopback接口是虚拟接口,是一种纯软件性质的虚拟接口。任何送到该接口的网络数据报文都会被认为是送往设备自身的。大多数平台都支持使用这种接口来模拟真正的接口。这样做的好处是虚拟接口不会像物理接口那样因为各种因素的影响而导致接口被关闭。事实上,将Loopback接口和其他物理接口相比较,可以发现Loopback接口有以下几条优点:

1.       Loopback接口状态永远是up的,即使没有配置地址。这是它的一个非常重要的特性。

2.       Loopback接口可以配置地址,而且可以配置全1的掩码,可以节省宝贵的地址空间。

3.       Loopback接口不能封装任何链路层协议。

IP协议中的loopback地址。RFC2606中明确指出了loopback地址的标准域名为localhost。在IPv4中,其对应的IP地址一直是127.0.0.1;理论上,整个127IP段(127.0.0.0~127.255.255.255)的IP地址都为loopback地址,与localhost对应。在IPv6中,localhost对应的IP地址为0:0:0:0:0:0:0:1,一般写作::1。

在网络设备中,loopback被用来代表某些用于管理目的的虚拟接口,其含义并没有"回环"的意思。loopback虚拟接口会分配到一个IP地址,但是这个IP地址不会对应到实际的物理接口。网络设备中的loopback地址主要用于管理目的,例如设备发出的报警。网络设备中的应用程序(管理程序)使用loopback地址发送可接收数据流,而不是使用实际物理接口的地址。对外部来说,直接使用loopback地址来查看设备对应的信息(如报警信息),与网卡的物理地址无关。。我们也可以把这种地址理解为网络设备提供的服务的地址。

在通信领域,loopback可以用作将接收到的信号或数据直接返回给发送者的测试方法。作为一种测试方法,很多通信设备都可以配置端口的数据发送模式(例如all ones模式),来检测同一个端口上的信号接收。这种测试也叫"回环测试"。

3 Linux下的loopback

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 程序,用于进行 CAN 和 CAN FD 的回环测试: ``` #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <signal.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/can.h> #include <linux/can/raw.h> int s; void sigterm(int signo) { (void)signo; close(s); exit(0); } int main(int argc, char **argv) { struct can_frame frame; struct sockaddr_can addr; struct ifreq ifr; struct canfd_frame frame_fd; struct sockaddr_can addr_fd; struct ifreq ifr_fd; int nbytes; unsigned int can_id = 0x123; int i; if (argc == 2) { s = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (s < 0) { perror("socket PF_CAN failed"); return 1; } strcpy(ifr.ifr_name, argv[1]); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind failed"); return 1; } while(1) { nbytes = read(s, &frame, sizeof(struct can_frame)); if (nbytes < 0) { perror("Read"); return 1; } printf("CAN ID: 0x%X DLC: %d Data: ", frame.can_id, frame.can_dlc); for (i = 0; i < frame.can_dlc; i++) printf("%02X ", frame.data[i]); printf("\n"); frame.can_id &= CAN_EFF_MASK; frame.can_id |= CAN_EFF_FLAG; write(s, &frame, sizeof(struct can_frame)); } } else if (argc == 3) { s = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (s < 0) { perror("socket PF_CAN failed"); return 1; } strcpy(ifr.ifr_name, argv[1]); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind failed"); return 1; } s = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (s < 0) { perror("socket PF_CAN failed"); return 1; } strcpy(ifr_fd.ifr_name, argv[2]); ioctl(s, SIOCGIFINDEX, &ifr_fd); addr_fd.can_family = AF_CAN; addr_fd.can_ifindex = ifr_fd.ifr_ifindex; if (bind(s, (struct sockaddr *)&addr_fd, sizeof(addr_fd)) < 0) { perror("bind failed"); return 1; } while(1) { nbytes = read(s, &frame_fd, sizeof(struct canfd_frame)); if (nbytes < 0) { perror("Read"); return 1; } printf("CAN ID: 0x%X DLC: %d Data: ", frame_fd.can_id, frame_fd.len); for (i = 0; i < frame_fd.len; i++) printf("%02X ", frame_fd.data[i]); printf("\n"); frame_fd.can_id &= CAN_EFF_MASK; frame_fd.can_id |= CAN_EFF_FLAG; write(s, &frame_fd, sizeof(struct canfd_frame)); } } else { printf("Usage: %s <interface> or %s <interface> <canfd-interface>\n", argv[0], argv[0]); return 1; } return 0; } ``` 使用方法: 1. 单独使用 CAN: ``` $ ./can_loopback can0 ``` 将 can0 接口连接在回环模式下。程序将读取每个收到的帧并将其发送回去。 2. 使用 CAN 和 CAN FD: ``` $ ./can_loopback can0 can1 ``` 将 can0 接口连接到 CAN FD 节点 can1。程序将读取每个收到的 CAN FD 帧并将其发送回去。 注意:使用此程序需要 root 权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值