计算机网络 自顶向下

本书是当前世界上最为流行的计算机网络教科书之一,采用了作者独创的自顶向下的方法来讲授计算机网络的原理及其协议。

应用层

网络应用是计算机网络存在的理由,如果我们不能构想出任何有用的应用,也就没有任何必要去设计支持它们的协议了

协议原理

体系结构

  • 客户-服务器:发起通信的进程被标识为客户,在会话开始时等待联系的进程是服务器
  • 对等p2p:当对等方A请求对等方B发送一个特定文件时,A是客户,B是服务器

进行通信的实际上是进程而不是程序,在两个不同端系统上的进程,通过跨越计算机网络交换报文而互相通信。

为了向特定目的地发送邮政邮件,目的地需要一个地址,为了标识该接收进程,需要定义两种信息

  1. 主机地址
  2. 在目的主机中指定接收进程的标识符

因特网提供俩种运输协议

  1. TCP:此服务模型包括面向连接服务和可靠数据传输服务,
    • 面向连接的服务: TCP 会通过握手让客户和服务器互相交换运输层控制信息
    • 可靠的数据传送服务:当应用程序的一端将字节流传进套接字时,它能够依靠 TCP 将相同字节流交付给的接收方的套接字
  2. UDP:是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达接收进程

Web 和 HTTP

HTTP(HyperText Transfer Protocol) 使用 TCP 作为它的支撑协议,一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问 TCP

非持续连接会按顺序发生以下情况

  1. HTTP客户进程在端口号80发起一个到服务器www.someSchool.eduTCP连接
  2. HTTP经它的套接字向该服务器发送一个HTTP请求报文。该报文中包含了路径名/someDepartment/home.index
  3. HTTP服务器进程经它的套接字接受该请求报文,在其存储器中检索出对象www.someScheool.edu/someDepartment/home.index,在一个HTTP响应报文中封装对象,并通过套接字向客户发送响应报文
  4. HTTP服务器进程通知TCP断开该TCP连接
  5. HTTP客户接收响应报文,TCP连接关闭。该报文指出封装的对象是一个HTML文件,客户从响应报文中提取出该文件,检查该HTML文件,得到图像文件的引用

RTT(Round-Trip Time) 表示往返时间,一轮三次握手也表示一个 RTT ,所以一个非持续连接的响应时间就是两个 RTT 和传输 HTML 文件的时间

电子邮件

由三个部分组成: 用户代理(user agent)邮件服务器(mail server)简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)

每个接收方在其中的某个侯建服务器上有一个邮箱 mailbox ,一个典型的邮件发送过程是

  1. 从发送方的用户代理开始,传输到发送方的邮件服务器
  2. 传输到接受方的邮件服务器
  3. 邮件被分发到接受方的邮箱中

如果发送方的邮件不能交付给接受方的服务器则发送方的邮件服务器在一个报文队列 message queue 中保持该报文并在以后尝试再次发送

以下是 SMTP 的基本操作

  1. 发送方低啊用它的邮件代理程序并提供接收方的邮件地址,撰写报文并指示用户代理发送该报文
  2. 发送方把报文发给它的邮件服务器,在哪里该报文被放在报文队列中
  3. 发送方的邮件服务器上的SMTP客户端发现了报文队列中的这个报文,它就创建一个到运行到接收方邮件服务器上的SMTP服务器的TCP连接
  4. 经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送发送方报文
  5. 在接收方的邮件服务器上,SMTP的服务器端接收该报文,接收方的邮件服务器然后将该报文放入接收方的邮箱中
  6. 在接收者方便时,他调用用户代理调用该报文

SMTP 一般不适用中间服务器发送邮件,会建立一个 TCP 连接直接从两端连接,即使是从香港到洛杉矶

SMTPHTTP 的区别

  • HTTP是一个拉协议,SMTP是一个推协议
  • SMTP要求每个报文采用7比特ASCII码格式,而HTTP没有这种限制
  • 当既包含文本又包含图形时,HTTP把每个对象封装到它自己的HTTP响应报文中,而SMTP把所有报文对象放到一个报文之中

接收方的用户代理如何使用本地 PC 上的用户代理获取位于他的某 ISP 的邮件服务器上的邮件呢,目前有一些流行的邮件访问协议

  1. POP3:,它按照三个阶段进行工作

    • 特许:用户代理发送用户名和口令来鉴别用户,两个命令 user <username>pass <password>

    • 事务处理:用户代理取回报文,这个阶段也能删除报文,有以下几个命令 listretrdelequit

    • 更新:结束该 POP3 对话

  2. IMAP:它比POP3复杂的多,它会把每个报文和一个文件夹联系起来,当保温第一次到达服务器时,它与收件人的INBOX文件夹相关联,收件人能够把邮件移动到一个新的、用户创建的文件夹中阅读和删除等等,它还具有运行用户获取报文某些部分比如报文首部的命令

  3. 基于web的电子邮件:用户代理就是普通的浏览器,用户和它的远程邮箱之间的通信通过HTTP进行

DNS

DNS(Domain Name System) 是一个由分层的 DNS 服务器实现的分布式数据库;一个使得主机能够查询分布式数据库的应用层协议

DNS 通常是由其他应用层协议所使用的,包括 HTTPSMTPFTP ,将用户提供的主机名解析为 IP 地址, DNS 获得 IP 地址的做法如下

  1. 同一台用户主机上运行着DNS应用的客户端
  2. 浏览器从上述URL中抽取出主机名,并将这台主机名传给DNS应用的客户端
  3. DNS客户向DNS服务器发送一个包含主机名的请求
  4. DNS客户最终会收到一份回答报文,其中含有对应于该主机名的IP地址
  5. 一旦浏览器接收到来自于DNS的该IP地址,它能够向位于该IP地址80端口的HTTP服务器进程发起一个TCP连接

DNS 还提供了一些重要的服务

  • 主机别名host aliasing:通常有着复杂主机名的主机能够拥有一个或多个别名,而主机原生的名称为主机规范名canonical hostname
  • 邮件服务器别名mail server aliasing:电子邮件应用程序可以调用DNS,对提供的主机名别名进行解析,以获得该主机的规范主机名机器IP地址,邮件服务器和Web服务器可以使用相同的主机名
  • 负载分配load distribution:繁忙的站点被冗余分布在多台服务器上

DNS 是一个在因特网上实现分布式数据库的精彩范例

  1. 分布式、层次数据库:有三种DNS服务器

    • 根(root) DNS 服务器 :由 13 个不同的组织管理,它提供 TLD 服务器的 IP 地址
    • 顶级域服务器 :比如 comorg 等,也是 TLD 服务器的 IP 地址
    • 权威服务器 :在因特网上具有公共可访问主机(比如 Web 服务器和邮件服务器)的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机名字映射为 IP 地址。一半多数大学和大公司实现和维护他们自己基本和辅助的权威 DNS 服务器

    还有一种叫本地 DNS 服务器,每个 ISP 都有一台本地 DNS 服务器,当主机与某个 ISP 连接时,该 ISP 提供一台主机的 IP 地址,该主机具有体态或多台本地 DNS 服务器的 IP 地址 DHCP

  2. DNS缓存:在一个请求链中,当某DNS服务器接收一个DNS回答时,它能将映射缓存在被本地存储器中

