深度好文:TCP三次握手和四次挥手深入实践

 

TCP连接状态

  图1是TCP三次握手、数据传输、四次挥手三个阶段的状态转移图,状态说明如下:

  1.  LISTEN:侦听来自客户端的TCP端口的连接请求
  2. SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
  3. SYN-RCVD:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)
  4. ESTABLISHED:代表一个打开的连接
  5. FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
  6. FIN-WAIT-2:从远程TCP等待连接中断请求
  7. CLOSE-WAIT:等待从本地用户发来的连接中断请求
  8. LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
  9. TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
  10. CLOSED:没有任何连接状态,连接结束

 

 

 

 

本文通过实践例子模拟每个阶段的状态变化。

  

 

 图1 TCP连接状态转移图

 

 

 

 本文用tcpdump抓包分析TCP连接的交互过程,其中tcpdump Flags含义如下:

  1.  S=SYN 发起连接标志
  2. P=PUSH 传送数据标志
  3. F=FIN 关闭连接标志
  4. R=RESET 异常关闭连接,链接重置
  5. . 表示没有任何标志,表示返回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

posted @ 2023-02-24 07:32  sword0077  阅读(49)  评论(0编辑  收藏  举报