传输控制协议TCP 6.3 TCP 的数据编码与确认 TCP 协议采用了许多与数据链路层类似的机制来保证可靠的数据传输,如采用序列号、确认、滑动窗口协议等。只不过TCP 协议的目的是为了实现端到端结点之间的可靠数据传输,而数据链路层协议则为了实现相邻结点之间的可靠数据传输。 首先,TCP 要为所发送的每一个报文段加上序列号,保证每一个报文段能被接收方接收,并只被正确地接收一次。 其次,TCP 采用具有重传功能的积极确认技术作为可靠数据流传输服务的基础。这里,“确认”是指接收端在正确收到报文段之后向发送端回送一个确认(ACK)信息。发送方将每个已发送的报文段备份在自己的发送缓冲区里,而且在收到相应的确认之前是不会丢弃所保存的报文段的。“积极”是指发送方在每一个报文段发送完毕的同时启动一个定时器,假如定时器的定时期满而关于报文段的确认信息尚未到达,则发送方认为该报文段已丢失并主动重发。为了避免由于网络延迟引起迟到的确认和重复的确认,TCP 规定在确认信息中捎带一个报文段的序号,使接收方能正确地将报文段与确认联系起来。 第三,采用可变长的滑动窗口协议进行流量控制,以防止由于发送端与接收端之间的不匹配而引起数据丢失。这里所采用的滑动窗口协议与数据链路层的滑动窗口协议在工作原理上是完全相同的,惟一的区别在于滑动窗口协议用于传输层是为了在端到端结点之间实现流量控制,而用于数据链路层是为了在相邻结点之间实现流量控制。TCP 采用可变长的滑动窗口,使得发送端与接收端可根据自己的CPU 和数据缓存资源对数据发送和接收能力来作出动态调整,从而灵活性更强,也更合理。 6.4 传输效率与流量控制 6.4.1 滑动窗口机制 TCP 采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。 在 TCP 报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。 举例:见下图 情况(a): 发送端要发送 900 字节长的数据,划分为 9 个 100 字节长的报文段,而发送窗口确定为 500 字节。发送端只要收到了对方的确认,发送窗口就可前移。发送 TCP 要维护一个指针。每发送一个报文段,指针就向前移动一个报文段的距离。 情况(b): 发送端已发送了 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变...