TCP三次握手和四次挥手

文章目录

  • 1、三次握手
    • 1.1、首先了解一些常见的符号
    • 1.2、三次握手的概念
    • 1.3、大致过程
      • 1.3.1、第一次握手
      • 1.3.2、第二次握手
      • 1.3.3、第三次握手
    • 1.4、常见面试题
      • 1.4.1、为什么不用两次握手或者四次握手?
      • 1.4.2、三次握手过程中可以携带数据吗?
      • 1.4.3、SYN攻击是什么?
      • 1.4.4、什么是全连接队列、半连接队列?
  • 2、四次挥手
    • 2.1、了解一些常见的符号
    • 2.2、四次挥手的概念
    • 2.3、大致过程
      • 2.3.1、第一次挥手
      • 2.3.2、第二次挥手
      • 2.3.3、第三次挥手
      • 2.3.4、第四次挥手
    • 2.4、常见面试题
      • 2.4.1、挥手为什么需要四次?
      • 2.4.2、TCP 四次挥手过程中,为什么需要等待 2MSL, 才进入 CLOSED 关闭状态?
      • 2.4.3、保活计时器有什么用?

1、三次握手

1.1、首先了解一些常见的符号

标志位 作用
SYN synchronous建立联机
ACK acknowledgement 确认
PSH push传送
FIN finish结束
RST reset重置
URG urgent紧急
Sequence number 顺序号码(seq)
Acknowledge number 确认号码 (ack)
状态 表示
CLOSED 不在连接状态(这是为方便描述假想的状态,实际不存在)
LISTEN 等待从任何远端TCP 和端口的连接请求
SYN_SEN 不在连接状态(这是为方便描述假想的状态,实际不存在)
SYN_RECEIVED 发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
ESTABLISHED 表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。

1.2、三次握手的概念

     三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常指定自己的初始化序列号为后面的可靠性传送做准备实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息

1.3、大致过程

1.3.1、第一次握手

TCP三次握手和四次挥手_第1张图片

1.3.2、第二次握手

TCP三次握手和四次挥手_第2张图片

1.3.3、第三次握手

TCP三次握手和四次挥手_第3张图片

1.4、常见面试题

1.4.1、为什么不用两次握手或者四次握手?

参考:https://www.zhihu.com/question/429915921/answer/2682855827

1.4.2、三次握手过程中可以携带数据吗?

第一次、第二次握手是不可以的,第三次握手是可以的。

为什么呢?

      第一次握手不能携带数据是出于安全的考虑,因为如果允许携带数据,攻击者每次在 SYN 报文中携带大量数据,就会导致服务端消耗更多的时间和空间去处理这些报文,会造成 CPU 和内存的消耗
      第 3 次握手是可以携带数据的。此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,它已经建立连接成功,并且确认服务端的接收和发送能力是正常的。

1.4.3、SYN攻击是什么?

       服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包Server则回复确认包并等待Client确认由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。

怎么防护SYN攻击?

  • 缩短超时(SYN Timeout)时间
  • 增加最大半连接数
  • 过滤网关防护
  • SYN cookies技术

1.4.4、什么是全连接队列、半连接队列?

     全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。
      服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。

2、四次挥手

2.1、了解一些常见的符号

状态 作用
ESTABLISHED 表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
FIN_WAIT_1 等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
FIN_WAIT_2 等待远端TCP 的连接终止请求。
CLOSE_WAIT 等待本地用户的连接终止请求。
TIME_WAIT 等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
LAST_ACK 等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)

2.2、四次挥手的概念

     建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

     TCP 连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。

2.3、大致过程

2.3.1、第一次挥手

TCP三次握手和四次挥手_第4张图片

2.3.2、第二次挥手

TCP三次握手和四次挥手_第5张图片

2.3.3、第三次挥手

TCP三次握手和四次挥手_第6张图片

2.3.4、第四次挥手

TCP三次握手和四次挥手_第7张图片

2.4、常见面试题

2.4.1、挥手为什么需要四次?

再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。

     1.关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
     2.服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
     从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,从而比三次握手导致多了一次。

2.4.2、TCP 四次挥手过程中,为什么需要等待 2MSL, 才进入 CLOSED 关闭状态?

  1. 为了保证客户端发送的最后一个 ACK 报文段能够到达服务端。 这个 ACK 报文段有可能丢失,因而使处在 LAST-ACK 状态的服务端就收不到对已发送的 FIN + ACK 报文段的确认。服务端会超时重传这个 FIN+ACK 报文段,而客户端就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段。接着客户端重传一次确认,重新启动 2MSL 计时器。最后,客户端和服务器都正常进入到 CLOSED 状态。
  2. 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。

2.4.3、保活计时器有什么用?

除时间等待计时器外,TCP 还有一个保活计时器(keepalive timer)。

      设想这样的场景:客户已主动与服务器建立了 TCP 连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。

      服务器每收到一次客户端的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔 75 秒钟发送一次。若连续发送 10 个探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。

你可能感兴趣的:(分享,tcp/ip,网络,服务器)