资讯专栏INFORMATION COLUMN

当我们讨论TCP的连接运输管理时,我们在说什么

bitkylin / 1654人阅读

摘要:连接管理概述是面向连接的协议。要使每一方能够确知对方的存在。的应用进程先向其发出连接释放报文段,并停止发送数据,主动关闭连接。将连接释放报文的终止控制位设置为,序列号为。收到的连接释放报文之后,发送确认。

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会使本次连接产生的报文段都从网络中消失。

全文完。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29883.html

相关文章

  • 9012年,我们讨论js深浅拷贝我们在说什么

    摘要:正文讨论深浅拷贝,首先要从的基本数据类型说起根据中的变量类型传递方式,分为值类型和引用类型,值类型变量包括。当你拷贝的对象有多级的时候,就是深拷贝。数据不存在则对其拷贝。 前言: 本文主要阅读对象:对深浅拷贝印象模糊对初级前端,想对js深浅拷贝聊一聊的中级前端。 如果是对这些有完整对认知体系和解决方法的大佬,可以选择略过。 正文: 讨论深浅拷贝,首先要从js的基本数据类型说起: 根据 J...

    xeblog 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<