锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

《计算机网络自顶向下方法》笔记

时间:2023-03-08 17:00:00 dsl3继电器mss51p继电器

暑假期间,我读了这本书,为即将到来的专业课程奠定了一点基础。总结一下大致的内容,然后在课后补充你所学到的东西。
我觉得这本书有很多例子,很容易理解。这是一本很容易读的入门书。


本学期结合教师和教科书的内容,补充笔记。王卫亚老师讲课很清楚,课后对一些不懂的地方了解透彻。

文章目录

  • 基础
    • 通信链路和分组交换机
    • 家庭接入网
    • 分组交换网络的延迟、丢包和吞吐量
      • 时延
      • 排队时延和丢包
      • 吞吐量
    • 协议栈
    • 安全
  • 可靠的数据传输原理
    • 比特差错怎么办?
    • 丢包怎么办
    • 流水线技术
      • 回退N步(GBN)协议
      • 选择重传(SR)协议
  • 应用层
    • 应用层协议
    • Web
      • HTTP
        • HTTP请求报文
        • HTTP响应报文
        • cookie
        • Web缓存器
    • FTP协议
    • 电子邮件
    • DNS
  • 运输层
    • UDP
      • 校验和
    • TCP
      • 3次握手
      • 4次挥手
      • 流量控制
      • 拥塞控制
  • 网络层
    • 数据平面
      • IP协议
      • IPv4
      • IPv6
      • ARP协议
      • 子网划分
      • CIDR
      • 路由器
      • NAT
      • DHCP协议
    • 控制平面
      • ICMP协议
      • RIP协议
      • OSPF协议
      • BGP协议
  • 链路层
    • 检测和纠正错误
      • 奇偶校验
      • 循环冗余校验
    • PPP协议
      • PPP帧
    • 局域网
      • 多路访问协议
      • CSMA/CD协议
      • MAC帧
      • 交换机

基础

通信链路和分组交换机

通信链路分组交换机连接端系统。
通信链路包括不同传输速率的同轴电缆、铜线、
光纤和无线电谱。
当一个端系统将数据发送到另一个端系统时,发送端系统将数据分段,并在每个段添加第一个字节。由此形成的信息包称为分组
分组交换机从其一个进入通信链路接收到达的分组,并从其一个出口通信链路转发。分组交换机包括路由器(router)链路层交换机(link-layer switch)

一种理解:分组类似于卡车,通信链接类似于高速公路和公路,分组交换机类似于交叉口,端系统类似于建筑。

从发送端系统到接收端系统,一系列通信链路和分组交换机被称为通过该网络路径(route/path)

家庭接入网

宽带住宅接入有两种最流行的方式:DSL(Digital Subscriber Line,数字用户线)电缆

  • DSL
    从提供本地电话接入的本地电话公司获取DSL因特网接入。家庭电话线还携带数据和传统电话信号,编码频率不同:分为高速下行信道、中速上行信道和普通双向电话信道。
  • 电缆
    住宅从提供有线电视的公司获得了电缆因特网接入。电缆因特网接入需要电缆调制解调器,将网络分为上下两个通道。电缆因特网接入的一个重要特点是共享广播媒体。因此,如果几个用户同时通过下行通道下载视频文件,每个用户接收视频文件的实际速率将远低于电缆的总下行速率。
  • 光纤到户
    光纤到户(Fiber To The Home,FTTH) 它提供了一个更高的速度,它直接从当地的中心局到家庭提供了一条光纤路径。从中央局提供的每一种光纤都由许多家庭共享,直到它相对接近这些家庭。有两种光纤分布系统结构:有源光纤网络(Active Optical Network,AON)无源光纤网络(Passive Optical Network,PON)

PON:每个家庭都有一个光纤网络端接器 (Optical Network Terminator, ONT),它通过特殊的光纤连接到相邻的光纤分配器 (splitter) 。该分配器将一些家庭集成到共享光纤中,然后连接到当地电话号码和公司中心局光纤线路端接器 (Optical Line Terminator, OLT)。该OLT提供了光信号和电信号之间的转换,经过本地电话公司路由器与因特网相连。在家庭中,用户将一台家庭路由器(通常是无线路由器)与ONT通过这个家庭路由器连接到因特网。

  • 以太网
    局域网也可以使用(LAN)将端系统连接到边缘路由器。以太网是最流行的局域网技术,用户使用双绞铜线连接到以太网交换机,以太网交换机或这样的交换机网络连接到更大的因特网。

网络链路和交换机移动数据有两种基本方法:电路交换(circuit switching)分组交换(packet switching)

  • 分组交换
    大多数分组交换机在链路的输入端使用存储、转发和传输(store-and-forward transmission) 机制。存储、转发和传输是指在交换机开始将分组的第一个比特传输到输出链路之前,必须接收整个分组的所有比特并缓存,然后才能开始向出链路传输。
    每个分组交换机都有多个链路连接。路由器以这种方式确定向哪个链路传输:通过转发表(forwarding table) 将分组首部的IP地址映射为输出链路。对于每个链路,分组交换机都有一个输出缓存(或输出队列)。当网络堵塞时,一个到达的分组可能会发现缓存已经满了,然后就会发生分组丢失(丢包)(packet loss),也就是说,已经到达或排队的分组之一将被抛弃。
  • 电路交换
    每台主机都与一台交换机直接相连。 当两个主机主要通信时,电路交换网络在两个主机之间创建一个特殊的端到端连接(end-to-end connection),称作电路,电路是通过频分复用(Frequency-Division Multiplexing, FM )时分复用(Time-Division Multiplexing, TDM) 来实现的。
    对于FDM,链路的频谱由跨越链路创建的所有连接共享。在连接期间链路为每条连接专用一个频段,该频段的宽度称为带宽(bandwidth)
    对于TDM链路,时间被划分为固定期间的帧,并且每个帧又被划分为固定数量的时隙。当网络跨越一条链路创建一条连接时,网络在每个帧中为该连接指定一个时隙。 这些时隙专门由该连接单独使用,一个时隙(在每个帧内)可用于传输该连接的数据。

