RFC-1180

原文: https://tools.ietf.org/html/rfc1180#page-8

1、介绍

本教程仅包含 TCP/IP 各个关键点的一个视图,因此它是 TCP/IP 技术的“骨架”。这里省略了其发展与资助历史、商业用例,以及与 ISO OSI 作为对比的前景。事实上,也省略了大量的技术信息。剩下的是在 TCP/IP 环境中工作的专业人员所必须理解的最小信息。这些专业人员包括系统管理员、系统程序员以及网络管理员。

本教程使用 Unix TCP/IP 环境作为示例,但是各个要点适用于所有 TCP/IP 实现。

注意,本备忘录的目的在于解释,而非定义。如果对协议的正确规范有任何疑问,请参考定义 RFC 的实际标准。

下一节是对 TCP/IP 的概览,接着是对各个组件的详细描述。

2、TCP/IP 概览

“TCP/IP”,这个通用的术语通常表示任何、所有与 TCP 和 IP 相关的特定协议。它可以包含其他协议、应用,甚至是网络媒介。协议相关的例子有:UDP、ARP、ICMP。应用相关的例子有:TELNET、FTP、rcp。一个更加准确的术语应该是“互联网(internet)技术”。一个使用互联网技术的网络则被称为“互联网”。

2.1、基本结构

想要理解该技术,你首先得理解下面的逻辑结构:

NAME

这是一个互联网上的计算机内部的分层协议的逻辑结构。每个使用拥有这样一个逻辑结构的互联网技术的计算机都能够进行通信。该逻辑结构用于判断处于互联网上的计算机的行为。这些方框表示数据通过计算机时的处理过程,连接方框的线段则表示数据的路径。处于底部的水平线表示以太网电缆;“o” 表示收发器(transceiver),“*” 表示 IP 地址;“@” 表示以太网地址。对该逻辑结构的理解是对互联网技术本质的理解;它将贯穿于整个教程。

2.2、术语

流经互联网的数据单元的名称,取决于它在协议栈中的位置。总的来说:如果它处于以太网(Ethernet),则被称为 “以太网帧(frame)”;如果它处于以太网驱动设备和 IP 模块之间,则被称为 “IP 数据包(packet)”;如果它处于 IP 模块和 UDP 模块之间,则被称为 “UDP 数据报文(datagram)”;如果它处于 IP 模块和 TCP 模块之间,则被称为 “TCP 段(segment)”,或者更通常的称为“传输消息”;如果它处于网络应用之中,则被称为 ”应用消息“。

这些定义是不完善的。实际的定义会在不同出版物之间发生变化。更加明确的定义可以在 “小节 1.3.3 RFC 1122” 中找到。

驱动设备(driver)是一种在网络接口硬件之间通信的软件。模块(module)是一种与驱动设备、网络应用、或者另一个模块进行通信的软件。

这些术语,驱动设备、模块、以太网帧、IP 数据包、UDP 数据报、TCP 消息、应用消息,会适当的使用于整个教程中。

2.3、数据流

让我们顺着数据在图一中所展示的、通过协议栈向下流动的方向。对于一个使用 TCP(Transmission Control Protocol) 的应用,数据会在应用和 TCP 模块之间传递。对于使用 UDP(User Datagram Protocl) 的应用,数据会在应用和 UDP 模块之间传递。FTP(File Transfer Protocol) 是一个使用 TCP 的典型应用。在本例中它的协议栈是 FTP/TCP/IP/ENET。SNMP(Simple Network Management Protocol) 是一个使用 UDP 的应用。它在本例中的协议栈是 SNMP/UDP/IP/ENET。

TCP 模块、UDP 模块以及以太网驱动设备,都是多对一的多路转接器(multiplexer)。作为多路转接器,它们会将多种输入转换为一种输出。它们同时又是一对多的反-多路转接器(de-multiplexer)。作为反-多路转接器,它们可以根据协议头部中的类型字段,将一种输入转换为多种输出。

NAME

如果一个以太网帧从网络向上来到以太网驱动设备,数据包可以被传递到上游的 ARP(Address Resolution Protocol) 模块或 IP(Internet Protocol) 模块。以太网帧中的类型字段的值会用于判断是将以太网帧传递给 ARP 还是 IP 模块。