视频流和内容分发网

视频是一系列的图像,通常以一种恒定的速率来展现。视频能够被压缩,可用比特率来权衡视频质量

HTTP 流中,视频只是存储在 HTTP 服务器中作为一个普通文件,每个文件有一个特定的 URL ,当用户要看该视频时,客户与服务器创建一个 TCP 连接并发送对该 URlHTTP GET 请求。

在客户一侧,字节被收集在客户应用缓存中,一旦该缓存中的字节数量超过预先设定的门限,客户应用程序就开始播放,特别是,流式视频周期性地从客户应用程序缓存中抓取帧,对这些帧解压缩并且在用户屏幕上展现

动态适应流 Dynamic Adaptive Streaming over HTTP(DASH) :在 DASH 中,视频编码分为几个不同的版本,其中每个版本具有不同的比特率,对应与不同的质量水平,客户动态地请求来自不同版本且长度为几秒的数据段数据块

使用 DASH 后,每个视频版本存储在 HTTP 服务器中,每个版本都有一个不同的 URLHTTP 服务器也有一个告示文件 manifest file ,为每个版本提供了一个 URL 及其比特率

内容分发网 Content Distribution Network(CDN) 管理分布在多个地理位置上的服务器,在它的服务器中存储静态资源的副本,并且所有试图将每个用户请求定向到一个将提供最好的用户体验的 CDN 位置

大多数 CDN 利用 DNS 来截获和重定向请求,比如在 NetCinema 雇佣了第三方 CDN 公司来向其客户分发视频。接下来出现了 6 个步骤

  1. 用户访问位于NetCinemaweb网页
  2. 当用户点击视频链接时,发送了一个对于video.netcinema.comDNS请求
  3. 用户的本地DNS服务器LDNS将该DNS请求中继到一台用于NetCinema的权威服务器,该服务器观察到URL中的video,为了将该DNS请求移交给KingCDNNetCinema权威DNS服务器并不是返回一个IP地址,而是向LDNS返回一个KingCDN域的主机名
  4. 从这时起,DNS请求进入了KingCDN专用DNS基础设施,用户的LDNS则发送第二个请求,此时是对返回主机名的DNS请求,此时,KingCDNDNS系统最终向LDNS返回KingCND内容服务器的IP地址
  5. LDNS向用户主机转发内容服务CND节点的IP地址
  6. 一旦客户接收到KingCDNIP地址,它与具有该IP地址的服务器创建了一条直接TCP连接,并且发出对该视频的HTTP GET请求

任何 CDN 部署,其核心是集群选择策略 cluster selection strategy ,动态将客户定向到 CDN 的某个服务器集群或数据中心的机制

套接字编程

运行在不同机器上的进程彼此通过向套接字发送报文来进行通信

UDP 套接字编程,可以用两段 python 代码演示

# 客户端

from socket import *
serverName = 'hostname'
serverPort = 12000
# 该行创建客户的套接字,第一个参数表示使用了 ipv4,第二个参数表示该套接字类型
clientSocket = socket(AF_INET, SOCK_DGRAM)
# 当执行这条命令时,屏幕会以下列语句进行提示以让用户键入字符
message = raw_input('Input lowercase sentence:')
# 通过套接字向目的主机发送报文,同时将字符串类型转为字节类型
clientSocket.sendto(message.encode(), (serverName, serverPort))
# 等待接收来自服务器的数据,数据被放置到第一个变量中,源地址被放置在第二个变量中
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode())
clientSocket.close()
# 服务器端

from socket import *
serverName = 'hostname'
serverPort = socket(AF_INET, SOCK_DGRAM)
# 将端口号和服务器的套接字绑定在一起
serverPort.bind('', serverPort)
print('The Server is ready to receive')
while True:
    # 等待分组到达
    messge, clientAddress = serverSocket.recvfrom(2048)
    modifiedMessage = message.decode().upper()
    serverSocket.sendto(modifiedMessage.encode(), clientAddress)

TCP 是一个面向连接的协议,当客户和服务器能够互相开始发送数据之前,他们先要握手和创建一个 TCP 连接。

TCP 连接的一端与客户套接字相联系,另一端与服务器套接字相联系,当创建该 TCP 连接时,我们将其与客户套接字地址(IP 和端口)与服务器套接字地址(IP 和端口)关联起来。

在三次握手后,服务器会生成一个专为客户进行连接的套接字,称为连接套接字 connectionSocket 。可用两段 python 代码演示

# 客户端

from socket import *
serverName = 'servername'
serverPort = 12000
# 第二个套接字表示是一个 tcp 连接
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
sentence = raw_input('Input lowercase sentence:')
# 通过套接字进入 TCP 连接发送字符串
clientSocket.send(sentence.encode())
# 等待服务器返回的字节
modifiedSentence = clientSocket.recv(1024)
printf('From Server:')
clientSocket.close()
# 服务器端

from socket import *
serverName = 'servername'
serverPort = 12000
# 第二个套接字表示是一个 tcp 连接
serverSocket = socket(AF_INET, SOCK_STREAM)
# 将端口号与套接字关联
serverSocket.bind(('', serverPort))
# serverSocket 相当于启动 tcp 的套接字,此处是会监听客户端 TCP 连接请求
serverSocket.listen(1)
print('The server is ready to receive')
while True:
    # 当有客户连接时使用 accept 创建一个新套接字为这个特定客户专用
    connectionSocket, addr = serverSocket.accept()
    sentence = connectionSocket.recv(1024).decode()
    capitalizedSentence = sentence.upper()
    connectionSocket.send(captializedSentence.encode())
    connectionSocket.close()

运输层

运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信 logic communication 功能。运输层协议是在端系统中而不是在路由器中实现的。在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组,一般称该分组为运输层报文段

网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信 我们可以这样类比

  • 应用层报文 = 信封上的字符
  • 进程 = 接收人
  • 主机 = 家庭
  • 运输层协议 = 家庭里接收信并把信送到接收人的人
  • 网络层协议 = 邮政服务

多路复用与多路分解

接收主机中的运输层实际上并没有直接将数据交付给进程,而是将数据交给了一个中间的套接字,在任意时刻,在接收主机上可能又不止一个套接字,所以每个套接字都有唯一的标识符

