陈颂光
全栈工程师,能够独立开发从解释器到网站和桌面/移动端应用的各类软件。
关注我的 GitHub

理解计算机网络

一组相互连接的网络称为互联网。为了设计和描述网络,通常用分层方法以分解复杂度,每层负责提供不同的服务,每一层只依赖于下面一层的接口。每一层也可有多种称为协议的工作方式以提高灵活性。下面给出一个实用的分层模型:

  • 物理层负责在通信信道上传输比特(它要尽可能确保一端发送一个比特时另一端收到一个相同的比特),这涉及机械和电子:
    • 0与1分别怎样表示
    • 传输是单工的(只有一方可发送)、半双工(双方可发送,但同一时间只有一方在发送)的还是全双工(双方可同时发送)
  • 数据链路层负责在两个相邻节点间传输帧,常见的问题有:
    • 确保接收方收到正确的帧,通常是通过发回确认帧
    • 确保接受方与发送方速率匹配(流量调节)
    • 广播式网络中共享信道的访问
  • 网络层负责在两个节点间传输帧,常见的问题有:
    • 对节点的命名
    • 决定从源到目标的路径(路由)
    • 异构网络间的兼容性
    • 服务质量保证
  • 传输层负责在两个应用程序间传输包,常见问题有:
    • 区分应用程序(端口)
    • 是否保证可靠性(顺序、错误检测)
    • 流量控制
  • 应用层负责生成或处理数据。

在OSI模型中,应用层下面,还有会话层负责对话和同步,表示层负责公共数据结构的编码。

许多事实上的网络标准是IETF的RFC,也有一些标准来自IEEE、ISO或ITU。

物理层

基本常识

在电子领域,带宽是指在传输过程中振幅不会明显减弱的频率范围宽度。如果不考虑噪声,任何经过了带宽为$B$的低通滤波器的信号,单位时间内采样$2B$次就够了,如果信号有$V$个离散级别则最大数据为$2B\log_2V$。对于信噪比$\frac{S}{N}$的信道,最大数据速率为$B\log_2(1+\frac{S}{N})$。现在技术已经很接近这最优值。

传输介质

导向传输介质

  • 交通工具。把数据写到存储设备后用交通工具送到另一个节点,对于大量数据而言,这实际上可能是最便宜和快速的,一辆满载磁带、DVD或U盘的货车的带宽是所有导线网络所望尘莫及的。
  • 双绞线由两条相互绝缘的铜线螺旋式地绞在一起组成。有一定抗干扰能力(几千米不用增强),带宽与直径有关,可用于数字或模拟信号,常用于电话系统。5 类线由四对双绞线组成,但100Mbps以太网只用了其中两对用于两个方向。有人提议在每对双绞线加屏蔽层,但因较昂贵和笨拙而没有广泛使用。
  • 同轴电缆由内层铜芯和外网组成,它们由绝缘层分开。有较强的抗干扰能力,带宽也高,可用于数字或模拟信号(但电阻不同),常用于有线电视和以往的长途电话系统。
  • 供电网络的电力线。对用户方便(供电与网络可用相同接口),但噪声严重。
  • 光纤由光源(发光二极管或半导体激光,前者比较便宜用于单模光纤)、双层琉璃介质(通过全反射传输)、光电二极管。有很强的抗干扰能力(50公里不用增强,,用适当波形避免色散可能更长),带宽也很高(可达100Gbps,如可突破光电转换开销可更高),成本也高(虽然轻可以节省管线支撑系统成本,但熔合和接口贵),常用于骨干网,但用于最后一英里也越来越普遍。

无线传输

无线传输技术上容易部署(布置管线需要大量人力和协商路权,时间长还往往引致不便),但为了避免混乱ITU-R和各国政府对频谱的分配要服从,而购买频谱相当昂贵,不过通常预留部分频谱免费供小功率使用。

通常用较窄的频段,但也有例外:

  • 跳频扩频,即周期性地改变通信频率,用以增加窃听难度或抗干扰性(不会一直用噪声大的频率),用于军事和wifi
  • 直接序列扩频,即使用码片序列把信号展开到较宽的频段,用以容忍窄带干扰和多径衰减,用于3G电话和GPS
  • 超阔带通信,即发送不断变更位置的脉冲,用以提高带宽和产生较少干扰,用于定位系统

可以使用不同的频段:

  • 无线电波,低频,能全方向传播且穿透障碍物能力强,但衰减严重(平方反比,但长距离下可能比光纤和导线好)且容易受到电气设备干扰
    • VLF、LF、MF沿地面传播,由于带宽低但穿透力强,用于调幅(AM)广播等等
    • HF和VHF借助电离层反射传播,用于长距离通信
  • 微波,几乎直线传播(但还是可能有点多径衰减),穿透力低,每一定距离(与塔高平方根正比)需要中继器,4GHz以上可能被雨水吸收,用于长途电话、移动电话和电视转播
  • 红外线,有方向性,穿透力低,用于遥控器
  • 可见光,对天气比较敏感(温度、湿度、风力)

通过在人造卫星上放置一些转发器(约40个?),把收到的信号放大后在指定波段广播出去,覆盖范围广且传输成本与距离无关,但有点延迟且容易窃听。

  • 地球同步卫星的周期与地球自转周期相同,因而没有定位问题,用于内容发布(主要是电视)等等。
  • 中地球轨道卫星,轨道低一些,覆盖范围也小一些,用于导航系统
  • 低地球轨道卫星,轨道更低,因而发射设备功率可更低,延迟也更低,用于语音和数据通信,适合地面基础设施不发达地区通信(如海洋、极地、高山和沙漠)、灾难救援(地面设施受损)

数字调制与多路复用

由于各种信道都是运送模拟(连续)信号的,而比特是离散(数字)的,所以需要有从数字信号到模拟信号的调制过程和反过来的解调过程。

基带传输

先考虑信号传输占有介质从零到最大值间全部频率的情况。

现在假设介质有两个状态,分别记为0和1。

  • 不归零编码(NRZ)是最直观的方法,是把比特0和1分别表示为状态0和1,但它有重大缺陷,因为双方时钟通常不完全一致,如接收方没法区分一长段0究竟有几个0
  • 曼彻斯特编码,用频率为信号频率两倍的时针信号与原来信号异或(在0和1分别表示为单位时间中状态先1后0和先0后1),从而解决时针只是大致同步的情况,平衡信号(两种状态的时间一样多)对很多设备特别友好(避免直流分量的衰减,方便校准),但消耗了一些带宽
  • 不归零逆转编码(NRZI)在遇到比特1时反转状态,否则保持,它仍有长串零问题,一些解决方案:
    • 把每4个比特映射为5个比特使新的比特组没有全零,从而保证不会有太多连续的0,利用多映射(一个输入组等可能映射为一个指定组或其补,又或按历史选择)可大致实现平衡信号
    • 扰频,即双方使用相同种子生成伪随机序列,通过异或到信号来编码和解码,由于长零通常是人为造成的,这样编码后出现长零不太可能,而且这方案不浪费带宽

当介质有多种状态时,如有$2^n$个状态时,可同时传输最多$n$位(也可能更少,因为部分位用于纠错)。

通带传输