如果一个 IP 数据包向上来到 IP 模块,数据单元会被传递到上游的 TCP 或 UDP,这取决于 IP 头部中协议字段的值。

如果一个 UDP 数据报向上来到 UDP 模块,应用消息会基于 UDP 头部中端口字段的值传递给上游的网络应用。如果 TCP 消息向上来到 TCP 模块,应用消息会基于 TCP 头部中端口字段的值传递给上游的网络应用。

向下游的多路转接会比较易于执行,因为从每个起始点开始仅有一个下游路径;每个协议模块会在数据单元中添加各自的头部信息,因此数据包能够在目的计算机中进行反多路转接。

通过 TCP 或 UDP 从应用中传出的数据会聚集到 IP 模块上,让后通过低层的网络接口驱动设备向下发送。

尽管互联网技术支持多种不同的网络媒体,但是本教程中的所有示例都会使用以太网(Ethernet),因为它是 IP 协议下使用的最普遍的物理网络。图一中的计算机拥有单个以太网连接。6 字节的以太网地址对于一个以太网中的每个接口来说是唯一的,并位于以太网驱动设备的低层接口。

该计算机(图一)同样拥有一个 4 字节的 IP 地址,该地址位于 IP 模块的低层接口。每个 IP 地址对于互联网来说必须是唯一的。

一个运行中的计算机总是知道它自己的 IP 地址和以太网地址。

2.4、两个网络接口

如果一个计算机被连接到两个单独的以太网,像下图(3)中一样:

NAME

请注意该计算机拥有两个以太网地址和 IP 地址。

从图中的结构可以发现,该计算机拥有两个物理网络接口,IP 模块同时作为多对多的多路转接器和多对多的反多路转接器。

NAME

它会在任意一个方向上执行多路转接以适应传入和传出的数据。一个伴随多于一个网络接口的 IP 模块比我们一开始的例子要复杂的多,它可以将数据转发到另一个网络。数据可以到达任意网络接口,也可以从任意其他的网络接口被发出。

NAME

将一个 IP 数据包发送到另外一个网络的过程被称为 IP 数据包的”转发“。一个专门用来转发 IP 数据包的计算机被称为 ”IP-路由器(router)“。

从图中你可以发现,被转发的 IP 数据包绝不会接触到 IP 路由器中的 TCP 或 UDP 模块。有些 IP 路由器的实现中甚至并不拥有 TCP 或 UDP 模块。

2.5、IP 创建了一个单一逻辑网络

IP 模块是互联网技术成功的核心。在消息向下流经协议栈时,每个模块都会添加各自的头部信息到消息中。当消息由协议栈向上传输到应用时,每个模块或驱动设备都会从消息中删除对应的头部信息。IP 头部中包含了 IP 地址,它从多个物理网络构建了一个单个逻辑网络。这种物理网络的互联也即名称的来源:Internet(因特网、互联网)。限制了 IP 数据包分组范围的一组相互关联的物理网络则称为”互联网“。

2.6、物理网络独立性

IP 对网络应用隐藏了底层的网络硬件。如果你发明了一个新的物理网络,你可以通过实现一个能够连接到互联网底层 IP 的驱动设备来将其投入使用。因此,网络应用能够保持不被硬件技术的改变所影响,从而保持完整。

2.7、互操作性

如果互联网之上的两个计算机能够通信,它们被称为可以”互操作“;如果一个互联网技术的实现很好,则被称为拥有”互操作性“。通用计算机用户受益于互联网的安装,因为计算机在市场上的互操作性。通常来说,如果你购买了一台计算机,它将会进行互操作。如果一台计算机不拥有互操作性,或者不能添加互操作性,它将在市场中占有一个狭小而特殊的地位。

2.8、概览之后

基于设置的背景,我们将回答以下问题:

  • 当发出一个 IP 数据包时,目标以太网地址是如何确定的?
  • 当发出一个 IP 数据包时,IP 模块如何知道使用多个低层网络接口中的哪一个?
  • 一台计算机中的客户端如何连接到另一台计算机中的服务端?
  • 为什么同时存在 TCP 和 UDP,而不是仅有一个或另一个?
  • 有哪些可用的网络应用程序?

