TCP 连接详解( 三 )


文章插图
 
TCP 连接断开的四次挥手

TCP 连接详解

文章插图
 
1)服务端会根据自身情况 , 没有要处理的数据时会把第二次和第三次挥手合并成一次挥手 , 此时标志位 FIN=1 / ACK=1;
2)MSL 是 Maximum Segment Lifetime 缩写 , 指数据包在网络中最大生存时间 , RFC 建议是 2分钟;
 
详细描述:
1)客户端、服务端都可以主动发起断开连接;
2)第一次挥手 , 客户端向服务端发送含 FIN=1 标志位的数据包 , 随机序列号 seq=m , 此时客户端状态由 ESTABLISHED 变为 FIN_WAIT_1;
3)第二次挥手 , 服务端收到含 FIN=1 标志位的数据包 , 就知道客户端要断开连接 , 服务端会向客户端发送含 ACK=1 标志位的应答数据包 , 确认序列号 ack=m+1 , 此时服务端状态由 ESTABLISHED 变为 CLOSE_WAIT;
4)客户端收到含 ACK=1 标志位的应答数据包 , 知道服务端的可以断开的意思 , 此时客户端状态由 FIN_WAIT_1 变为 FIN_WAIT_2;(第一、二次挥手也只是双方交换一下意见而已)
5)第三次挥手 , 服务端处理完剩下的数据后再次向客户端发送含 FIN=1 标志位的数据包 , 随机序列号 seq=n , 告诉客户端现在可以真正的断开连接了 , 此时服务端状态由 CLOSE_WAIT 变为 LAST_ACK;
6)第四次挥手 , 客户端收到服务端再次发送的含 FIN=1 标志位的数据包 , 就知道服务端处理好了可以断开连接了 , 但是客户端为了慎重起见 , 不会立马关闭连接 , 而是改状态 , 且向服务端发送含 ACK=1 标志位的应答数据包 , 确认序列号 ack=n+1 , 此时客户端状态由 FIN_WAIT_2 变为 TIME_WAIT;
等待 2 个MSL时间还是未收到服务端发过来的数据 , 则表明服务端已经关闭连接了 , 客户端也会关闭连接释放资源 , 此时客户端状态由 TIME_WAIT 变为 CLOSED;
也就是说 TIME_WAIT 状态存在时长在 1~4分钟;
7)服务端收到含 ACK=1 标志位的应答数据包 , 知道客户端确认可以断开了 , 就立即关闭连接释放资源 , 此时服务端状态由 LAST_ACK 变为 CLOSED;
 
SYN 洪水攻击(SYN Flood)
是一种 DoS攻击(拒绝服务攻击) , 大概原理是伪造大量的TCP请求 , 服务端收到大量的第一次握手的数据包 , 且都会发第二次握手数据包去回应 , 但是因为 IP 是伪造的 , 一直都不会有第三次握手数据包 , 导致服务端存在大量的半连接 , 即 SYN_RCVD 状态的连接 , 导致半连接队列被塞满 , 且服务端默认会发 5 个第二次握手数据包 , 耗费大量 CPU 和内存资源 , 使得正常的连接请求进不来;




推荐阅读