在频带不是从0开始的情况(低频电磁频谱要求很大的天线),可以进行平移。信号可表示为波的各种参数:

  • 幅移键控
  • 频移键控
  • 相移键控

这些模式可以结合使用,如振幅与相位结合的编码方式用星座图(二维坐标平面上标一些点)表示,为了避免轻微干扰影响太多位,可用格雷码使相邻符号只有一个比特不同。

多路复用

为了让多个比特流共用一个信道,有不同方法:

  • 时分复用(TDM),多个流轮流占用信道,混合流以各子流速率总和速率传输,但各流须同步(可能需要增加保护时间)
  • 频分复用(FDM),不同流使用不同的频率范围同时传输,在另一端可用滤波方法(硬件或软件)重新分开它们,为了避免互相干扰:
    • 保护带,让两个频率范围间有一定距离,但会浪费一些带宽
    • 正交频分复用,各频率让每个子载波在相邻子载波中心为零,从而在在中心采样就不会受相邻波影响
  • 码分复用(CDMA),对于每个流对应一个相互正交的等长码片(状态1与-1的序列),发送比特0就改为发送码片(1则是相反的码片)于是在接收端只用与相应码片作内积即可分离出各个比特流,但各流须同步。在一些应用中不要求码片完全正交,用伪随机序列加上其它纠错方法已经足够。

利用已有设施

电话系统

现在的电话系统中各用户通过本地回路(通常用模拟的双绞线,但光纤到户已经开始部署)连接到端局,端局通过数字的中继线(通常是光纤)连接到交换局,各交换局间用中继线连接起来。

为了通过电话系统实现互联网接入,计算机通过调制解调器连接到本地回路。由于普通电话线传输频率不到3.1kHz(因为设计用途为承载话音),所以调制解调器通常只有56kbps的数据率(而且这已经是去掉本地回路中一条才得到的)。后来,DSL(数字用户线)通过去除部分滤波器来消除上述人为的频率限制,然后把频谱分成若干段供各信道使用,包括语音、上行数据和下行数据(通常下行信道较多,因为通常用户下载多于上传,所以叫ADSL)。为了让原有电话继续工作,用户需要增加一个称为分离器的滤波器把低频信号分离出来,电话线、电话和ADSL调制解调器连到分离器的不同接口,这通常需要上门服务;相应地端局也有分离器。

中继线带宽非常高(因为铺设高带宽本和低带宽线路成本差不多,钱主要花在挖沟处),通常是数字的,采用时分复用和波分复用(后者可突破光电转换瓶颈)。

  • 电路交换,即从物理上建立一条端到端的物理连接(早期由接线员人手负责,但因为某镇有两个殡葬工,其中一个的老婆是接线员导致他包揽了生意,结果另一殡葬工发明了自动化电话交换系统)
  • 数据包交换,即用存储-转发方式尽可能快地发送数据包,不同包可能走不同路径(可能后发先至,但容错性更好,因为中间节点故障可以绕过它),从而避免浪费和降低建立电路的开销,但引入了不稳定的排队延迟

移动电话

在移动电话系统中,一个地理区域分成一些蜂窝(跨度可达数公里,但负荷大的地方会使用更小功率更低的),每个蜂窝使用一组与相邻蜂窝都不同的频率。每个蜂窝的中心是一个基站,负责转发蜂窝内的电话传输,各基站最终连接到移动电话交换局(它会维护各手机号最后基站信息)。每个电话与所在蜂窝的基站保持周期性联系,手机开机时检测各控制信道的信号强度选择通过广播自己的序列号和电话号加入最强的,在基站发现信号太弱时询问相邻基站与电话间的信号强度(或者由手机检测),然后把控制权转让给与电话间信号最强的基站(3G用了软切换,即与新基站联系上才与原来基站中断连接以保持连续性)。

  • 第一代移动电话是模拟语音的。为了让蜂窝内可以有多个电话同时使用,采用频分复用,每次通话有上行和下行频谱,另外有频谱用于基站与电话间控制、提醒用户有呼叫、分配信道。打出电话用冲突-随机时间重试的方式广播被叫号和自己的标识。而空闲的电话不断检测寻呼信道,若发现有人呼叫自己,则在指定的信道开始通话。
  • 第二代移动电话是数字语音的。数字化的好处在于可用纠错、压缩和加密技术处理信号,并容许短信。GSM(全球移动通信系统)结合了频分复用和时分复用以支持更多通话同时进行。用于鉴别和加密的机密保存在SIM(用户识别模块)卡中。
  • 第三代移动电话是数字话音和数据。采用CDMA(码分多址),但因为没有同步,也要传输码片。另外,基站要让各手机调节功率(手机本身用来自基站信号强度决定相反的初始发射强度)以避免造成干扰。通过容许多个基站使用相同频率和定向天线,可以增加容量。
  • 第四代移动电话(LTE,长期演进)提供高带宽并与其它有线和无线网络无缝集成。

有线电视

有线电视末段使用同轴电缆为传输介质(前面可能有光纤或天线),为了用有线电视网络涉足互联网接入和电话服务,需要把它改成双向的:把所有中继器(至少是部分频率的)改成双向的,并且把电缆截短再分别连到光纤。为了同时传输电视和互联网内容,使用频分复用,用低(于电视)频谱来传输上行数据,用高频传输下午数据,因此上行带宽一般低于下行的(符合通常客户需求)。

同样,通过有线电视系统接入互联网需要调制解调器,与计算机的接口通常是以太网,与有线电视网络的接口则比较复杂。新上电的调制解调器扫描下行信道寻找一个头端定期发送的特殊包,然后按其中参数在上行信道请求头端分配上下行信道。调制解调器间可能竞争上行信道,纯时分复用过于浪费,故常让若干个调制解调器共用一个槽,结合CDMA或收不到头端确认时等候随机时间重发。

ADSL中每个用户可以保证带宽,而有线电视则是共享带宽的。通常电话设施比有线电视系统更可靠,而且不容易被邻居窃听。

数据链路层

数据链路层在比特流与帧流间转换,可提供的服务分为:

  • 无确认的无连接服务,适合错误率很低或要求实时性时,如以太网
  • 有确认的无连接服务,在没有收到确认时重发帧,以便尽早发现错误,如802.11(wifi)
  • 有确认的有连接服务,保证每个帧以正确顺序接收,如卫星通信

点对点链路

成帧方法

把比特流拆分为帧的方法有:

  • 字节计数,假定所有帧长相同,则把每个指定个数位作为一个帧,缺陷在于可能因一个传输错误而使用后面比特全无意义
  • 标志字节,假定以特定的字节作为帧的分隔符,则寻找这标志字节就可以把各帧分开,为避免标志字节出现于数据中,可用转义字节(用两个转义字节表示自身),应用有PPP
  • 标志比特,如上类似但帧大小不必为8的倍数,用插入位的方法防止内容出现标志,应用有USB
  • 编码违禁,把比特组编码为更长的比特组从而有不合法的编码,然后用它们作为标志

差错控制

为了检测帧的部分或全部丢失,可要求接收方在收到帧(或一组帧)后发回一个确认帧,如果发送方在一个时限内没有收到确认,则重发(指定帧或后面所有帧),重发的帧和原始的帧应该有相同序列号(所需位数与确认组大小有关)以便处理重复接收的情况。

