前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器常用虚拟网络接口之一,veth

容器常用虚拟网络接口之一,veth

作者头像
glinuxer
发布2019-04-10 11:04:00
3.4K0
发布2019-04-10 11:04:00
举报
文章被收录于专栏:专注网络研发专注网络研发

现在容器已经得到了广泛使用,用于实现轻量级的虚拟化,资源的隔离等。Docker则是目前应用最广泛的容器实现。而Docker的实现,依赖于Linux上的基础功能namespace,以及诸多虚拟网络接口。这次,我将把Linux上常用的虚拟网络接口都介绍一下。第一回是最简单的veth。

先说说什么是虚拟网络接口。与之对应的是真实的物理网络接口,即真实的网卡。而虚拟网络接口,则是没有实际的物理设备,而是通过软件“模拟”的网络接口。对于内核的来说,只要实现了net_device规定的几个必要接口,并且成功调用register_netdevice注册了该netdev,则内核就会认为这个netdev是一个网络接口。至于怎么能不能接收或者发送数据包,就看你自己个儿的了:)

其实虚拟网络接口没有那么神秘,vlan,bridge等,都是虚拟网络接口。

真实的网络接口连在实际的物理链路上,自然有正常的收发报文,并且一般通过中断进行通知。而对于虚拟接口来说,内核也早已设计好了框架,只要进行适当的接口调用,内核就会把数据包传递给你创建的虚拟接口。这里引用之前画的skb在内核的flow图的一个片断。

红色方框就是两个虚拟网络接口常用的“介入”数据包接收的两种手段,其中netdev_rx_handler_register是目前新虚拟接口常用的方式。通过向真实物理网卡注册一个rx_handler回调函数,当该网卡收到数据包时,会将skb传递给这个rx_handler进行处理。

现在进入今天的主题,veth,其全称是Virtual Ethernet Cable,这里需要注意的是最后有个Cable。这个Cable强调了veth并不是一个ethernet,而是一个cable。你可以将其想象成一个虚拟网线直连了两个ethernet网卡,其功能也是用于穿透两个namespace,进行双向通信,而不是当作ethernet网卡使用。

首先看看veth的使用示例,先创建一个namespace

现在已经建好了linuxerpub的namespace。

作为新建的ns,linuxerpub只有一个lo接口。为了打通与linuxerpub的通信,就可以使用最简单的veth了 —— 用虚拟的网线连接两个ns。使用命令:

ip link add veth0 type veth peer name veth1

创建两个veth虚拟接口。

这时就有了两个新的网络接口veth0和veth1。

为了节省空间,我把连续执行的命令只截了一个图。

  1. ip link set veth1 netns linuxerpub:将veth1分给linuxerpub;
  2. ip netns exec linuxerpub ip link list:显示linuxerpub下的链路信息,veth1已经存在于linuxerpub中了;
  3. ip netns exec linuxerpub ifconfig veth1 10.10.1.2/24 up:设置linuxpub的veth1的IP且让其up起来;
  4. ifconfig veth0 10.10.1.1/24 up:设置当前ns的veth0的IP且让其up起来;
  5. ping 10.10.1.2:从当前ns ping linuxerpub的veth1,已经可以ping通;

这样,通过最简单的虚拟接口veth就把两个ns用网络连接起来了。

上面是veth的使用示例,其源码实现也比较简单。以关键的发送数据包的代码为例:

代码相当简单,因为veth都是以“对”的形式存在。所以先通过当前veth的dev,获取到对端的veth,即这里的rcv,然后调用dev_forward_skb将当前skb转发给rcv这个netdev。

当__dev_forward_skb返回成功(做些检查),就调用netif_rx_internal进入内核收包的流程。也就是说,这是skb已经从发送转为了接收阶段。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LinuxerPub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档