深度好文:TCP三次握手和四次挥手深入实践
TCP连接状态
图1是TCP三次握手、数据传输、四次挥手三个阶段的状态转移图,状态说明如下:
- LISTEN:侦听来自客户端的TCP端口的连接请求
- SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
- SYN-RCVD:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)
- ESTABLISHED:代表一个打开的连接
- FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
- FIN-WAIT-2:从远程TCP等待连接中断请求
- CLOSE-WAIT:等待从本地用户发来的连接中断请求
- LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
- TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
- CLOSED:没有任何连接状态,连接结束
本文通过实践例子模拟每个阶段的状态变化。
图1 TCP连接状态转移图
本文用tcpdump抓包分析TCP连接的交互过程,其中tcpdump Flags含义如下:
- S=SYN 发起连接标志
- P=PUSH 传送数据标志
- F=FIN 关闭连接标志
- R=RESET 异常关闭连接,链接重置
- . 表示没有任何标志,表示返回ack
为什么要三次握手?
-
如果只有一次握手,Client不能确定与Server的单向连接,更加不能确定Server与Client的单向连接;
-
如果只有两次握手,Client确定与Server的单向连接,但是Server不能确定与Client的单向连接;
-
只有三次握手,Client与Server才能相互确认双向连接,实现双工数据传输。
图2 TCP三次握手
1)发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。
2)接收方接收后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。
3)最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。
或这个示意图:
为什么要四次挥手?
“三次握手”的第二次握手发送SYN+ACK回应第一次握手的SYN,但是“四次挥手”的第二次挥手只能发送ACK回应第一次挥手的FIN,因为此时Server可能还有数据传输给Client,所以Server传输数据完成后才能发起第三次挥手发送FIN给Client,等待Client的第四次挥手ACK。
图3 TCP四次挥手
1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
或如下示意图
摘自:
https://baijiahao.baidu.com/s?id=1708621911214426696&wfr=spider&for=pc
https://www.jianshu.com/p/d3725391af59