即使收到帧,帧的内容也可能与发送的不同,为了检测错误,需要在帧加入一些冗余:

  • 纠错码可以纠正一些轻微错误,适合较不可靠的信道
    • 海明码,增加一些校验位,它们由一些数据位异或得到,解码为最近的合法码字以提供纠错能力,用于存储器
    • 卷积码,属于流(而不是分组)编码,输出取决于输入位和编码器内部状态(与前面输入有关),处理单个错误效果较好,而且可用软判决(不必在纠错前决定每个位的0还是1)
    • Reed-Solomon码,把数据看作多项式,利用无穷域上n次多项式由其图像的n+1个不同点决定的事实,编码成一些点,处理突发错误效果较好,可与卷积码联用
    • 低密度奇偶校验码,每个输出位由少量输入位形成,解密时用近似算法迭代,适用于大块数据
  • 检错码只检测错误,在发现错误时要求重发,适合较可靠的信道
    • 奇偶校验位,加入一位使码字中1的个数是奇数(或偶数),可检出1位错误,通过交错发送码字可以抵抗一些突发错误(连错几个位)
    • 校验和,通过把帧数据分成组再作模加法,但如果数据随机性低效果会减弱
    • 循环冗余校验,取定r次多项式$G(x)$,把帧看作多项式$M(x)$,则校验和对应$x^rM(x)$除以$G(x)$的商,容易用硬件实现

当然上述只是尽力而为的,不能绝对保证所有错误被检出,但漏网的机会极低

流量控制

在发送方与接收方速度不匹配时需要流量控制,否则会丢失很多帧。基本方式是接收方与发送方协商发送,如:

  • 发送方在接收方确认了上一个帧后才发送下一个帧

例子

PPP帧的格式如下:

  • 使用字节填充作为帧边界(不出现于其它地方)
  • 可选的接收者地址
  • 可选的控制字段
  • 网络层协议编号
  • 有效载荷
  • 循环冗余校验和

PPP还提供:

  • 链路控制协议(LCP),用于启动线路(认证)、测试线路、关闭线路、协商参数等等
  • 网络控制协议(NCP)对应于各种网络层协议,用于协商网络层选项(比如分配IP)

SONET光纤链路上发送PPP帧前进行扰码(与伪随机流xor以防长串0导致的同步问题)。

ADSL链路上PPP协议和有效载荷再包了两层:

  • AAL5,帧包括填充、长度和CRC
  • 异步传输模式(ATM)是一种面向连接的技术,基于虚电路,它传输固定长度(53字节,其中48字节为有效载荷,其余的头包括虚电路标识符)的信元

广播链路

与点对点链路相比,广播链路涉及一个新的问题:多方竞争信道使用权时的管理。

  • 静态信道分配,即拆分信道给不同用户使用,但对于通信量不稳定的情况会造成很大浪费
    • 频分多路复用,如把FM波段分给各电台
    • 时分多路复用
  • 动态信道分配,即每个用户在没有其它用户占用时可使用整个信道
    • ALOHA
      • 纯ALOHA中,每个用户需要发送数据时就尝试发送,然后检测帧是否有冲突(有线局域网中发送时即可检测,无线网可能需要中心确认(也许A、B在都在C的接收范围但不在对方的接收范围,或相反)),有则等待随机时间后重试
    • 分槽ALOHA中,时间是离散的并且是同步的(如通过时间脉冲),每个时间槽对应于一个帧,从而降低了冲突机会一半,但最佳信道利用率仍只有$e^{-1}$
    • 载波侦听(CSMA),监听信道上是否有传输,只在信道空闲时才发送,否则
      • 坚持CSMA,用户一直监听信道,发现信道变为空闲时开始发送,发生冲突则随机等待,问题在于信道变为空闲时多个正在等待的用户会同时开始发送而导致冲突
    • 非坚持CSMA,用户随机等待后继续
    • 带冲突检测的CSMA(CSMA/CD)在发生冲突时立即停止传输,只要在最长传播时间两倍仍没有检测到冲突,则发送方可确定没有冲突
    • 无冲突协议,它们在高竞争时比较合适
      • 预留协议,在竞争期各用户分别有一个位的时间槽用于表示申请使用,然后各申请者轮流使用信道
    • 令牌,只有持有令牌的用户可以发送,每个用户用完后或不需要用时把令牌发给下一用户,曾用于环拓扑的网络
    • 二进制倒计数,在竞争期各用户依次发送其编号各位,一旦发现有比自己高的位就退出竞争,这可实现优先级
    • 有限竞争协议,把用户分成组,组内用冲突方法,组间用无冲突方法

以太网

以太网的帧由前导码、目标地址、源地址、类型(大的话)或长度(小于1536的话)、数据、填充(最小帧长是为了防止短帧没有到达接收方时发送方已经传送完毕,导致冲突漏检)和校验和组成。其中每个网络接口卡出厂时分配了惟一的48位地址(其中前24位确定厂商,后面由厂商分配),地址开首为1表示组播(全1表示广播)。

以太网生命力相当顽强,一再突破速度和距离限制,超越了许多曾经比它好的竞争对手,它的成功不只是由于向后兼容性。

  • 经典以太网使用坚持CSMA/CD,在连续发生$i$次冲突后等待0到$\min\{2^i-1,1023\}$之间个时间槽的随机时间(二进制指数后退)
  • 交换以太网,由于总线式(可能有中继器)或基于集线器的网络随着节点增多,冲突更频繁且容易被窃听,所以出现用交换机代替部分或全部集线器的潮流(即把局域网组成更大的局域网),交换机(作为网桥)只把帧转发到到目标节点的线路,交换机基本上即插即用,它会自动配置(当有帧进入,先更新源地址对应的线路表项,再对目标地址查表以决定转发到哪(到源线路则丢弃防循环,如果交换机成环,还需要找出自动更新一个生成树),没找到则转发到所有其它线路)
    • 虚拟以太网,802.1Q帧加入了虚拟以太网标识符(顺带还有优先级和规范格式指示器位),虚拟以太网感知的交换机会利用这标识符决定转发到哪些线路,从而让一些物理上不同位置的节点逻辑上属于同一网络,方便灵活地进行访问管制、负载控制和广播
  • 快速(百兆)以太网,使用更短或高带宽的介质,并通过自动协商机制兼容老的以太网
  • 千兆以太网,采用扰码和纠错码,增加了载波扩充(填充以便支持更长的线路)、帧突发(一次传输多个帧)、流量控制(利用暂停控制帧)
  • 万兆以太网,通过使用单模光纤、双轴铜线或6a类双绞线,已经用于中继线及数据中心和交换局内部

无线局域网

802.11有两种模式:

  • 架构模式,其中每个客户端与一个接入点(AP)关联,常用于互联网接入
  • 自组织模式,其中各节点是对等的,较不常见

在物理层,有多种选择,它们都支持多种速率可自适应

  • 老式802.11使用红外或2.4GHz跳频
  • 802.11a使用5GHz频段的正交频分复用
  • 802.11b使用2.4GHz频段扩频使用码分复用
  • 802.11g使用2.4GHz频段的正交频分复用
  • 802.11n使用四根天线同时发送信息流,用多入多出(MIMO)技术分离它们

