Cracking the coding interview--Q17.5

February 7, 2013
作者:Hawstein
出处:http://hawstein.com/posts/17.5.html
声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。

题目

原文:

What are the differences between TCP and UDP? Explain how TCP handles reliable delivery (explain ACK mechanism), flow control (explain TCP sebnder’s / receiver’s window) and congestion control.

译文:

TCP和UDP之间有什么区别?解释TCP如何处理可靠交付(解释ACK机制),流量控制 (解释TCP发送器/接收器窗口)及拥塞控制。

解答

TCP(传输控制协议):TCP是一个面向连接的协议。从客户端到服务器可以建立一个连接, 然后数据通过这个连接进行传输。TCP协议具有以下特点:

UDP(用户数据报协议):UDP是无连接的协议。UDP以数据块的形式在网络中发送消息/数据包。 UDP协议的特点如下:

解释TCP如何处理可靠交付(解释ACK机制)和流量控制(解释TCP发送器/接收器窗口)

对于每个TCP数据包,如果接收者收到了数据包,那么它必须发出确认。 发送方如果没有收到确认,会重新发送数据包。这个机制保证每个数据包都被传送到接收方。 ACK是TCP协议中用于确认收到数据包的数据包。TCP窗口是发送方在得到接收方的确认前, 在特定连接上能够发送的数据量。

例如,一对主机在TCP连接上进行通信,其中TCP窗口大小是64KB。那么, 发送方发送完64KB的数据后就必须等待接收方的确认, 接收方发送确认时可能已经收到了全部数据,也可能只收到了部分数据。 如果接收方发出确认所有的数据都已经接收到,那么发送方就会发送另外64KB的数据。 如果发送方收到的确认中表明接收方只收到了32KB的数据(另外32KB的数据可能还在传输, 或者已经丢失),那么发送方最多只能再发送32KB数据,因为同一时刻不能有超过64KB 的未确认数据。(第二个32KB和此次发送的32KB都未确认)

拥塞控制

TCP使用网络拥塞避免算法进行拥塞控制。有许多不同的算法可以解决这个问题。其中, Tahoe和Reno算法是最有名。为了避免拥塞,TCP使用多方位的拥塞控制策略。 对于每个连接,TCP维护一个拥塞窗口,控制未确认数据包的总大小, 这有点类似于TCP中用于流量控制的滑动窗口。TCP使用一种称为“慢启动” 的机制来增加连接初始化后及超时后的拥塞窗口大小。一开始, 拥塞窗口的大小是最大段大小(MSS)的2倍。尽管初始速率很低,但它增加得很快。 每收到一个确认,拥塞窗口就增加1个MSS。这样,经过一个往返时间(RTT), 拥塞窗口就增加了一倍。当拥塞窗口的大小超过一个阈值,算法就进入一个新的状态, 叫拥塞避免。

补充阅读: TCP拥塞控制算法

全书题解目录:

Cracking the coding interview–问题与解答

全书的C++代码托管在Github上:

https://github.com/Hawstein/cracking-the-coding-interview