计算机网络教程-传输层协议-TCP(1) - STEMHA's Blog

计算机网络教程-传输层协议-TCP(1)

TCP(传输控制协议)

传输控制协议(Transmission Control Protocol,TCP)是一个面向连接可靠的协议。

  • TCP 显式定义了连接建立、数据传输以及连接拆除阶段来提供面向连接服务。
  • TCP 使用GBN 和SR 协议的组合来提供可靠性。
  • 为了实现这个目的,TCP 使用校验和(为差错发现)、丢失或被破坏分组重传、累积和选择确认以及计时器。

TCP 服务

进程到进程的通信

像UDP 一样,TCP 通过使用端口号来提供进程到进程通信。

流传递服务

与UDP 不同,TCP 是一个面向流的协议。在UDP 中,进程发送一些具有预先规定边界的报文给UDP 进行传递。UDP 将它自己的头部添加到这些报文中并传递到IP 层进行传输。来自进程的每一个报文称为一个用户数据报,最后变成一个IP 数据报。IP 和UDP 都不认识这些数据之间的关系。

而TCP 允许发送进程以字节流形式传递数据,并且接收进程也以字节流形式接收数据。TCP 建立一种环境,在这种环境中,两个进程好像由一个假想的“管道”连接,这个管道通过因特网传送这些进程的数据。

这种假想的环境如图所示。发送进程产生(写入)字节流,而接收进程消费(读出)这些字节流。
字节流传递

发送和接收缓冲区

因为发送和接收进程可能以不同的速度写入和读出数据,所以TCP 需要用于存储的缓冲区。

  • 每一个方向都存在一个缓冲区:发送缓冲区和接收缓冲区。
  • 这些缓冲区也用于TCP 流量和差错控制机制。
  • 实现缓冲区的一种方法使用以一字节为存储单元的循环数组

实现缓冲区的方法如图所示。为了简化,我们只画出了两个缓冲区,每个缓冲区20个字节。通常情况下,缓冲区是数百甚至数千个字节,这取决于实现方法。这里给出的缓冲区是大小相同的,实际上并非总是如此。
TCP发送和接收缓冲区
上图表示了在一个方向上数据的移动。在发送端,缓冲区有三种类型的存储单元。

  • 白色的部分是空存储单元,可以由发送进程(生产者)填充。
  • 灰色的部分用于保存已经发送但还没有得到确认的字节。TCP 在缓冲区中保留这些字节,直到收到确认为止。
  • 灰色缓冲区是将要由TCP 发送的字节。但是,在本章的后面将会看到,TCP 可能只发送灰色部分。这可能是由于接收进程缓慢或者网络中可能发生的拥塞造成的。
  • 灰色存储单元的字节被确认后,这些存储单元可以回收并且对发送进程可用,这就是我们给出一个环形缓冲区的原因。

接收端的缓冲区操作比较简单。环形缓冲区分成两个区域(表示为白色和灰色)。白色区域包含空存储单元,可以由从网络上接收的字节进行填充。灰色区域表示接收到的字节,可以由接收进
程读出。当某个字节被接收进程读出以后,这个存储单元可被回收,并加入到空存储单元池中。

尽管缓冲能够处理生产进程速度和消费进程速度之间的不相称问题,但在发送数据之前,还需要多个步骤。
IP 层作为TCP 服务的提供者,需要以分组的方式而不是字节流的方式发送数据。
在传输层,TCP 将多个字节组合在一起成为一个分组,这个分组称为段(segment)。
TCP 给每个段添加头部(为了达到控制目的),并将该段传递给IP 层。段被封装到IP 数据报中,然后再进行传输。整个操作对接收进程是透明的。
这些段可能被无序接收、丢失,或者损坏和重发。所有这些均由TCP 处理,接收进程不会察觉到任何操作。
下图表示了在缓冲区中如何从字节生成段。
TCP段
注意,段的大小不必相同。为了简单起见,我们在图中只表示了一个包含3 个字节的段和另一个包含5 个字节的段。实际的段可能包含数百(或者数千)个字节。

全双工通信

