三次握手Three-way Handshake

 三次握手Three-way Handshake

1.1简介

传输层(Transport Layer)TCP协议中客户端和服务端建立联系

1.2  目的

确保数据完整性可靠性

1.3  情景举例

你(客户端)打电话约朋友(服务端)吃饭

  1. 第一次握手(你打电话)
    • 你:“喂,老王!晚上吃火锅不?”
    • (SYN=1:你发起邀约,但不确定对方是否能听到)
    • 此时你竖起耳朵等回复,心里没底。
  2. 第二次握手(朋友回应)
    • 老王:“可以啊!不过得7点后,你方便吗?”
    • (SYN=1, ACK=1:朋友答应了你的邀约,同时提出自己的条件)
    • 现在你知道朋友能听到你,但朋友不确定你是否能听到他的回复。
  3. 第三次握手(你确认)
    • 你:“行,那就7点老地方见!”
    • (ACK=1:你确认了朋友的条件)
    • 双方都确认了对方能正常沟通,约饭成功

 1.4 三次握手流程

  1. 第一次握手(SYN=1)
    • 客户端发送一个TCP报文,包含:
      • SYN=1(表示请求建立连接)
      • 初始序列号(ISN)(例如Seq=x,随机生成以防止历史冲突)
    • 状态变化:
      • 客户端进入SYN_SENT状态。
  2. 第二次握手(SYN=1, ACK=1)
    • 服务端收到SYN后,回复一个报文,包含:
      • SYN=1(表示服务端也发起连接请求)
      • ACK=1(确认客户端的SYN)
      • 确认号(Ack)=x+1(表示期望下次收到x+1的数据)
      • 服务端的ISN(Seq=y)。
    • 状态变化:
      • 服务端进入SYN_RCVD状态。
  3. 第三次握手(ACK=1)
    • 客户端收到服务端的SYN+ACK后,回复:
      • ACK=1(确认服务端的SYN)
      • 确认号(Ack)=y+1(期望服务端下次发送y+1的数据)
      • 可携带数据(若开启快速传输)。
    • 状态变化:
      • 客户端和服务端均进入ESTABLISHED状态,连接建立完成。
### TCP 三次握手过程及其 SYN 和 ACK 值变化 TCP 的三次握手是一个建立可靠连接的过程,其核心目标是通过交换序列号 (SYN) 和确认号 (ACK),确保双方能够同步并验证通信能力。以下是详细的描述: #### 初始状态 客户端处于 CLOSED 状态,服务器可能处于 LISTEN 状态等待新连接。 #### 第一步:客户端发送 SYN 请求 客户端向服务器发起连接请求,发送一个带有 SYN 标志的数据包,并设置初始序列号 `SEQ=100` 表示该数据包的起始位置[^1]。 ```plaintext <SEQ=100><CTL=SYN> ``` 此时,客户端进入 SYN-SENT 状态。 #### 第二步:服务器响应 SYN 并返回 ACK 服务器接收到客户端的 SYN 数据包后,会分配必要的资源来处理此连接,并回应一个包含两个标志位的数据包——SYN 和 ACK。其中: - **SYN** 设置新的序列号 `SEQ=300`,表示服务器端的初始序列号; - **ACK** 将客户端的序列号加一作为确认号 `ACK=101`,表明已接收到来自客户端的第一个字节的位置。 ```plaintext <SEQ=300><ACK=101><CTL=SYN,ACK> ``` 此时,服务器进入 SYN-RECEIVED 状态。 #### 第三步:客户端确认连接完成 客户端再次发送一个带 ACK 标志的数据包给服务器,以最终确认连接成功。这个数据包不携带任何有效载荷,仅更新自己的序列号至下一个可用值 `SEQ=101` 同时将服务器的序列号加一设为确认号 `ACK=301`: ```plaintext <SEQ=101><ACK=301><CTL=ACK> ``` 当服务器接收到上述 ACK 数据包之后,便正式进入了 ESTABLISHED 状态;同样地,在客户端也完成了整个流程从而达到相同的状态。 以上就是完整的 TCP Three-Way Handshake 过程以及期间涉及的关键参数 SYN 和 ACK 数值的具体含义与变动情况说明。 ```python def tcp_handshake(): client_seq = 100 server_seq = 300 # Client sends SYN to Server syn_packet_client_to_server = {"SEQ": client_seq, "CTL": "SYN"} # Server responds with SYN and ACK ack_value_from_client = client_seq + 1 syn_ack_packet_server_to_client = { "SEQ": server_seq, "ACK": ack_value_from_client, "CTL": ["SYN", "ACK"] } # Client acknowledges connection establishment by sending an ACK packet back. seq_value_for_next_byte_client_side = client_seq + 1 final_ack_value_sent_by_client = server_seq + 1 ack_packet_client_back_to_server = { "SEQ": seq_value_for_next_byte_client_side, "ACK": final_ack_value_sent_by_client, "CTL": "ACK" } tcp_handshake() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值