网络

计算机网络是计算机科学的一个重要组成部分。特别是在当前互联网,移动互联网的浪潮之下,几乎所有的服务都需要通过网络实现,并且后台的分布式数据库也通过网络进行互联。因此,了解一些计算机网络相关的概念不仅仅有利于技术面试,也可以对整体行业有更好的理解。对于初级的程序员面试而言,除非是网络相关的职位面试,否则面试的问题基本停留于一些常见概念。例如,TCP和UDP的区别,TCP的基本功能,网络的层次等等。对于路由器生产商,例如Cisco,Arista,华为等,需要着重准备routing相关的问题;对于即时通讯的职位,由于该应用对于性能要求较高,故基本需要用C语言实现,对应地,你需要着重准备socket programing;对于互联网公司,通常公司的开发环境会抽象网络层的具体实现,并提供API,“并提供API,故你只需要对于网络有一个基本概念即可。

网络分层

计算机之间的交互模型通常是指Open Systems Interconnection model (OSI),该模型将网络通信系统抽象成了七层

路由

从用户角度来看,路由(Routing)是指将数据从一个用户终端,通过网络节点(例如路由器,交换机等),发送到另一个用户节点的过程。理论上说,对于一个拥有多个节点的拓扑网络而言,路由是指在Network Layer(OSI model的第三层),将数据包(data packet)从一个节点以最优路径发送到目标节点的实现方法。其核心包括:如何获得邻近节点的信息,如何估计链路质量,如何寻址,如何构建网络拓扑结构“等等。 通过路由器之间的路由协议(routing protocol),可以实现两个网络节点之间信息(包括网络域名,邻近节点,链路质量等)的交换和散布,通过不断重复该过程,每个节点都会获得足够多关于所在网络的拓扑信息。当有数据包需要传送时,路由器再通过路由算法(routing algorithm)计算传递当前数据包的最优路径,并把数据包发送给下一个邻近节点。许多路由算法基于图理论,实现了最小生成树,最短路径等等经典的拓扑算法。关于路由算法的进一步讨论,请参考“工具箱”中提到的参考教材。

网络中,所谓的地址是指IP地址,IPv4规定利用32bits作为IP地址。但随着网络设备的增多,IPv4已经不能满足人们的需求,故互联网逐渐向IPv6进行演进,IPv6利用128bits作为IP地址。

事实上,直观而言,network routing的过程就相当于传统意义上的邮包寄送,IP地址可以类比于邮政编码,路由器就相当于邮局,通过目的地邮政编码与邮局系统中的递送路径进行比较,由此确定下一步应该把当前包裹传递到哪里。

常用网络统计指标

衡量网络质量通常有下面两个指标:

1) 带宽/速率(Bandwidth/Rate)

所谓的带宽是指一个网络节点能以多快的速度将数据接收/发送出去,单位是bits per second(bps)。对于对实时性要求不高的数据,例如下载等,带宽是影响用户体验的主要因素。两个终端节点之间的带宽由路径中所有节点的最小带宽决定。同时,终端的数据发送速度不应该超过当前的上载带宽,否则会对网络造成压力导致拥堵(congestion)。

2) One-way Delay / Round Trip Time (RTT)

One-way Delay用以衡量网络的延迟。假设在时间点A从一个节点发送数据到另一个节点,目的地节点在时间点B收到数据,则两个时间点之差即为One-way Delay。类似地,RTT则是数据完成一个Round Trip回到始发节点的时间差,一般RTT可以近似估计为One-way Delay的两倍。对于网络会议,IP电话等等,延迟是影响用户体验的主要因素。延迟可能是由网络中某个节点处理数据速度慢,突然有大规模数据需要传输,或者某条链路不断重传数据造成的。延迟与带宽有一定的相关性,但没有必然联系:可以类比某个路口,假设每秒可以有一辆车通过该路口,但现在突然来了100辆车,路口的通过效率并没有变化(即带宽不变),但每辆车通过路口的等待时间却变长了(延迟增加)。

