TCP作为面向连接的可靠传输协议,被广泛应用于各种场景,也是在面试时经常被提及的内容。学习了解TCP协议也是学习网络必不可少的一步,作者从个人的角度对TCP的一些知识进行了梳理,也是对学习的一个记录,有不对的地方也欢迎大家进行交流。

TCP的三次握手过程

三次握手过程

TCP的四次挥手过程

四次挥手过程

  • 这里使用golang写的tcp服务端和客户端代码,用wireshark抓包进行验证
  • 服务端代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package main

    import (
    "fmt"
    "net"
    )

    func main() {
    // 监听TCP端口 8080
    listener, err := net.Listen("tcp", "localhost:9999")
    if err != nil {
    fmt.Println("Error listening:", err)
    return
    }
    defer listener.Close()

    fmt.Println("Listening on localhost:8080...")
    for {
    conn, err := listener.Accept()
    if err != nil {
    fmt.Println("Error accepting:", err)
    continue
    }
    go handleConnection(conn)
    }
    }

    func handleConnection(conn net.Conn) {
    defer conn.Close()
    buffer := make([]byte, 512)
    for {
    n, err := conn.Read(buffer)
    if err != nil {
    fmt.Println("Error reading:", err)
    break
    }
    fmt.Println("Read data:", string(buffer[:n]))
    }
    }

  • 客户端代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package main

    import (
    "fmt"
    "net"
    "time"
    )

    func main() {
    tcp, err := net.DialTCP("tcp", nil, &net.TCPAddr{
    IP: net.IPv4(127, 0, 0, 1),
    Port: 9999,
    })
    if err != nil {
    panic(err)
    }
    defer tcp.Close()
    write, err := tcp.Write([]byte("123"))
    fmt.Println(write, err)
    time.Sleep(time.Second * 5)
    }

  • 客户端发送123进行抓包结果如下
    握手与挥手抓包结果

PSH标志的数据内容

我抓包重点要看传输的内容是什么,只要携带PSH标志的那就是携带了传输数据的内容(或者说如上面golang列子的tcp.Write([]byte("123"))内容),如果传输的内容想这种简单的字符串,可以右键追踪流数据以UTF-8格式查看

外链资料

WireShark过滤包的一些指令
浅谈TCP,一文带你搞懂TCP
ASCII查询表