首页 理论教育TCP连接建立与关闭

TCP连接建立与关闭

【摘要】:TCP在IP之上工作,IP本身是一个无连接的协议,在无连接的协议之上要建立连接,对初学者来说,这是一个较难理解的问题。同时客户机的TCP协议层通知应用层进程,连接已建立,可以进行数据传输了。由客户机的应用进程向其TCP协议层发出终止连接的命令,则客户TCP协议层向服务器TCP协议层发送一个FIN被置1的关闭连接的TCP报文段。当服务器收到确认后,整个连接被完全关闭。

TCP是一个面向连接的协议,TCP协议的高可靠性是通过发送数据前先建立连接,结束数据传输时关闭连接,在数据传输过程中进行超时重发、流量控制和数据确认,对乱序数据进行重排以及前面讲过的校验和等机制来实现的。下面我们讨论连接建立和关闭的问题。

TCP在IP之上工作,IP本身是一个无连接的协议,在无连接的协议之上要建立连接,对初学者来说,这是一个较难理解的问题。但读者一定要清楚,这里的连接是指在源端和目的端之间建立的一种逻辑连接,使源端和目的端在进行数据传输时彼此达成某种共识,相互可以识别对方及其传输的数据。连接的TCP协议层的内部表现为一些缓冲区和一组协议控制机制,外部表现为比无连接的数据传输具有更高的可靠性。

1.建立连接

互联网中两台要进行通信的主机,在一般情况下,总是其中的一台主动提出通信的请求(客户机),另一台被动地响应(服务器)。如果传输层使用TCP协议,则在通信之前要求通信的双方首先要建立一条连接。TCP使用“3次握手”(3-way Handshake)法来建立一条连接。所谓3次握手,就是指在建立一条连接时通信双方要交换3次报文。具体过程如下:

1)第1次握手。由客户机的应用层进程向其传输层TCP协议发出建立连接的命令,则客户机TCP向服务器上提供某特定服务的端口发送一个请求建立连接的报文段,该报文段中SYN被置1,同时包含一个初始序列号x(系统保持着一个随时间变化的计数器,建立连接时该计数器的值即为初始序列号,因此不同的连接初始序列号不同)。

2)第2次握手。服务器收到建立连接的请求报文段后,发送一个包含服务器初始序号y,SYN被置1,确认号置为x+1的报文段作为应答。确认号加1是为了说明服务器已正确收到一个客户连接请求报文段,因此从逻辑上来说,一个连接请求占用了一个序号。

3)第3次握手。客户机收到服务器的应答报文段后,也必须向服务器发送确认号为y+1的报文段进行确认。同时客户机的TCP协议层通知应用层进程,连接已建立,可以进行数据传输了。

通过以上3次握手,两台要通信的主机之间就建立了一条连接,相互知道对方的哪个进程在与自己进行通信,通信时对方传输数据的顺序号应该是多少。连接建立后,通信的双方可以相互传输数据,并且双方的地位是平等的。如果在建立连接的过程中握手报文段丢失,则可以通过重发机制进行解决。如果服务器端关机,客户端收不到服务器端的确认,客户端按某种机制重发建立连接的请求报文段若干次后,就通知应用进程,连接不能建立(超时)。还有一种情况是当客户请求的服务在服务器端没有对应的端口提供时,服务器端以一个复位报文应答(RST=1),该连接也不能建立。最后要说明一点,建立连接的TCP报文段中只有报文头(无选项时长度为20个字节),没有数据区。(www.chuimin.cn)

2.关闭连接

由于TCP是一个全双工协议,因此,在通信过程中两台主机都可以独立地发送数据,完成数据发送的任何一方都可以提出关闭连接的请求。关闭连接时,由于在每个传输方向既要发送一个关闭连接的报文段,又要接收对方的确认报文段,因此关闭一个连接要经过4次握手。具体过程如下(下面设客户机首先提出关闭连接的请求):

1)第1次握手。由客户机的应用进程向其TCP协议层发出终止连接的命令,则客户TCP协议层向服务器TCP协议层发送一个FIN被置1的关闭连接的TCP报文段。

2)第2次握手。服务器的TCP协议层收到关闭连接的报文段后就发出确认,确认号为已收到的最后一个字节的序列号加1,同时把关闭的连接通知其应用进程,告诉它客户机已经终止了数据传送。在发送完确认后,服务器如果有数据要发送,则客户机仍然可以继续接收数据,因此把这种状态称为半关闭(Half-close)状态。因为服务器仍然可以发送数据,并且可以收到客户机的确认,只是客户方已无数据发向服务器了。

3)第3次握手。如果服务器应用进程也没有要发送给客户方的数据了,就通告其TCP协议层关闭连接。这时服务器的TCP协议层向客户机的TCP协议层发送一个FIN置1的报文段,要求关闭连接。

4)第4次握手。同样,客户机收到关闭连接的报文段后,向服务器发送一个确认,确认号为已收到数据的序列号加1。当服务器收到确认后,整个连接被完全关闭。

连接建立和关闭的过程如图8-19所示,该图是通信双方正常工作时的情况。关闭连接时,图中的u表示服务器已收到的数据的序列号,v表示客户机已收到的数据的序列号。