在接收端会有几个字段将一个到达运输层报文段定向到适当的套接字,而将运输层报文段中的数据交付到正确的套接字的工作称为多路分解 demultiplexing 。这些字段分别为

  • 源端口号字段source port number field
  • 目的端口号字段descination port number field

在主机上的每个套接字能够分配一个端口号,当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字

在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用 multiplexing

UDP 套接字是由一个二元组全面标识的,该二元组包含一个目的 IP 地址和一个目的端口号。因此,如果两个 UDP 报文段有不同的源 IP 地址或源端口号,但具有相同的目的 IP 地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程。而源端口号是目的地需要返回数据到发送地时作为目的地返回数据所用

TCP 套接字是由一个四元组,源 IP 地址,源端口号,目的 IP 地址,目的端口号。当欢迎套接字的后续连接套接字的这四元组与欢迎套接字的四元组相同时则会将报文段定向分解到相应的套接字

UDP

UDP 除了复用分解已极少量的差错检测外,它对 IP 就没增加别的东西,实际上相当于直接和 IP 打交道。而且 UDP 没有握手,所以这又称为无连接的

有许多应用更适合 UDP ,主要由以下几个原因

  1. 关于发送什么数据以及何时发送的应用层控制更为精细。因为TCP有拥塞控制机制,但并不是所有应用都希望数据能准确无误的发送
  2. 无需连接建立,不会引入建立连接的时延
  3. 无连接状态,也不跟踪参数
  4. 分组首部开销小,每个TCP20个字节的首部,而UDP只有8

UDP 首部有四个字段,每个字段由两个字节组成,分别为源端口号,目的端口号,长度,检验和

UDP 检验和提供了差错检验功能,用于确定当 UDP 报文段从源到达目的地移动时,其中的比特是否发生了改变,检验和其实就是所有字节相加将溢出进行回卷之后取反码,之后在接收数据之后将数据和检验和相加得出 1111111111111111 就表示数据完整

可靠数据传输原理

可靠数据传输协议 reliable data transfer protocl 是为了实现数据可以通过一条可靠的信道进行传输这一服务抽象

我们可以一步一步地研究一些列协议,最后得到一个完美、可靠的数据传输协议

  1. 经完全可靠信道的可靠数据传输rdt 1.0rdt的发送端只通过rdt_send(data)事件接受来自较高层的数据,产生一个包含该数据的分支,并将分组发送到信道中。接收端rdt通过rdt_rev(packet)从底层信道接受一个分组,从分组中取出数据,并将数据上传给较高层

  2. 经具有比特差错信道的可靠数据传输rdt2.0

    底层信道更为实际的模型是分组中的比特可能受损的模型。这种比特差错通常会出现在网络的物理部件中

    我们通过肯定确认 positive acknowledgment(ACK) 和否定确认 negative acknowledgment(NCK) 来使接收方可以让发送方知道哪些内容被正确接收,那些内容接受有误需要重复,基于这样重传机制的可靠传输协议称为自动重传请求 Automativ Repeat reQuest, ARQ 协议。此外它还需要三种协议功能来处理存在比特差错的情况:

    • 差错检测。需要一种机制使接收方检测何时出现了比特差错

    • 接收方反馈。为了让发送方了解接收方情况的唯一途径就是让接收方提供明确的反馈信息给发送方。使用 0 表示 NCK1 表示 ACK

    • 重传。接收方收到有差错的分组时,发送方将重传该分组文

    整个过程为,先有 rdt_send(data) 时间,发送方产生一个包含待发送数据的分组,带有检验和,然后经由 udt_send(sndpkt) 操作发送该分组。发送方协议如果收一个 ACK 协议,则发送方就知道最近发送的分组已被正确接收,如果收到 NAK 则会重传上一个分组并等待接收方为响应重传分组而回送的 ACKNCK

    当发送方处于等待 ACKNCK 的状态时,它不能从上层获得更多的数据,这样的协议称为停等 stop-and-wait

    但是 ACKNCK 的数据报可能会损坏,我们可以在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号 sequence number 放在该字段。浴室接收方只需要检查需要好即可确定接受到的分组是否一次重传

rdt 2.1 可以通过发送两个相同的 ACK 代替 NAK

  1. 经具有比特差错的丢包信道的可靠数据传输rdt3.0

    除了比特受损外,底层信道还会丢包。丢包后,可以在发送一个分组时就启动一个倒计数定时器 countdown timer 来在一个给定的时间量过期后,中断发送方。

    因为分组序号在 10 之间交替,所以 rdt3.0 也被称为比特交替协议 alternating-bit protocol

由于停等协议发送方(信道)利用率非常低,此时我们可以不以停等方式运行,允许发送方发送多个分组而无需等待确认,这种方式也被称为流水线,这种技术会带来以下影响

  • 必须增加序号范围,因为每个输送中的分组必须有一个唯一的序号,而不只是01
  • 协议的发送方和接收方也许不得不缓存多个分组。发送方最低限度应该能缓冲那些已发送但没有确认的分组
  • 解决流水线的差错分组有两种基本方法是:回退NGo-Back-N和选择重传Selective Repeat, SR

在回退 N 步协议中,允许发送方发送多个分组而不需等待确认,但它也受限于流水线中未确认的分组数不能超过某个最大允许数 N

我们可以将基序号 base 定义为最早未确认分组的序号,降下一个序号 nextseqnum 定义为最小的未使用序号(即下一个待发分组的序号),则可将序号范围分割成 4

那些已被发送但还未确认的分组的许可序号范围可以被看成一个在序号范围内长度为 N 的窗口,因此 GBN 协议也常被称为滑动窗口协议 sliding-window protocol

一个分组的序号承载在分组首部的一个固定长度的字段中,如果分组序号字段的比特数为 k ,则该序号范围为 [0, 2^k - 1]

GBN 发送方必须响应三种类型的事件

  • 上层的调用:当上层调用rdt_send()时,发送方首先检查发送窗口是否已满,即是否有N个已发送但未被确认的分组。如果窗口未满,则创建一个分组并发送且更新变量,如果窗口已满,发送方只需将数据返回给上层
  • 收到一个ACK:在GBN协议中,对序号为n的分组的确认采取累积确认cumulative acknowledgment的方式,表明接收方已正确接受到序号为n的以前且包括n在内的所有分组
  • 超时事件:如果出现超时,发送重传已发送但还未被确认的分组,如果没有已发送但未被确认的分组,则定时器被重新启动

GBN 本身也有一些情况存在性能问题,有且是当窗口长度和带宽时延积很大时,在流水线中会有很多分组时,单个分组的差错就能够引起 GBN 重传大量分组

选择重传 SR 协议通过让发送方仅重传那些它怀疑在接收方出错的分组而避免了不必要的重传。 SR 接收方将确认一个正确接收的分组而不管其是否按序。失序的分组将被缓存直到所有丢失分组皆被收到为止,这是才可以将一批分组按需交付给上层

