TCP Three-Way handshake

本文详细介绍了TCP连接的三步握手过程。首先客户端发送SYN段指定初始序列号;其次服务器接收SYN并回复SYN/ACK段分配缓冲区;最后客户端确认ACK完成连接。

initialize TCP variables:

sequence numbers

buffers,flow control info


Client: connection initiator

Socket clientSocket = new Socket("hostname","portnumber");


Server: contacted by client

Socket connectionSocket  = welcomeScoket.accept();


Three-Way handshake:

step1: Client sends TCP SYN segment to server 

specifies initial seqnum = x

no data

step2: server receives SYN replies with SYN/ACK segment

server allocates buffers

specifies server initial seq =y

acknowledgement = x+1

step3: client receives SYN/ACK replies with ACK segment .which my contain data

acknowledgement = y+1


转载于:https://www.cnblogs.com/liguangsunls/p/7259881.html

### 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、付费专栏及课程。

余额充值