前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊TCP连接管理

聊聊TCP连接管理

作者头像
Bug开发工程师
发布2018-04-17 13:39:48
1.3K0
发布2018-04-17 13:39:48
举报
文章被收录于专栏:码农沉思录码农沉思录

什么是TCP

在介绍什么是TCP之前,先简单讲一下网络分层模型。因特网协议栈由5个层次组成,分别是物理层、链路层、网络层、运输层和应用层,每一层有每一层的作用和任务。应用层的任务是通过应用进程间的交互来完成特定网络应用,如常见的HTTP就是应用层协议。运输层的任务是负责向2台主机中进程之间的通信提供通用的数据传输服务。网络层负责为分组交换网上的不同主机提供通信服务。链路层则是负责将网络层的数据组装成帧,并将其从一个结点(主机或者路由器)移动到路径上的下一个结点。物理层则是将链路层中的帧以比特的形式从一个结点移动到下一个结点。

我们今天要讲的TCP是属于运输层的协议,其特点是提供面向连接可靠的数据传输,此外,TCP还提供了流量控制拥塞控制等功能。面向连接的意思是在一个应用进程开始向另一个应用进程发送数据之前,这两个进程需要先进行“握手”以建立连接,而在结束数据传输之前,也需要通过“挥手”断开连接。今天我们要讲的就是TCP的连接管理,即TCP如何建立连接与断开连接,后续文章再介绍TCP的其他特性。

TCP建立连接

TCP建立连接的过程也叫“握手”,“握手”需要在客户端和服务端之间交换3个TCP报文,所以也俗称“三次握手”,其过程如下:

  1. 首先客户端A请求与服务端B建立连接,其会发送一个TCP报文段,且首部中的同步位SYN=1,同时会带上一个初始序列号seq=x。
  2. 服务端B收到A的连接请求后,如果同意建立连接,则向A发送确认报文。在确认报文中需要将SYN和ACK位都置为1,同时确认序列号为ack=x+1,并且为自己选择一个初始序列号seq=y。
  3. 客户端A收到服务端的确认后,还要给B发出确认,后面会解释为什么。确认报文段的ACK置为1,确认号ack=y+1,序列号seq=x+1。当B收到A的确认后,TCP连接就建立了。

这里有一个问题就是,客户端最后为什么还要再给服务端再发一次确认再建立连接呢?或者说为什么不是“二次握手”而要进行“三次握手”呢?这是为了防止已失效的连接请求报文段突然传送给了B而导致错误。

所谓的失效的连接请求报文是怎么产生的呢?假如客户端A发送了一个建立连接的请求报文段,该报文段在网络中长时间滞留了,以至于A误以为该报文段丢失了,所以重新再发了一次建立连接的请求报文段给服务端B。假如过了一段时间,B收到了A第一次发送的请求建立连接报文段,因为该报文段对于A而言已经是失效的了,假如说B一收到该报文段就回应A并建立连接的话,该连接就白白浪费资源了,因为对A而言该连接已经是失效的。而采用“三次握手”则可避免这种问题。

TCP断开连接

TCP断开连接相对复杂一点,总共分为4个步骤,俗称“四次挥手”。其过程如下:

  1. 数据传输结束后,双方都可以断开连接,现在假设客户端A主动断开连接。其会向服务端发送一个断开连接的报文段,其报文段首部的终止控制位FIN置为1,序列号seq=u。
  2. 服务端B收到A的断开连接报文段后,会对其进行应答确认,确认号ack=u+1,并且序列号为seq=v,然后B就进入了CLOSE-WAIT状态。这个时候只表示A没有数据发送给B,如果B还有数据需要发送给A的话,B还是可以继续发送的,此时的连接是“半关闭”的,即从A到B的数据传输已经终止了,但从B到A的数据传输可能还会进行并持续一段时间。
  3. 当B没有数据要发送给A的时候,B就会向A发送断开连接的报文段。其报文段同样将FIN置为1,序列号为w,确认号跟上次的确认号一样,为ack=u+1。
  4. A在收到B的连接释放请求报文段后,必须发送一个确认数据包给A。其确认号ack=w+1,序列号为seq=u+1,接着A进入TIME-WAIT状态。这个时候连接还没有释放掉,而是要经过时间等待计时器设置的时间2MSL后才会断开连接。MSL,即最大报文段寿命,RFC793建议设置为2分钟,实际使用中与工程相关。

这里有一个问题就是,为什么A在发送完最后一个确认报文段之后,需要经过2MSL的时间才关闭连接呢?其理由如下:

其一,为了保证A发送的最后一个确认报文段能够到达B。这个确认报文段可能会丢失,如果B收不到这个确认报文段,其会重传第三次“挥手”发送的FIN+ACK报文,而A则会在2MSL时间内收到这个重传的报文段,每次A收到这个重传报文段后,就会重启2MSL计时器。这样可以保证A和B都能正常关闭连接。

其二,为了防止已失效的报文段出现在下一次连接中。A经过2MSL时间后,可以保证在本次连接中传输的报文段都在网络中消失,这样一来就能保证在后面的连接中不会出现旧的连接产生的报文段了。

以上就是TCP连接管理的内容了,后续还会继续介绍TCP的其他特性。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据传输服务
腾讯云数据传输服务(Data Transfer Service,DTS)可帮助用户在业务不停服的前提下轻松完成数据库迁移上云,利用实时同步通道轻松构建高可用的数据库多活架构,通过数据订阅来满足商业数据挖掘、业务异步解耦等场景需求。同时,DTS 还提供私有化独立输出版本 DTS-DBbridge,支持异构数据库和同构数据库之间迁移和同步,可以帮助企业实现完整数据库迁移(如 Oracle)。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档