三次握手
- 客户机的 TCP 先向服务器的 TCP 发送一个连接请求报文. 这个特殊的报文中不含应用层数据, 其首部中的 SYN 标志位被置 1. 另外, 客户机会随机选择一个起始序号 seq=x
- 服务器端的 TCP 收到连接请求报文后, 若同意建立连接, 就向客户机发送确认报文,SYN 和 ACK 位都被置为 1, 确认号字段的值为 x+1, 并且服务器随机产生起始序号 seq=y
- 当客户机收到确认报文后, 还要向服务器给出确认, 这个报文的 ACK 标志位被置为 1, 序号字段为 x+1, 确认号字段为 y+1
四次挥手
- 客户机打算关闭连接,就向其 TCP 发送一个连接释放报文,并停止再发送数据,主动关闭 TCP 连接, 该报文的 FIN 标志位被置 1, seq=u(u等于前面已经传送过的数据的最后一个字节的序号加 1)
- 服务器接收连接释放报文后即发出确认, 确认号是 ack=u+1, 这个报文自己的序号是 v, 等于它前面已传送过的数据的最后一个自己的序号加 1. 此时, 从客户机到服务器这个方向的连接就释放了, TCP 连接处于半关闭状态. 但服务器若发送数据, 客户机仍要接收, 即从服务器到客户机的连接仍未关闭.
- 若服务器已经没有了要向客户机发送的数据, 就通知 TCP 释放连接, 此时其发出 FIN=1 的连接释放报文
- 客户机收到连接释放报文后, 必须发出确认. 在确认报文中, ACK 字段被置为 1, 确认号 ack=w+1, 序号 seq=u+1. 此时, TCP 连接还没有释放掉, 必须经过等待计时器设置的时间 2MSL 后, A 才进入到连接关闭状态.
ps.
- 等待2MSL的原因:为了保证客户端发送的最后一个ACK报文段能够到达服务器;防止已失效的报文段,还在网络中滞留;
- 为什么建立时三次握手,关闭则需要四次:建立时,服务端收到客户端的连接请求后,可以直接同时发送SYN和ACK报文;关闭时,服务端收到客户端的FIN请求时,可能还存在未发送完的报文,只能先回复ACK报文,当所有报文发送完毕后,服务端才能发送FIN报文,所以,需要四次。