“一切皆文件“ 视角下的网卡

表象上看,网卡上面摞着一个 TCP/IP 协议栈,而 TCP/IP 是多路复用的。inet socket 就是多路复用版的网卡文件描述符。创建像 /dev/sda 一样的设备文件 /dev/eth0 读写网卡不难,像 /dev/net/tun 注册物理网卡就行,但你读写它时要自己手工做协议的封装和解封装。

涉及到通信和存储可再多说一点。

存储和通信的共同特征是 “写入的目的是读出”,不同点在于存储是同一套程序在同一个地方读写,而通信则相反。不同于存储自己写自己读,通信是写给对端读的,这就需要协议而不仅仅是一套 “格式”。
在网卡之上必须要摞一套协议。

/dev/sda 可以通过任何一个程序以任意方式读写,定义一套任意的私有格式(或文件系统)即可,而 /dev/eth0 则必须和对端共同遵守一套格式和逻辑,这同一套格式和逻辑就是 TCP/IP,将 TCP/IP 汇聚于系统本身或共享库中最直接,这取消了直接读写网卡的需求,而调用系统或共享库中协议例程的接口就是 socket。

不是网卡不能是文件,是太麻烦,没必要。但如果不涉及协议操作的纯转发,网卡完全可以作为文件来读写:

while (true) {
    read("/dev/eth0", buffer, &size);
    write("/dev/eth1", buffer, size);
}

大致就是这个意思。

浙江温州皮鞋湿,下雨进水不会胖。

你可能感兴趣的:(网络,服务器,运维)