TCP连接机制

  • 时间:
  • 来源:互联网
  • 文章标签:

阐述TCP建立连接时为什么要进行三次握手,断开连接时为什么又要进行四次挥手。

连接的维护

客户端与服务器连接成功之后,客户端和服务器为了维护该段链接都是要使用自身资源的,服务器在这里是面向众多的客户端的,维护一段连接对客户端来讲所需要的资源是不值一提的,但是作为一台服务器,当来自世界各地的客户端来连接它的时候,这时候对服务器来讲,维护这些众多连接所需要的资源就是十分珍贵的。

确认应答机制

TCP的连接是可靠的,如何来保证连接的可靠性?在日常生活中,发送一条信息,当对方对所发出的信息进行回复时就可以确认对方已经收到所发出的信息,确认应答机制就是采用这个方法。

当客户端想服务器发送一段数据,服务器应当对客户端发出的数据进行回应,这就构成了确认应答机制。TCP将每个字节的数据都进行了编号,每一个ack都带有确认序号,意思就是告诉发送者,我已经接收到了哪些数据,下一次就从哪里开始发送

超时重传机制

当一条数据在进行发送的时候丢失时,这时发送者一直在等待接收者所返回的ack信息,此时接收者没有收到数据,自然就不会返回ack信息,此时发送方和接收方都进入等待的状态,这样就会造成资源的浪费,所以TCP建立了超时重传机制,当在一定的时间内发送方没有接收到接收方返回的ack信息时,发送方就会认为此时数据已经丢失,则会立即重新发送一次数据

但是某些时候,报文并没有丢失,只是因为网络问题造成传输时间延长,那就会造成接收方收到多条重复数据,但是不用担心,TCP协议能够根据数据的序号识别出哪些是重复的数据,并进行去重

超时重传的时间

超时重传所等待的时间是动态的,系统为了保证TCP链接的高效性,会动态的计算超时重传的时间。

三次握手

第一次握手

客户端向服务器发送链接请求,发送之后客户端进入SYN_SEND状态,等待服务器的确认

当该条报文发送后,客户端无法判断连接是否应该被建立,所以也不会产生维护连接所需要的资源。

第二次握手

服务器向客户端发送确认及连接请求,发送之后服务端进入SYN_RCVD状态

当该条报文发送后,服务器认为客户端希望建立连接,服务器会向客户端发送连接信息,但是这时服务器并不能确认客户端是否收到自己所发送的信息,所以此时服务器也不会创建维护连接所需要的资源。

第三次握手

客户端向服务器发送确认信息,这个报文发送完成之后,服务器和客户端都进入ESTABLISHED状态

当客户端接收到服务器发来的数据时,客户端此时可以确认连接将要被建立,所以此时客户端就会创建出维护这段连接所需要的资源,并且向服务器发送确认信息。

当服务器收到确认信息时,服务器也就会创建出维护这段连接所需要的资源。

为什么一定要三次握手

可靠性

可靠性即就时在链接创建时,必须保证客户端的服务器的收/发接口和服务器的收/发接口正常工作

第一次握手:客户端向服务器发送连接请求,服务端收到连接请求,此时服务器可以确认客户端发送接口正常,此时客户端无法确认服务器接收/发送接口正常,服务器无法确认客户端接受接口正常

第二次握手:服务器向客户端发送确认信息,此时客户端接收到确认信息,即可确认服务端发送/接收接口正常工作,但此时服务端无法确认客户端接收接口正常

第三次握手:客户端向服务端发送确认信息,服务器端此时可以确认客户端接收/发送接口都正常工作

服务端资源保护

作为面向众多客户端的服务器,需要确保服务器资源的利用率

在互相发送报文的过程中,最后一条报文发送的可靠性是永远无法保证的,所以在第三次握手中,当客户端向服务器端发送确认信息时,如果该段报文丢失,服务器会认为连接并没有完成,也就不会在服务端创建出维护连接的资源,仅有客户端会产生维护连接的资源

四次挥手

连接的维护是双向的,关闭连接时也必须保证双向的连接都被关闭,FIN仅表示自己已经发送完所有信息,但依然允许对方发送数据,自己也会进行接收

第一次挥手

客户端向服务器发送FIN,发送之后客户端进入TIME_WAIT1状态

客户端向服务器表明自己已经将所有数据发送完成,请求断开客户端—>服务端的连接

第二次挥手

服务器收到FIN后,向客户端发送ACK,发送之后服务端进入CLOSE_WAIT2状态

服务器向客户端发送确认信息,表明客户端可以将客户端—>服务端的链接关闭

第三次挥手

服务器发送完数据之后,向客户端发送FIN,发送之后服务端进入LAST_ACK状态

当服务器将所有数据发送完成时,此时服务器向客户端发送FIN表明希望关闭服务器—>客户端的连接

第四次挥手

客户端收到FIN后进入TIME_WAIT状态,客户端向服务器发送ACK

客户端向服务器发送确认信息,表明可以关闭连接

TIME_WAIT

当客户端处于TIME_WAIT状态之后,必须等待2MSL的时间才可以关闭连接,这是因为最后的一条报文无法进行确认,如果最后一条报文丢失,服务器端会处于LAST_ACK状态,如果客户端发送的最后一条ACK丢失,服务器端就会在2MSL的时间内进行超时重传FIN,当客户端在2MSL内又收到FIN时,就会重置计时器,并重新发送ACK,如果客户端在2MSL的时间内没有收到任何信息,即就说明最后一条ACK顺利被服务器接受,服务器和客户端就可以进入CLOSED状态了

本文链接http://www.taodudu.cc/news/show-1944917.html