彻底理解TCP三次握手与四次挥手
- 为什么要三次握手?
- 为什么要四次挥手?
- 为什么客户端释放后需要2个MSL等待?
- 熟悉Socket连接、TCP连接的过程?
前言
1. TCP连接:面向连接的可靠传输
- 连接靠Socket和三次握手
- 可靠靠重传机制,滑动窗口,差错控制,流量控制
2. TCP连接大体过程
- 建立连接
- 数据传输
- 连接释放
常见问题
为什么要三次握手?
- 需要同步信息:Socker()连接四元组,同步序列号,商议窗口大小
- 表层原因:确定收发双方功能正常
- 深层次原因:
- 避免历史连接初始化新的连接
- 同步双方初始序列号【可靠性】
- 避免资源浪费
SYN攻击
- 服务端会维护两个队列:Accept队列,SYN队列(未连接)
- 攻击者伪装不同IP地址的SYN报文,服务端每接收到一个SYN报文,就进入SYN_RECV状态,但服务端发送的ACK+SYN无法得到主机的ACK;1.服务端会多次发送直至超时,2.会占用服务端的SYN未接收接收队列,使服务器不能正常服务
为什么要四次挥手?
- 多的一次在服务端的FIN和ACK不一定是同步的:服务端会先确认收到客户端关闭的请求并发送ACK,但会先处理完自己手上的事再来处理是否同意,发送FIN
- TCP四次挥手
为什么客户端释放后需要2个MSL等待?
-
- MSL是报文的最大生存时间;2. 网络中可能存在来自发送方的数据包,发送方的数据包被接收方处理后,又向对方发送响应,一来一回需要2MSL;3. 所以当报文阻塞,触发超时重发,经过上述过程需要2MSL
- 防止旧连接的数据包被收到
- 保证服务端能正确关闭
- 服务端正常收到四次挥手的最后一个ACK报文,则服务端正常关闭
- 服务端没有收到四次挥手的最后一个ACK报文,则服务端重发FIN报文,等待新的ACK
- TIME_WAIT时间过短,无法使服务端正常关闭,时间过长,则占用资源
熟悉Socket连接、TCP连接过程
参考:《图解网络-小林coding-v2.0.pdf》