802.11使用带冲突避免的CSMA(CSMA/CA),即空闲时仍然随机等待(非空闲时不计入),发送但收不到确认则指数后退。

  • 为提高可靠性,必要时降低速率或帧大小
  • 为了移动设备的电池,可以向AP声明进入省电模式,由AP缓存发给移动设备的数据(期间可能向移动设备发送信标帧),直到移动设备主动发送
  • 为了服务质量,不同优先级的帧在信道空闲不同时间长度后才开始发送

802.11的帧分为数据帧、控制帧、管理帧,帧由帧控制、持续时间、接收地址、传输地址(除控制帧)、序号(除控制帧)、CRC

802.11提供以下服务:

  • 数据传送
  • 关联服务,用于连接移动站与AP
  • 重新关联,用于改变移动站的首选AP(如站离开或AP关闭)
  • 认证,包括WPA2方式和已经被攻破的WEP
  • 分发服务,用于路由帧(发到空中或有线网络)
  • 隐私服务,如WPA2使用AES加密
  • QoS流量调度和计时器同步,用于流媒体
  • 发射功率控制,用于节能和满足监管要求
  • 动态频率选择,用于避开繁忙的频段

宽带无线

802.16(全球微波接入互操作性,WiMax)被提议用于最后一英里接入,结合了802.11和3G的一些特性。

  • 物理层,先频用OFDM技术分为一些信道,并通过时分实现双工(时间非对称)
  • 用户与基站利用X.509证书和RSA双向认证,其后通信用密码链块模式的AES或DES加密,用SHA-1检查完整性
  • 链路面向连接,上行链路服务质量分为:
    • 恒定比特率服务,如未压缩媒体
    • 实时可变比特率服务,如压缩媒体
    • 非实时可变比特率服务,如大文件传输
    • 尽力而为服务
  • 特定服务汇聚子层,映射到IP、以太网或ATM等等

蓝牙

蓝牙提供短距离通信,不同的设备能相互发现和连接(配对),进行安全的通信。它的功能包括:

  • 语音通信(如对对讲机、无线耳机)
  • 输入输出(如键盘、鼠标、打印机和遥控器)
  • 数据同步
  • 联网

蓝牙系统由微网组成,一组相互连接的微网构成散网。每个微网有一个主节点、至多7个从节点和至多255个驻留节点(只响应主节点)。

  • 使用2.4GHz频分复用、自适应跳频和频移键控或相移键控(后者一个符号可携带2~3比特)调制
  • 信道再时分给主节点(一半)和从节点
  • 帧包括
    • 标识主节点的访问码
    • 重复三次的头(因噪声大):目标号、类型(同步有连接/异步无连接/轮询/空)、缓冲是否満是否确认、序列号和CRC
  • 帧的有效载荷可以加密
  • 主从设备的配对通过
    • 个人识别码(PIN)匹配(安全性弱)
    • 自动生成的长密钥匹配
  • 链路可以是同步有连接的(预留时间槽,不重传,用于语音之类)或异步无连接的
  • 可选的逻辑链路控制适配协议提供差错控制和服务质量
  • 不同服务有不同的上层协议

RFID

无线射频识别(RFID)系统提供极低成本的短距离通信,愿景是物联网,其组成为:

  • 读写器,有电源和一些天线,用于盘点附近的标签
  • 标签,包括识别码和少量内存,由无线传输供电

链路是半双工的,读写器进行跳频来限制干扰,用两个低功率间间隔长短来调制解调,当读写器要接收数据时发送固定的载波信号,由标签吸收或反射,这种标签不用射频的方法叫后向散射。为了避免多个标签同时传输,读写器先发送一个查询信号,然后在每个时间槽开始时读写器发送一个开始信号(包括命令、物理层参数、标签选择、响应范围和CRC),然后标签发送响应信号,若读写器没有发现冲突,则发送继续信号,接着前面发过响应的标签发送其标识,否则指数等待。

网络层

网络层提供主机对主机的通信服务

  • 虚电路网络是有连接的,中间的路由器会维护连接信息(每个连接关联的链路),由于按标签而非目标转发,有建立开销但以后节省路由开销,优势在于容易实现服务质量和拥挤控制,如多协议标签交换(MPLS),它能有效地重用标签
  • 数据报网络是无连接的,每个包被单独路由,优势在于高度鲁棒,如互联网协议(IP)

路由算法

点对点

路由过程寻找从源到目标之间的一条路径。路由算法应当是高度鲁棒的,尽可能正确和稳定,并在公平性和有效性间取舍。路由器使用存储-转发模式工作,来自输入线路的每个信号会被转发到某个输出线路,这决策通常通过查表完成,这个表可能是静态的,但通常是动态地自适应更新的。

  • 最短路径算法总是选择从源到目标的最短加权(距离、带宽、延迟、成本等等)路径,但由于难以知道整个网络的结构(它还会变化),这只能作为一个基准
  • 泛洪算法把每个输入转发到所有其它出口,极端鲁棒,但会造成太多重复的包(即使限制每个包的跳数,或者防止相同包经过同一路由器两次),只能用于小网络
  • 距离矢量算法,每个路由器维护到各地址的已知最短路径的长度和相邻结点列表,然后相邻的路由器间定期交换列表以找出更短的路径(还有测量与邻居的延迟),它会收敛,缺点是坏消息传播很慢
  • 链路状态路由,每个路由器启动时利用HELLO数据包发现邻居并计算各链路成本(按延迟和带宽倒数等等),然后定期或发生变化时把链路信息推送给所有路由器(如受控的泛洪),各路由器按这些信息更新路由,它收敛快但要求内存和计算时间较大

为了提高网络的可伸缩性,可以采用分层路由,即把路由器组织为区域,每个路由器只维护到同一区域中其它路由器的链路和到其它同级区域的链路表。

组播

组播寻找从源到时一组目标的路径集。我们固然可以通过分别对每个目标进行路由,但这会造成不必要的重复工作:因为许多相同数据会经过相同的链路,实际上只用发一次(但要标识目标集)。

特别地,广播可用逆向路径转发,如果广播包来自往广播源的链路,则转发到所有其它链路,否则抛弃,这样路由器也不用记住序号也能反回环。如果知道整个网络的拓扑,还可以通过最小生成树优化。

如果组的密度高,可以借用上述的广播技术,但可以通过修剪(删除不通往组成员的分支)广播生成树得出组播生成树优化。如果不知道全局的拓扑,则可以由发现死包的路由器告诉上一个不要再把这组的包发到这。另一种方法则是由各组成员分别向一个中心发送包。

拥挤控制

当网络负荷过重,实际吞吐量反而会由于超时或缓存溢出而下降,这就是拥挤。控制拥挤的方法由短期到长远有:

  • 负载脱落,过载时故意丢弃一些包,但在没有发送方合作的话不知道包的重要性(如实时媒体中新的全帧较重要,文件传输则是老的重要),避免发送方把所有东西标成重要只能靠经济诱因
  • 流量限制,当发现拥挤迹象(按线路利用率、排队长度、丢包率)时要求发送方或前一跳放慢(在包打标记或专门的抑制包)
  • 准入控制,基于虚电路的网络可在高负载时拒绝建立新连接,这甚至可保证容量
  • 流量感知路由,即让数据包避开热点区域,方法是把延迟作为路由考虑,但这会导致不稳定性,多路径路由分散流量可能更有吸引力
  • 网络供给,即建立一个与流量匹配的网络

