为什么TCP需要“三次握手”、“四次挥手”?

版权声明:允许转载,请注明文章出处 https://blog.csdn.net/Vickers_xiaowei/article/details/85131980
更多传输层知识点:传输层的UDP通信和TCP通信

为什么TCP需要“三次握手”、“四次挥手”?

三次握手过程

1、连接过程最新的一次连接都不可靠,因为最新的这次连接可能丢包、损坏等。
2、如果是两次握手,服务器在接收到连接请求后,需要建立数据结构来维护连接请求,如果服务器的ACK丢失的状况大量出现,那么会出现SYN攻击服务器
3、三次握手保护服务器,第三次ACK丢失,客户端认为连接成功,服务器处于半连接状态,服务器认为连接没有成功,只有客户端会建立数据结构维护链接,如此服务器可以达到高效、安全。客户端给服务器发送数据,服务器的数据结构没有建立好,TCP首部的标志位RST复位置1,报文重新建立连接。

在这里插入图片描述

四次挥手过程

1、挥手是双向的,不仅要拆除客户端对于服务器的连接,还要拆除服务器对于客户端的连接。
2、客户端发送FIN包给服务器,服务器知道了客户端要把连接断开了,服务器把自己的连接状态改为半连接状态,继续接受客户端的数据,但不再发送数据给客户端,并且给客户端发送ACK确认包,客户端收到ACK之后,客户端到服务端的连接就拆除了。由于网络中可能还存在双方之前发送的数据,因此,服务器要在保证数据传输完毕了之后,给客户端发送FIN包拆除服务器给客户端建立的连接。
3、客户端收到服务端的FIN包之后,知道服务器也要断开服务器对于客户端建立的连接了,然后客户端回复服务器,告诉服务器它收到了断开连接的FIN报,此时双向连接均已拆除,可是服务器并不知道自己的FIN包是否被客户端接收,客户端的ACK也有可能丢失,因此,进入TIME_WAIT状态。

在这里插入图片描述

syn泛洪攻击

SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求(SYN),而被攻击端发出的响应报文(ACK+SYN)将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中(半连接挂起等待状态,接收不到攻击端的ACK,就重发ACK+SYN,直到超过时间SYN timeout,才会丢弃连接,释放资源)消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。

在这里插入图片描述

为什么会有TIME_WAIT?

1、主动关闭方在最后一次发送ACK之后,有可能这个ACK会丢掉,被动方等待一段时间之后,没有接收到ACK会认为FIN请求没有发送成功,然后重新发送一个FIN到主动方,如果主动方发送ACK之后直接关闭,释放资源,那么当发送的ACK丢失后被动方会维持这个无效链接很长时间,浪费被动断开方资源。如果主动方又重新建立socket,会对新的socket造成影响。
2、因此我们让主动方等待2个MSL时间,确保ACK已经发送到对方,在这个时刻如果收到被动方超时重传的FIN包,计时器重置。(MSL最大报文生存周期)
3、TIME_WAIT状态,等待时间是为了保护主动关闭方,在超过2个MSL时间后主动方再收到FIN包,这个FIN包将会被丢弃,不再传到主动方。
4、有TIME_WAIT,就可以保证最后一个报文在某种程度达到基本可靠,“TIME_WAIT期间没有消息就是好消息”
5、有TIME_WAIT,把通信信道双方以前的合法数据尽量消散。

猜你喜欢

转载自blog.csdn.net/Vickers_xiaowei/article/details/85131980