简单来说,分组交换和电路交换的区别就是:前者是按需分配,而后者是按人头分配。例如对于TMD,用户不可以使用为其他用户所分配的时隙。

分组交换网的时延、丢包和吞吐量

时延

分组在沿途的每个节点会经受几种不同类型的时延。最为重要的是节点处理时延(nodal processing delay)、排队时延(queuing delay)、传输时延(transmission delay)(也叫发送时延)和传播时延(propagation delay),这些时延总体累加起来是节点总时延(tolal nodal delay)

  • 处理时延
    检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分,处理之后,路由器将该分组引向通往下一个路由器链路之前的缓存队列。高速路由器的处理时延通常是微秒或更低的数量级。
  • 排队时延。
  • 传输时延
    这是将所有分组的比特推向链路所需要的时间,即分组比特长度/传输速率(单位是Mbps)。实际的传输时延通常在毫秒到微秒量级。
  • 传播时延
    分组被推向链路之后,从该链路的起点到下一个路由器的时间是传播时延,传播速率取决于该链路的物理媒体,速率范围是2xl08~3xl08m/s。

对于传输时延和传播时延的区别,前者是路由器推出分组所需要的时间,而后者是一个比特从一台路由器传播到另一台路由器所需要的时间。
下面是3个节点之间的一个传播过程。演示传播-传输-传播的过程。注意要等整个分组到达第二个节点并完成缓存之后才开始传输分组。
传播-传输-传播

做一个类比:假设高速公路收费站间的公路段是链路,收费站是路由器。有10辆汽车(每辆汽车是一个比特)作为一个车队(一个分组)在行驶。首先要先确认每辆车都到达了该收费站(这个时间是排队时延),然后假定每个收费站以每辆车10s的速度(即传输速率)服务一辆汽车,这个车队必须在服务时间100s(传输时延)后才可以出发。
注意如果车速很快或两个收费站之间的路程很短,而服务时间很长的话,可能在最后几辆车离开之前,前面几辆车就已经到达了下一个收费站。(动画演示)

排队时延和丢包

节点时延中最复杂的是排队时延。
令a表示分组到达队列的平均速率,以分组/秒(即packet/s)为单位。R表示传输速率,以bps(即b/s)为单位。假定所有分组都是由L比特组成的,则比特到达队列的平均速率是L*a(bps),比率La/R被称为流量强度(traffic intensity)

如果La/R>1,就会出现丢包的情况(动画演示)。而如果La/R≤1,则可能出现排队时延。

吞吐量

吞吐量(throughput) 就是从客户端到服务器中所有链路的传输速率的最小值。

协议栈

网络以 分层(layer) 的方式组织协议以及实现这些协议的网络硬件和软件,每层通过在该层中执行某些动作或使用直接下层的服务来提供服务。各层的所有协议被称为协议栈(protocol stack)。因特网的协议栈由5个层次组成:物理层、链路层、网络层、运输层和应用层。

  • 应用层
    应用层是网络应用程序及它们的应用层协议存留的地方。因特网的应用层包括许多协议,例如HTTP、SMTP、FTP等。把位于应用层的分组称为报文(message)
  • 运输层
    运输层在应用程序端点之间传送应用层报文。因特网中有两种运输协议:TCP和UDP。把运输层的分组称为报文段(segment)
  • 网络层
    网络层包括IP协议,通常把它称为IP层。网络层的分组称为数据报(datagram),网络层负责将数据报从一台主机移动到另一台主机。
  • 链路层
    链路层将数据报沿路径传向下一个节点并上传给网络层。链路层的例子包括以太网、WiFi和电缆接入网的DOCSIS协议。把链路层分组称为帧(frame)
  • 物理层
    物理层将帧中的一个个比特从一个节点移动到下一个节点。

安全

  1. 将有害程序放入电脑:

    • 病毒(virus) 是一种需要某种形式的用户交互来感染用户设备的恶意软件。典型的例子是包含恶意可执行代码的邮件附件。
    • 蠕虫(worm) 是一种无须任何明显用户交互就能进入设备的恶意软件。
  2. 另一种安全性威胁称为拒绝服务攻击(Denial-of-Service attack,DoS),攻击服务器和基础设施使得不能由合法用户使用。大多数DoS攻击属于下列三种类型之一:

    • 弱点攻击:向一台目标主机上运行的易受攻击的应用程序或操作系统发送制作精细的报文,导致服务器停止运行或主机崩溃。
    • 带宽洪泛:向目标主机发送大量的分组使得目标的接入链路变得拥塞,导致合法的分组无法到达服务器。
    • 连接洪泛:在目标主机中创建大量的半开或全开TCP连接,导致主机停止接受合法的连接。
  3. 分组嗅探机
    在无线传输设备的附近放置一台接收机,该接收机就能得到传输的每个分组的副本。这样的接收机被称为分组嗅探器(packet sniffer)。由于分组嗅探机只是被动地接受信息而不注入,因此难以检测。最好的防御方法都与密码学有关。

  4. IP哄骗
    生成具有任意源地址、分组内容和目的地址的分组,然后将这个人工制作的分组传输到因特网中,就可以让接收方执行某些嵌入在该分组内容中的命令。将具有虚假源地址的分组注入因特网的能力被称为IP哄骗(IP spoofing)。为了解决这个问题,我们需要采用端点鉴别,即一种使我们能够确信一个报文源自我们认为它应当来自的地方的机制。

可靠数据传输原理

可靠数据传输协议(reliable data transfer protocol) 的下层协议可能是不可靠的,例如,TCP是在不可靠的(IP)端到端网络层之上实现的可靠数据传输协议。

出现比特差错怎么办

