mir*_*tod 10 sockets network-programming tcp go
我正在尝试成功建立 TCP 3 向握手。
\n我希望能够控制 IP 层,最好使用github.com/google/gopacket。
这是我的 Go 程序:
\npackage main\n\nimport (\n "fmt"\n "log"\n "net"\n\n "github.com/google/gopacket"\n "github.com/google/gopacket/layers"\n "golang.org/x/net/ipv4"\n)\n\nfunc main() {\n proto := layers.IPProtocolTCP\n\n c, err := net.ListenPacket(fmt.Sprintf("ip4:%d", proto), "127.0.0.1")\n if err != nil {\n log.Fatal(err)\n }\n defer c.Close()\n\n iprawconn, err := ipv4.NewRawConn(c)\n if err != nil {\n log.Fatal(err)\n }\n\n tcp := layers.TCP{\n SrcPort: 43124,\n DstPort: 2222,\n SYN: true,\n ACK: false,\n Window: 65535,\n Seq: 231,\n }\n // payload := []byte{\'a\', \'b\', \'c\', \'\\n\'}\n options := gopacket.SerializeOptions{\n // ComputeChecksums: true,\n FixLengths: true,\n }\n buffer := gopacket.NewSerializeBuffer()\n err = gopacket.SerializeLayers(buffer, options,\n &tcp,\n // gopacket.Payload(payload),\n )\n if err != nil {\n fmt.Printf("[-] Serialize error: %s\\n", err.Error())\n return\n }\n b := buffer.Bytes()\n fmt.Println(b)\n\n h := &ipv4.Header{\n Version: ipv4.Version,\n Len: ipv4.HeaderLen,\n TotalLen: ipv4.HeaderLen + len(b),\n // ID: 12345,\n Protocol: int(proto),\n // Src: net.ParseIP("192.168.25.1").To4(),\n Dst: net.ParseIP("127.0.0.1").To4(),\n TTL: 64,\n }\n\n if err := iprawconn.WriteTo(h, b, nil); err != nil {\n log.Println(err)\n }\n\n buf := make([]byte, 1024)\n for {\n _, p, _, err := iprawconn.ReadFrom(buf)\n if err != nil {\n fmt.Printf("Error reading: %#v\\n", err)\n return\n }\n fmt.Printf("Message received: %s\\n", string(p))\n fmt.Printf("Message received: %s\\n", string(buf))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我在用着nc -vvln 2222听。
运行我的程序看起来像iprawconn.ReadFrom(buf)从未从服务器读取回复(SYN+ACK)。
\xe2\x9e\x9c send_packet sudo go run main.go\nPassword:\n[168 116 8 174 0 0 0 231 0 0 0 0 80 2 255 255 0 0 0 0]\n\n\nRun Code Online (Sandbox Code Playgroud)\n使用 Wireshark,我看到我的客户端使用 RST 进行回复:\n
我究竟做错了什么?
\n谢谢!