这些将会在补习完以外网之后进行解释。

3、以太网

本节是对以太网(Ethernet)技术的简要概览。

一个以太网帧包含了目的地址、来源地址、类型字段以及数据。

一个以太网地址占用 6 个字节。每个驱动设备都有各自的以太网地址,并使用目的地址来监听以太网帧。所有的驱动设备同时还会监听一个十六进制的通配地址 ”FF-FF-FF-FF-FF-FF-FF“,称为”广播“地址。

以太网使用了 CSMA/CD(Carrier Sense and Multiple Access with Collision Detection, 基带冲突检测的载波监听多路访问技术),CSMA/CD 意味着所有驱动设备的通信都基于一个单独的媒介,而同一时间仅能有一个驱动设备执行发送,但所有驱动设备能够同时进行接收。如果两个驱动设备尝试在一个瞬间同时发送,则会被检测到传输碰撞,然后两个驱动设备均会等待一个随机很短的周期来再次尝试发送。

3.1、人类类比

以太网技术的一个很好的类比是一组人在一个小的、全黑的房间中进行讨论。在这个类比中,物理网络媒介是空气中的声波,来替代同轴电缆中的电信号。

每个人都能听到其他人说话的声音(载波侦听)。房间中的所有人都有相同的能力进行谈话(多路访问),但是他们都没有长篇大论,因为他们都很有礼貌。如果一个人很无礼,他则会被要求离开房间(比如抛出网络)。

当别人正在说话时,则没人再会说话。如果两个人在同一瞬间开始说话,则两个人都会知道这种状况的发生,因为他们听到了一些他们没有说过的事情(冲突检测)。当两个人意识到这个状态,都会开始等待一段时间,然后其中一个会再次开始谈话。其他人则会等待正在说话的人结束,然后开始自己的发言。

每个人都拥有唯一的名字(唯一的以太网地址)以避免混淆。每个人每次开始谈话时,都会以他要进行谈话的人的名字以及自己的名字(以太网目的地址与源地址)作为谈话消息的开场白。比如,“Hello Jane, this is Jack, ..blah blah blah…"。如果发送者想要对所有人说话则会说 ”everyone“(广播地址),比如,”Hello Everyone, this is Jack, ..blah blah blah…“。

4、ARP

当发出一个 IP 数据包时,目的以太网地址又是如何被识别的呢?

ARP(Address Resolution Protocol) 用于将 IP 地址翻译为以太网地址。这种翻译仅应用于传出的数据包,因为这也就是 IP 头部和以太网头部被创建的时机。

4.1、用于地址翻译的 ARP 表

翻译通过一个表查找过程来执行。该表被称为 ARP 表,被保存在内存中,而每个计算机包含一行。一列用于保存 IP 地址,一列用于保存以太网地址。当把 IP 地址翻译为以太网地址时,会在表中搜索一个匹配的 IP 地址。下面是一个简化的 ARP 表:

NAME

人们约定,在书写 4 字节的 IP 地址时,每个字节按照 10 进制的形式,并且各个字节间使用句号分割。同时约定,在书写 6 进制的以太网地址时,每个字节按照 16 进制的形式,并且每个字节间使用端横杠或冒号分割。

ARP 表是必不可少的,因为 IP 地址及以太网地址在被选择时是各自独立的;你无法使用一个算法来将 IP 地址翻译为以太网地址。IP 地址由网络管理员基于计算机在互联网上的位置进行选择。当计算机被移动到互联网的另一个部分,IP 地址也必须随着改变。而以太网地址则由制造厂商基于该厂商所注册的以太网地址空间进行选择。当以太网硬件接口板改变时,以太网地址随之改变。

4.2、典型翻译场景

在常规的网络应用操作中,比如 TELNET,发送一个应用消息给 TCP,然后 TCP 将对应的 TCP 消息发送给 IP 模块。应用、TCP 模块、IP 模块会知道目的 IP 地址。这时 IP 数据包模块已经被构造并准备好发送给以太网驱动设备,但是首先得识别目的以太网地址。

而 ARP 表则就是为了查找目的以太网地址。

4.3、ARP 请求-响应对

