Cracking the coding interview--Q17.5

Hawstein | February 7, 2013

题目

原文:

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协议具有以下特点:

  • 可靠的。当你沿着一个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

声明:自由转载-非商用-非衍生-保持署名 | 创意共享3.0许可证,转载请注明作者及出处
出处:http://hawstein.com/2013/02/07/17.5/