前言
TCP连接与断开都不是普通的一次牵手、分手,为什么呢?又是怎么牵手、分手的呢?
下面探个究竟~
三次握手机制
- 第一次握手
- 主机A 向 主机B 发送一个含有同步序列号(SYN)标志位的数据段,请求建立连接。通过这个数据段,主机A 告诉 主机B:我想与你通信;你可以使用哪个序列号作为起始数据段来回应我
- 第二次握手
- 主机B 收到 主机A 的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应 主机A,也告诉 主机A:我已收到请求,你可以传输数据了;你要用序列号作为起始数据段来回应我
- 第三次握手
- 主机A 收到数据段后,再发送一个带有确认应答的数据段,确认已收到 主机B 的数据段
三次握手成功,主机A 与 主机B 可以传输数据了
握手的特点
- 没有应用层的数据
- SYN这个标志位只有在TCP建产连接时才会被置1
- 握手完成后SYN标志位被置0
为什么需要三次握手
如果一个连接请求在网络中跑得慢,超时了,这时客户端会重新发出请求,但是这个跑得慢的请求最后还是跑到了,服务端就接收了两个连接请求。客户端收到一个确认后,后面发来的确认就不管了,服务器不知道,就会一直维持着资源,造成浪费
三次握手的话,当服务器收不到客户端的 确认应答ACK 时,就会认为这个 SYN 无效,释放;对客户端的数据传输返回 RST
名词解释
- ACK
- TCP报头的控制位之一,对数据进行确认
- 确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了。比如:确认号为X,则表示前X-1个数据段都收到了
- 只有当ACK=1时,确认号才有效;当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性
- SYN
- 同步序列号,TCP建立连接时会将这个位 置1
- RST
- 表重置连接、复位连接
四次挥手
- 第一次挥手
- 当 主机A 完成数据传输后,将控制位 FIN 置1,提出停止 TCP 连接的请求
- 第二次挥手
- 主机B 收到 FIN 后对其作出相应,确认这一方向的 TCP 连接将关闭,将 ACK 置1
- 第三次挥手
- 主机B 再提出反方向的关闭请求,将 FIN 置1
- 第四次挥手
名词解释
- FIN
- 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1