<>TCP建立连接过程的三次握手的详细解析
首先认识一下TCP有6种标识:SYN(建立联机)、ACK(确认)、PSH(传送)、FIN(结束)、RST(重置)、URG(紧急)
为了保证数据能达到目标,TCP采用三次握手策略:
*
客户端首先发送一个SYN(synchronize)标志的数据包给接收方【第一次的seq序列号是随机生产的,这样是为了网络安全,如果不是随机产生的初始序列号,黑客将会以很容易的方式获取到你与其他主机之间的初始化序列号,并且伪造徐磊好进行攻击】
*
服务端接收后,回传一个带有SYN/ACK(acknowledgement)标志的数据包以示传达确认信息【SYN是为了告诉客户端,客户端到服务端的通道没问题;ACK用来验证服务端到客户端的通道是否有问题】
* 最后,客户端再回传一个带ACK标志的数据包,代表握手结束若在握手某个过程中某个阶段突然中断,TCP协议会再次以相同的顺序发送相同的数据包
<>为什么需要三次握手呢?
三次握手的目的是建立可靠的通信信道,说道通信,简单来说就是数据的发送和接收;而三次握手最主要的目的就是双方确认自己与对方的发送与接收是否正常的
* 第一次握手:客户端:什么都确认不了;服务端:对方发送正常,自己接收正常
* 第二次握手:客户端:对方发送正常,接收正常,自己发送、接收正常;服务端:对方发送正常,自己接收正常
* 第三次握手:客户端:对方发送正常,接收正常,自己发送、接收正常;服务端:对方发送正常,接收正常,自己发送、接收正常
<>两次握手不行吗?为什么TCP客户端最后还要发送一次确认呢?
主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误;经典场景:客户端发送了第一个请求连接并且没有丢失,只是因为在网络节点中滞留的时间太长了
* 由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据、然后关闭连接
*
此时此前滞留的那一次请求连接,网络通畅了到达服务器,这个报文本应该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源浪费
*
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务器接收到了那条失效的报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户并没有请求连接