TCP协议
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
40package 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
22package 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
格式查看
外链资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 博客!