华为网络基础 | TCP连接管理机制

  • 内容
  • 相关

前几篇讲解了RS | 数据包帧字节——图例详解RS | IP报文头部RS | TCP头部封装RS | WireShark实战之验证,将前面的知识点通过WireShark抓包验证,这样时候你的印象应该是比较深刻,也应该掌握更牢靠了。

在学习的过程中难免有很多疑惑,有疑惑尽量解决掉,不然越积越多就没有激情,导致没有兴趣,最终是学不好的。

现在来讲讲TCP中的连接管理机制,正常情况下, tcp需要经过三次握手建立连接, 四次挥手断开连接,那么什么是三次握手? 为什么需要三次握手,而不是二次或者四次?

1、什么是三次握手

第一次: 

    客户端 - - > 服务器 此时服务器知道了客户端要建立连接了 

第二次: 

    客户端 < - - 服务器 此时客户端知道服务器收到连接请求了 

第三次: 

    客户端 - - > 服务器 此时服务器知道客户端收到了自己的回应

到这里, 就可以认为客户端与服务器已经建立了连接。

接着看个图:

刚开始, 客户端和服务器都处于 CLOSE 状态;

此时, 客户端向服务器主动发出连接请求, 服务器被动接受连接请求;

①  TCP服务器进程先创建传输控制块TCB, 时刻准备接受客户端进程的连接请求, 此时服务器就进入了 LISTEN(监听)状态 ;

②  TCP客户端进程也是先创建传输控制块TCB, 然后向服务器发出连接请求报文,此时报文首部中的同步标志位SYN=1, 同时选择一个初始序列号 seq = x, 此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定, SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号; 

③  TCP服务器收到请求报文后, 如果同意连接, 则发出确认报文。确认报文中的 ACK=1, SYN=1, 确认序号是 x+1, 同时也要为自己初始化一个序列号 seq = y, 此时, TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据, 但是同样要消耗一个序号; 

④  TCP客户端进程收到确认后, 还要向服务器给出确认。确认报文的ACK=1,确认序号是 y+1,自己的序列号是 x+1;

⑤  此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

2、为什么不用两次?

主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。如果使用的是两次握手建立连接,假设有这样一种场景:客户端发送的第一个请求连接并且没有丢失,只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。 

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

3、为什么不用四次?

因为三次已经可以满足需要了, 四次就多余了。

疑惑我猜也为你解决了一部分了,如果还有其他的疑惑,欢迎留言,或者找找度娘、谷歌!!

 您阅读这篇文章共花了:

上一篇:Excel | 高级应用功能

下一篇:华为网络基础 | TCP和UDP报文分段区别

本文标签:    

版权声明:本文依据CC-BY-NC-SA 3.0协议发布,若无特殊注明,本文皆为《fishyoung》原创,转载请保留文章出处。

本文链接:华为网络基础 | TCP连接管理机制 - http://www.fishyoung.com/post-140.html