image.png

image.png

初始状态:

服务端监听某个端口,处于 LISTEN 状态。
客户端处于 CLOSE (关闭)状态。

第一次握手:

客户端 给 服务器 发送一个 SYN,
户端 处于 SYN_SENT 状态。

首部 的 同步位 SYN = 1
初始序列号 seq = 1

SYN = 1 的报文段不能携带任何的数据,但要指定序号。

第二次握手:

服务器 接收到来自 客户端 的 SYN 后,
会以自己的 SYN 报文作为应答,

客户端 的 seq+1 确认序列号 ack 的值,
表示自己已经收到了 客户端 的 SYN,

此时 服务器 处于 SYN_RCVD 的状态

确认报文段中 SYN = 1, ACK = 1
确认序列号 ack = m+1,
初始序列号 seq = n

第三次握手:

客户端 收到 服务器 的 SYN 之后,
客 户端进入 ESTABLISHED 状态,
发送一个报文段 ACK

服务器收到 报文段 ACK 之后,
也会进入 ESTABLISHED 状态。

确认报文段中,ACK = 1,
确认序列号 ack = n+1,序列号 seq = m+1。

双方已经建立起连接,可以正常的发送数据。

服务器和客户端在握手中的状态:
首先,三次握手之前,客户端和服务器端都是处于关闭状态。

然后客户端发起了第一个SYN包,想要去跟服务器建立链接。

发完SYN包之后就变成syn_sent状态

服务器收到客户端的syn包之后,变成syn_rcvd状态
回了一个syn,ack。

客户端收到syn,ack之后变成 establish 的状态,
并且向服务器发送了一个ack包,
服务器收到ack包后也建立链接了。