循序渐进搞懂 TCP 三次握手核心 - YahuiAn
source link: https://www.cnblogs.com/yahuian/p/tcp-three-way-handshake-core.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
循序渐进搞懂 TCP 三次握手核心
本文旨在通过形象的例子和实操,把无形的、虚拟的网络转为具体的、可视化的。带领网络小白一步步的掌握 TCP 三次握手核心知识点,为后续深入学习 TCP 协议打基础。
如下图所示,小明(客户端)给小美(服务端)打电话,在经过互相询问和应答,确认通信畅通后,才开始愉快地聊天。(本例子不一定无懈可击主要是意会即可)
一个 TCP 报文段分为首部和数据两部分,TCP 所有的功能都体现在首部的各个字段中。
序列号:本报文段所发送数据的第一个字节的序号,在建立连接时会随机生成初始序列号 ISN(Inital Sequence Number)。
确认号:下一次应该收到的数据的序列号,若确认号为 N,则代表到序列号 N-1 为止的数据都已经正确收到。
-
ACK:为 1 时确认号才生效,在建立连接后所有传送的报文段 ACK 均为 1。
-
SYN:为 1 时表示这是连接请求(SYN=1,ACK=0)或者连接接受(SYN=1,ACK=1)报文。
由于上述报文都未携带数据,即 len=0,所以响应的 ack 等于请求的 seq+1。
为了抓到比较纯净的包,我们实现一个简单的 TCP Server,接受客户端的请求并回复。
func main() {
// 监听端口
l, err := net.Listen("tcp", "0.0.0.0:8080")
if err != nil {
panic(err)
}
defer l.Close()
for {
// 接受连接
conn, err := l.Accept()
if err != nil {
log.Printf("accept err: %s\n", err)
continue
}
go hello(conn)
}
}
func hello(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 1024)
// 读数据
if _, err := conn.Read(buf); err != nil {
log.Printf("conn read err: %s\n", err)
return
}
log.Printf("%s\n", string(buf))
// 写数据
if _, err := conn.Write([]byte("hello, xiao ming.\n")); err != nil {
log.Printf("conn write err: %s\n", err)
return
}
}
客户端请求:
echo -n "hello, xiao mei." | nc 81.68.197.93 8080
使用 wireshark 分析(统计 - 流量图)可以清楚的看到三次握手的过程。
同时也能看到 seq 和 ack 的关系,在握手成功后发送了 len=16 的包后,然后 ack=17 表示序列号在 16 之前的数据都已经正确收到。
注意:ISN 是一个随机数,并不为 0,wrieshark 为了显示更友好,使用了相对序号,在鼠标右键选项中取消即可看到真正的序列号,如:Seq=3503481500。
TCP 所谓的面向连接本质就是客户端和服务端的数据结构都各自维护了一个”连接状态“,三次握手期间状态变化如下:
LISTEN:服务端主动监听一个端口,等待客户端的连接请求
SYN-SENT:发送 SYN 包后的状态
SYN-RECEIVED:收到 SYN 包,且发送了 SYN+ACK 包后的状态
ESTABLISHED:连接建立成功
# 使用 netstat 命令查看当前系统的 TCP 连接状态
$ netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 ubuntu:58824 39.156.66.18:http TIME_WAIT
tcp 0 0 localhost:20172 localhost:37276 ESTABLISHED
图解TCP/IP(第5版)
计算机网络(第7版)谢希仁
Recommend
-
62
求各路大神多多指点。。。。。。。。
-
8
TCP 三次握手和四次挥手 2020-08-03 传输控制协议(英语:Transmission Control Proto...
-
8
TCP协议三次握手过程分析
-
4
TCP的三次握手和四次挥手TCP的三次握手TCP建立链接的步骤TCP的三次握手步骤思考:TCP握手为什么不是两次 or 四次?TCP的四...
-
4
详细说下 TCP 三次握手的过程?-吴师兄学编程 当前位置:吴师兄学编程 > 计算机网络 > 详细说下 TCP 三次握手的过程? ...
-
4
如果不了解TCP报文的格式可以点击这里 三次握手
-
4
腾讯云和阿里云tcp三次握手的区别 原创 wx62296eeeca632 2022-03-11 09:55:56...
-
4
本文主要分析 TCP 协议的实现,但由于 TCP 协议比较复杂,所以分几篇文章进行分析,这篇主要介绍 TCP 协议建立连接时的三次握手过程。 TCP 协议应该是 TCP/IP 协议栈中最为复杂的一个协议(没有之一),TCP 协议的复杂性来源于其面向连接和保证可靠传输。
-
2
两将军问题和TCP三次握手 作者:有态度的马甲 2022-10-10 07:34:36 本文记录了两将军问题: 对于不可靠信道,无数次确认都不能百分百达成可靠共识。TCP 三次握手是在两个方向确认包的序列号, 增加了超时重试, 是...
-
5
TCP 三次握手,给我长脸了噢 大家好,我是...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK