传输控制协议 TCP 概述
TCP 最主要的特点
- TCP 是
面向连接的运输层协议
。应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接 - 每一条 TCP 连接只能有两个
端点
,每一条 TCP 连接只能是点对点
的(一对一) - TCP 提供
可靠交付
的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达 - TCP 提供
全双工通信
。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据 面向字节流
。TCP 中的“流”指的是流入到进程或从进程流出的字节序列
面向字节流
“面向字节流”的含义是:虽然应用程序和 TCP 的交互式一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流
。TCP 并不知道所传送的字节流的含义
TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系
例如,发送方应用程序交给发送方的 TCP 共10个数据块,但接收方的 TCP 可能只用了4个数据块就把收到的字节流交付上层的应用程序
接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据
TCP 和 UDP 在发送报文时采用的方式完全不同。TCP 并不关心应用进程一次把多长的报文发送到 TCP 的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。如果应用进程传送到 TCP 缓存的数据块太长,TCP 就可以把它划分短一些再传送。如果应用进程一次只发来一个字节,TCP 也可以等待积累有足够多的字节后再构成报文段发送出去
TCP 的连接
TCP 把连接
作为最基本的抽象
。TCP 的许多特性都与 TCP 是面向连接的这个基本特性有关
TCP 连接的端点叫做套接字(socket)或插口
,根据 RFC 793 的定义:端口号拼接到(concatenated with) IP 地址即构成了套接字
套接字 socket = (IP 地址:端口号)
每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定
TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)}
TCP 连接就是由协议软件所提供的一种抽象。TCP 连接的端口是个很抽象的套接字
,即( IP地址
: 端口号
)。同一个 IP 地址可以有多个不同的 TCP 连接,而同一个端口号也可以出现在多个不同的 TCP 连接中
易混淆的 socket
同一个名词 socket 却可表示多种不同的意思,以下 socket 的意思跟本文中所引用的 RFC 793 定义的 socket(指端口号拼接到 IP 地址)不同
- 允许应用程序访问连网协议的
应用编程接口 API(Application Programming Interface)
,即运输层和应用层之间的接口,称为 socket API,并简称为 socket - 在 socket API 中使用的一个
函数名
也叫做 socket - 调用 socket 函数的
端点
称为 socket,如“创建一个数据报 socket” - 调用 socket 函数时,其
返回值
称为 socket 描述符,可简称为 socket - 在操作系统内核中连网协议的 Berkeley 实现,称为 socket
实现
可靠传输的工作原理
理想的传输条件
理想的传输条件有以下两个特点
- 传输信道不产生差错
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据
实际的网络不具备以上两个理想条件。需要使用一些可靠的传输协议,当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当减低发送数据的速度。这样,不可靠的传输信道就能够实现可靠传输了
停止等待协议
全双工通信的双方既是发送方也是接收方。把传送的数据单元都称为分组。“停止等待”就是每发完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组
无差错情况
出现差错
只要超过一段时间没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这就叫做超时重传
。要实现超时重传,就要在每发送完一个分组时设置一个超时计时器
- 发送完一个分组后,
必须暂时保留已发送的分组的副本
(在发生超时重传时使用)。只有在收到相应的确认后才能清除暂时保留的分组副本 - 分组和确认分组都必须进行
编号
。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认 - 超时计时器的重传时间
应当比数据在分组传输的平均往返时间更长一些
确认丢失和确认迟到
使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信
像上述的这种可靠传输协议常称为自动重传请求 ARQ(Automatic Repeat reQuest)
。重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组
信道利用率
停止等待协议的优点是简单,但缺点是信道利用率太低
为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输
。流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直