但是 ARP 表首先又是如何被填充的呢?答案是”基于需要“的基础,由 ARP 自动完成填充。

当 ARP 表不能用于转换一个地址时会发生两件事:

  1. 一个带有以太网广播地址的 ARP 请求被发送到网络上的所有计算机;
  2. 需要被传出的 IP 数据包被排队。

所有计算机的以太网接口都会接收到这个广播的以太网帧。每个以太网驱动设备会检查以太网帧中的类型字段并将 ARP 数据包发送给 ARP 模块。ARP 请求数据包中会说”如果你的 IP 地址与这个目标 IP 地址匹配,请告诉我你的以太网地址“。一个 ARP 请求数据包的具体格式会像下面这样:

NAME

每个 ARP 模块会检查对 IP 地址进行检查,以确定目标 IP 地址与自身的 IP 地址是否匹配,然后直接向源以太网地址发送一个响应。ARP 响应中会说”是的,那个目标 IP 地址就是我,让我告诉你我的以太网地址“。一个 ARP 响应数据包中会包含与请求中对调的发送者、目标字段内容。看起来会是这样:

NAME

该响应会被原始的发送者计算机收到。以太网驱动设备会查看以太网帧中的类型字段然后将 ARP 数据包发送给 ARP 模块。ARP 模块检查 ARP 数据包并将发送者的 IP 地址添加到自己的 ARP 表中。

被更新后的 ARP 表看起来会是这样:

NAME

4.4、场景延续

新的翻译现在已经被自动安装到表中,从它被需要到完成仅需要数毫秒。如果你还记得上面的第二步,将要被传出的 IP 数据包目前正在被排队。接着,IP 地址到以太网地址的翻译会通过查找 ARP 表来执行,然后以太网帧被发送到以太网。因此,基于新的 3、4、5 步,发送者计算机的情况应该是这样的:

  1. 一个带有以太网广播地址的 ARP 请求被发送到网络上的所有计算机;
  2. 需要被传出的 IP 数据包被排队;
  3. 用于 ARP 表的、带有 IP 到以太网地址翻译的 ARP 响应返回;
  4. 对于被排队的 IP 数据包,ARP 表会被用于将 IP 地址转换到以太网地址;
  5. 以太网帧被发送到以太网。

总的来说,当基于 ARP 表的翻译无法完成,一个数据包会被排队。翻译数据会基于 ARP 请求、响应快速被填充,然后 IP 数据包被传送出去。

每个计算机的每个以太网接口都有一个单独的 ARP 表。如果目标计算机不存在,则不会有 ARP 响应、ARP 表中也不会存在对应的条目。IP 模块会删除掉需要发送到该地址的 IP 数据包。上层协议也无法识别一个断开的以太网与属于目标 IP 的地址的计算机的缺失之前的区别。

有些 IP 和 ARP 的实现不会在等到 ARP 响应的时候将 IP 数据包排队。取而代之的是 IP 数据包会被删除,对于丢失的 IP 数据包的恢复则会留给 TCP 模块或 UDP 网络应用来完成。恢复通过超时和重发来完成。被重新发送的消息则能够被成功发送出去,因为该消息的第一个副本已经使得 ARP 表被填充。

5、因特网协议

IP 模块是因特网技术的核心,而 IP 的精髓是其路由表。IP 使用这个内存中的表来制定有关 IP 数据包路由的所有决定。IP 路由表的内容有网络管理员定义。

立即路由表示是如何被使用的既是对因特网原理的理解。这些理解对成功的 IP 网络管理及维护是必须的。

想要更好的理解路由表,我们首先要拥有一个对路由概览,然后是学习 IP 网络地址,然后再查看各个细节。

5.1、直接路由

下图是一个包含三台计算机的小型因特网:A、B、C。每个计算机都拥有相同的、最开始的图一中所示的 TCP/IP 协议栈。每个计算机的以太网接口都拥有各自的以太网地址。每台计算机都拥有各自的、由网络管理员设置到 IP 接口的 IP 地址,同时网络管理员还在以太网上设置了 IP 网络编号。

NAME

