TCP连接的建立和释放

连接的建立

假设主机A运行客户端程序,主机B运行服务器端程序。

1.A向B发送建立连接的请求
2.B收到请求后,向A发送确认
3.A收到B的确认后,向B发送确认的确认

这里写图片描述

这就是所谓的三次握手,那为什么需要三次握手呢,两次行不行?答案是不行的,因为信道是不可靠和有延迟的,《计算机网络》谢希仁是这样写的:采用三次握手可以防止已失效的连接请求报文突然又连接到B,产生错误

考虑这样的特殊情况,A向B发送了连接请求,但是由于网络状况,一定时间内B没有收到,进而A也没有收到确认,A认为请求报文丢失,又向B重新发送,之后建立连接,传输数据,然后释放链接。但是这之后B收到了来自A的“迟到的请求”,于是B又向A发送了确认。

  • 采用两次握手 则B以为A要建立连接,进而分配了资源,而实际情况A并不会向B发送消息,进而浪费了B的资源。
  • 采用三次握手 B收不到确认,知道A并没有要求建立连接,进而不会分配资源。

连接的释放

TCP连接的释放需要四次握手,因为TCP连接是全双工通信,只有A和B均不向对方发送数据时,连接才可以释放。

这里写图片描述

1.当A没有数据要进行发送时,会向B发送释放报文段,B收到消息后会发送确认,A收到后进入半关闭状态,此时已经没有数据要发送了,但是仍然额可以接受来自B的数据。
2.若B也没有要向A发送的数据了,则B向A发送连接释放报文,等待A的确认
3.A收到了B的连接释放报文段后,必须对此报文发出确认。然后进入TIME-WAIT(时间等待)状态,2MSL(Maximum Segment Lifetime,最长报文寿命)之后,结束连接。
4.B收到确认后,结束连接。

之所以第三步要进入等待状态,两个原因

  1. 发送给B的确认可能丢失,若B在一定时间内没有收到对自己释放连接的确认,则会进行重发,则A在TIME-WAIT状态内重新受到B的释放连接请求,,然后重新发送确认,重启计时器,若次确认仍然没有送达,则又进入循环,直到时间结束为止。
  2. 经过2MSL后,网络中应该没有旧连接的,这样下一次心得连接中便不会出现这种就得连接请求报文了。

猜你喜欢

转载自blog.csdn.net/weixin_40901329/article/details/79520116