服务质量

  • 流量整形,通过调节速率和突发性平滑化以减少网络拥挤并且更容易描述,一种方法是令牌桶算法,数据(看作水)注入桶中,有令牌时可排出一定量
  • 包调度,路由器分配带宽、缓冲区和CPU时间的方法:
    • 先来先报务,实现简单,但不同流间会相互影响服务质量且尾丢包不一定是预期的
    • 公平队列,为每个输出线路设立单独的队列,每个队列有给定的资源
    • 优先级,优先处理最高优先级的包,于是低优先级的可能饿死
    • 时间戳顺序
  • 准入控制,各路由器按流规范(如令牌桶速率、令牌桶容量、峰值速率、数据包大小范围)决定是否接受连接

IETF提出了两个报务质量协议:

  • 综合服务,由接收方向发送方发出资源预留请求,中间经过的路由器按此预留必要资源,但没有被广泛部署
  • 区分服务,一组路由器组成管理域(通常由ISP管理),为订购区分服务的IP包打上区分服务类别字段,不同服务类别对应不同优先级的队列和故意丢失概率

网络互联

由于各种网络(如以太网、802.11、MPLS)提供不同的服务(有没有连接、能否组播或广播、数据包大小、有序性、服务质量、丢包率、安全性、记帐等等)要把它们互联,需要一个公共层。IP是最流行的网络层协议,它对下层要求很少,可提供尽力而为的服务。

IPv4

网络层首先要为各结点(网络接口而非主机)命名,IPv4中概念上每个结点用32位的IP地址标识,IP地址的若干高位标识网络,其余位标识结点,通常记为首字节的十进制表示.次字节的十进制表示.三字节的十进制表示.末字节的十进制表示/网络部分位数的十进制表示,其中网络部分为IP地址与子网掩码的与。IP地址的层次结构简化了路由(只用维护前缀和线路对应,采最具体优先,这缩短了路由表从而时间开销,这叫无类域间路由CIDR),但造成了地址浪费和不利移动设备(它可能不同时间在不同子网)。一些IP地址有特殊意义:

  • 位全0的地址表示本机
  • 位全1的地址表示在本地网络广播
  • 网络部分全0表示本地网络的指定结点
  • 结点部分全1表示在指定网络广播
  • 由位01111111(127)开始的地址供回环测试用(到这地址的包不会放到线路而作为入境包)
  • 由位00001010(10)开始的地址用作NAT内部地址
  • 由位1110开始的D类地址用于组播
  • 由位1111开始的E类地址被保留

IPv4头的组成:

  • 版本,4位
  • 头有多少个32位,4位
  • 区分服务,8位(其中6位用于服务类别,2位用于拥挤通知)
  • 头与数据的总长度(字节),16位
  • 分段所属数据报标识,16位
  • 预留,1位
  • 不允许分段标志,1位,用于发现路径的最大传输单元(必须分段时会报错)
  • 还有更多分段标志,1位
  • 分段偏移量,13位
  • 生存期,8位,经过每个路由器时至少递减1(排队时间长可更多),到0则丢弃包并向发送方报错
  • 传输层协议,8位
  • 头校验和,16位,使头所有16位之和为0
  • 源地址,32位
  • 目标地址,32位
  • 若干个选项,都不常用或没有得到广泛支持,如
    • 安全,给出密级
    • 严格源路由,给出包应经过的完整路径
    • 松散源路由,给出包应经过的部分路由器
    • 记录路由,要求每个路由器加上自己的地址
    • 时间戳,要求每个路由器加上自己的地址和时间戳

IPv6

IPv6中每个结点用128位的IP地址标识,通常用16进制表示,每4位用:分隔,各组的前导0可省去。

IPv6头的组成:

  • 版本,4位
  • 区分服务,8位(其中6位用于服务类别,2位用于拥挤通知)
  • 流标签,20位,用于服务质量保证
  • 有效载荷长度,16位
  • 下一个扩展头的类型或传输层协议,8位
  • 跳数限制,8位,经过每个路由器时递减1,到0则丢弃包并向发送方报错
  • 源地址,128位
  • 目标地址,128位
  • 可选的扩展头(包括含下一个头类型、8位类型(前两位表示不能处理选项时应跳过、丢包、丢包并报错、丢包并对非组播地址报错)、8位字节长度和值):
    • 逐跳选项:所有路由器解析的选项,如巨型有效载荷长度
    • 目标选项:只由目标解析的选项
    • 路由:包括未经过的路由类型、路由器数、包必须经过的路由器地址
    • 分段:包括数据报标识符、分段号、是否还有分段等等信息,但利用MTU发现,只有源进行分段(与IPv4不同)
    • 认证:用于鉴别发送方
    • 安全:用于提供机密性和完整性

虽然IPv6已经提出二十多年,但由于从IPv4平滑切换到它涉及更新大量现存设备,使用还不是很普遍,再说IPv4地址不足的问题在通过两个权宜之计缓解:

  • 动态地分配地址,从而只用为活跃(而不是全部)的网络接口分配IP地址,但总是有线的需求正在变大
  • 网络地址转换,即在客户网络与ISP路由器间设立NAT盒子(可能和防火墙合一),把IP地址和端口(TCP/UDP)重新映射,于是一个外部IP地址可以对应超过6万台个网络接口,但它违反了协议分层的原则,从而有局限性:
    • NAT内部可向外部发起通信,但外部不能主动向NAT内部发起通信,这可能是缺点(如点对点通信变得难以实现),也可能是优点(和防火墙一样防止可疑的外部连接)
    • 不适用于非TCP/UDP的通信
    • 一些应用层协议指定客户使用多个指定端口(如FTP),为NAT盒子就每一个打补丁并不理想

辅助协议

ICMP

互联网控制消息协议支持的消息类型有:

类型 用途
目的地不可达 在路由器不能发现合适输出线路时报告源
超时 在TTL减到0时报告源,traceroute就用它跟踪路径
参数问题 头无效时报告源
源抑制 告知源发送了太多包
重定向 在包似乎路由错误时告知源
回显和回显应答 用于检查连通性
请求和应答时间戳 与回显类似但要求时间戳
路由器通告 用于发现附近的路由器
ARP

地址解析协议用于查询IP地址对应的以太网MAC地址。基本工作方式为:

  1. 当一个结点想向一个IP地址发信息时,在以太网广播一个请求,查询这IP地址
  2. 如果有结点发现有人在请求自己的IP地址,则返回其MAC地址
  3. 源收到应答后就可以利用MAC地址发送帧,没有应答则向称为默认网关的已知路由器发送帧

当然,不用每次发都重复上述过程,各以太网结点会缓存结果,在发生变化时也可能主动通知其它结点。

有时,ARP代理仿冒拥有特定IP地址并代答ARP请求,这可能用于拒绝报务攻击或中间人攻击,但也有合理用途,如代发或重定向到移动设备。

DHCP

动态主机配置协议用于配置地址、网络掩码、默认网关地址、DNS服务器地址等等。它的工作方式是结点启动时广播DHCP发现包,DHCP服务器(若它不在本地网络,路由器可能要配置为转发这种包)收到后,通过DHCP提供包返回配置参数。以后结点周期性向DHCP服务器续订。

