tcp 三次 握手

好的,这是一个关于 TCP 三次握手 的清晰、详细的解释。

核心目的

TCP 三次握手的主要目的是建立一个可靠的、全双工的连接,并在双方之间同步初始序列号。它确保通信双方都具备发送和接收数据的能力。


握手过程

假设客户端(Client)想要与服务器(Server)建立连接。

第一步:SYN

  • 客户端 发送一个 TCP 数据包,其中:

    • 标志位 SYN = 1:表示这是一个"同步"请求,希望建立连接。

    • 序列号 seq = xx 是客户端随机选择的初始序列号。

  • 此时,客户端进入 SYN-SENT 状态。

第二步:SYN + ACK

  • 服务器 收到客户端的 SYN 包后,如果同意连接,则会回复一个数据包,其中包含:

    • 标志位 SYN = 1ACK = 1SYN=1 表示服务器也在同步自己的序列号;ACK=1 表示确认号字段有效。

    • 序列号 seq = yy 是服务器随机选择的初始序列号。

    • 确认号 ack = x + 1 :这表示"我(服务器)已经收到了你的序列号为 x 的包,下一个我期望收到序列号为 x+1 的包"。这是对客户端 SYN 的确认。

  • 此时,服务器进入 SYN-RECEIVED 状态。

第三步:ACK

  • 客户端 收到服务器的 SYN-ACK 包后,会再次发送一个确认包,其中包含:

    • 标志位 ACK = 1:表示这是一个确认包。

    • 序列号 seq = x + 1 :因为客户端的第一个 SYN 包消耗了一个序列号 x,所以下一个包的序列号就是 x+1

    • 确认号 ack = y + 1 :表示"我(客户端)已经收到了你的序列号为 y 的包,下一个我期望收到序列号为 y+1 的包"。这是对服务器 SYN 的确认。

  • 客户端发送完这个包后,进入 ESTABLISHED 状态。

  • 服务器 收到这个 ACK 包后,也进入 ESTABLISHED 状态。

  • 至此,连接建立成功,双方可以开始传输数据。


为什么是"三次",而不是两次或四次?

这是一个经典问题,关键在于 可靠性和效率的平衡

  1. 防止已失效的连接请求报文造成混淆(主要理由)

    • 想象一个场景:客户端发送了一个 SYN 请求,但由于网络延迟,这个包很久才到达服务器。客户端等不到回复,会重发一个新的 SYN 并成功建立了连接、完成了通信、关闭了连接。

    • 此时,那个迟到的、旧的 SYN 包终于到达了服务器。如果只需要两次握手(服务器回复 SYN-ACK 后就认为连接已建立),服务器就会单方面建立一个无用的连接,并等待客户端发送数据,造成资源浪费。

    • 三次握手 机制下,服务器发送 SYN-ACK 后,必须等待客户端的最终 ACK。对于那个迟到的旧请求,客户端不会回复 ACK(因为它没有发起这个连接),因此服务器在超时后会自动关闭这个半连接,避免了资源浪费。

  2. 双方确认双方的发送和接收能力都正常

    • 第一次握手:服务器确认"客户端的发送能力、自己的接收能力"正常。

    • 第二次握手:客户端确认"自己的发送和接收能力、服务器的发送和接收能力"都正常。

    • 第三次握手:服务器确认"客户端的接收能力、自己的发送能力"正常。

    • 经过三次交换,双方都确信自己和对端具备完整的通信能力。

  3. 同步初始序列号

    • TCP 依靠序列号来保证数据的有序性和可靠性。三次握手确保了双方都明确知道了对方的初始序列号,为后续可靠传输打下了基础。

四次握手 没有必要,因为可以将服务器的 SYN 和对客户端 SYNACK 合并成一个包发送,提高了效率。


状态变化总结

text
复制
下载

复制代码
客户端:CLOSED -> SYN-SENT -> ESTABLISHED
服务器:CLOSED -> LISTEN -> SYN-RECEIVED -> ESTABLISHED

类比(打电话)

  1. 第一次握手 :A 打电话给 B,说:"喂,你好,能听到吗?" (SYN

  2. 第二次握手 :B 听到后,回答:"我能听到,你呢?" (SYN-ACK

  3. 第三次握手 :A 听到 B 的回答,说:"我也能听到。" (ACK

  4. 开始通话:然后双方开始正式交谈(传输数据)。


相关问题:SYN 洪水攻击

攻击者疯狂地发送第一次握手(SYN)包,但不完成第三次握手。服务器会为每个半连接分配资源并等待,直到资源耗尽,无法为正常用户服务。防御方法包括 SYN Cookie 等。

如何查看?

在 Linux/Unix 系统中,可以使用 netstatss 命令查看 TCP 连接状态。在抓包工具如 Wiresharktcpdump 中,可以清晰地看到 SYNSYN-ACKACK 这三个包的交换过程。

总结:TCP 三次握手是互联网可靠通信的基石,它用最小的代价(三次交互)解决了在不可靠网络上建立可靠连接的根本问题。

相关推荐
土星云SaturnCloud9 小时前
不止是替代:从机械风扇的可靠性困局,看服务器散热技术新范式
服务器·网络·人工智能·ai
liulilittle9 小时前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++
lang201509289 小时前
Sentinel核心机制:Context与EntranceNode解析
网络·sentinel
chuxinweihui9 小时前
数据链路层
运维·服务器·网络
qq_2515335910 小时前
使用 Python 提取 MAC 地址
网络·python·macos
aFakeProgramer10 小时前
Linux 启动流程
网络
阿干tkl12 小时前
传统网络与NetworkManager对比
linux·网络
运维有小邓@12 小时前
USB 设备安全攻略:USB 设备管理方案与安全工具
网络
老蒋新思维13 小时前
创客匠人峰会洞察:私域 AI 化重塑知识变现 —— 创始人 IP 的私域增长新引擎
大数据·网络·人工智能·网络协议·tcp/ip·创始人ip·创客匠人