TCP

TCP 是因特网运输层的面向连接的可靠度运输协议,连接的双方都将初始化与 TCP 连接相关的许多 TCP 状态变量

TCP 连接提供的是全双工服务,如果一台主机上的进程 A 与另一台主机上的进程 B 存在一条 TCP 连接,那么应用层数据就可从进程 B 流向进程 A 的同时,也从进程 A 流向进程 B

TCP 也是点对点的,即在单个发送方与单个接收方之间的连接

一旦建立起一条 TCP 连接,两个应用程序之间就可以相互发送数据了, TCP 会将数据引导到发送缓存里 send buffer 里,发送缓存是发起三次握手期间设置的缓存之一。 TCP 可从缓存中取出并放入报文段中的数据受限于最大报文长度 Maximum Segment Size, MSS 来设置, MSS 通常根据最初确定的本地发送主机发送到最大链路层帧长度 Maximum Transmission Unit, MTU 来设置,设置该 MSS 要保证一个 TCP 报文段加上 TCP/IP 首部长度(通常 40 字节)

TCP 报文段的首部包括源端口号和目的端口号,同时也包括检验和字段 checksum field ,同时还包括以下字段

  • 32比特的序号字段sequence number field32比特的确认号字段acknowledgment number field,用于可靠数据传输
  • 16比特的接收窗口字段receive window field,该字段用于流量控制
  • 4比特的首部长度字段header length field,该字段指示了以32比特为单位的TCP首部长度
  • 可选与变长的选项字段options field,该字段用于发送方和接收方协商最大报文段长度MSS时,会在高速网络环境下用作窗口调节因子时使用
  • 6比特的标志字段flag field

一个报文段的序号 sequence number for a segment 是该报文段首字节的字节流编号,比如数据流由一个包含 500000 字节的字节组成,其 MSS1000 字节,数据流的首字节编号是 0 ,第二个报文段分配序号 1000 ,第三个 2000 以此类推,每一个序号被填入到相应 TCP 报文段首部的序号字段中

主机 A 填充进报文段的确认号是主机 A 期望从主机 B 收到的下一字节的序号,假设 A 已经收到来自主机 B 的编号为 0~535 的所有字节,同时他打算发送一个报文段给 B 表示是等待 536 之后的字节,则此时确认号字段为 536 ,但 TCP 只确认该流中至第一个丢失字节为止的字节,所以 TCP 被称为提供累积确认 cumulative acknowledgment

报文段的样本 RTT 也就是 sampleRTT 是从某报文段被发出(即交给 IP )党对该报文段的确认被收到之间的时间段,在任意时刻,仅为一个已发送的但目前尚未被确认的报文段估计 SampleRTT ,另外 TCP 决不为已被重传的报文段计算 SampleRTT

发送方通常可在超时时间发生之前通过主义所谓冗余 ACK 来较好地检测到丢包情况,冗余 ACKduplicate ACK )就是再次确认某个报文段的 ACK 。当接收方接收到一个序号大雨下一个所期望的、按序的报文段,也就是说有报文段缺失,它会对已经接收到的最后一个按序字节数据进行重复确认,之后 TCP 就会执行快速重传 fase retransmit ,即在定时器过期之前重传丢失的报文段

许多 TCP 实现会将正确接收但失序的报文段缓存起来,当分组 n 超时时, TCP 最多重传报文 n ,而不会对 n + 1 进行重传,所以其实 TCPSRGBN 的混合体

TCP 为它的应用程序提供了流量控制服务 flow-control service 以消除发送方使接收方缓存溢出的可能性,它是一个速度匹配服务,即发送方的发送速率与发送方应用程序的读取速率相匹配

流量控制

TCP 通过让发送方维护一个称为接收窗口 receive window 的变量来提供流量控制,假设主机 A 通过一条 TCP 连接向主机 B 发送一个大文件,主机 B 为该连接分配了一个接收缓存,并用 RcvBuffer 来表示其大小,主机 B 上的应用程序不时地从该缓存中读取数据,我们定义以下变量

  • LastByteRead:主机B上的应用进程从缓存读出的数据流的最后一个字节的编号
  • LastByteRcvd:从网络中到达的并已放入主机B接收缓存中的数据流的最后一个字节的编号】

接收窗口用 rwnd 表示: rwnd = RcvBuffer - [LastByteRcvd - LastByteRead] ,发送主机通过将未确认的值控制在 LastByteRcvd - LastByteRead 以内以保证发送主机不会使接收主机的缓存溢出

TCP 连接管理

客户中的 TCP 会用以下方式与服务器中的 TCP 建立一条 TCP 连接:

  1. 客户端的TCP会想服务器端的TCP发送一个特殊的TCP报文段,在报文段的首部中有一个标志位SYN被置为1。这个报文段被称为SYN报文段,此时客户在SYN_SENT状态

  2. 该报文段到达服务器后,服务器回去出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。该报文段包含三个信息

    • SYN 被置为 1

    • TCP 报文段首部的确认号字段被置为 client_isn + 1 ,最后服务器选择自己的初始序号 server_isn ,将其放置到 TCP 报文段首部的序号字段中。允许连接的报文段被称为 SYNACK 报文段 SYNACK segment

  3. 接收到SYNACK报文段后,客户主机将值server_isn + 1放置到TCP报文段的首部的确认字段中来完成此项工作,之后就处于ESTABLISHED状态并能发送和接收应用层数据。因为连接已经建立,所以该SYN被置为0

当需要结束连接时,客户发出一个首部 FIN1 的特殊报文段,并进入 FIN_WAIT_1 状态。当服务器接收到这个报文段后向发送方回送一个确认报文段,此时进入 FIN_WAIT_2 状态。之后服务器会发送一个 FIN 终止报文段,之后客户端对这个报文段进行确认,并进入 TIME_WAIT 状态,经过等待后连接正式关闭,客户端所有资源将被释放

拥塞控制原理

丢包一般是当网络变得拥塞时由于路由器缓存溢出引起的,为了处理网络拥塞原因,需要一些机制以在面临网络拥塞时遏制发送方

拥塞原因与代价

在理想化的情况中,当分组的到达速率接近链路容量时,分组经历巨大的排队时延

发送方必须执行重传以补偿因为缓存溢出而丢失的分组。当发送方在遇到大时延时所进行的不必要重传会引起路由器利用其链路带宽转发不必要的分组副本

当一个分组沿一条路径被丢弃时,每个上游路由器用于转发该分组到丢弃该文组使用的传输容量最终被浪费掉了

拥塞控制方法

我们可根据网络层是否为运输层拥塞控制提供了显式帮助,来区分拥塞控制方法

  • 端到端拥塞控制。网络层并没有为运输层拥塞控制提供显式支持。即使网络中存在拥塞,端系统也必须通过对网络行为的观察来推断之
  • 网络辅助的拥塞控制。在网络辅助的拥塞控制中,路由器向发送方提供关于网络中拥塞状态的显式反馈信息,这种方式通常采用了一种阻塞分组choke packet的形式