自动重传请求(Automatic Repeat reQuest, ARQ)协议是基于重传机制的可靠数据传输协议。它使用肯定确认(ACK)和否定确认(NAK)通知发送方哪些内容被正确接收,哪些有误需要重传。由于发送方需要一直等待接收方发回肯定确认才会发送新的数据,因此这种协议被称为停等(stop and-wait)协议
但这种协议有一个致命的缺陷,就是ACK或NAK也可能受损。解决方法是遇到含糊不清的ACK或NAK时重发数据。在数据分组中添加一个新的字段,存储发送数据的序号,以告知接收方这次数据是重发的还是新的。

丢包怎么办

发送方需要一个定时器,选择一个最大时间,如果超过这个时间还没有收到ACK就重传数据。对于因此而导致的可能出现的冗余数据分组,也可以通过上面序号的方式解决。
对于简单的情况,1比特的序号就足够了。与上一个数据相同则表示重传,否则就是新的数据。由于分组序号在0和1之间交替,因此这样的协议被称为比特交替协议(alternating-bit protocol)

流水线技术

上面的协议主要性能缺陷来源于停等协议。因此解决方法就是不以停等的方式运行,允许发送方发送多个分组,这被称为流水线技术(pipelining)。要保证这个技术,必须增加序号的范围,发送方和接收方都要能缓存多个分组。解决流水线的差错恢复有两种基本方法:回退N步(Go-Back-N,GBN)选择重传(Selective Repeat,SR)

回退N步(GBN)协议

即使可以同时发送多个分组,但最大数量仍受限制。
假设序号字段的比特为k位。那么序号空间就可以看做是一个长度为2k的环。那些已发送但还未被确认的分组的序号范围可以被看成是一个在序号范围内长度为N的窗口,因此N被称为窗口长度(window size),GBN协议也被称为滑动窗口协议(sliding-window protocol)

通过这个动画可以直观地看到GBN的过程

GBN发送方在发送分组时,首先检查窗口是否已满,即是否有N个已发送但未确认的分组。如果满了则缓存数据或使用同步机制。发送后如果出现超时,就重传所有已发送但未确认分组,这就是回退N步的意思。
接收方丢弃所有失序分组。比如此时期望收到n分组,但却先收到了n+1分组。接收方就将该分组缓存,如果n分组丢失,那么它将丢弃该n+1分组。这就是累积确认的方式,即当序号为n的分组发送ACK时,表示序号小于n的分组都成功交付。

也因此,BGN可能会因为一个分组的差错而引起大量分组的重传。这会大大降低性能。

注意窗口的单位是字节而非分组。TCP为每一个连接都设有一个持续计时器,若时间到期则发送一个探测报文段,对方收到后给出自己当前的窗口值,以此解决互相等待的死问题。

选择重传(SR)协议

SR协议通过发送方仅重传出错的分组来解决这个性能问题。

SR接收方不管这个分组是否是按顺序的都会接收它,失序的分组会被缓存直到所有序号小于它的分组都被接收。每个收到的分组都有两个边界,表示其字节序号的范围,采用左闭右开的表示方法。

SR动画

应用层

应用程序体系结构规定了如何在各种端系统上组织该应用程序。包括 客户-服务器体系结构(client-server architecture,C/S)P2P体系结构(Peer to peer architecture, P2P)
前者中有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。而后者对服务器的依赖极低,甚至可以没有。应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。并且,某些应用具有混合的体系结构。

可以从四个方面对应用程序服务要求进行分类,来选择合适的运输层:可靠数据传输、吞吐量、定时和安全性。

应用层协议

在运行在多个端系统上的应用程序间进行通信的实际上是 进程(process) 而不是程序。当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信。在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。

进程通过一个称为 套接字(socket) 的软件接口向网络发送和接受报文,因此套接字也称为应用程序和网络之间的 应用程序编程接口(Application Programming Interface,API)。套接字是应用层和运输层之间的接口。由IP地址+端口号组成。

应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。包括:

  • 交换的报文类型:例如请求报文和响应报文。
  • 各种报文类型的语法:如报文中的各个字段及这些字段是如何描述的。
  • 字段的语义:即这些字段中的信息的含义。
  • 确定一个进程何时以及如何发送报文:对报文进行响应的规则。

Web

Web是万维网(Wrold Wide Web) 的简称。Web页面(也叫文档)是由 对象(object) 组成的。一个对象只是一个文件,诸如一个HTML文件、一个JPEG图形、一个Java程序或一个视频片段这样的文件, 且它们可通过一个统一资源定位符(Uniform Resource Locator,URL) 地址寻址。

URL的一般格式是协议://主机:端口/路径

Web的应用层协议是超文本传输协议(HyperText Transfer Protocol,HTTP)。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。Web浏览器(Web browser) 实现了HTTP的客户端,“浏览器”和“客户”在这里是一个意思。Web服务器(Web server) 实现了HTTP的服务器端,用于存储Web对象。

以前一直不知道超文本是超在哪了,其实所谓超文本就是指包含指向其他文档的链接的文本。

HTTP

HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。HTTP使用TCP作为它的支撑运输协议。HTTP客户首先发起一个与服务器的TCP连接。一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。客户向它的套接字接口发送HTTP请求报文并从它的套接字接口接收HTTP响应报文。类似地,服务器从它的套接字接口接收HTTP请求报文和向它的套接字接口发送HTTP响应报文。
因为HTTP服务器并不保存关于客户的任何信息,所以说HTTP是一个无状态协议(stateless protocol)

书上说无状态的特性使得服务器更容易支持大量并发请求,这个我还没搞懂是为什么。

应用程序可以将每个请求/响应对通过一个单独的TCP连接发送,这种方法被称为非持续连接(non-persistent connection),是HTTP1.0的方法;而HTTP1.1使用 持续连接(persistent connection) 将所有的请求和响应经相同的TCP连接发送。

HTTP请求报文

以下面这个请求报文为例:

GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: zh-CN

