title: go实现tcp/ip协议协议-1 环境搭建 date: 2022-04-02 01:15:19 tags: tcp categories: tcp toc: true
实现用户态协议的意义
1: 最开始学习tcp协议,网上找了很多教程,学完又忘,就想自己实现一遍便于深入理解网络协议栈
2: c10k->c10m(netmap,dpdk)的发展,会需要我们自己实现用户态协议
3: 微内核兴起,网络协议的改变,需要我们自己实现用户态协议
环境搭建
1:tap/tun 后续文章基于该方法实现tcp/ip协议
2:netmap 零拷贝方式
3:dpdk+vpp方式
具体代码如下,go版本(go version go1.17.8 linux/amd64),
运行后输入ip addr即可看到我们创建的虚拟网卡,tap/tun为两种模式,tap为网卡模式
tap获取到的数据包包含以太网协议,tun读到的数据包从ip协议开始,看到tun0了后以及添加上了对应的路由地址 代表环境正常了

package main
import (
"fmt"
"github.com/songgao/water"
"log"
"os"
"os/exec"
)
const (
MTU = "1504"
)
func main() {
iface, err := water.New(water.Config{
DeviceType: water.TUN, //创建tun虚拟网卡
})
if err != nil {
panic(err)
}
log.Printf("tun interface: %s", iface.Name())
runBin("/bin/ip", "link", "set", "dev", iface.Name(), "mtu", MTU)
runBin("/bin/ip", "addr", "add", "192.168.2.0/24", "dev", iface.Name())
runBin("/bin/ip", "link", "set", "dev", iface.Name(), "up")
}
func runBin(bin string, args ...string) {
cmd := exec.Command(bin, args...)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
if err := cmd.Run(); err != nil {
panic(err)
}
}