TCP协议

计算机网络(第七版)阅读笔记

TCP协议的特点

(1)TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。

(2)每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)。这个问题后面还要进一步讨论。

(3)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。

(4)TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。

(5)面向字节流。TCP中的“流”(stream)指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流

TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。

TCP面向字节流的概念

为了突出示意图的要点,我们只画出了一个方向的数据流。但请注意,在实际的网络中,一个TCP报文段包含上千个字节是很常见的,而图中的各部分都只画出了几个字节,这仅仅是为了更方便地说明“面向字节流”的概念。另一点很重要的是:图5-8中的TCP连接是一条虚连接(也就是逻辑连接),而不是一条真正的物理连接。TCP报文段先要传送到IP层,加上IP首部后,再传送到数据链路层。再加上数据链路层的首部和尾部后,才离开主机发送到物理链路。

TCP的连接

TCP把连接作为最基本的抽象。TCP的许多特性都与TCP是面向连接的这个基本特性有关。因此我们对TCP连接需要有更清楚的了解。
前面已经讲过,每一条TCP连接有两个端点。那么,TCP连接的端点是什么呢?TCP连接的端点叫做套接字(socket)或插口。根据RFC 793的定义:端口号拼接到(concatenated with)IP地址即构成了套接字。因此,套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。例如,若IP地址是192.3.4.5而端口号是80,那么得到的套接字就是
(192.3.4.5:80)。总之,我们有

套接字socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP连接 :: = {socket1,socket2} = {(IP1:port1),(IP2:port2)}

这里IP1和IP2分别是两个端点主机的IP地址,而port1和port2分别是两个端点主机中
的端口号。TCP连接的两个套接字就是socket1和socket2。可见套接字socket是个很抽象的
概念。

总之,TCP连接就是由协议软件所提供的一种抽象。虽然有时为了方便,我们也可以说,在一个应用进程和另一个应用进程之间建立了一条TCP连接,但一定要记住:TCP连接的端点是个很抽象的套接字,即(IP地址:端口号)。也还应记住:同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中。请注意,socket这个名词有时容易使人把一些概念弄混淆,因为随着互联网的不断发展以及网络技术的进步,同一个名词socket却可表示多种不同的意思。例如:

(1)允许应用程序访问连网协议的应用编程接口API(Application Programming Interface),即运输层和应用层之间的一种接口,称为socketAPI,并简称为socket。
(2)在socketAPI中使用的一个函数名也叫做socket。
(3)调用socket函数的端点称为socket,如“创建一个数据报socket”。
(4)调用socket函数时,其返回值称为socket描述符,可简称为socket。
(5)在操作系统内核中连网协议的Berkeley实现,称为socket实现。

可靠传输的工作原理

我们知道,TCP的报文是交付给IP层传输的,但IP层只能尽最大努力的交付,即TCP以下的网络提供的传输服务是不稳定的,因此TCP必须采取一些措施才能使两个运输层进行可靠交付。
理想的传输条件有以下两个特点:

  1. 传输信道不产生差错
  2. 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据

实际情况下网络一般不具备以上两个条件,但是我们可以使用一些可靠的传输协议,当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速度。这样一来,本来不可靠的传输信道就能够实现可靠传输了。下面从最简单的停止等待协议讲起。

停止等待协议

“停止等待”就是每发送完一个分组就停止发送,等待对方确认,在收到确认后继续发送下一个分组。

1)无差错情况
正常情况下,停止等待协议一般都应为无差错传输,即发送方A向接收方B传输一个分组,当B接收到分组后会向A返回确认状态,A收到B发送的确认请求后才继续发送下一个分组。

2)有差错情况
当传输过程中出现错误,此时就要准备超时重传,A发送分组前都会对每个分组进行编号,设置一个超时计时器,并且会将分组内容保存到收到B的确认信息后,若传输过程中出差错,B在一定时间内未能接收到A发送的分组,则A会将该分组重新发送给B,直至收到B的确认信息,这就是可靠传输协议。

应当注意以下三点:

第一,A在发送完一个分组后,必须暂时保留已发送的分组的副本(在发生超时重传时使用)。只有在收到相应的确认后才能清除暂时保留的分组副本。
第二,分组和确认分组都必须进行编号②。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认。
第三,超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。
在运输层重传时间的准确设定是非常复杂的,这是因为已发送出的分组到底会经过哪些网络,以及这些网络将会产生多大的时延(这取决于这些网络当时的拥塞情况),这些都是不确定因素。将往返时间固定(这并不符合网络的实际情况),只是为了讲述原理的方便。关于重传时间应如何选择,在后面还要进一步讨论。

3)确认丢失和确认收到
若B收到A发送的分组但是B向A发送的确认信息丢失,此时会触发超时重传,B会收到一个重复的分组,应当删除重复分组并重新向A发送确认。若传输过程无差错但是确认信息延迟,导致触发超时重传,此时B会收到一个重复的分组,此时要删除重复的分组,重新发送确认,A会收到重复的确认,应当进行的操作是删除重复确认即可。

4)信道利用率
停止等待协议的优点是简单,但缺点是利用率低。为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地在传送。显然,这种传输方式可以获得很高的信道利用率。当使用流水线传输时,就要使用连续ARQ协议和滑动窗口协议。

posted @ 2021-05-26 14:20  三山易川  阅读(953)  评论(0)    收藏  举报