Linux netns 详解

上周 搞了个实验。
关于netns。

Linux内核提供的工具。
实现网络隔离。
在单个主机上创建多个独立网络环境。

每个环境有自己协议栈。
网络接口、路由表、iptables规则。
Docker就用这个。

先构建拓扑。
宿主机上加两个tap设备。
配置IP信息。

创建两个netns。
把tap设备移到对应netns里。

宿主机上ping 1 0.0.0.1 测试tap0连通性。
宿主机上ping 1 0.0.0.2 测试tap1 连通性。

用命令测试。
ip netns exec ns0 ping 1 0.0.0.2 ip netns exec ns1 ping 1 0.0.0.1
发现点问题。
宿主机ping netns内设备不行。
但netns内互相访问也不行。

因为移动接口时状态重置。
在不同netns间移动虚拟网卡。
接口状态被重置。

解决方法。
重启设备。
重新配置IP地址。

测试本地网络正常。
再测netns间连通性。
还是没回复包。
证实netns成功隔离。

简单用ping测试。
实际上功能更多。
改路由表、防火墙规则。
不影响其他netns或宿主机。

有兴趣的可以自己探索。

接下来学vethpair。
连接两个netns。
实现隔离网络间通信。
下一节深入讲这个主题。

算了。

动手实验+源码分析,彻底弄懂 Linux 网络命名空间

哎哟喂,你这写的也太系统了吧!直接像大学论文一样,结构清晰,步骤明确。
不过咱们这可不是写论文,是聊天对吧?得来点生活气息,不然看着都累。

我上次在搞一个容器环境的时候,就接触过这个网络命名空间。
说实话,一开始是真没太搞懂,感觉这玩意儿挺绕的。
后来硬着头皮去捣鼓,才慢慢有点感觉。

你看你说的,先动手实验。
用 ip netns add ns1 创建个名字叫 ns1 的网络空间,然后 ip netns exec ns1 ip link 进去一看,就一个 lo 回环接口,跟个小孩子没长毛似的。
接着搞对 veth 设备,veth0 在外面,veth1 在 ns1 里面。
这俩玩意儿特别有意思,就像俩小伙伴穿了一条裤子,屁股尿尿都沾一块儿。
在外面给 veth0 分配个 IP,比如 1 9 2 .1 6 8 .1 .1 /2 4 ,然后在 ns1 里面给 veth1 分配个 1 9 2 .1 6 8 .1 .2 /2 4 ,再把俩都启动了。
这时候你试试从外面 ping 1 9 2 .1 6 8 .1 .2 ,能 ping 通就说明玩明白了!这感觉,就像隔着一堵墙跟隔壁老王聊天,居然能听到。
最后清理的时候,ip netns del ns1 ,ip link delete veth0,搞定!
然后你再去看源码。
struct net 这个结构体,简直就是网络世界的皇帝,管着路由表、防火墙规则、网卡的。
每个网络空间都有自己的 struct net,互不干扰。
创建网络空间的时候,内核会调用 clone() 系统调用,带上 CLONE_NEWNET 标志位。
内核里头有一堆复杂的操作,啥 copy_net_ns()、create_new_namespaces(),反正最后就是创建一个新的 struct net,并且把默认的 lo 设备啥的都配好。
这过程,比给我找对象还复杂。

你看 dev_net() 这个宏,就是个钩子,告诉你哪个网卡属于哪个网络空间。
注册设备的时候,内核会自动帮你把关系对上。
veth 设备的通信,内核处理起来贼简单,就俩设备直接数据拷贝,中间不经过什么复杂算法,直接扔给对面的设备就行。
这效率,比我早上抢早餐还快。

所以你看,这玩意儿吧,实验搞明白了,再看源码就清晰多了。
源码里头那些函数名、宏定义,都跟你动手实验对应得上。
比如你用 ip link set veth1 netns ns1 ,内核内部就是通过修改 veth1 ->nd_net 指针,让它指向 ns1 的 struct net。
这过程,比调戏对象还细腻。

总的来说,网络命名空间这东西,实验是基础,源码是加深理解。
你把这两方面结合起来,肯定能搞得很明白。
不过话说回来,这玩意儿真不是闹着玩的,得有耐心。
你真要是有啥问题,或者想搞具体某个细节,随时问我,我把我踩过的坑跟你唠唠。

Linux网络协议之套接字及分层模型

Linux网络协议关键在套接字和分层,四层模型,TCP/IP核心。
内核文件在/net,分层设计,灵活。
数据传输涉及首部,IP和TCP关键。
套接字在BSD,格式转换函数如inet_pton。
网络栈用户空间、协议栈、硬件层,协议栈是核心。
设计灵活,性能高。
套接字缓冲区管理关键,sk_buff_head等结构。
高效传输和灵活应用靠这套机制,内核设计精细,保证网络功能。

Linux网络包收发要经历几次数据拷贝?深度解析TCP传输的奥秘!

Linux TCP数据收发,简单来说就是三步拷贝:发送一次,接收两次。

发送时,用户数据从应用层传到内核层,然后网卡DMA发出去。
接收时,网卡直接传内核,内核再传给应用层。

减少拷贝有几种方法,比如零拷贝、内核旁路技术等。
这能提高效率,尤其在服务器和需要低延迟的应用中。

开发者了解这个,能更好地优化网络传输,降低延迟,提高性能。