TCP 必须使用端到端拥塞控制而不是网络辅助的方式

TCP 拥塞控制

TCP 采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制器能向连接发送流量的速率,再通过拥塞窗口长度控制发送速率

TCP 使用下列指导性原则来确定发送速率使得网络既不会拥塞又能充分利用所有可用的带宽

  • 一个丢失的报文段标意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率
  • 一个确认报文段只是该网络正在向接收方交付发送方的报文段,因此,当对先前未确认报文段的确认到达时,能够增加发送方的速率
  • 带宽探测,给定ACK指示源到目的地路径无拥塞,而丢包事件指示路径拥塞,TCP调节其传输速率的策略是增加其速率以响应到达的ACK,除非出现丢包事件, 此时才减少传输速率

TCP 拥塞控制算法 TCP congestion control algorithm 包括三个部分

  1. 慢启动:当一条TCP连接开始时,cwnd的值通常初始置为一个MSS的较小值,使初始速率大概MSS/RTT,当传输到报文段首次被确认就增加1MSS,并发送出两个最大长度的报文段。何时结束这种指数增长呢?

    1. 如果存在一个由超时指示的丢包事件, TCP 发送方将 cwnd 设置为 1 并重新开始慢启动过程,他还将第二个状态的值 ssthresh 设置为 cwnd/2
    2. cwnd 的值等于 ssthresh 时,结束慢启动并且 TCP 转移到拥塞避免模式
    3. 如果检测到 3 个冗余 ACK ,这时 TCP 执行一种快速重传并进入快速恢复状态
  2. 拥塞避免:一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半

最近,对于 IPTCP 的扩展方案允许网络明确向 TCP 发送方和接收方发出拥塞信号,这种形式的网络辅助拥塞控制被称为明确拥塞通告 Explicit Congestion Notification, ECN 。在网络层, IP 数据报首部的服务类型字段中的两个比特被用于 ECN

网络层:数据平面

网络层能够被分解为两个相互作用的部分,即数据平面和控制平面

网络层概述

网络层的作用从表面上看极为简单,即将分组从一台发送主机移动到一台接收主机,需要使用两种重要的网络层功能

  • 转发:当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组移动到适当的输出链路,一般为几纳秒,通常用硬件实现
  • 路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组所采用的的路由或路径,计算这些路径的算法被称为路由选择算法routing algorithm,一般为几秒,通常用软件实现

每台网络路由器中有一个关键元素是它的转发表 forwarding table ,路由器检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法转发分组 ,转发是数据平面执行的主要功能

控制平面的传统方法为人工配置转发表, SDN Sortware=Defined Networking 方法为使用 SDN 使用软件计算转发表

网络服务模型

网络服务模型 network service model 定义了分组在发送与接收端系统之间的端到端运输特性

  • 确保交付。该服务确保分组将最终到达目的地
  • 具有时延上界的确保交付,该服务不仅确保分组的交付,而且在特定的主机到主机的时延上界内交付
  • 有序分组交付,该服务确保分组以它们发送的顺序到达目的地
  • 确保最小带宽,这种网络服务模仿在发送和接收主机之间有一条特定比特率的传输链路的行为
  • 安全性,网络层能够在源加密所有数据报并在目的地解密这些分组

路由器工作原理

网络层的转发功能将分组从一台路由器的入链路传送到适当的出链路,下面是路由器的 4 个组件

  • 输入端口input port。它在路由器中执行终结入物理链路的物理层功能,它还要与位于入链路远端的数据链路层交互来执行数据链路层功能,还要执行查找功能,通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结果转发到输出端口
  • 交换结构。交换结构将路由器的输入端口连接到它的输出端口
  • 输出端口。输出端口存储从交换结构接收端分组,并通过执行必要的链路层和物理层在输出链路上传输这些分组
  • 路由选择处理器。执行控制平面功能

路由的输入端口,输出端口和交换结构几乎总是用硬件实现

输入端口中执行的查找对于路由器运行是至关重要的,路由器使用转发表来查找输出端口,使得到达的分组能经过交换结构转发到该输出端口。转发表由路由选择处理器更新的,或转发表接收来自远程 SDN 控制器的内容

路由器可以使用分组目的地址的前缀 prefix 与该表中的表项进行匹配;比如 11001000 00010111 匹配 1100100 ,而如果有多个地址匹配时,使用最长前缀匹配原则 longest prefix matching rule 选在匹配最长的匹配项进行转发

一旦确定了输出端口,该分组就能够进入交换结构,在某些设计中,如果来自其他输入端口的分组当前正在使用该交换结构,一个分组可能会在进入交换结构时被暂时阻塞

交换

交换结构位于路由器的核心部位,因为正是通过这种交换结构,分组才能实际地从一个输入端口交换到一个输出端口中

  • 经内存交换。分组从输入端口中被复制到处理器内存中,路由选择处理器从首部中提取目的地址,在转发表中找出适当的输出端口,并将该分组复制到输出端口的缓存中
  • 经总线交换。输入端口经一根共享总线将分组直接传送到输出端口,不需要路由选择处理器的干预。由于一次只有一个分组能够跨越总线,路由器的交换带宽受总线速率的限制
  • 经互联网络交换。使用一个复杂的互联网路,只有当来自于两个不同端口的分组其目的地为相同的输出端口时,一个分组才会进行等待

何时出现排队

在输入端口和输出端口都会形成分组队列,而随着队列的增长,路由器的缓存空间最终将会耗尽,并且当无内存可用于存储到达的分组时将会出现丢包

  1. 输入排队:如果交换结构不能快得使所有到达分组无时延地通过它传送,则会出现输入排队,当一个分组正在使用交换结构,则另一个分组在输入端不得不等待,从而导致这个等待的分组的后面分组也在等待,这种现象叫做线路前部阻塞Head-Of-the-Line,HOL阻塞
  2. 输出排队:输出端口向输出链路发送一个分组的时间内,将有N个新分组到达该输出端口,即交换结构的速度比输出转换的速度快N倍,会好景输出端口可用内存

分组调度

排队的分组有很多种方法经输出链路传输,如果链路当前正忙于传输另一个分组,到达链路输出队列的分组要排队等待传输。如果没有足够的缓存空间来容纳到达的分组,队列的分组丢弃策略则确定该分组是否将被丢弃或者从队列中去除其他分组以便为到达的分组腾出空间

  1. 先进先出First-In-First-Out, FIFO:即先到达的分组先进行排队
  2. 优先权排队priority queuing:达到输出链路的分组被分类放入输出队列中的优先权类,比如基于IP的实时话音分组可能获得超过电子邮件分组的优先权
  3. 加权公平排队Weighted Fair Queuing, WFQWFQ调度器以循环的方式为各个类提供服务,首先第一个类,然后第二个类以此类推。在发现一个空的类队列时,它立即移向服务序列中的下一个类

