网络:运输层TCP-流量控制

在计算机网络体系结构中整体被划为了五层。由高到低:

  • 应用层
  • 运输层
  • 网络层
  • 数据链路层
  • 物理层

今天主要来记录在五层体系结构中较为重要的一层,也是在工作和学习当中经常会接触到的一层–运输层

运输层的概念

从通信和信息处理的角度看,运输层向其上一层应用层提供通信服务,他属于面向网络通信的最高层,也是面向应用功能的最底层。也就是说他是在应用层和IP协议层(网络层)中间的一层,我们知道在两台机器互相通信时,我们通过ip定位到两端所在的位置(也就是ip层的主要作用)。不过这种说法不够正确,为什么说不够准确?网络通讯究其根本是一个端的应用进程在用户的操作下向另一端应用进程请求,而两端主机中不单单只同时存在一个任务进程,所以在两端通信时从根本上来说其实是两端主机中的两个进程在进行通讯

IP协议层的主要工作就是帮我们在网络中定位当那一台我们想要请求的主机在哪里,但另一个问题出现了,就是我们无法准确定位目标主机中哪一个应用进程是我们要通信的,不能定位,也就不能将我们的请求发送到对应的应用进程。这时运输层协议的作用就派上用场了。

运输层的两个主要协议

  • UDP:用户数据报协议,UDP在传输数据前不需要先建立连接,接收端的主机在接收到数据报后不需要给出确认,也就是所谓的不可靠通信。但在一些情况下UDP能够提供更有效的通信。
  • TCP:传输控制协议,TCP是面向连接的通信方式,在传输数据前需要建立连接,同时在接收端收到消息后也要发送确认消息。

传输控制协议TCP

由于TCP协议的复杂性,本篇文章暂时只重点关注TCP协议在流量控制方面的问题。其他方面例如:可靠传输、拥塞控制、连接管理等问题以后再详细记录。

TCP主要特点

  1. TCP是面向运输层的传输协议:也就是前边提到,TCP在传输数据前需要先建立连接,而在通信结束后也要释放该连接。
  2. TCP提供的是端到端的两端通信:也就是说TCP协议只能同时在两个端点进行通信。
  3. TCP提供可靠交付:在使用TCP协议传输的数据,能够保证无差错、不丢失、不重复,并且按序到达。
  4. TCP提供全双工通信:TCP允许通信双方在任意时刻进行互相通信。
  5. 面向字节流:TCP中的“流”指的是从程序中流出或者流入程序的字节序列,面向字节流的含义是:虽然应用与TCP一次交互是一个数据块,但TCP把这些数据块都看做是一连串无结构的字节流,TCP不关心发送的字节流的具体含义,但接收方必须要能够有能力识别接收到的字节流,并将其还原成有用的应用层数据。(这也就是我们经常用到的序列化与反序列化)

TCP报文段首部格式

在了解TCP的流量控制前,有必要来先了解一下什么TCP报文段首部格式。逻辑上TCP是面向字节流的,但实际上TCP传输的数据单元是一个报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在他的报文段中,当然也包括要研究的流量控制。只用弄清报文段中每一个数据的意义,才能理解TCP工作的原理。

eaDoxulp8LjE5QM

先说明,TCP的流量控制是基于滑动窗口的,也就是当前我们只关心报文段的首部格式中的窗口数据。

关于窗口数据的理解,在TCP中窗口数据指的是接收端的可用窗口数据,不是发送方的发送窗口,为什么要关心接收端的窗口数据呢?这也就是TCP的流量控制机制。TCP中规定,不希望发送方不停的发送数据,因为接收端的缓存空间是有限的,当超过接收端的缓存空间时会影响整个通信质量。简单理解就是窗口数据就是接收端传递给发送端让其作为发送窗口大小的依据。

关于报文段中其他的数据含义参考连接博客中内容。

TCP/IP学习笔记(九)TCP报文段首部格式

TCP流量控制

通常来说,希望传输的数据的速度越快越好,但实际上TCP是双端通信,所以就会存在发送方过快而接收方来不及处理的问题,这样就是造成数据丢失,称为不可靠通信。

所以在TCP中为了保证两端的流量速率平衡,提供了流量控制机制,TCP的流量控制是基于滑动窗口机制实现的。

VwRMWC6zeIN2jkO

  • 在建立连接口此时B告知了A当前的可接受窗口大小,也就是receiver windows=400,TCP规定发送窗口不能大于接收窗口的大小,当前我们假设每次发送的数据报大小都为100。
  • A前三次发送了数据到B,不过第三次(200-300)发送过程中失败了,没有顺利到达B,此时A认为当前接收窗口已满,等待B回复新的接收窗口大小。
  • B回复A确认当前接收成功的发送记录位置为200(也就是前两次发送成功了),同时接收窗口大小为300,A收到后就知道第三次发送失败了,稍后将(201-300)进行重传。
  • A直到接收窗口为300,那么将进行三次发送(201-300、301-400、401-500),之后等待B发送新的接收窗口。
  • B回复A确认当前接收成功的发送记录位置为500,下次将从501开始发送,并同时告知接收窗口为100。
  • A向B发送501-600,等待B更新新的接收窗口大小。
  • B回复A确认当前接收成功的发送记录位置为600,并告知接收窗口大小为0,也就意味着不在允许发送数据了,A接到后将暂停发送,直到A接收到新的接收窗口大小。

从上图中我们可以清楚的看到,主机B在这个通信的过程中进行了三次流量控制,第一次控制在300、第二次控制在100、第三次控制在0不允许发送。并通过确认机制保证了消息的可靠交付,并能够平衡两边的传输速率。

此时有一个特殊的情况没有在图中表示出来,当B告知了A窗口为0时,A也就暂停了其当前的工作,过了一会B有有了200的接收窗口,也就是A可以继续发送报文段了,那么A如何知道当前有新的接收窗口了呢?

在这种情况下,TCP协议为了解决这个问题规定:在一方接收到0窗口时,那么将启动一个持续计时器,这个计时器的主要工作就是在收到0窗口时启动,一定时间后将会向接收方发送0窗口探测报文段。如下图:

GS5NF3nCQLi92hb

  • 此后若B返回窗口大小为0,那么将重新设定计时器,也就是准备发送新一轮的探测报文段。
  • 若B返回窗口大小不为0,那么A将恢复继续发送报文段。

TCP同样规定,尽管在接收窗口设置为0时,接收方也要能接收以下几种报文段:零窗口探测报文段、确认报文段、携带紧急数据的报文段。

总结

本篇文章记录了TCP的流量控制功能,在这之前先分析了运输层在计算机网络结构体系的五层结构中概念与作用,并记录了运输层提供的两种通信协议UDP和TCP,最后着重分析了TCP数据报的首部格式,了解了在TCP流量控制中用到的窗口参数,最后详细分析了,TCP协议如何在通信的过程中如何基于滑动窗口实现的流量控制,以及在出现接收窗口为0的情况下TCP如何解决发送方的恢复发送机制。

over~