TCP是面向连接的协议,TCP把连接作为最基本的抽象。每一条TCP连接唯一地被通信两端的两个端点所确定。在面向连接通信中,连接的建立和释放是必不可少的过程。TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接的应用进程叫做服务器。而本文小编主要为大家介绍TCP的连接管理原理!
TCP协议连接管理就是协议的基本工作流程了。那么这个连接的建立,其中包括三次握手。那么针对这个在TCP协议中建立连接采用三次握手的方法。为了建立连接,其中一方,如服务器,通过执行LISTEN和ACCEPT原语被动地等待一个到达的连接请求。
另一方,如客户方,执行CONNECT原语,同时要指明它想连接到的IP地址和端口号,设置它能够接受的TCP数据报的最大值,以及一些可选的用户数据。CONNECT原语发送一个SYN=1,ACK=0的数据报到目的端,并等待对方响应。
该数据报到达目的端后,那里的TCP实体将察看是否有进程在侦听目的端口字段指定的端口。如果没有,它将发送一个RST=1的应答,拒绝建立该连接。
如果某个进程正在对该端口进行侦听,于是便将到达的TCP协议数据报交给该进程,它可以接受或拒绝建立连接。如果接受,便发回一个确认数据报。一般情况下,TCP的连接建立过程如图所示。
为了释放连接,每方均可发送一个FIN=1的TCP协议数据报,表明本方已无数据发送。当FIN数据报被确认后,那个方向的连接即告关闭。当两个方向上的连接均关闭后,该连接就被完全释放了。一般情况下,释放一个连接需要4个TCP数据报:每个方向均有一个FIN数据报和一个ACK数据报。
1)服务器进程准备好接受外来的连接,这通常是通过调用socket,bind,listen这三个函数来完成,我们称之为被动打开(passiveopen)。然后服务器进程就处于LISTEN状态,等待客户的连接请求,如有,则作出响应。
2)客户通过调用connect发起主动打开(activeopen),向服务器发出连接请求报文段,请求中的首部的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段不能携带数据,则要消耗一个序号。
这时,TCP客户进入SYN-SEND(同步已发送)状态。
TCP规定,首部中序号字段值是本报文段所发送数据的第一个字节的序号。
3)服务器收到客户端连接请求后,必须确认(ACK)客户的SYN报文段。在确认报文段中,把SYN和ACK位都置为1,确认号为ack=x+1,同时也为自己选择一个初始序号seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。
这时,TCP服务器进入SYN-RCVD(同步收到)状态。
TCP规定,若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
4)客户在收到服务器的确认后,还要向服务器进程给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP规定,这个报文段可以携带数据,也可以不携带数据,如果不携带数据,下一个数据报文段的序号仍是seq=x+1。
这时,TCP连接已经建立,客户进入ESTABLISHED(已建立连接)状态。
5)服务器收到客户的确认后,也进入ESTABLISHED状态。
在上述的建立连接的过程中,前后发送了三个报文段,因此TCP建立连接的过程也称之为三次握手。
从上文我们可以看到“三次握手”,那你知道为什么需要三次握手吗?下面就来了解一下。
什么客户在收到服务器的确认后,还要向服务器发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传送到了服务器,因而发生错误。
考虑一种情况,客户发出连接请求后,但因连接请求报文丢失而未收到确认。于是客户再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。客户共发送了两个连接请求报文段,其中第一个丢失,第二个到达了服务器。没有“已失效的连接请求报文段”。
现假定一种异常情况。即客户发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达服务器。本来这是一个早已失效的报文段,但服务器收到此失效的连接请求后,就误认为是客户又一次发出一次新的连接请求。于是就向客户发出确认报文段,同意建立连接。假定不采用三次握手,那么只要服务器发出确认,新的连接就建立了。
由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送数据。但服务器却以为新的连接已经建立了,并一直等待客户发送数据。服务器的许多资源就这样白浪费了。
采用三次握手的办法可以防止上述现象的发生。例如刚才的情况下,客户不会向服务器的确认发出确认,由于服务器收不到确认,就知道客户并没有要求建立连接。
小编结语:
以上就是关于TCP的连接管理原理的相关内容,看完文章,是否对您的学习有所帮助呢?如有疑问请到编程学习网教育进行咨询···