传输控制协议(Transmission Control Protocol,TCP)
是一个面向连接可靠的协议。
像UDP 一样,TCP 通过使用端口号来提供进程到进程通信。
与UDP 不同,TCP 是一个面向流的协议。在UDP 中,进程发送一些具有预先规定边界的报文给UDP 进行传递。UDP 将它自己的头部添加到这些报文中并传递到IP 层进行传输。来自进程的每一个报文称为一个用户数据报,最后变成一个IP 数据报。IP 和UDP 都不认识这些数据之间的关系。
而TCP 允许发送进程以字节流形式传递数据,并且接收进程也以字节流形式接收数据。TCP 建立一种环境,在这种环境中,两个进程好像由一个假想的“管道”连接,这个管道通过因特网传送这些进程的数据。
这种假想的环境如图所示。发送进程产生(写入)字节流,而接收进程消费(读出)这些字节流。
因为发送和接收进程可能以不同的速度写入和读出数据,所以TCP 需要用于存储的缓冲区。
实现缓冲区的一种方法
是使用以一字节为存储单元的循环数组。实现缓冲区的方法如图所示。为了简化,我们只画出了两个缓冲区,每个缓冲区20个字节。通常情况下,缓冲区是数百甚至数千个字节,这取决于实现方法。这里给出的缓冲区是大小相同的,实际上并非总是如此。
上图表示了在一个方向上数据的移动。在发送端,缓冲区有三种类型的存储单元。
接收端的缓冲区操作比较简单。环形缓冲区分成两个区域(表示为白色和灰色)。白色区域包含空存储单元,可以由从网络上接收的字节进行填充。灰色区域表示接收到的字节,可以由接收进
程读出。当某个字节被接收进程读出以后,这个存储单元可被回收,并加入到空存储单元池中。
尽管缓冲能够处理生产进程速度和消费进程速度之间的不相称问题,但在发送数据之前,还需要多个步骤。
IP 层作为TCP 服务的提供者,需要以分组的方式而不是字节流的方式发送数据。
在传输层,TCP 将多个字节组合在一起成为一个分组,这个分组称为段(segment)。
TCP 给每个段添加头部(为了达到控制目的),并将该段传递给IP 层。段被封装到IP 数据报中,然后再进行传输。整个操作对接收进程是透明的。
这些段可能被无序接收、丢失,或者损坏和重发。所有这些均由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 软件能够记录发送或接收的段,但是在段的头部没有段序号字段。
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 中的通信是全双工的;当建立一个连接时,双方同时都能发送和接收数据。
计算机网络教程-自顶向下方法
TCP与UDP的区别
Update your browser to view this website correctly. Update my browser now