xiaohanliang
OS
OS
  • hi
  • PROCESS
    • 0. 你的程序是怎么用内存的
    • 1. 为什么内存要区分堆与栈
    • 2. 什么叫你的程序
    • 3. 搞玄学?看看进程切换
    • 4. 进程是怎样调度的
    • 5. 理解进程线程有啥用
    • 6. 没有人真正见过的进程通信
    • 7. [WIP]mutex的起源CAS
    • 8. [WIP]mutex的下一步信号量
    • 9. [WIP]如何人为制造死锁
    • 10. 怎么什么东西都是fd
    • 11. IO各种模型
    • 12. Epoll内部是怎么工作的
  • NETWORK DEVICES
    • 1. 一个新的namesapce
    • 2. veth对讲机
    • 3. 如何靠网桥连接对讲机
    • 4. 左耳进右耳出的tun设备
    • 5. 如何用iptables改包头
    • 6. 在ip报头上再包个头
    • 7.如何用vxlan隧道分割局域网
    • 8. 通过多播组的方式获取mac
    • 9. 自动维护的fdb/arp表
    • 10. [WIP]macvlan网卡
Powered by GitBook
On this page
  • introduction
  • 传统的socket是怎么玩的
  • 那么tun是怎么玩的

Was this helpful?

  1. NETWORK DEVICES

4. 左耳进右耳出的tun设备

introduction

tun/tap提供了一种用于发消息的新玩法. 假设你现在想要发一条tcp消息, 传统的玩法是创建一个socket, 然后通过折腾这个socket来达到发消息的目的. 但是tun/tap的玩法是你先往一个文件里写, 然后t/t进程从这个文件里读出这条消息以后再发到物理链路里去.

但为什么要折腾这一下呢?

这里面可以拿出来玩的点在于t/t进程是怎么发的, 发给谁的, 比如你, 想发消息给youtube.com, 然后请求内容进了t/t进程, t/t会不会直接发给yt? 不见得会, 如果经过合理配置, t/t不会那么老老实实, 而是可以发给另一个人. 这像什么? 是不是很像你的VPN?

听懂了吗? 你以为你是发消息给1.2.3.4, 但如果这个包真的丢到物理链路上去了, 是没有人知道1.2.3.4在哪儿的, 于是t/t把这条消息先发给2.3.4.5, 这个人知道1.2.3.4是谁, 然后他帮你转发过去, 这像什么? 是不是很像容器通信? 你以为你给容器发消息呢, 其实网上没有人知道这个容器IP到底是谁, 于是t/t帮你先发给宿主机, 然后宿主机转发给下辖的容器, 不错, 这正是flannel的玩法

传统的socket是怎么玩的

我觉得有必要先介绍一下传统socket是怎么玩的, 某App现在想要向网络中发送一条消息, 于是他先创建了一个socket, 然后他通过socket调用实现用户态&内核态的数据交互, 接下来这条消息会进网络协议栈, 继而通过eth0网卡发到网上. 这个过程, 就是我们所说的: "普通网卡通过网线收发数据包" (顺着网线来打我)

那么tun是怎么玩的

tun设备你要知道他本身没有任何发信息的能力, 他只有一层拦截&修改消息的能力, 我们回到上面的例子中, 这个App想要发消息给1.2.3.4, 于是他通过Socket API发消息:

  • 协议栈收到这条消息以后判定这条消息应该从tun0设备发出, 消息发给了tun0

  • /dev/tun0 收到了这条消息以后, 发现某个VPN程序已经将这个文件打开了, 于是将消息发送给VPN, 这个时候消息已经出内核态了

  • VPN程序, 将目标IP修改成2.3.4.5后, 将这个消息通过Socket API发到协议栈里, 通过eth0网卡发出

你看到了吗? 他本身并不发任何消息, 他只负责将要发送的包, 转发给某个中间程序, 最后说到底还是要通过Socket发出去的.

Previous3. 如何靠网桥连接对讲机Next5. 如何用iptables改包头

Last updated 4 years ago

Was this helpful?