【TCP的运输链接管理】三次握手和四次挥手
TCP是面向连接的 协议。运输连接是用来传送TCP报文的。TCP的运输连接的建立和释放是每一次面向连接中必不可少的过程。传输连接分为三个部分,即:连接建立,数据传送,连接释放。
TCP建立连接过程中要解决的三个问题:
- 要使每一方都要感知到对方的存在;
- 要允许双方协商一些参数(如最大窗口值,是否使用窗口扩大选项等);
- 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配;
TCP连接的建立采用客户端服务器方式。主动发起连接建立的进程叫客户,而被动等待连接建立的 应用进程叫做服务器;
TCP的连接建立:
假定主机A运行的是TCP客户端程序,B运行的是TCP的服务器程序,最初两端都处于关闭状态,A主动打开连接,而B被动打开连接
为什么建立连接需要3次握手?
主要是为了初始化SYN,也就是上图中的x和y,这个号要作为以后的数据通信的序号,以保证应用层接收到的序号不会因为网络上的传输问题而乱序(TCP用这个来拼接数据);
为什么A还要在发送一次确认?
这主要是为了防止已失效的连接请求报文段突然又传送到B,因而发生错误;
所谓“已经失效的请求报文段是这样产生的”,正常情况下,A发出连接请求,但是因为请求报文丢失而未收到确认,于是A在重传一次连接请求,后来收到请求建立连接,数据传输完毕后,就释放了连接。A总共发送了两个连接请求报文段,其中第一恶丢失,第二个到达了B。
但是如果A第一次发送的请求报文段并没有丢失,只是在某个网络结点滞留了一段时间以至于延误到连接释放以后的某个时间才到达B,本来这就是一个已经失效的报文段,但是B收到了请求报文,就误以为是A又发送了一次新的请求,于是就向A发送确认报文,同意建立连接;假定不采用三次握手,,那么只要B发出确认,新的连接就建立了。
由于A并没有发出建立连接的请求,因此不会理睬B的确认,也不会发送任何数据,但是B以为新的连接建立了,并一直等待A发送来数据,B的资源就白白浪费了;
TCP的连接释放:
数据传输结束后,通信的双方都可以释放连接,A和B都处于ESTABLISHED状态,A的应用先向TCP发出连接释放报文段,并停止在发送数据,主动关闭TCP连接;
在第四次,A收到B的连接释放报文段后,对此发出确认,然后进入到TIME-WAIT状态,但是现在 的TCP还没有释放掉,必须经过时间等待计数器设置的时间后,A才进入到关闭状态;(MSL称为最长报文段寿命)
为什么会有第三次握手,第三次和第二次能不能合并为一次?
B收到连接释放报文后立即发出确认,然后B就进入关闭状态,因而A到B这个方向的连接就释放了,这时的TCP处于半关闭状态,即A没有数据要发了,但是B若要发送数据,A仍要接受,B到A这个方向的连接并没有关闭;
因为第二次只是对A发送的请求释放进行确认,但是本身自己并没有发送数据,所以要有第三次
为什么A在TIME-WAIT状态必须等待2MSL时间呢?
- 为了保证A发送的最后一个ACK报文段能够到达B,这个报文段可能丢失,如果B没有收到报文段的确认时,B会超时重传这个报文段,如果A不等待这一段时间,立即释放,则无法收到B重传的报文段,也不会再发送一次确认报文段,B就无法进入到关闭状态;
- 防止“已失效的请求报文段”出现在本链接中,A发送完最后一个ACK报文段后,再经过2MSL时间,就可以使本链接持续的时间内所产生的所有报文段都从网络中消失;