feng xiaohan

TCP

tcp/ip

TCP 三次握手

  • seq:sequence number,序列号(通过各种算法 isn 随机生成的);
  • ack:acknowledgement number,确认号(ack = seq + 1);
  • ACK:acknowledgement,确认序列号有效;
  • SYN:synchronous,发起新连接;
  • FIN:finish,完成;

第一次握手:
客户端向服务端发起建立新连接(SYN),并且发送序列号(seq);

序列号用于确保发送消息的顺序不乱。

第二次握手:
服务端接收到客户端的序列号(seq),判断该序列号的确认号是否正确(ack),如果正确就标记一个 ACK,然后向客户端发起建立新连接(SYN),并且带上服务端自己的序列号(seq);

第三次握手:
客户端接收到之后会判断服务端的 seq 是否正确,如果正确的话也会标记一个 ACK

客户端的 seq = 第一次握手客户端的 seq + 1
ack = 服务端 seq + 1

TCP 四次挥手

四次挥手可以由客户端或者服务端发起。此处以客户端主动发起为例子。

第一次挥手:
客户端向服务端发送连接完成状态(FIN),并添加上客户端的 seq;此时客户端从 established 状态变为 fin_wait_1 等待状态;

第二次挥手:
服务端收到客户端的信息后需要去验证 seq,判断 ack 是否正确,如果正确就标记一个 ACK 返回给客户端;
此时客户端会进入 fin_wait_2 阶段,在这个阶段内,如果有未完成或未处理的任务,会将所有任务处理完成,处理完之后服务端才会发起第三次挥手,最终来结束状态;

第三次挥手:
服务端发起 FIN + ACK(ack)+ 服务端 seq;
此时客户端进入超时等待状态 time_wait。

该状态的存在是为了确保第四次挥手的 ACK 标记不丢失,确保连接能正常断开,保证 TCP 的可靠性。如果 ACK 标记丢失了,服务端会再次发起断开连接请求(FIN),传递 ACK(再执行一次第三次挥手)。

第四次挥手:
客户端超时等待完成后回向服务端发起 ACK (ack)+ seq,并彻底关闭连接。