TCP的运输连接管理

    TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放时每一次面向连接的通信中必不可少的过程。因此,运输连接就有三个阶段,即:连接建立、数据传输和连接释放。

    在TCP连接建立过程中要解决以下三个问题:

(1)要使每一方能够确知对方的存在;

(2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等);

(3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

    TCP的连接建立:主动发起连接建立的应用进程叫做客户(A),而被动等待连接建立的应用进程叫做服务器(B)。

A主动打开连接,B被动打开连接并处于LISTEN状态,等待客户的连接请求。

A向B发出连接请求报文段,这是首部中的同部位SYN=1,同时选择一个初始序号seq=x。此时A处于SYN-SENT(同步已发送)状态。

B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应将SYN和ACK位置都置1,确认号ack=x+1,同时给自己选择一个初始序号seq=y。此时B进入SYN-RCVD(同步收到)状态。

客户端A收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。这是TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。

当B收到A的确认后,也进入ESTABLISHED(已建立连接)状态。

    上面给出的连接建立过程叫做三次握手。

    为什么A还要发送一次确认呢?主要是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。

    TCP的连接释

å次æ¥æ

数据传输结束后,此时A和B都处于ESTABLISHED状态。A先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。终止控制位FIN=1,其序号seq=u,他等于前面传输过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT状态,等待B的确认。

B接收到连接释放报文段后立即发出确认,确认号是ack=u+1,而这个报文段自己的序号为u,等于B前面已传输过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。此时从A到B这个方向的连接就释放了,这是的TCP连接处于半关闭状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。

A收到来自B的确认 后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段(在这之前还需要接受服务器发送的最后的数据。

服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ACK=1,ack=u+1;由于在半关闭状态,服务器可能又发送了一些数据,假定此时的序列号为w,seq=w,此时服务器就进入LAST-ACK状态,等待客户端的确认。

客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号为seq=u+1,此时客户端就进入TIME-WAIT状态,注意此时TCP连接还没有释放,必须等待2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

而服务器在收到客户端发出的确认之后立即进入CLOSED状态,同样,撤销TCB之后,就结束了这次TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

猜你喜欢

转载自blog.csdn.net/deft_hll/article/details/80993116