HTTP请求报文的第一行叫作请求行(request line),其后继的行叫作首部行(header line)

请求行有3个字段:方法、URL和HTTP版本。方法字段可以取几种不同的值,常见的方法有以下几个:

方法 含义
OPTION 请求一些选项的信息
GET 请求由URL标志的信息
HEAD 请求由URL标志的信息的首部
POST 给服务器添加信息
PUT 在指明的URL下存储文档
DELETE 删除所指明的URL的资源
TRACE 进行环回测试
CONNECT 用于代理服务器

首部行Host: www.someschool.edu指明了对象所在的主机;Connection: close指明使用非持续连接的方法;User-agent:用来指明用户代理,即向服务器发送请求的浏览器的类型。如本例的Mozilla/5.0即Firefox浏览器;Accept-language:表示想要的该对象的语言版本,如本例的zh-CN表示简体中文。

首部行的最后其实还有一个实体体(entity body),只是在使用GET的时候为空。如果请求行的方法使用POST,如用户提交表单的时候,实体体中包含的就是用户在表单字段中的输入值。要注意GET也可以提交表单。

HTTP响应报文

以下面这个响应报文为例,它响应上面的请求报文:

HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2021 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2021 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)

响应报文包括三部分:状态行(status line),首部行和实体体。

状态行是第一行,有3个字段:协议版本、状态码和相应状态信息。其中一些常见的状态码和相关的短语包括:

  • 200 OK:请求成功,信息在返回的响应报文中。
  • 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
  • 400 Bad Request: 一个通用差错代码,指示该请求不能被服务器理解。
  • 404 Not Found:被请求的文档不在服务器上。
  • 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。

首部行中Data:指明发送该响应报文的时间;server:指明服务器;Last-Modified:指示了对象创建或者最后修改的日期和时间;Content-Length:指发送对象的字节字数;Content-Type:指明实体体中的对象是HTML文本。

实体体包含了所请求的对象本身,即本例中的(data data…)。

cookie

由于HTTP是无状态的,因此需要使用cookie来让站点对用户进行跟踪,使用cookie实现用户和服务器的交互。cookie技术有4个组件:①在HTTP响应报文中的一个cookie首部行;②在HTTP请求报文中的一个cookie首部行;③在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理;④位于Web站点的一个后端数据库。

Web缓存器

可以配置用户的浏览器,使得用户的所有HTTP请求首先指向Web缓存器(Web cache) (也叫 代理服务器(proxy server))。一旦某浏览器被配置,每个对某对象的浏览器请求会被首先定向到Web缓存器。

至于Web缓存器的作用,Web缓存器首先可以大大减少对客户请求的响应时间。其次可以大大减少一个机构(如公司或大学)的接入链路到因特网的通信量(一般这会比直接提升链路的速率更经济且有效)。

但是仔细想想的话就会发现问题,即存放在缓存器中的对象副本可能是陈旧的。为了解决这个问题,HTTP通过条件GET方法来确保副本是最新的:缓存器在向服务器发送GET请求时,会包含一个If-Modified-Since:首部行,其值应该等于上一次请求时得到的响应的Last-Modified:值。意为只有在指定日期后对象被修改过,才需要发送该对象。如果没有被修改过,服务器则会响应一个状态行为304 Not Modified的报文。

FTP协议

文件传送协议(File Transfer Protocol, FTP) 提供一些文件传送的基本服务,使用C/S方式,其服务器进程分为一个主进程和若干个从属进程。它提供交互式的访问,允许客户指明文件的类型和格式。使用两个TCP连接:控制连接和数据连接,端口号分别是是21和20。主要功能是减少再不同操作系统下处理文件的不兼容性。

简单文件传送协议(Trivial…,TFTP) 不支持交互,使用UDP连接。

电子邮件

电子邮件系统有3个主要组成部分:

  • 用户代理(user agent)
    用户代理允许用户阅读、回复、转发、保存和撰写报文。
  • 邮件服务器(mail server)
  • 简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)

邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。
电子邮件的报文必须包含From:To:首部行。之后是以ACSII格式表示的报文体。

DNS

一个主机可以由主机名(例如www.google.com)来标识,也可以由IP地址来标识。一个复杂主机名可以有多个主机别名(host aliasing),原名则被称为规范主机名(canonical hostname)

域名系统(Domain Name System,DNS) 进行主机名到IP地址转换的目录服务。它是一个由分层的DNS服务器实现的分布式数据库,也是一个使得主机能够查询分布式数据库的应用层协议。它运行在UDP之上,使用53号端口。

DNS采用了分布式的设计方案,使用了大量的服务器,分布在全世界。有3种类型的DNS服务器:

  • 根DNS服务器
    有400多个根DNS服务器由13个不同的组织管理。它提供TLD服务器的IP地址。
  • 顶级域(Top Level Domain,TLD) DNS服务器
    对每个顶级域(如com, org, net等)和国家的顶级域(如cn, fr等),都有TLD服务器。它提供权威DNS服务器的IP地址。
  • 权威DNS服务器。
    拥有将主机名映射为IP地址的DNS记录。

解析过程是这样的:主机向本地域名服务器查询一般采用递归查询的方式。应用程序调用DNS客户端,指明需要被解析的主机名。用户主机上的DNS接收到后,向网络中发送一个DNS查询报文,然后接收到一个回答报文(所有的DNS请求和回答报文使用UDP数据报经端口53发送)。最后将映射缓存到本地存储器中(一段时间后将会丢弃缓存的信息)。

所有DNS服务器都存储了资源记录(Resource Record,RR),RR提供主机名到IP地址的映射。它是一个包括4个字段的4元组:(Name, Value, Type, TTL)。TTL指记录的生存时间,即什么时候从缓存中删除。而Name和Value则取决于Type:

  • Type = A:Name是主机名,Value是IP地址。
  • Type = NS:Name是一个域(如foo.com),Value是一个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。
  • Type = CNAME:Value是别名为Name的主机对应的规范主机名。
  • Type = MX:Value是别名为Name的邮件服务器的规范主机名。

