聊聊TCP连接管理

什么是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的其他特性。

原文发布于微信公众号 - 编程沉思录(code-thinker)

原文发表时间:2018-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武军超python专栏

2018年8月16日TCP中三次握手和四次挥手详解

 上图中有几个字段需要重点介绍下:         (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。...

9120
来自专栏Janti

基础巩固——你应该这么理解TCP的三次握手和四次挥手

网络传输层负责最底层的底层链路连接。两台主机之间进行互联,基于网线的物理硬件上的协议。在这个侧面,主机与主机之间只认得硬件mac编码。并不认识IP。

7720
来自专栏PHP实战技术

OSI 七层模型简单梳理!

功能:OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。 7.应用层 网络服务与最终用户的一个接口。 协议有:HTTP F...

537120
来自专栏我的博客

TCP/IP三次握手

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN...

34370
来自专栏用户画像

第14章 帧中继

403. 一台空配置的MSR 路由器通过接口S1/0 接入帧中继网络。要在该路由器上通过配置帧中继子接口来实现连通,则关于帧中继子接口描述正确的是__AC。

7810
来自专栏我就是马云飞

注意!是TCP不是HTTP的3次握手与4次挥手

11930
来自专栏Linyb极客之路

网络编程之你应该这么理解TCP的三次握手和四次挥手

网络传输层负责最底层的底层链路连接。两台主机之间进行互联,基于网线的物理硬件上的协议。在这个侧面,主机与主机之间只认得硬件mac编码。并不认识IP。

13420
来自专栏coderhuo

TCP连接建立、断开过程详解

TCP连接建立过程需要经过三次握,断开过程需要经过四次挥手,为什么? 有没有其他的连接建立、断开方式?

13820
来自专栏JavaEdge

计算机网络基础知识点1. OSI,TCP/IP,五层协议的体系结构,以及各层协议2. IP地址的分类3. ARP是地址解析协议,简单语言解释一下工作原理。4. 各种协议的介绍5. 描述RARP协议6.

57380
来自专栏武培轩的专栏

TCP和UDP的区别

TCP TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 ...

31150

扫码关注云+社区

领取腾讯云代金券