OSPF

开放最短路径优先协议常用于域内路由(内部网关路由),它支持点对点链路和广播链路。自治区域被划分成一些区域,连接到至少两个区域的路由器叫区域边界路由器,其它叫内部路由器。其中,有个骨干区域,它连接到所有其它区域(可能通过隧道),其中的路由器叫骨干路由器。

对于同一区域中的源和目的地,选择区域内最佳路径之一(负载平衡)。否则,若源和目的地在自治区域的不同区域,则先路由到骨干区域再到目的地所在区域。若目的地不在自治区域内,则先路由到自治区域边界路由器。实际上,自治区域可组织为更多层。

同一区域内路由采用基于距离向量的动态方法。由于与同一LAN上的路由器交换信息是低效的,每个LAN选举出一台指定路由器和备份路由器,每个路由器与各同LAN的指定路由器交换信息。这涉及一些IP包:

  • 新加入的路由器发现邻居
  • 提供和确认发送者到其邻居的成本
  • 声明链路状态变更
  • 请求链路状态信息

BGP

边界网关协议常用于域间路由,由于不同自治区域由不同组织管理,所以涉及政治和商业考虑,如不想经过敌对组织的网络中转或选择中转费较便宜的网络。

传输层

区分应用程序是通过端口号进行的,一些众所周知的服务使用固定的端口号(可见/etc/services文件,其中低于1024的通常只供特权用户侦听),而其它端口可能要用端口映射器按名称查找。服务器进程除了可能直接监听端口外,也可能由系统进程inetd监听一组端口并分派连接给各服务器进程。

面向连接的服务

以下是标准的服务原语:

  • 主动建立连接,这需要发送包
  • 等待连接请求
  • 释放连接,这需要发送包
  • 发送数据,这需要发送包
  • 等待接收数据

TCP

传输控制协议(TCP)用于在不可靠网络上提供可靠的端对端全双工字节流传输。

TCP头的组成:

  • 源端口,16位,用于区分发送主机上的应用程序
  • 目标端口,16位,用于区分接收主机上的应用程序
  • 序号,32位
  • 确认号,32位,表示下一预期来自对方的序号(即确认前面的已收到)
  • TCP头长度,4位表示头有多少个32位
  • 保留,4位
  • 标志位
    • CWR表示是否要求对方放慢发送速率
    • ECE表示是否已经应对方要求放慢
    • URG表示是否使用紧急指针
    • ACK表示是否有确认信息(通常1)
    • PSH表示接收方是否应立即清洗缓冲区
    • RST表示是否重置(如用于主机崩溃和拒收)
    • SYN表示是用于建立连接
    • FIN表示是否释放连接
  • 窗口大小,16位,用于说明对方从确认号起能发多少个字节(通常是缓冲区的空闲空间)
  • 校验和,16位
  • 紧急指针,16位,指定到紧急数据的字节偏移(不常用)
  • 若干个选项,如
    • 接受的最大报长(默认556字节)
    • 窗口因子,窗口大小会被左移这位数
    • 时间戳,用于估算超时和防止序号回绕
    • 选择确认,确认一个序号范围

TCP建立连接的过程如下:

  1. 发起方向接受方发送SYN包
  2. 接受方向发起方发送SYN-ACK包,确认发起方的初始序号
  3. 发起方向接受方发送ACK包,确认接受方的初始序号

TCP释放连接的过程如下:

  1. 一方向另一方发送FIN包
  2. 另一方向一方发送FIN-ACK包
  3. 一方向另一方发送ACK包

然而由于其中任何的包都可能丢失,所以不能保证双方真正完成连接。事实上,不存在能保证对方建立也连接的协议,因为如果最后的一个包重要则因为无从知道它有没有丢协议不可靠,而如果该包不重要,则可从协议去掉。类似地,为了避免出现半开连接或不断重传,可以约定一段时间没有收到段则要求对方响应,收不到响应则断开连接,但在要维持连接时可能要定时发送哑段。有时按照需要单方面断开连接已经足够。

因为要重组顺序,需要缓冲区。为了控制差错,通常对一组字节确认。一般不是收到数据立即确认,而是延迟一段时间以减少一些确认。如果发送一个包后一段时间内没有收到确认,则重传,这个超时间隔是动态调整的,根据测量的确认间隔老化得出平滑往返时间和平滑往返时间变化,但排除重传值。另外,发送方在一段时间都由于窗口限制不能发数据时发送探询消息,以防确认丢失导致通信死锁。

为了控制拥挤,TCP协商窗口大小,其中丢包常视为拥挤的信号(传输错误较少见)。如慢速启动中,窗口大小不断增加(先指数后线性),直到出现丢包(收到后续包确认或超时)则减半。

这里涉及公平与效率的一个权衡,如为连接单独划分带宽和缓冲区以保证服务质量往往会导致低资源使用率。一个公平策略最大最小公平中,各连接初始速率为0,然后缓慢地增加它们的速率,直到饱和。对主机的公平性与对连接的公平性又会得出不同结果。

如果要应付主机崩溃,一般需要应用层介入,因为传输层并不知道接着要做什么。

无连接服务

UDP

UDP头由源端口、目标、UDP长度和可选的UDP校验和(校验头、数据和争议性的IP伪头)。UDP用于DNS查询、实时媒体、幂等的远程过程调用(RPC)。以下两个介于传输层与应用层间的协议基于UDP来进行实时传输:

  • 实时传输协议(RTP)把多个实时数据流复用到UDP数据报流,每个数据报的RTP头有有效载荷类型、序号、相对时间(以便视频流与音频流同步,并控制抖动)、同步源标识符、贡献源标识符等等
  • 实时传输控制协议(RTCP)用于反馈网络信息(用于调整数据率)、同步不同流和命名源

性能考虑

以下是一些针对高速网络的经验:

  • 主机速度比网络速度更重要,现在网络接口卡和路由器处理数据包的速率已经可与数据包到达链路的速率一样快,故主机的软件开销成为瓶颈
  • 使用大的包和小的头以减低开销,且成块地使用数据
  • 避免层间的重复工作和复制
  • 避免不必要的上下文切换,因为内核态与用户态切换常伴随复制
  • 避免拥挤优于拥护恢复,因为拥挤恢复代价高
  • 设置较大的超时值,避免不必要的重传
  • 考虑用硬件实现协议
  • 避免反馈
  • 面向连接

对于低速网络则有不同的经验:

  • 压缩头

对于涉及不总保持连接设备(如低轨道卫星、潜艇和只购买非高峰时段网络服务的企业)的延迟/中断容忍网络,虽然仍是存储转发模型,但等待链路可用需要较长时间,需要持久性介质。同时,设备可能会通过不同的接入点接入网络,可能是可预测的(如卫星)也可能不是(如汽车)。为此,需要在传输层与应用层间设数据束协议,并定义这层的标识符。

应用层

域名系统