TCP 提供全双工服务(full-dupler service),即数据可以在同一时间双向流动。每一方向TCP都有发送和接收缓冲区,它们能在双向发送和接收段。

多路复用和多路分解

与UDP 类似,TCP 在发送端执行多路复用,在接收端执行多路分解。然而,由于TCP 是一个面向连接协议,因此需要为每对进程建立连接。

面向连接的服务

与UDP 不同,TCP 是一种面向连接的协议。位于站点A 的一个进程与站点B 的另外一个进程想要进行数据的发送和接收,步骤如下:
1.在两个TCP 之间建立一个连接。
2.在两个方向交换数据。
3.连接终止。
注意,这是一个逻辑连接,而不是一个物理连接。TCP 段封装成IP 数据段,并且可能被无序地发送,或丢失,或被破坏,然后重发。每个段都可以通过不同的路径到达目的端。
TCP 建立一种面向字节流的环境,在这种环境中,TCP 能承担按顺序传递这些字节到其他站点的任务。

可靠的服务

TCP 是一种可靠的传输协议。它使用确认机制来检查数据是否安全和完整地到达。

TCP与UDP基本区别

  1. 基于连接与无连接
  2. TCP要求系统资源较多,UDP较少
  3. UDP程序结构较简单
  4. 字节流模式(TCP)与数据报模式(UDP);
  5. TCP保证数据正确性,UDP可能丢包
  6. TCP保证数据顺序,UDP不保证

TCP 的特点

序号系统

虽然TCP 软件能够记录发送或接收的段,但是在段的头部没有段序号字段。
TCP 在段的头部采用称为序号(sequence number)确认号(acknowledgment number)的两个字段。这两个字段指的是字节序号,而不是段序号。

字节序号

TCP 为在一个连接中传输的所有数据字节(八位字节)编号。在每个方向上序号都是独立的。
当TCP 接收来自进程的一些数据字节时,TCP 将它们存储在发送缓冲区中并给它们编号。不必从0 开始编码,TCP 在0到232−1 之间生成一个随机数作为第一个字节的序号,例如,如果随机数是
1057,并且发送的全部字节个数是6000,那么这些字节序号是1057~7056。下面将会看到字节序号是用于流量和差错控制。

在每个连接中传送的字节都由TCP 编号,序号开始于一个随机产生的数。

序号

字节被编号后,TCP 对发送的每一个段分配一个序号。在每一个方向上的序号定义如下:
1.第一段的序号是初始序号(initial sequence number,ISN),这是一个随机数。
2.其他段的序号是之前段的序号加之前段携带的字节数(实际上的或想象的)。之后,我们将给出一些控制段,它们被认为携带了一个想象字节。

一个段的序号字段的值定义了该段包含的第一个字节的序号。

当一个段携带数据和控制信息(捎带)时,它使用一个序号。如果一个段没有携带用户数据,那么它逻辑上不定义序号。虽然字段存在,但是值是无效的。然而,当有些段仅携带控制信息时也
需要有一个序号用于接收方的确认。这些段用作连接建立、连接终止或连接废弃。这些段中的每一个好像携带一个字节那样使用一个序号,但都没有实际的数据。

确认号

TCP 中的通信是全双工的;当建立一个连接时,双方同时都能发送和接收数据。

  • 每一方为字节编号,每一方经常使用不同的起始字节号。
  • 每一方向的序号表明了该段所携带的第一个字节的序号。
  • 每一方也使用确认号来确认它已收到的字节。
    但是,确认号定义了该方预期接收的下一个字节的序号(也就是序号+1)。另外,确认号是累积的,这意味着接收方记下它已安全而且完整地接收到最后一个字节的序号,然后将它加1,并将这个结果作为确认号进行通告。
    在这里,术语“累积”指的是,如果一方使用5643 作为确认号,则表示它已经接收了所有从开始到序号为5 642 的字节。但要注意,这并不是指接收方已经接收了5 642 个字节,因为第一个字节的编号通常并不是从0 开始的。

参考资料

计算机网络教程-自顶向下方法
TCP与UDP的区别

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×