当 A 向 B 发送一个 IP 数据包时,IP 头部中包含了 A 的 IP 地址来作为 IP 源地址,以太网头部中包含了 A 的以太网地址作为源以太网地址。同时,IP 头部中包含了 B 的 IP 地址作为目的 IP 地址,以太网头部中包含了 B 的以太网地址作为目的以太网地址。

NAME

在这个简单场景中,IP 是算一项开销,因为 IP 为由以太网提供的服务增加了很少的能力,相反,IP 却增加了消耗,需要额外的 CPU 处理、网络带宽用于生成、传输、解析 IP 头部。

当 B 的 IP 模块收到了来自 A 的 IP 数据包,它会对比目的 IP 地址与自身的 IP 地址,如果匹配,则会将数据包传递给上层协议。

这种 A 和 B 之间的通信称为直接路由。

5.2、间接路由

下图展示了一种更加贴近现实的因特网视图。它通过一个称为计算机 D 的 IP 路由器将 3 个以太网和 3 个 IP 网络组合,进而连接在一起。每个 IP 网络都拥有 4 台计算机;每台计算机都拥有各自的 IP 地址和以太网地址。

NAME

除了计算机 D,其他每个计算机都拥有图一中所示的相同的 TCP/IP 协议栈。计算机 D 是 IP 路由器;它被连接到 3 个网络,因此拥有 3 个 IP 地址及 3 个以太网地址。计算机 D 拥有类似图 3 中的 TCP/IP 洗衣栈,除此之外,他拥有 3 个 ARP 模块及 3 个以太网驱动设备,而非图 3 中的两个。但是注意计算机 D 仅有一个 IP 模块。

网络管理员已经为每个以太网设置了一个唯一的序号,称为 IP 网络序号。IP 网络序号并未在图中展示,其中仅展示了网络名。

当 A 发送一个 IP 数据包给 B 时,处理过程与上面的单个网络相同。位于同一个 IP 网络中的任意计算机之间的通信都与前面介绍过的直接路由的例子匹配。

当 D 与 A 通信时是直接通信。当 D 与 E 通信时是直接通信。当 D 与 H 通信时是直接通信。这是因为这些计算机对都处于同于一个 IP 网络。

然而,当计算机 A 与一个处于 IP 路由器源端的计算机通信时,通信则不再是直接的。这种通信被称为”间接“通信。

这种对 IP 数据包的路由由 IP 模块完成,并会透明的出现于 TCP、UDP 及网络应用中。

如果 A 向 E 发送一个 IP 数据包,源 IP 地址、以太网地址则为 A 的相应地址。目的 IP 地址则为 E 的相应地址,但是 A 的 IP 模块会将数据包发送给 D 以进行转发,这是目的以太网地址则为 D 的相应地址。

NAME

D 的 IP 模块接收到 IP 数据包并对目标 IP 地址进行判断,发现并非自己的 IP 地址,然后直接将 IP 数据包发送给 E。

NAME

总的来说,对于直接通信,源 IP 地址、源以太网地址都是发送者的对应地址,目标 IP 地址、以太网地址都是接收者的对应地址。对于间接通信,IP 地址与以太网地址不会像这样结对出现。

该示例因特网也是相当简单的一个。真实的网络通常因为各种因素变得复杂,最终拥有多个 IP 路由器以及多种类型的物理网络。

5.3、IP 模块路由规则

上面的概览已经展示了发生了什么,而不是如何发生的。现在让我们审查一下 IP 模块使用的一些规则、算法。

  • 对于一个传出的 IP 数据包,从上层输入 IP,IP 必须决定是以直接还是间接的方式发送数据包,同时 IP 必须选择一个低层网络接口。这些选择的确定都基于对路由表的查询。
  • 对于一个传入的 IP 数据包,从低层接口输入 IP,IP 必须决定是将 IP 数据包转发还是传递到上层。如果 IP 数据包被转发,则又会被当做是一个传出数据包。
  • 当传入的 IP 数据包抵达时,它永远不会再通过相同的网络接口被转发回去。

这些决定会在 IP 数据包被低层网络接口处理及 ARP 表被商议之前确定。

5.4、IP 地址

