TCP三次握手过程

第一次握手

  • 客户端动作:客户端发送一个SYN包(同步序列号包)到服务器,设置SYN=1,并选择一个初始序列号seq=x。客户端发送此包后,进入SYN_SENT(同步已发送)状态,等待服务器的确认。
  • 数据包内容:SYN=1,seq=x(x为客户端选择的初始序列号)。

SYN=1:告诉服务器,我要请求连接

第二次握手

  • 服务器动作:服务器收到客户端的SYN包后,发送一个SYN+ACK包(同步序列号+确认包)给客户端,设置SYN=1,ACK=1,确认号ack=x+1(表示已收到客户端x之前的数据,并期望下一个数据包从x+1开始),同时选择一个自己的初始序列号seq=y。服务器发送此包后,进入SYN_RECV(同步已接收)状态。
  • 数据包内容:SYN=1,ACK=1,ack=x+1,seq=y(y为服务器选择的初始序列号)。

SYN=1:告诉客户端,同意连接

ACK=1:表示服务器已经确认了客户端发送的SYN包

ack=x+1:告诉客户端下一个期望接收的数据包的序列号

第三次握手

  • 客户端动作:客户端收到服务器的SYN+ACK包后,发送一个ACK包(确认包)给服务器,设置ACK=1,确认号ack=y+1(表示已收到服务器发来的序列号为seq=y的数据包,并期望下一个数据包从y+1开始),序列号seq=x+1(表示这是客户端在第一次握手后发送的下一个数据包)。发送完这个包后,客户端和服务器都进入ESTABLISHED(连接已建立)状态,完成三次握手。
  • 数据包内容:ACK=1,ack=y+1,seq=x+1。

ACK=1: 表示客户端已经确认了服务器发送的SYN+ACK包

ack=y+1:告诉服务器下一个期望接收的数据包的序列号

注释:

SYN (同步序列编号,Synchronize Sequence Numbers)

ACK(确认标志,Acknowledgment)

ack 确认号,通过ack字段,接收方可以告诉发送方哪些数据已经被成功接收,哪些数据可能还需要重传。

seq 序列号,确定数据包的唯一性和有序性。

三次握手过程的形象比喻:

两个人打电话场景:

A:喂,能听得到我讲话吗?

B:能听得到,你能听得到我讲话吗?

A:能听得到,那我们开始聊天吧!

为什么需要第三次握手过程?

1,确保双方的初始序列号都被确认:在TCP连接建立过程中,双方都需要知道对方的初始序列号,以便后续的数据传输。两次握手只能确认一方的初始序列号,而第三次握手(通过ACK包)能够确认双方的初始序列号,确保双方都准备好了进行数据传输。

2,建立双向连接:两次握手只能建立单向连接,即服务器知道客户端的初始序列号,但客户端不知道服务器的初始序列号。而三次握手通过双方的确认,建立了双向连接,确保双方都知道对方的响应,为后续的双向通信提供了基础。

相关推荐

  1. TCP握手过程

    2024-06-11 17:12:02       28 阅读
  2. TCP握手

    2024-06-11 17:12:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 17:12:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 17:12:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 17:12:02       82 阅读
  4. Python语言-面向对象

    2024-06-11 17:12:02       91 阅读

热门阅读

  1. 【设计模式】面向对象与UML

    2024-06-11 17:12:02       32 阅读
  2. 有关团队“知识管理”和“经验留存”的思考

    2024-06-11 17:12:02       29 阅读
  3. 大模型推理时model.generate的源码

    2024-06-11 17:12:02       27 阅读
  4. 关于零拷贝的认知

    2024-06-11 17:12:02       31 阅读
  5. 租用服务器提供服务

    2024-06-11 17:12:02       32 阅读
  6. 整数反转(leetcode)

    2024-06-11 17:12:02       31 阅读
  7. 排查Spring条件注解未能生效的常见原因

    2024-06-11 17:12:02       29 阅读
  8. Linux 常用命令

    2024-06-11 17:12:02       28 阅读
  9. C#学习系列之UDP同端口发送与接收

    2024-06-11 17:12:02       34 阅读
  10. Web基础与HTTP协议

    2024-06-11 17:12:02       33 阅读