国际协议:IPv4、寻址、IPv6 及其他

掌握 IP 编址就是掌握因特网的网络层

IPv4 的关键字段如下:

  • 版本。这4比特规定了数据报的 IP 协议版本
  • 首部长度。4比特确定 IP 数据报中载荷实际开始的地方
  • 服务类型。使不同的IP数据报能够互相区别开来,比如 IP 电话应用和FTP
  • 数据报长度。该字段长为16比特
  • 标识、标志、片偏移。与 IP 分片有关
  • 寿命Time-To-Live, TTL:来确保数据报不会永远在玩咯中循环,当一台路由器处理数据报时,该字段的值减一
  • 协议。该字段通常仅当一个 IP 数据报到达其最终目的地时才会有用,该字段值指示了 IP 数据报的数据部分应交给哪个特定的运输层协议
  • 首部检验和。首部检验和用于帮助路由器检测收到的 IP 数据报中的比特错误。
  • 源和目的 IP 地址。当某源生成一个数据报时,它在源 IP 字段中插入它的 IP 地址,在目的 IP 地址字段中插入其最终目的地的地址。通常源主机通过DNS查找来巨顶目的地址
  • 选项字段允许 IP 首部被扩展。首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段中的信息
  • 数据(有效载荷)。数据保存在的首要理由

IPv4 数据报分片

一个链路层帧能承载的最大数据量叫做最大传送单元 Maximum Transmission Unit, MTU

传输分组的问题在于发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的 MTU ,此时就需要将 IP 数据报中的数据分片成两个或更小的 IP 数据报,用单独的链路层帧封装它们,这些数据报被称为片 fragment

当一台目的主机从相同源收到一系列数据报时,它需要确定这些数据报中的某些是否是一些原来较大数据报的片。初始数据包的最后一个片的标志比特被设为 0 ,其他设为 1 。为了确定是否丢失了一个片或是为了按正确的顺序重新组装片,使用偏移字段指定该片应该放在初始 IP 数据报的那个位置

IPv4 编址

当主机中的 IP 想发送一个数据报时,它就在该链路上发送。主机与物理链路之间的边界叫做接口 interface 。路由器必须拥有两条或更多条链路与它连接,路由器与它的任意一条链路之间的边界也叫接口,而一个 IP 地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联

每个 IP 地址长度为 32 比特,因此总共有 2^32 个可能的 IP 地址,这些地址通常按所谓点分十进制记法 dotted-decimal notation 书写,即每个字节用它的十进制形式书写,各节点间以句点隔开

如果接口通过一个以太网交换机互联,或通过一个无线接入点互联,则它们会形成一个子网。IP 编址会为子网分配一个地址,比如 223.1.1.0/24 ,其中 24 被称为子网掩码,表示 32 比特中的最左侧 24 比特定义了子网地址

因特网的地址分配策略被称为无类别域间路由选择 Classless Interdomain Routing, CIDR ,其中 a.b.c.d/x 中的 x 指示了地址第一部分中的比特数,它也被称为该地址的前缀 prefix 。当该组织外部的一台路由器转发一个数据报,且该数据报的目的地址位于该组织内部时,仅需考虑改地址前面的 x 比特

一个地址剩余的 32 - x 比特可认为是用于区分该组织内部设备的,其中所有设备具有相同的网络前缀。当该组织内部的路由器转发分组时才会考虑这些比特

如何获取地址

  1. 获取一块地址。为了获取一块 IP 地址用于一个组织的子网内,某个网络管理员会与他的ISP联系,该ISP可能会从已分给它的更大地址块中提供一些地址

  2. 获取主机地址:动态主机配置协议。组织一旦获得了一块地址,它就可为本组织内的主机与路由器接口逐个分配 IP 地址。可以使用手动配置,但是更多的还是使用动态主机配置协议Dynamic Host Configuration, DHCP

DHCP 是一个客户 - 服务器协议,客户通常是新到达的主机,它要获得包括自身是使用的 IP 地址在内的网络配置信息。 DHCP 是一个 4 个步骤的过程

  • DHCP 服务器发现。一台新达到的主机的首要任务时发现一个要与其交互的 DHCP 服务器。这可通过 DHCP 发现报文 DHCP discover message 来完成,客户在 UDP 分组中向端口 67 发送该发现报文。 DHCP 客户生成包含 DHCP 发现报文的 IP 数据包,其中使用广播目的地之 255.255.255.255 并且使用本主机源 IP 地址 0.0.0.0 ,之后链路层将该帧光波导所有与该子网连接的节点

  • DHCP 服务器提供。 DHCP 服务器收到一个 DHCP 发现报文时,用 DHCP 提供服务 DHCP offer message 向客户做出响应。该报文仍然使用 IP 地址 255.255.255.255 来向该子网的所有节点广播。每台服务器提供的报文包含有收到的发现报文的事务 ID 、向客户推荐的 IP 地址、网络掩码以及 IP 地址租用期 address lease time

  • DHCP 请求。新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供用 DHCP 请求报文 DHCP request message 进行响应,回显配置的参数

  • DHCP ACK 。服务器用 DHCP ACK messageDHCP 请求报文进行响应,证实请求的报文

网络地址转换

家庭网络的编址拥有相同的网络地址 10.0.0.0/24 ,这些地址用于局域网 private network

Network Address Translation, NAT 对外界的行为就像一个具有单一 IP 地址的单一设备。从本质上讲, NAT 使路由器对外界隐藏了家庭网络的细节。而路由器又是从 DHCP 中得到它的地址

NAT 路由器上有一个 NAT 转换表 NAT translation table ,在表项中包含了端口号及其 IP 地址,来让路由器直到它应该将某个分组转发给哪个内部主机

IPv6