有人说,命名和缓存失效是计算机领域最重大的两个问题。域名系统(DNS)就是给网络上主机命名的一个常用方案,在这方案中主机按逻辑(而非物理结构)被组织为树,每个主机对应于叶子,每个结点称为域,有一个名字(可以非拉丁,不区分大小写),域名由从叶子到某祖先(如果是根,则域名叫绝对域名,否则叫相对域名)的各结点的名字组成,用.分隔。根结点名字为空,它下面一层的域叫顶级域。每个域的管理者可以决定它有哪些下级的域,根由ICANN负责管理。

域名对于人类而言比IP地址好记,但为了用下层协议通信,还是要把域名转换回IP地址。每个域关联一些资源记录,包括域名、生存期、类别(通常为IN,表示互联网)、类型和值,其中常见类型有:

类型 含义
SOA 授权开始 本区域的主要信息源、管理员邮箱、序列号和一些标志与时限
A 主机的IPv4地址 32位整数
AAAA 主机的IPv6地址 128位整数
MX 邮件交换 优先级和接收邮件的域
NS 域名服务器 本域的域名服务器
CNAME 规范名 域名
PTR 指针 IP地址的别名
SPF 发送者的政策框架 邮件发送政策文本
SRV 服务 提供服务的主机
TXT 文本 说明的ASCII文本

一个域名可以对应多个IP地址以便负载平衡。一个域的各资源记录存放在一个或多个域名服务器中。查询一个域并找出其对应地址的过程称为域名解析,标准的流程中,每个机器知道一个或多个本地域名服务器(通常由ISP运营,也可能由其它人,如google运营8.8.8.8以便收集营销数据)的地址,用户的域名解析请求发送到本地域名服务器,然后本地域名服务器依次找出从根(根域名服务器的地址是已知的)到查询域名上级域各级域名服务器的地址,直到得到所求域名对应的地址,最后把结果返回给用户。当然,为了避免多余的重复查询和减低根域名服务器的压力,用户和本地域名服务器都会缓存结果一段时间,缓存记录(相对于权威记录)可能过时。

由于性能原因,DNS查询基于UDP,并采用简单的格式,用16位标识符关联查询与响应。针对安全性问题,已经有人提出的DNSSEC机制。

电子邮件

电子邮件系统的构成包括:

  • 用户代理是用户用来收发邮件的程序,它与用户的邮件传输代理通信,也可能带有邮件过滤、自动回复之类的功能。例子有Outlook、Thunderbird和一些基于web界面的。
  • 邮件传输代理用于转发邮件,邮件从发送者的邮件传输代理送到接收者的邮件传输代理(不直接给接收者是因为他不总是在线,或者在不同地方在线),中间可能经过其它邮件传输代理(中继的常见用途是邮箱迁移)

现在流行的邮件格式由RFC5322定义,邮件头(类比于信封)由一些键值对组成,其中多数是可选的:

  • To:字段给出主要收件人列表,收件人通常用标识@域名形式给出
  • Cc:字段给出次要收件人列表
  • Bcc:字段给出秘密收件人列表(不让主次收件人知道)
  • From:字段给出邮件作者
  • Sender:字段给出邮件发送者
  • Date:(时间)、Reply-To:(回复地址)、Message-Id:(邮件标识)、In-Reply-To:(所回复邮件的标识)、References:(相关邮件标识)、Keywords:(关键字)、Subject:(标题)等等自明
  • MIME-Version:(MIME版本)、Content-Description:(ASCII描述)、Content-Id:(内容标识)、Content-Transfer-Encoding:(打包方式)、Content-Type:(内容类型和格式)等等指定内容类型
  • Received:字段给出经过的邮件传输代理标识符、时间和一些路由信息,由邮件传输代理插入
  • Return-Path:字段给出返回给发件人的方法,通常只有它是地址,由最后的邮件传输代理插入
  • X-g开首的非标准字段

邮件体在邮件头后的空行后开始,其编码方法由MIME相关的RFC给出,其中标准的打包方法有:

  • ASCII文本,每行最多1000个字符
  • 扩展ASCII文本(可用一个字节全部8位),每行最多1000个字符
  • 原始二进制数据(可用一个字节全部8位)
  • 二进制数据base64编码,把每三个字节编码为四个字节,每6位编码为一个ASCII字符,0到63依次表示为A到Z、a到z、0到9、+/,最后填充最多2个=
  • 可打印编码,即普通字符按ASCII编码,但控制字符、个别标点符号和大于127的字节用=后接两个十六进制数字表示

而内容类型形如类型/子类型,后面可能有一些形如;字段=值的参数。标准类型有text(文本)、image(图像)、audio(音频)、video(视频)、model(3D模型)、application(应用程序生成的数据)、message(封装的邮件)、multipart(由多个类型的数据组成,即带附件的邮件),子类型列表由IANA分配。其中message常用的子类型有htmlrfc822partial(容许把邮件拆开几部分分别发送),multipart的子类型有:

  • mixed容许每个部分有不同类型
  • alternative用于提供相同内容的多种格式让用户看其中一个
  • paralled用于指示多个部分应同时观看(如同步的音频和视频)
  • digest用于提供聚合信息

发送邮件使用SMTP协议,客户代理在TCP端口25与邮件服务器建立连接,然后利用ASCII文本通信,一个简单的通信形如:

  1. 用户代理发送HELO 域名,服务器响应一个数字代码和一个字符串
  2. 用户代理发送MAIL FROM: 发件人,服务器响应一个数字代码和一个字符串
  3. 用户代理发送RCPT TO: 收件人,服务器响应一个数字代码和一个字符串
  4. 用户代理发送DATA,服务器响应一个数字代码和一个字符串
  5. 用户代理发送邮件,最后一行是单独的.,服务器响应一个数字代码和一个字符串
  6. 用户代理发送QUIT

SMTP的不足在于缺乏安全性,既没有鉴别发送者(MAIL FROM:字段可随意填),也没有对邮件加密。ESMTP对SMTP进行了扩展,支持AUTH,这样邮件服务器只给他相信的人转发邮件。

用户代理从邮件传输代理接收邮件常用的两个协议如下:

  • IMAP协议(互联网邮件访问协议),用户代理通过TCP 143端口与用户的邮件传输代理通信,它支持用文件夹组织邮件,并有获取邮件和搜索等等命令。
  • POP3协议(邮件协议版本3)是较旧的,它通常把邮件下载到本地后从服务器删除邮件。

当然,基于web的用户代理不必用上述协议。

电子邮件的低成本导致垃圾邮件如假药广告、假文凭和其它诈骗泛滥,它们通常由被恶意软件控制的僵尸网络发出。由于浪费了用户很多时间,有一些防范垃圾邮件的方法:

  • 邮件服务器只接受经认证用户发的邮件
  • 验证发送方IP是否符合声称来源域名的MX列表,如有SPF还可作其它检查
  • 使用规则或统计特征过滤邮件

万维网

万维网由大量相互链接的页面组成,这些页面一般是用HTML(超文本标记语言)写成的文本文件,其中也常嵌入CSS(层叠样式表)和JavaScript,从而完成MVC模型,有关信息请参考。用户通过浏览器访问这些页面,浏览器可利用插件或辅助应用程序呈现各种媒体。现在又回到把资源命名的问题,现在的方法是URL(统一资源定位器),它形如`协议://[用户@]域名或IP[:端口]/路径[?字段[=值]{&字段[=值]}][#书签]`:

  • 协议,常见的有http(超文本传输协议)、https(安全的超文本传输协议)、ftp(文件传输协议)、file(本地文件)、mailto(发送邮件)、rtsp(流式媒体)、sip(多媒体呼叫)、about(浏览器信息)

