TCP的三次握手与四次挥手

  关键词:TCP、三次握手、四次挥手、2MSL
  前言:
      SYN包:建立连接用的。
      FIN包:断开连接用的。
     TCP是这样子的,一方要发送请求,就需要和另外一方建立连接。另外一方要发送请求的话,也需要和这一方建立连接。
     TCP中为了满足稳定性,每次发送报文给对方,都要求返回ACK确认报文,表示接受到了。

1、用图描述三次握手与四次挥手:

2、三次握手:

(1)简单描述什么是三次握手:

  • 客户端向服务器发起连接请求(问是否可以连接);
  • 服务器接收到请求后进行确认,返回确认报文,同时也发送了请求报文给客户端;
  • 客户端收到报文后,建立连接,同时向服务器发送确认报文;服务器接收到确认报文之后建立连接。

(2)为什么要进行三次握手:

①为什么要3次握手:防止出现半连接攻击这种情况。
分析:
  • 第一次握手:客户端向服务器发送SYN包,告诉服务器说偶要建立连接。如果只有一次握手那么此时可能会出现一种情况,服务器就是顽皮,你要建立连接,我就不允许,但是客户端以为服务器是很好说话的,以为服务器已经同意建立连接。那么此时就会傻傻向服务器发送数据,但是服务器根本就没有接收,也不想接收。所以此时就会导致客户端一直在变傻傻等着服务器的响应。这样子就不好。
  • 第二次握手:因此此时就要求服务器还需要返回一个ACK确认报文让客户端知道服务器已经同意了。而此时为什么服务器还要同时发送SYN包呢?其实就是为了满足TCP的全双工特性,保证双方谁都可以发送请求。假如有的话,那么如果此时客户端突然请求断开连接了,因为服务器还是保持着连接的,所以还是可以向服务器发送数据的。如果说只到了第二次握手就结束建立连接的过程。那么此时服务器处理连接已建立的状态。它就会一直等待客户端的请求,但是如果此时客户端反悔了,它不发请求了,但是此时服务器是不知道的,所以它就会一直在等待客户端的请求,以为它是要发送的,但实际上并没有发送,这样子就会导致服务器消耗大量的时间在等待这个请求,这就很不好。(这就是半连接攻击的一种情况)
  • 第三次握手:因此就提出了客户端还需要向服务器再发送一个确认包,告诉服务器,我是真的想要建立连接的。那么此时服务器才会处于连接已建立的状态。

3、四次挥手:

(1)简单描述什么是四次挥手:

  • 主动方发送报文通知被动方要断开连接;
  • 被动方接收到请求之后,返回确认报文告知收到请求,准备断开;
  • 被动方也发送报文给主动方告知准备断开连接;
  • 主动方接收到请求之后返回确认报文告知被动方确定断开。此时双方都断开连接。

(2)为什么要四次挥手:

前言:
  半关闭状态:当A方请求和B方断开连接之后,B方还是可以发送数据给A方的,只是A方不可以发送了而已。
  全双工:双方可以在同一时刻同时向对方发送请求的一种通信方式。TCP就是全双工的。
  MSL时间:客户端发送一次请求到服务器接收到这个请求所经过的最长时间。
分析:
  客户端发送FIN包请求断开连接,客户端收到后,返回ACK确认报文,告诉客户端说,我知道了,你可以断开连接了。但是服务器不会立马返回FIN包,告诉客户端可以断开连接了。为什么呢?
  因为TCP是全双工的,所以说在客户端发送断开连接的请求的时候,可能服务器刚好向客户端发送了数据,所以此时就需要有半关闭状态这样子的一个特性来保证客户端还可以接受到信息。(可能此时服务器的数据还没有发送完毕,但是客户端申请断开连接)
  为了保证服务器还可以向客户端发送完所有的信息。所以需要再等一段时间,等到服务器发送完所有的数据之后,会向客户端发送一个FIN包,请求与客户端断开连接,然后客户端接收到之后返回ACK包,告诉服务器说可以了。双方才真正断开连接。所以总共有4次。

(3)为什么主动方处于TIME_WAIT状态之后,还需要等待2MSL时间才会进入CLOSED状态?

  主动方在发送完最后一个ACK确认包给被动方之后,如果此时服务器在1MSL的时间内没有收到客户端发送的这个包,那么此时就会重新向主动方进行第三次挥手,即向主动方再发送一个FIN包。此时如果主动方再2MSL的时间内在此接受到这个FIN包,那么就再次向被动方发送一个ACK包。此时发送完这个包之后会再次等待2MSL时间。重复上述操作,如果此时再经过2MSL时间之后没有收到被动方的FIN包,那么就会进入CLOSED状态。
 
参考资料:
posted @ 2019-12-02 10:44  数据是宝  阅读(211)  评论(0编辑  收藏  举报