在命令行输入nslookup就可以发送DNS查询。

运输层

网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。运输层使用16位的端口号对网络应用进程进行编址(非网络进程不标识端口号)。可以分为以下三类:

  • 熟知端口号
    数值为0~1023(0号不用),是规定好的一些端口号。
  • 登记端口号
    数值为1024~49151,使用这些端口号必须在IANA登记。
  • 短暂端口号
    数值为49152~65535,在客户进程运行时动态选择。

书中将主机和网络层协议类比为家庭和邮政服务,进程和运输层协议比作两个家庭的所有成员和他们之中负责收发邮件的人。

UDP(用户数据报协议)TCP(传输控制协议) 是运输层的两个协议,它们负责将主机间的交付扩展到进程间的交付,这被称为运输层的多路复用(transport-layer multiplexing)与多路分解(demultiplexing)
注意UDP和TCP是不相关的,因此可以同时使用相同的端口号。

一个进程有一个或多个套接字。

将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。
从不同套接字中收集数据块,并为其封装上首部信息从而生成报文段,然后将报文段传递到网络层。这个工作称为多路复用。

家庭中负责收发邮件的人将邮件发给各个成员就是多路分解,而将他们写的邮件送给邮政则是多路复用。

UDP

UDP提供不可靠、无连接的服务。应用层交给UDP多长的报文,UDP就照样发送它。

它除了复用、分解功能及少量的差错检测外,几乎没有对IP增加别的东西。在发送报文段之前,发送方和接收方的运输层实体没有握手,因此说UDP是无连接的。

那么为什么不使用更可靠的TCP呢?概括地讲,由于不需要经过握手,且没有拥塞机制,UDP可以保证发送报文段的实时性。并且省去了维护连接状态的开销也使得UDP能支持更多的活跃用户。

UDP的首部包括四个字段:源端口号、目的端口号、长度和校验和。每个字段由2个字节组成。长度字段指明了包括首部在内的UDP报文段长度是多少字节。校验和用于检查报文段是否出现差错。

校验和

发送方的UDP首先增加12个字节的伪首部(既不向上也不向下传递,只用于计算校验和),然后对报文段中的所有16比特字(不足则补0)求和再进行反码运算,求和时如果遇到溢出就要回卷1。将结果放到校验和字段中。
接收方将所有16比特字(包括了校验和)加在一起。如果该分组没有出现差错,那么结果应该是16位1。

TCP

TCP提供可靠的、面向连接的服务。它连接的端点就是套接字。

当一侧要向另一侧发送数据时,它只需经过其套接字将数据丢进TCP连接。这与UDP不同,UDP服务器在将分组丢进套接字之前必须为其附上一个目的地址。
TCP是面向字节流的,它把应用层交下来的数据看成一连串无结构的字节流,将这些来自套接字的字节放到 发送缓存(send buffer) 里,然后时不时从中取出数据传递给网络层。TCP可以从中取出并放入报文段中的数据数量叫做最大报文段长度(Maximum Segment Size,MSS)。它通常由最大链路层帧长度(即最大传输单元(Maximum Transmission Unit,MTU) )决定。要保证一个TCP报文段+TCP/IP首部长度≤MTU。

注意MSS指报文段中应用层数据的长度,而不包括其首部。
MTU指链路层帧的数据部分的最大长度,而非帧的总长。

TCP首部一般有20个字节:

  • 各2字节的源端口、目的端口
  • 4字节的序号字段、4字节的确认号字段。用于可靠数据传输。
    序号是该报文段首字节的字节流编号。例如数据流包含500 000字节,MSS为1000字节,数据流的首字节编号为0。TCP将为该数据流构建500个报文段,第一个序号为0,第二个为1000,以此类推。
    确认号是发送方期望从对方那收到的下一字节的序号。因为TCP是全双工的,即A向B发送数据的时候也可能收到来自B的数据。例如A收到了包含字节0 ~ 50以及60 ~ 100的报文段而没有收到51 ~ 59的报文段。那么A到B的下一个报文段中的确认号字段将包含51。因此称TCP提供累计确认。
    当接收方收到比期望序号大的报文段时,会发送冗余ACK(即再次确认已经确认过的某个报文段的ACK)。当接收方收到3个冗余ACK时,TCP就会执行快速重传(即在该报文段的定时器过期之前重传丢失的报文段)。
  • 4位数据偏移
    实际上是指首部长度,单位是32位(双字)。
  • 6位保留用于以后使用
  • 6位的标志字段
    • URG(urgent) 表示紧急指针字段是否有效。TCP缓存(buffer)优先发送紧急报文段。
    • ACK(acknowledgment) 表示确认字段是否有效。在连接建立后所有报文的ACK都必须置1。
    • PSH(push) 发送方希望在键入一个命令后立即就能收到对方的响应(不然对方可能会因为拥塞、缓存等原因推迟发送),则将PSH置1。TCP缓存(buffer)优先向进程交付PSH位1的报文段。
    • RST(reset) 置1时表示TCP连接出现严重差错,必须释放并重新连接。也可以用来拒绝一个连接。
    • SYN(synchronization) 用于建立连接。
    • FIN(finis) 用于释放连接。
  • 2字节的接收窗口字段,用于流量控制。
    TCP提供了 流量控制服务(flow control service) 以消除因发送方和接收方速度不匹配而出现的缓存溢岀的可能性。接收窗口指示自己还有多少可用的缓存空间。
    接收窗口大小rwnd = 缓存大小 - (到达缓存的最后一个字节的编号 - 从缓存读出的最后一个字节的编号)
  • 2字节校验和
  • 2字节紧急指针
    指出本报文段紧急数据的字节数。注意即使窗口为0也可以发送紧急数据。
  • 最多40字节的选项字段。

下面是TCP建立和关闭连接的过程:

