跟着简叔学的,可以B站搜索 简说linux
loopback设备网卡设备
本地环回接口(或地址),亦称回送地址(loopback address)。真实的网卡设备工作在数据链路层,负责不同网卡设备之间的信号传输和转化。如果ifconfig查看,ens代表着真实的网卡设备,lo代表loopback网卡设备。该网卡设备并不是真实存在的,它存在的意义是什么呢。
lo网卡设将发送队列和接收队列接在了一起,因此上层应用给lo发送了什么,它就给你返回什么。通过这种特殊结构可测试协议栈是否正常工作,当使用命令,数据从应用层转到协议栈最后到lo设备,如果说协议栈功能是ok的,那么数据包从lo发出去后就应该收到正确的回应。1
ping 127.0.0.1 -c l
那么基于lo这种机制,还可以实现不同进程之间的通信,这是一种网络通信。通过不同端口号就可以进行不同进程的通信,就和正常的socket通信一样。
loopback驱动源码
文件路径:/drivers/net/loopback.c
1.入口函数
总的来看,也还是初始化一个device,把自定义的函数挂载到device的函数指针上。然后把这个device拿去注册。
1 |
|
针对上面的:dev->netdev_ops = &loopback_ops;
,就是网络设备固定的一些操作,net_device_ops包含的操作实际上非常多,这里面就实现了4个。如果没有这一步的话,就会使用系统提供的默认的实现,
1 | static const struct net_device_ops loopback_ops = { |
主要就是定义了几个callback
会在调用alloc_netdev
时候注册进来。当上层的应用程序发包的时候协议栈里面的tx_softirq会去处理这些信息,然后调用ndo_start_xmit= loopback_xmit
进行数据分包。另外还有统计功能。