三次握手四次挥手
进入listen状态
客户端和服务的还没有建立连接前,都处于 CLOSED 状态
并且在开始之前需要创建TCB (传输控制块)、
直到TCB创建完成后,才进入LISTEN状态
开始建立连接
# 第一次握手
客户端发送请求请求和服务的建立连接:
seq(客户端的seq)=x,
SYN=1,
进入 SYNC-SENT阶段
# 第二次握手
服务端接收到客户端的请求后返回给客户端:
seq (服务端的seq) = y,ack(服务的期望的下次客户端的请求序号)=x+1
ACK=1, SYN=1
进入SYNC-RECV 阶段
# 第三次握手
客户端回应服务的确认信息:
ack(客户端希望下次服务的响应的序号)= y+1
ACK=1
客户端和服务端进入establish
以上完成三次握手的操作
之所以需要三次握手的原因
从一般情况上来看,好像只需要两次握手就可以实现
- 客户端发起请求
- 服务端同意请求
但是这样会导致明显的问题:服务端无法判断客户端的SYN请求是否已经过期
因为一些网络波动或者其他原因导致客户端第一次发送的SYN请求没有得到回应,会主动废弃重新(seq(a)=100)
重新发送一个SYN(b)(seq=200)
当a到服务端,服务端期待下次客户端的ack从100+1开始,然后返回给客户端,但是此时的客户端的下次seq为200+1
不符合,直接中断连接,如果没有这种第三次在此确认的机制,那么服务端会在第二次就直接同意建立连接