3次握手

首先服务器要先创建传输控制模块TCB用以存储每一个连接中的重要信息。此时服务器就处于LISTEN(收听)状态。

  • 第一次
    首先客户端也创建TCB。然后发送一个不包含应用层数据的特殊报文。将标志字段中的SYN置1,并随机选择一个初始序号client_isn放在序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。
  • 第二次
    到达后,服务器为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。其中也包括了置为1的SYN、置1的ACK和随机的初始序号server_isn,以及确认号client_isn + 1。该报文被称为SYNACK报文段(SYNACK segment)
  • 第三次
    收到SYNACK报文段后,客户端也给该连接分配缓存和变量,并向服务器发送一个确认报文。其中SYN置为0、ACK置1,确认号为server_isn + 1。该报文段可以携带数据,且在不携带数据的时候不消耗序号。

为什么是三次握手而不是两次握手呢? 即为什么客户端最后还要发一次确认报文?一言以蔽之是为了避免服务器资源浪费。考虑以下情况:客户端发出了连接请求但超时了,因此发出了第二次连接请求。第二次顺利地建立了连接,但在释放后服务器才收到第一次发出的连接请求,此时服务器会再返回SYNACK报文段。如果没有第三次握手,就会建立一条本来不需要的连接。

4次挥手

  • 第一次
    关闭连接时,客户端发出一个特殊的报文段。其中标志字段中的FIN置1,序号client_isn为上一个最后的字节序号+1。此时客户端进入FIN_WAIT_1状态
  • 第二次
    服务器发回一个ACK,确认号为client_isn + 1。此时服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。客户端到服务器的连接就被释放了,此时TCP连接处于半关闭(half-close) 状态。即客户端不用发送数据了,但如果服务器发送数据客户端还得接受。
  • 第三次
    服务器发送自己的终止报文段,即FIN置为1,确认号和上一次相等。此时服务器进入LAST_ACK状态。
  • 第四次
    客户对服务器的终止报文段发送ACK。此时客户端进入TIME_WAIT状态。必须经过时间等待计数器(TIME_WAIT timer) 设置的时间2 * MSL后才进入CLOSED状态,MSL叫做最长报文段寿命(Maximum Segment Lifetime)。在此期间如果ACK丢失,客户端将重传最后的ACK报文。

为什么是四次挥手而不是三次挥手呢? 因为TCP是全双工的,在客户端确定关闭连接时,服务器可能还有要发送的数据,因此前两次挥手只是关闭了客户端的连接。如果客户端要关闭连接时服务器也不需要发送数据了,那么它可以把第二次和第三次挥手的内容合并到一个报文段发送,这样就变成了“三次挥手”。

流量控制

TCP为每一个连接维护一个持续计时器(persistence timer),每当收到对方的零窗口通知时,就启动持续计时器。在计时器时间到期后,发送一个仅携带一个字节数据的探测报文段,来获取当前的窗口值。

拥塞控制

TCP在出现超时或者收到3个冗余ACK时认为出现了拥塞。TCP在顺利交付报文段后会增加发送速率,但在检测到拥塞时降低速率。
发送方维护一个额外变量拥塞窗口(cwnd),限制其发送流量的速率。已发送但未确认的数据流不超过rwnd和cwnd中的最小值,即:
LastByteSent - LastByteAcked ≤ min(cwnd, rwnd)

TCP拥塞算法主要包括3部分:慢启动、拥塞避免和快速恢复。前两者是强制实现的,区别在于增加cwnd的方式;后者对发送方不是必需的。

  • 慢启动
    当TCP建立连接时,cwnd通常初始值设为一个MSS,在每次收到ACK后都增加一个MSS。例如一开始发送一个报文段,收到ACK后发出2个报文段,分别收到ACK后则发出4个报文段。因此慢启动是指数增长的。并且维护并初始化一个变量ssthresh(slow start thresh,慢启动阈值)
    慢启动的结束有以下三种情况:① 在检测到拥塞时,TCP令ssthresh = cwmd / 2cwmd = 1,并重新开始慢启动。② 当cwnd增加到ssthresh时,结束慢启动并转移到拥塞避免模式。③ 检测到3个冗余ACK时,令ssthresh = cwmd / 2cwmd = ssthresh,TCP执行并进入快速恢复模式。
  • 拥塞避免
    此时从每个ACK增加一个MSS变为每个RTT增加一个MSS。例如在一个RTT内发送10个报文段,则每个报文段在确认后增加1/10个MSS。因此拥塞避免是线性增长的。
  • 快速恢复
    对于快速恢复,必须使用快速重传算法。即接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认。发送方在连续收到三个冗余ACK时对每个冗余ACK都增加一个MSS。当收到丢失报文段的ACK后,TCP降低cwnd并进入拥塞避免模式。

TCP拥塞控制方式是在每个RTT内线性增加,出现3个冗余ACK时减半,因此也被称为 加性增、乘性减(Additive-Increase, Multiplicative-Decrease,AIMD) 拥塞控制方式。

网络层

网络层要实现两个功能:转发和路由选择。
因此网络层也分为数据平面和控制平面来分别实现这两个功能。
前者是网络层中路由器的功能,决定了到达路由器输入链路的数据报如何转发到该路由器的输出链路。转发的过程只有纳秒级;后者是网络范围的逻辑,控制平面决定数据报所采用的路由或路径。路由选择则通常为几秒。

可以理解为路由选择是出门旅行前做的规划,而转发则是路上从A路口走到B路口。

因特网的网络层提供尽力而为服务(best-effort service),即不保证分组的接收、顺序和时延。
网络层把链路层的网络连接起来,因此称为“网络的网络”。

要注意TCP/IP协议其实是不严格分层的

例如IP报的数据部分可以包含同是网络层的ICMP协议内容。
又例如一般而言是下层向上层提供服务,但对于TCP/IP协议,却是运输层向网络层提供了可靠保证。