IPv6 是为了因对大 IP 地址空间的需求

  1. IPv6数据报格式,IPv6引入的最大重要的变化显示在其数据报格式中

    • 扩大的地址容量。 IPv6 将 IP 地址长度从 32 比特增加到 128 比特
    • 简化高效的 40 字节首部。
    • 流标签。 IPv6 有一个难以捉摸的流 flow 定义,给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流

    以下是 IPv6 中定义的字段

    • 版本。该 4 比特字段用于标识 IP 版本号, IPv6 将该字段值设为`6
    • 流量类型。该 8 比特字段与我们在 IPv4 中看到的 TOS 字段的含义相似
    • 流标签。该 20 比特字段用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权
    • 有效载荷长度。该 16 比特值作为一个无符号整数,给出了 IPv6 数据报中跟在定长的 40 字节数据报首部后面的字节数量
    • 下一个首部。标识数据报中的内容需要交付给哪个协议,和 IPv4 一样
    • 跳限制。转发给数据报的每台路由器将对该字段内容减一
    • 源地址和目的地址。
    • 数据。当数据报到达目的地时,该有效载荷从 IP 数据报中移出

    我们可以注意到很多 IPv4 的数据报不出现在 IPv6

    • 分片/重新组装。 IPv6 不允许在中间路由器上进行分片与重新组装,这种操作只能在源与目的地执行。如果数据报太大就发送一个分组太大的 ICMP 差错报文即可。能够大大加快网络中的 IP 转发速度
    • 首部检验和。因为在因特网层中的运输层和数据链路层协议执行了检验操作,所以 IP 设计者觉得在网络层中该功能实属多余
    • 选项。选项字段不再是标准 IP 首部的一部分,可能出现在 IP 首部中由下一个首部指出的位置上
    1. IPv4IPv6 的迁移。在实践中已得到广泛采用的迁移方法包括建隧道 tunneling

通用转发和 SDN

OpenFlow 是一个得到高度认可和成功的标准,它已经称为匹配加动作转发抽象、控制器以及更为一般的 SDN 革命等概念的先驱。匹配加动作转发表在 OpenFlow 中称为流表 flow table ,它的每个表项包括

  • 首部字段值的集合,入分组将与之匹配
  • 计数器集合(当分组与流表项匹配时更新计数器)可以报包括已经与该表项匹配度分组数量,以及自从该表项上次更新依赖度时间
  • 当分组匹配流表项时所采取的动作集合。

控制平面

控制平面作为一种网络范围的逻辑,不仅控制着沿着从源主机到目的主机的端到端路径间的路由器如何转发数据包,而且控制网络层组件和服务如何配置和管理

概述

我们看到了转发表和流表如是如何计算、维护和安装的。有两种可能得房

  • 每路由器控制。每台路由器中都包含转发和路由选择功能。每台路由器都有一个路由选择组件,用于与其他路由器中的路由选择组件通信,以计算其转发的值。
  • 逻辑集中式控制。通用的匹配加动作抽象允许执行传统的 IP 转发以及其他功能负载共享、防火墙功能和NAT的丰富集合

路由选择算法

路由选择算法 routing algorithm 目的是从发送方到接收方的过程中确定一条通过路由器网络的好的路径。一般而言,路由选择算法的一种分类方式是更具该算法是集中式还是分散式来划分

  • 集中式路由选择算法centralized routing algorithm用完整的、全局性的网络制式计算出从源到目的地的最低开销路径。具有全局状态信息的算法被称作链路状态Link State, LS算法
  • 分散式路由选择算法decentralized routing algorithm以迭代、分布式的方式计算出最低开销路径。每个节点仅有预期直接相连的开销知识即可开始工作

第二种广义分类方式是更具算法是静态的还是动态的进行分类

  • 静态路由算法static routing algorithm中,路由随时间的变化非常缓慢,通常是人工进行调整
  • 动态路由算法dynamic routing algorithm随着网络流量负载或拓扑变化而改变路由选择路径

第三种是根据它是负载敏感的还是负载迟钝的进行划分

  • 在负载敏感算法load-sensitive algorithm中,链路开销会动态地变化以反映出底层链路的当前拥塞水平。如果当前拥塞的一条链路与高开销相联系,则路由选择算法趋向于绕开该拥塞链路来选择路由
  • 当今的路由选择算法都是负载迟钝load-insensitive,因为某条链路的开销不明确反映当前的拥塞水平

因特网控制报文协议

因特网控制报文协议 ICMP 被主机和路由器用来彼此沟通网络层的信息。 ICMP 最典型的用途是差错报告。比如,当运行一个 HTTP 会话时,也许会遇到一些诸如 目的网络不可达 之类的错误报文,这种报文就来源于 ICMP

ICMP 通常被认为是 IP 的一部分,但从体系结构上讲它位于 IP 之上,因为 ICMP 报文是承载在 IP 分组中的。

ICMP 报文包含一个类型子弹和一个编码字段,并且包含引起该 ICMP 报文首次生成的 IP 数据报的首部和前 8 个字节

ping 程序就是发送一个 ICMP 类型 8 编码 0 的报文到指定主机。看到回显请求,目的主机发回一个类型 0 编码 0ICMP 回显回答

还有的 ICMP 报文是源抑制报文,目的是执行拥塞控制,发送报文后,会强制该主机减少其发送速率

链路层和局域网

我们将看到两种截然不同类型的链路层信道。第一种类型是广播信道,用于连接有线局域网、卫星网和混合光纤同轴线缆接入网中的多台主机。第二种的链路层信道是点对点通信链路,比如链路连接的两台路由器之间

链路层概述

我们将运行链路层协议的任何设备均称为节点 node ,包括主机、路由器、交换机和 wifi 接入点。我们也把沿着通信路径连接相邻节点的通信信道称为链路 link 。在通过特定的链路时,传输节点将数据包封装在链路层帧中,并将该帧传送到链路中

虽然任一链路层的基本服务都是将数据报从一个节点移动到相邻节点,但所提供的服务细节能够随着链路层协议的不同而变化。链路层能够提供的可能服务包括

  • 成帧framing。每个网络层数据报经链路传送之前,几乎所有的链路层协议都要将链路层帧封装起来。一个帧由一个数据字段和若干首部字段组成,其中网络层数据包插在数据字段中
  • 链路接入。媒体访问控制Medium Access Control, MAC规定了帧在链路上传输的规则。用于协调多个节点的帧传输
  • 可靠交付。当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层数据报,链路层的可靠交付服务通常是通过确认和重传取得。
  • 差错检验和纠正。当帧中的一个比特作为1传输时,接收方节点中的链路层硬件可能不正确地将其判断为0,反之亦然。通过让发送节点在帧中包括差错检测比特,让接受的节点进行差错检查

链路层在何处实现

链路层的主体部分是在网络适配器 network adapter 中实现的,网络适配器有时也称为网络接口卡 Network Interface Card, NIC

差错检测和纠正技术

比特级差错检测和纠正 bit-level error detection and correction 为对从一个节点发送到另一个物理上连接的临近节点的链路层帧中的比特损伤进行检测和纠正,它们通常是链路层提供的两种服务

差错检测和纠正技术使接收方有时但并总是检测出已经出现的比特差错。即使采用差错检测比特,也还是可能未检出比特差错 undetected bit error ,而出差错的概率越小导致的开销就越大

多路访问链路和协议

有两种类型的网络链路:点对点链路 point-to-point link 由链路一端的单个发送方和链路另一端的单个接收方组成。第二种类型的链路是广播链路 broadcast link ,它能够让多个发送和接收节点口连接到相同的、单一的、共享的广播信道上。

如何协调多个发送和接收节点对一个共享广播信道的访问,就是多路访问问题 multiple access problem 。广播信道通常用于局域网中。计算机有类似的协议,也就是所谓的多路访问协议 multiple access protocol ,即节点通过这些协议来规范它们在共享的广播信道上的传输行为

由于所有节点都能传输帧,所以多个节点可能会同时传输帧。当发生这种情况时,所有节点同时接到多个帧,传输的帧在所有的接收方处碰撞 collide 了,当碰撞发生时,没有一个接收节点能够有效地获得任何传输的帧。因此涉及此次碰撞的帧都丢失了,在碰撞时间间隔中的广播信道被浪费了。当多个节点处于活跃状态,则需要以某种方式协调活跃节点的传输

我们能够将任何多路访问协议划分为 3 种类型之一

信道划分协议

时分多路复用 TDM 和频分多路复用 FDM 是两种能够用于在所有共享新到节点之间划分广播信道带宽的技术

TDM 将时间划分为时间帧 timeframe ,并进一步划分每个时间帧为 N 个时隙 slot ,然后把每个时隙分配给 N 个节点中的一个。无论何时某个节点在有分组要发送到时候,它在循环的 TDM 帧中指派给它的时隙内传送比特分组。节点必须总是等待它在传输序列中的轮次

FDMR bps 信道划分为不同的频段(每个频段具有 R/N 带宽),并把每个频率分配给 N 个节点中的一个。因此 FDM 在单个较大的 R bps 信道中创建了 N 个较小的 R/N bps 信道。但它限制一个节点只能使用 R/N 的带宽

第三种信道划分协议是码分多址 Code Division Multople Access, CDMATDMFDM 分别为节点分配时隙和频率,而 CDMA 对每一个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码

随机接入协议

在随机接入协议中,一个传输节点总是以信道的全部速率 R bps 进行发送。当有碰撞时,涉及碰撞的每个节点反复地重发它的帧,直到该帧无碰撞为止,但当一个节点经历一次碰撞时,它不必立刻重发该帧,它在重发该帧之前等待一个随机时延

交换局域网

局域网主机会使用链路层地址而不是 IP 地址来转发链路层帧通过交换机网络

链路层寻址和 ARP

主机和路由器都具有链路层地址

  1. MAC地址。并不是所主机或路由器具有链路层地址,而是它们的路适配器具有链路层地址。链路层交换机并不具有与它们的接口相关联的链路层地址。

MAC 地址长度为 6 字节,共有 2 ^ 48 个可能的 MAC 地址,这些 6 个字节地址通常用十六进制表示法,地址的每个字节被表示为一堆十六进制数。没有两个适配器具有相同的地址。

有时适配器的确要让局域网上所有适配器来接受并处理它打算发送到帧。发送适配器在该帧的目的地址字段中插入一个特殊的 MAC 广播地址。对于使用 6 字节的局域网,广播地址是 48 个连续的 1 组成的字符串 FF-FF-FF-FF-FF-FF

  1. 地址解析协议。因为存在网络层地址和链路层地址,所以需要在它们之间进行转换,这就是地址解析协议Address Resolution Protocol, ARP

    在发送主机中的 ARP 模块将取在相同局域网上的任何 IP 地址作为输入,然后返回相应的 MAC 地址。 ARP 只为在同一个子网上的主机和路由器接口解析 IP 地址

    每台主机或路由器在其内存中具有一个 ARPARP table ,这张表包含 IP 地址到 MAC 地址的映射关系

    首先,发送方 222.222.222.220 构造一个称为 ARP 分组 ARP packet 的特殊分组,并向它的适配器传递。适配器在链路层中封装这个 ARP 分组,用广播地址作为帧的目的地址,并将该帧传输进子网中。之后子网中的每个适配器都把该帧中的 ARP 分组向上传递给 ARP 模块。与之匹配的一个给查询主机发送回一个带有所希望映射的响应 ARP 分组。

  2. 发送数据到子网以外。首先数据报会发送给路由器接口,也就是通往最终目的地路径上的第一条路径上的第一跳路由器的 IP 地址,因此适当的 MAC 地址是通过ARP获取的这个路由器接口的适配器接口。之后这个帧就传递到网络层,路由器将该数据报传到目的地的路由接口,适配器把该数据报封装到一个新的帧中,并将该帧发送到目的地所在地子网中,通过ARP获取到目的地 MAC 地址

以太网

以太网几乎占领着现有的有线局域网市场

  1. 以太网帧结构。以太网帧具有六个字段

    • 数据字段 46 ~ 1500字节 。这个字段承载了 IP 数据报。以太网的最大传输单元是 1500 字节。如果超过就会被分片。如果小于 46 则会被填充
    • 目的地址 6字节 。这个字段包含目的适配器的 MAC 地址
    • 源地址 6字节 。包含了传输该帧到局域网上适配器的 MAC 地址
    • 类型字段 2字节 。此字段允许以太网复用多种网络层协议
    • CRC 4字节 。循环冗余检查是为了是接收适配器检测帧中是否引入了差错
    • 前同步码 8字节 。以太网帧以一个 8 字节的前同步码 Preamble 字段开始。该前同步码的前 7 字节的值都是 10101010 ,最后的一个字节是 10101011 。前同步码的前 7 字节用于唤醒接收适配器,并将它们的时钟和发送方的时钟同步

    当适配器 B 收到一个来自适配器 A 的帧,它对该帧进行 CRC 校验,当该帧未通过校验时,适配器 B 只是将该帧丢弃。由于丢弃了以太网帧而存在间隙,看不看得见这个间隙取决于使用的是 TCP 还是 UDP, TCP 重传, UDP 无视

  2. 以太网技术。以太网使用转发器repeater能够得到更长的运行距离,在输入端接收信号并在输出端再生该信号

数据中心网络

每个数据中心都有自己的数据中心网络 data center network ,这些数据中心网络将其内部主机彼此互联并与因特网中的数据中心互联

主机就像是数据中心的供奉,它们负责提供内容,存储邮件和文档,并共同执行大规模分布式计算。数据中心的主机称为刀片 blade 。每个机架一般对方 20 ~ 40 台刀片,每一个机架顶部有一台交换机,这台交换机被形象地称为机架顶部 Top of Rack, TOR 交换机,它们与机架上的主机互联,并与数据中心其他交换机互联

数据中心网络包含一台或多台边界路由器 border router ,它们将数据中心网络与公共因特网相连

  1. 负载均衡。在数据中心内部,外部请求首先被定向到一个负载均衡器load balancer。负载均衡器的任务是向主机分发请求,以主机当前的负载作为函数赖在主机之间均衡负载
  2. 等级体系结构。路由和交换机等级结构hierarchy of router and switch的顶端。边界路由器与接入路由器相连。所有链路通常使用以太网作为链路层和物理层协议

Web 页面的请求历程

p326