TCP连接管理概述
TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP的连接和释放是每一次面向连接的通信中必不可少的过程。因此,运输连接就有三个阶段,即:连接建立,数据传输和连接释放。运输连接的管理就是使运输连接的建立和释放都可以正常的进行。
在TCP连接的建立过程中要解决一下三个问题。
1.要使每一方能够确知对方的存在。
2.要允许双方协商一些参数(如窗口最大值、是否使用窗口扩大选项和时间戳选项以及服务质量等)。
3.能够对运输实体资源(如缓存大小、连接中的项目等)进行分配。
TCP连接的建立采用客户服务器方式。主动发起建立连接的应用叫做客户(Client),而被动等待连接建立的应用进程叫做服务器(server)。
TCP连接的建立
下图表示的是TCP连接建立的过程。主机A运行的是TCP客户端程序,而B运行TCP服务器端程序。最初的时候,双方的TCP进程都处于关闭(CLOSED)状态。然后A主动打开连接,而B被动打开连接。
1.A发送一个SYN=1的TCP报文,序列号seq是x。A的状态由CLOSED进入到SYN-SENT。
2.B收到之后发送SYN=1,ACK=1的TCP报文,同样为自己选一个序列号seq=y,确认号ack=x+1。B的状态由LISTEN进入到SYN-RCVD。
3.A收到B的确认之后,需要给B确认。ACK=1,seq=x+1,确认号ack是y+1。A的状态由SYN-SENT进入到ESTABLISH,B在收到A的确认之后也由SYN-RCVD进入到ESTABLISH。
以上的过程就是3次握手。这里一个常见的问题就是为什么在A发送建立连接的请求后还需要发送一个确认报文?这是因为主要是为了避免已经失效的连接请求报文段突然又传到了B而产生错误。失效的报文主要是在出现在网络不是很通畅的时候会产生,而三次握手机制避免了这种情况会产生的问题。
TCP连接的释放
在传输结束之后,通信双方都可以释放连接。A的应用进程先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。
1.A将连接释放报文的终止控制位FIN设置为1,seq序列号为u。此时A的状态由ESTABLISH进入到FIN-WAIT-1。
2.B在收到这个报文之后,随即发出确认。ACK=1 seq=v ack=u+1。此时B由ESTABLISH进入到CLOSE-WAIT状态。A收到B的确认之后进入到FIN-WAIT-2。此时B的TCP服务器进程会通知高层应用进程。这个时候A到B的传输就释放了,TCP的连接处于半关闭状态。A没有数据发送到B,若B还有数据,可以发送到A。
3.B发送FIN=1 ACK=1 seq=w ack=u+1(必须重复上次的确认号)。B由CLOSE-WAIT进入到LAST-ACK状态。
4.A收到B的连接释放报文之后,发送确认ACK=1 seq=u+1 ack=w+1。此时A由FIN-WAIT-2进入到TIME-WAIT。B在收到A的确认之后由LAST-ACK进入CLOSED状态。A在2MSL(大约是4分钟)之后进入到CLOSED状态。
这里一个常见的问题就是A为什么需要2MSL的等待时间。第一是为了保证A最后发送的ACK报文到达B。第二是为了当时出现上文提到的失效的报文段。因为2MSL会使本次连接产生的报文段都从网络中消失。
全文完。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。