数据平面

IP协议

主机或路由器与物理链路通过接口相连,一个IP地址与一个接口相关联。IP地址的写法是点分十进制记法(dotted-decimal notation),由4个十进制数构成,每个数字占8比特,例如192.168.1.1。

IP地址分两部分:网络号+主机号。网络号为8、16、24位分别对应A、B、C类IP地址。网络号或主机号为0时有特殊含义,例如网络号全0时表示本网络,总结如下表所示:

网络号 主机号 含义
全0 全0 本主机
全1 全1 在本网络进行广播(不交给路由器)
net-id 全1 对net-id网络进行广播
127 非(全0或全1) 用于本地软件环回测试

IPv4

IPv4数据报关键字段包括:

  • 版本号。
    4比特,一般是4或6。
  • 首部长度
    4比特。要注意其单位是32位。例如首部的固定长度部分是20字节,因此首部长度字段的最小值就是5(即5个32位)。
  • 区分服务
    8比特。用于区分不同服务类型(例如低时延或可靠性)的数据报。一般为0。
  • 数据报长度
    16比特。表示首部加上数据的长度,其单位为字节。
  • 16比特标识、3比特标志、13比特片偏移
    与IP分片有关。
    由于各个链路层协议所能承载的网络层数据报长度不同,而一个链路层帧能承载的最大数据量就是MTU(例如以太网是1500字节),这要小于数据报的最大长度。因此IPv4将数据报分成很多片(fragment)
    每产生一个数据报,标识就+1,路由器在分片时,让一个数据报的所有片都具有相同的标识。
    标志字段只有后两位在使用。最低位MF(more fragment)为1时表示后面还有分片。中间位DF(don’t fragment)为1时表示不能分片。
    使用偏移字段指定该片应该放在原数据报的哪个位置。其单位为32位,即其值等于该片前面的所有片的字节数除以8。例如将3800字节的数据分为1400、1400、1000三个片。它们的片偏移分别为0、1400/8=175、2800/8=350。
  • 寿命(Time-To-Live,TTL)
    寿命字段用以确保数据不会永远在网络中循环。每当一台路由器处理数据报时,其TTL减一,当其为0时会被抛弃。
  • 协议
    该字段当数据报到达最终目的地时才有用,它指示了数据报的数据部分应交给哪个特定的运输层协议。例如,值为6表明数据部分要交给TCP,而值为17表明交给UDP。
  • 首部检验和
    用于帮助路由器检测收到的IP数据报中的比特错误。只检验首部部分,而不检验数据部分。
  • 源、目的IP地址
    各32位比特。
  • 选项
    如果对首部有其他的需求,通过选项字段以扩展首部。
  • 数据

IPv6

IPv6使用冒号十六进制记法。
IPv6数据报字段包括:

  • 版本
  • 流量类型
    8比特,与IPv4的TOS字段类似。
  • 标签
    IPv6有关于 流(flow) 的定义。该字段用于给属于特殊流的分组加上标签。这些特殊流是发送方要求进行特殊处理的流,比如一种非默认服务质量或需要实时服务的流。
  • 有效载荷长度
    是一个16比特的无符号整数。指40字节的首部后面的字节数量。
  • 下一个首部
    指明数据字段交付给哪个协议(如UDP或TCP),其值与IPv4的协议字段相同。
  • 跳限制
    类似IPv4的寿命字段。
  • 源/目的地址
    IPv6将地址从32比特增加到128比特。
  • 数据

IPv6去除了路由器的分片操作,并移到了网络边缘的主机。由于分片和重装很费时间,因此这大大加快了IP转发速度。在遇到数据报太大的情况时,会向发送方发回一个“分组太大”的ICMP差错报文。

一种广泛的从IPv4迁移到IPv6的方法是建隧道(tunneling)。在两个使用IPv6数据报交互的节点之间的IPv4路由器的集合称为隧道,将整个IPv6的数据报放到一个IPv4的数据中,其中IPv4数据报的协议字段的值为41。

ARP协议

寻址的最终目的一定是MAC地址,那么一个IP数据报怎么找到对应的目的MAC地址呢?这就需要用到 地址解析(Address Resolution Protocal,ARP) 协议。

每台主机都有一个ARP高速缓存(ARP cache),里面存储本局域网上各主机和路由器的IP地址到MAC地址的映射表。每当发送IP报时,就在ARP cache中查找对应MAC地址并写入MAC帧。ARP协议是这样得到该映射关系的:
(1)ARP进程在本局域网上广播一个ARP请求分组,其内容为“我的IP地址是XX,我的MAC地址是XX,我想要知道IP地址为XXX的主机的MAC地址是什么”。
(2)所请求的目的主机收下该帧,在其中写入自己的MAC地址,将其发给源地址(单播),并且把源主机的IP地址到MAC地址的映射写入自己的ARP cache中以备之后用到。

ARP对每一个映射都设置一个生存时间,当过期时就将其删除,这样做避免了因为更换MAC地址而永远找不到对方。

子网划分

使用 子网掩码(network mask) 进行子网划分以重新定义网络号和主机号的位数。子网掩码的网络号位为1,主机号位为0。例如有3个IP分别是223.1.1.1,223.1.1.2,223.1.1.3的主机,和与它们连接的路由器接口223.1.1.4。这四个接口通过一个不包括路由器的网络互联起来,即互联这3个主机接口与1个路由器接口的网络形成一个子网(subnet)。IP编址为这个子网分配一个地址223.1.1.0/24,其中/24被称为子网掩码,指明了32位比特的前24位定义了子网地址。其他要连到223.1.1.0/24网络的主机都要有相同的前24位。

RTF文档没有规定但却极力推荐子网掩码使用连续的1。
子网掩码将IP地址从二级编址(网络号、主机号)变为三级编址(网络号、子网号、主机号)

CIDR