URL中特殊字符需要编码,空格转为+,其它用UTF-8编码为每字节%hh的形式。有时不用知道资源的位置,只是要作为资源的标识,这时应用URI。

浏览器用HTTP从服务器获取页面和相关资源,浏览器在TCP 80端口向URL指定的服务器主机发送请求,请求的组成

  1. 第一行是请求行:
    • GET请求,首行形如GET URL中主机后的部分 HTTP/1.1
    • POST请求
    • HEAD、PUT、DELETE、TRACE、CONNECT和OPTIONS之类请求不太常用
  2. 请求行后是一些形如字段: 值的行,其中常见字段有:
    • User-Agent是浏览器信息
    • Accept是客户预期的内容类型
    • Accept-Charset是客户可接受的字符集
    • Accept-Encoding是客户可接受打包方式
    • If-Modified-Since是缓存的时间,只有在此后页面发生变化才返回页面
    • If-None-Match是一些加密哈希,只有在页面的加密哈希与这些都不同才返回页面
    • Host是域名(必须,因为一个服务器可能为多个域名服务)
    • Authorization是客户认证信息
    • Referer是导致请求本页面的URL
    • Cookie是客户端为这域名(包括祖先域名)保存的信息,用于跟踪用户
    • Date是日期
    • Range是页面中的范围
    • Cache-Control是缓存处理方法
    • ETag是页面内容加密哈希
    • Upgrade是切换的协议
  3. 一个空行
  4. 是POST数据(如有)

服务器收到请求后,会获取指定的页面文件或运行指定程序(PHP/ASP/JSP/CGI)动态生成页面,并推断MIME类型之类的参数。服务器可能缓存静态文件或编译脚本来提高性能。响应的组成如下:

  1. 响应行,包括三位数代码和对代码的说明
    • 1xx表示信息,如100表示服务器同意处理请求
    • 2xx表示成功,如200表示请求成功、204表示没有内容
    • 3xx表示重定向,如301表示移动页面、304表示缓存仍有效
    • 4xx表示客户错误,如403表示禁止页面、404表示不存在页面
    • 5xx表示服务器错误,如500表示内部错误、503表示稍后再试
  2. 响应行后是一些形如字段: 值的行,其中常见字段有:
    • Server是服务器信息
    • Content-Type是内容类型
    • Content-Length是内容的字节数
    • Content-Encoding是打包方法(如gzip)
    • Content-Language是内容的自然语言
    • Content-Range是内容范围
    • Last-Modified是页面最后修改时间
    • Expires是页面过期时间
    • Location重定向到
    • Accept-Ranges可接受请求的字节范围
    • Set-Cookie是要求客户端为这域名保存的信息,用于跟踪用户
    • Date是日期
    • Range是页面中的范围
    • Cache-Control是缓存处理方法
    • ETag是页面内容加密哈希
    • Upgrade是切换的协议
  3. 一个空行
  4. 页面内容

传统上只有在加载页面时浏览器才能与服务器通信,但AJAX(异步javascript与XML)正改变这一点,从而可以利用来自服务器的最新数据更新页面的一部分。

一些组织中用户还是直接访问万维网,而是通过组织设置的web代理。这样,组织可控制组织内可访问的页面,还可通过多一级缓存来节省带宽和加快常用页面的加载。

内容分发

内容分发网络

为了应付大量请求,使用更强大的服务器是不可伸缩的,因此现在常由大量服务器组成一些服务器农场,然后把不同请求分散给其中各服务器处理,并尽可能保证负载均匀:

  • 让DNS服务器对不同请求返回不同IP(可以按路径长度、负荷或者随机),好处是不同服务器在地理上可以是分散的,从而可伸缩、低往返时间(因用户可从最近的服务器下载)
  • 由前端接收请求,然后分派给不同服务器(或者由空闲的服务器拉取)

它们可以在不同粒度结合使用。另外,保证各服务器提供的内容一致性也是一个问题,如果多个服务器共享存储设备,存储设备容易成为瓶颈。现在已经有一些CDN提供商,租用它们来存放大文件已经成为一种趋势,在应付突发需求时特别有效。

点对点网络

点对点是去中心化的尝试,其中的节点不仅接收内容也发出内容以尽用带宽,通常尽可能避免中心控制点以免单点故障(如被查封),目前最流行的协议是BT(BitTorrent):

  • 对于每个内容有一个种子文件中,其中包括跟踪器位置和内容的加密哈希值,跟踪器维护正在上传和下载该内容的节点列表
  • 节点间交换各自拥有的块列表,每个节点从其它节点下载它没有的内容块(尽可能罕有的)
  • 为了抵制搭便车的不贡献行为,各节点只与其它提供高下载性能的节点继续交换块

由于BT中没有给出查找跟踪器的有效,导致部分跟踪器成为了集中点,于是有人提出完全分布式的方案,其中一个是分布式映射表,能够把内容的加密哈希值映射到跟踪器位置。为此,把节点组织成一个环,每个加密哈希值范围对应对应节点号。为了加快搜索,用搜索树的思想,节点$i$的指取表记录节点$i+1,i+2,i+4,\cdots$的IP地址。在节点正常加入或离开前,应主动通知以便各节点更新指取表。为了容错,可能应在多个节点重复一些数据。

流媒体

对于媒体内容,由于比较大,先下载所有内容再播放要等待很长的时间,而顺序的观看模式恰好为一边下载一边播放提供了可能性。与其它内容相比,流媒体对延迟比较敏感,但对传统的可靠性要求较低(流畅比准确重要)。对于非实时的媒体,需要尽可能保证延迟是稳定的,然后缓冲一段时间的内容延迟播放即可。对于实时的流媒体,如IP语音,绝对延迟也是需要严格控制的,你不希望打电话时说了一句话后人家几秒后才听到回应。为了降低延迟,通过有损压缩技术来减少传输量是基本方法。但压缩也带来其它问题,如丢包后后面解码会出现问题,因此可能需前向纠错(每组包发送一个奇偶校验包)或交错编码(如先发送奇数号帧以使缺口变小)。而传输速率可以取决于双方的缓冲区使用情况,接近满时减慢。流媒体可能用UDP以降低开销,也可能用TCP以便通过防火墙。RTSP同时支持TCP与UDP,RTP则只支持UDP。

对于直播流媒体,由于不能大于播放速率地传送数据,客户端可能为减少抖动而使用更大的缓冲区和延迟。由于所有用户打算同时观看相同内容,服务器的压力主要来自带宽,为此使用组播(如UDP+RTP)是一个理想的方案,但现实上跨越网络边界的组播没有得到普遍支持(主要用于有线电视系统),结果还是要用CDN之类的做法。

对于实时会议,挑战来自于低延迟的要求,所以一般基于UDP,而且使用相对小的包(虽然大的包更高效),编码解码器的时间也能省则省。在不能增加带宽时,可能需要在网络层引入服务质量机制,如区分服务,即优先处理实时流量,甚至预留带宽,但除也加价以外很难防止滥用。

关键词 网络