网络管理员会根据计算机所附属的 IP 网络将 IP 地址设置到计算机。4 字节 IP 地址的一部分是网络 IP 序号,其他部分是计算机 IP 序号(或主机号)。对于表一种的计算机,其 IP 地址为 223.1.2.1,其网络序号为 223.1.2,主机序号为数字 1。

本教程中所有示例的 IP 地址都是 C 类地址,这意味着前三段为网络序号,最后一段为主机号码。网络地址的最高位是 110,C 类 IP 地址中网络序号的标识长度为 24 位,主机序号的长度为 8 位。因此可以有 2,097,152 个 C 类网络地址,每个网络中可以有 254 个主机。

IP 地址空间由 NIC(Network Information Center) 负责管理。所有连接到唯一一个万维网的因特网必须使用有 NIC 设定的网络序号。如果你在组建自己的因特网且不打算连接到因特网上,你也仍然需要从 NIC 获得网络序号。如果你选择使用自己的序号,一旦你的网络连接到其他网络则会存在出现混乱的风险。

5.5、命名

人们通过名称来引用到计算机,而非序号。一个名为 alpha 的计算机的 IP 地址或许为 223.1.2.1。对于小的网络,这种名称到地址的翻译数据通常会保存在各个计算机的 hosts 文件中。而对于大的网络,这种翻译数据文件被保存在一个服务器,并在需要的时候通过跨越网络来访问。文件中的几行可能看起来会是这样:

223.1.2.1	alpha
223.1.2.2	beta
223.1.2.3	gamma
223.1.2.4	delta
223.1.3.2	epsilon
223.1.4.2	iota

IP 地址作为第一列,计算机名作为第二列。

大多数情况下,你可以在所有计算机上安装完全相同的 hosts 文件。你会注意到 ”delta“ 在文件中仅有一条,尽管他可能拥有 3 个 IP 地址。Delta 可以通过其中任意一个 IP 地址抵达,使用哪一个是无关紧要的。当 delta 接收到一个 IP 数据包时它会查看目标地址,它会认出任意一个它自己的 IP 地址。

IP 网络同样也提供了名称。如果你拥有 3 个 IP 网络,你的用于注释这些名称的 ”networks“ 文件看起来会是这样:

223.1.2		development
223.1.3 	accounting
223.1.4		factory

IP 网络序号是第一列,名称位于第二列。

从本例中你可以看到,alpha 是位于开发网络的计算机编号 1,beta 是位于开发网络的计算机编号 2,等等。同样你也可以说成是:alpha 是 develop.1,beta 是 develop.2,等等。

上面的 hosts 文件对用户来说是足够满足使用的,但是网络管理员可能将 delta 那一行替换为:

223.1.2.4	devnetrouter	delta
223.1.3.1	facnetrouter
223.1.4.1	accnetrouter

hosts 文件中新增加的三行为 delta 的每个 IP 地址提供了更有意义的名称。事实上,第一个 IP 地址拥有两个名字:delta 与 devnetrouter 代表了相同的意义。在实践中,delta 会作为计算机的通用名称,而其他 3 个名称则仅用于对 IP 路由表的管理工作。

这些文件会被网络管理命令或网络应用使用以便提供有意义的名称。这些对因特网上的操作来说并非必要的,但是会使相关工作变得更加简单。

5.6、IP 路由表

IP 又是如何知道在发出一个 IP 数据包时使用哪个底层网络接口呢?IP 模块会从目的 IP 地址中解析出 IP 网络编号,然后作为一个键来搜索路由表。

路由表会为每个路径包含一行。路由表中主要的列包括:IP 网络编号、直接/间接标识、路由器 IP 地址、接口编号。该表会被每个传出的 IP 数据包通过 IP 引用。

在大多数计算机中,路由表可以通过 route 命令来修改。路由表的内容有网络管理员来定义,因为网络管理员为每个计算机设置了对应的 IP 地址。

5.7、直接路由细节

5.8、直接路由场景

5.9、间接路由细节

5.10、间接路由场景

5.11、路由总结

5.12、管理路由

6、用户数据报协议-UDF

6.1、端口

6.1、校验和

7、传输控制协议-TCP

8、网络应用

8.1、TELNET

8.2、FTP

8.3、rsh

8.4、NFS

8.5、SNMP

8.6、X-Window

9、其他信息

10、相关引用