因特网的地址分配策略是无类别域间路由选择(Classless Interdomain Routing,CIDR),它规定了子网寻址的规范。当使用子网寻址时,IP地址 a.b.c.d/x 被分为两部分,其中x指的是第一部分的位数,第一部分被称为该地址的前缀(prefix),用来指明网络号,剩下的则是主机号。CIDR将IP地址又改回了二级编址(前缀、主机号)。为了兼容子网划分,CIDR也有地址掩码(也可以叫做子网掩码),唯一区别是它的1、0必须是连续的。

路由器用分组目的地址的前缀与转发表中的表项进行匹配,而由于转发表中的表项长度可能不同,因此可能出现多个匹配的情况,路由器使用最长前缀匹配规则。之所以“前缀”而非整个地址,是因为前缀可以表示范围,否则每个地址对应一个链路接口的话就需要几十亿个接口了。之所以“最长”是因为前缀越长,地址就越具体。

路由器

路由器包括输入端口、交换结构、输出端口和路由选择处理器。
每台路由器都有一个转发表(fowarding table)。每张转发表主要存储目的IP地址、子网掩码和下一跳IP地址。(其实还有一些其他信息)。

输入端口的处理就是查找目的IP地址,然后发送该分组进入交换结构。
交换结构位于路由器的核心部位,通过交换结构,分组从输入端口转发到输出端口。交换有以下几种方式:

  • 经内存交换
    输入分组被复制到路由选择处理器的内存中,由处理器提取提取地址,找到合适的输出端口,并将分组复制到输出端口的缓存中。
  • 经总线交换
    让输入端口给分组添加一个标签以指示输出端口。所有输出端口都可以收到该分组,但只有与标签匹配的可以缓存它,并将其标签去除。
  • 经互联网络交换
    如纵横式交换机。当分组要从端口A到B时,交换机控制器闭合总线A和B的交叉点,然后A发送分组,因此只有B可以收到。与前两者不同,纵横式交换机是非阻塞的。

考虑纵横式交换机中A和B都要向C发送分组。即使输出端口C没有竞争,但A和B则要排队等待。这种现象叫做输入排队交换机中的线路前部(Head-Of-the-Line,HOL)阻塞。有一个结论是,如果输入链路上的分组到达速率达到其容量的58%,输入队列就可能无限制增大(也即可能出现大量丢包)。

如果是很多端口都向A端口发送分组,那么A的缓存可能会不足,此时就要做出决定:要么丢弃新来的分组(弃尾(drop-tail)),要么删除已经排队的分组。目前有很多分组丢弃策略,统称为主动队列管理(Active Queue Management,AQM)算法,其中使用最广泛的是随机早期检测(Random Early Detection,RED)算法

队列可以是普通的FIFO队列,也可以是优先队列,也可以是实现加权公平排队(Weighted Fair Queueing,WFQ)规则的队列,后者指将每个分组进行分类,然后对每个类分配其权重以计算优先级。然后轮流服务类1,类2…

NAT

可能很多家庭都有相同的诸如192.168.0.0/16这样的IP地址,网络地址转换(Network AddressTranslation ,NAT) 路由器使用其NAT转换表将这些专用网转化为全球唯一的IP地址。

DHCP协议

使用动态主机配置(Dynamic Host Configuration Protocol,DHCP)协议以避免人工配置IP地址。
DHCP使用客户服务器模式。主机在需要IP地址时会向服务器发送发现报文,服务器返回数据库中该主机的配置信息,若没有则为其分配一个IP地址。

DHCP服务器分配的IP地址是临时的,称这段时间为租用期(lease period)。另外DHCP协议其实是基于UDP的应用层协议,客户端口为68,服务器端口为67。

一般每个网络至少有一个DHCP中继代理(realay agent)(通常是一个路由器),它配置了DHCP服务器的IP地址,当收到主机广播的发现报文后,就将其单播给DHCP服务器。


控制平面

将整个互联网划分为多个自治系统(Autonomouos System,AS),每个AS都是使用相同路由选择协议的一组路由器。

路由选择协议分为两大类:

  • 内部网关协议IGP(interior gateway protocol)
    用于AS内部的路由选择。例如RIP协议和OSPF协议。
  • 外部网关协议EGP(external gateway protocol)
    用于AS间的路由选择。例如BGP协议。

ICMP协议

主机和路由器用 因特网控制报文协议(ICMP) 来沟通网络层的信息,允许主机或路由器报告差错情况和异常报告。

ICMP报文有一个类型字段和一个代码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节。
ICMP报文有两种:

  • 差错报告报文
    • 终点不可达(类型值为3)
      不能交付数据报时,向源点发送该报文。
    • 时间超过(11)
      收到TTL为0的报文时,发送该报文。
    • 参数问题(12)
      收到的数据报首部有字段的值不正确时,发送该报文。
    • 改变路由(重定向)(5)
      告知主机下次将数据报交给另一个路由器。
  • 询问报文
    • 回送(echo)请求或应答(8或0)
      收到echo请求的必须回发一个echo回答。
    • 时间戳请求或回答(13或14)
      回发当前的日期。

ICMP报文就放在IP报的数据部分。并且对ICMP差错报文不再发送ICMP差错报文,对第一个分片之后的数据报也不发送ICMP差错报文。另外,对多播或特殊地址的数据报也不发送ICMP差错报文。

RIP协议

路由信息协议(Routing Information Protocol,RIP) 是一种分布式的基于距离向量的路由选择协议。

RIP协议要求每一个路由器都维护一张它自己到其他每一个目的网络的距离(要注意这里的距离指的是跳数,即经过的路由器数量)记录表,包括目的网络,距离和下一跳地址。RIP协议规定距离的最大值为16,表示不可达。
RIP协议让每个相邻的路由器按固定的时间间隔交换自己的所有已知信息,直到路由表稳定下来(这段时间称为收敛时间),这取决于拓扑结构是否变化。

RIP协议使用距离向量算法计算最短距离,其基础是

相关文章