TCP vs UDP

在Transport Layer,数据流被分块传输。最常见的传输协议是TCP和UDP。关于两种协议的区别,优劣,通常是网络相关面试的重点。建议着重准备。

Transmission Control Protocol,TCP

Reliable Protocol

TCP是一种可靠的传输协议,即在网络条件正常的情况下,TCP协议能够保证接收端收到所有数据,并且接收到的数据顺序与发送端一致。TCP通过在发送端给每个数据包分配单调递增的sequence number,以及在接受端发送ACK(acknowledgement)实现可靠传输。每个发送的数据包都包含序列号,当接收端收到数据包时,会发送ACK告诉发送端当前自己期待的下一个序列号是多少。例如,发送端分别发送了序列号为99,100,101,102的四个数据包,接收端收到数据包99后,会发送ACK100,意味着接收端期待下一个数据包编号100。如果由于某些原因,数据包100没有到达接收端,但数据包101,102到达了,那么接收端会继续发送ACK100。当发送端发现当前发送的数据包编号超过了100,但接收端仍然期望收到100,那么发送端就会重新发送数据包100。“如果接收端收到了重新发送的数据包100,那么接收端会回复ACK103,继续进行剩下的数据传输,并且把数据包99,100,101,102按顺序传递给上一层。

Flow Control

TCP使用了end-to-end flow control以避免发送端发送数据过快导致接收端无法处理。TCP采用了滑动窗口(sliding window)实现流量控制。接收端通过ACK告诉发送端自己还能够接收多少数据,发送端不能发送超过该值的数据量。当接收端返回的窗口大小为0时,发送端停止发送数据,直到窗口大小被更新。由于ACK是由发送端发送的数据触发,可能接收端窗口已经打开,但是由于发送端已经停止发送,故接收端没有机会通过ACK告知发送端新的窗口大小,在这种情况下会造成死锁。在实际实现中,发送端会设置一个timer,如果timer到期,发送端会尝试发送小数据包,以触发接收端的ACK。

Congestion Control

为了控制传输速度防止堵塞网络,并且在网络容量允许的范围内尽可能多地传输数据,TCP引入congestion control,用以判断当前的网络负荷,并且调整传输速率。TCP通常采用additive increase,multiplicative decrease的算法,即如果按时收到对应的ACK,则下一次传输速率线性增加,否则则视为发生了网络堵塞,下一次传输的比特数折半。所谓的“按时”基于RTT:发送端会估计RTT,并且期望当数据包发送以后,在RTT时间内收到对应的ACK。“现代TCP需要分别实现Slow-start,congestion avoidance,fast retransmit和fast recovery,以达到最高的效率。具体请参考“工具箱”给出的资料。

User Datagram Protocol,UDP

相比于TCP,UDP简单许多:连接建立时不需要经过类似于TCP的三次握手,只需要知道接收端的IP和端口,发送端就可以直接发送数据。同时,UDP也没有ACK,flow control和congestion control,故UDP本身不能保证传输是可靠的。由于UDP本身只负责把数据传输到目的地,故可扩展性比较强。有些应用可以实现基于UDP 的特定算法,使得传输效率高于TCP。例如,当发生丢包时,TCP会重传该数据包,但该操作增加了传输延时。对于某些实时性要求较高的应用,可能继续传输新的数据更为重要,故基于UDP的传输方式可以更好地满足该要求。

通常而言,如果需要满足可靠性,有序接收,自适应带宽等要求,应该优先考虑TCP,因为其协议本身确保了这点。如果对实时性要求较高,或者应用需要特定的网络传输特性,则可以实现基于UDP的传输协议。往往,这样的协议需要实现congestion control,flow control,retransmission等机制,故通常情况下都可以直接采用TCP以减小开发成本。

工具箱

  1. OSI model
  2. Socket Programing
  3. Networking Reference Book
    • Computer Networks, Fifth Edition: A Systems Approach,Larry L. Peterson,Bruce S. Davie