LT-0807,2018.03.11翻译,@成都
声明
本文是一篇关于TCP/IP协议组件的RFC,聚焦于一个IP数据包经过一个路由器从源主机发送到目标主机的具体步骤。本文没有定义任何新的互联网标准。你可以不受限制的发行本RFC(Request for Comments 1180)。
目录
- 01 简介
- 02 TCP/IP概要
- 03 以太网
- 04 ARP
- 05 IP
- 06 UDP
- 07 TCP
- 08 上层应用
- 09 补充信息
- 10 参考文献
- 11 与其他RFC的关系
- 12 安全建议
- 13 联系作者
01 简介
本文阐述了一个TCP/IP最显著的特点,它也是TCP/IP技术的本质。本文忽略了TCP/IP的发展历程、商业案例、未来路线图以及与ISO/OSI参考模型之间的比较,事实上许多的技术细节也被忽略掉了,仅最低限度地保留了在TCP/IP环境中工作的专业人士必须要了解的知识,这些专业人士包括系统管理员、程序员以及网络管理员。
本文使用的样例来自Unix环境,但是TCP/IP是通用的。
注意:本文的目的是解释,而非定义。如果你对文中某个协议的说明有任何的质疑,请查阅相关的RFC并以事实标准为准。
下一节是TCP/IP的概览,接下来再单独对每一个组件进行详细讲解。
02 TCP/IP概要
术语“TCP/IP”常常意味着每一样与TCP、IP技术相关的,甚至不属于TCP、IP范畴的东西。它指的可能是其它一些协议,也有可能是上层应用甚至网络媒介。例如常见的UDP、ARP以及ICMP协议,常见的应用:Telnet、FTP以及RCP。有一个更准确的叫法:“互联网技术(internet technology)”。一个网络如果使用了互联网技术则可以称之为互联网。
02.01 基础结构
想要理解这门技术,你首先要理解下图的逻辑结构。
这就是互联网中一台主机的内部网络协议的层状逻辑结构图。每一台使用互联网技术相连的主机内部都有这样的逻辑结构。也正是这样的逻辑结构决定了主机在互联网上的表现行为。图中的矩形框代表数据经过主机时的处理过程,连接矩形框的线条代表数据通过的路径。最底端的水平线条代表连接网络的物理线缆,符号“o
”代表调制解调器,“*
”代表IP地址,“@
”代表Mac地址。理解这个逻辑结构是理解互联网技术的关键,它也自始至终地贯穿于本文。
02.02 术语
在网络中传输的每个单元的数据叫什么名字取决于它存在于哪一层协议栈。简单的来讲,数据如果在网卡以下可以称之为以太帧,如果在网卡与IP模块之间可以称之为IP包,如果在IP模块与UDP模块之间可以称之为UDP数据报,如果在IP模块与TCP模块之间可以称之为TCP段(通常叫TCP消息),数据如果在上层应用中则称之为应用消息。
这些定义并不完美,事实上在不同的版本中定义是千变万化的。更具体的定义可以参考RFC1122的1.3.3节。
本文中,驱动是指可以直接与网络硬件进行通信的软件,模块是指可以与驱动或应用或其他模块进行通信的软件。
术语“驱动、模块、以太帧、IP包、UDP数据报、TCP消息、应用消息”会根据需要适时使用于本文。
02.03 数据流
让我们化身为数据向着图1所示的各层协议栈穿流而下吧!一个应用如果使用TCP协议(传输控制协议“Transmission Control Protocol”),数据会经过应用与TCP模块;如果使用UDP协议(用户数据报协议“User Datagram Protocol”),则经过应用与UDP模块。FTP(文件传输协议“File Transfer Protocol”)就是一个典型的使用TCP的应用,从上往下它依次用到FTP/TCP/IP/ENET。SNMP(简单网络管理协议“Simple Network Management Protocol”)则是一个常见的使用UDP的应用,从上往下它依次用到SNMP/UDP/IP/ENET。
TCP模块、UDP模块以及以太网卡都是多对一的多路复用器,多路复用器可以把多路输入整合为一路输出;此外它们还是一对多的逆向多路复用器,可以根据协议头的类型字段把一路输入发散为多路输出。
一个以太帧经网卡驱动向上传递的时候,数据可以同时发往ARP和IP,此时以太帧的类型字段的值决定了该数据应该发往ARP还是IP模块。
一个IP包经IP模块向上传递的时候,可以同时发往TCP和UDP,IP包头部的协议字段的值决定了该数据应该发往TCP还是UDP模块。
UDP数据报经UDP模块向上传递的时候,数据发往上层应用则基于UDP数据报头部的端口字段的值;TCP消息经TCP模块向上传递的时候,数据发往上层应用则基于TCP消息头部的端口字段的值。
多路复用向下传输数据的实现非常简单,因为对于任何一个开始的节点,往下走都只有一条路。数据每流经一层都会被添加上该层的协议头,这样目标主机也可以方便的反向解码数据。
不管是TCP还是UDP,数据都会汇聚到IP模块,再往下,发送给底层的网卡驱动。
尽管互联网技术支持诸多的网络媒介,以太网却是IP使用的最广泛、最普及的物理网络,这也是本文采用以太网作为样例的原因。图1的主机只连接到一个网络,在一个以太网中,每个网络接口都有一个唯一的6字节的Mac地址,它位于网卡驱动底部的接口上。
该主机还有一个4字节的IP地址,位于IP模块底部的接口上。在同一个网络中,每一个IP地址都是唯一的。
一台运行中的主机总是清楚的知道自己的IP地址与Mac地址。
02.04 两张网卡
一台主机可以同时连接到两个独立的网络,如图3:
注意,该主机有两个Mac地址和两个IP地址。
从上图的逻辑结构中,我们可以看到:这台主机有两张网卡,而IP模块则变成了多对多的多路复用器/逆向多路复用器。
IP模块自动调节输入数据与输出数据,这样就实现了两个方向上的多路复用。一个IP模块连接多个网络要比我们第一个样例复杂,因为它能够在不同的网络间转发数据。数据可以从任一网络入站,再转发到另一个网络。
IP包从一个网络发往另一个网络的过程叫做转发IP包。一台主机如果专注于转发IP包的工作,可以称之为IP路由器。
我们可以从图5中看到:通过IP路由器转发的IP包是到达不了TCP或者UDP模块的,有些IP路由器甚至压根就没有TCP和UDP模块。
02.05 IP创造了互联网
IP模块是互联网技术取得成功的关键。当数据往下层流转时,每一层的模块/驱动把自己的相关信息添加到数据形成消息头。当数据向上流转发往上层应用时,每一层的模块/驱动则会剥去相应的消息头。IP消息头包含有IP地址,它从众多的物理网络中创建了一个单独的逻辑网络。内部相互连接的物理网络就是名称“互联网(internet)”的由来。限制在一个IP包范围以内的一个连接着的物理网络的集合,就叫做“互联网(internet)”;
02.06 物理网络的独立性
IP向上层应用隐藏了底部的网络硬件设施。如果你发明了一个新的物理网络,只需要新开发一个可以连接到IP的底层驱动,就可以让它运转起来。上层应用原封不动也不会因为硬件的改变而变得脆弱。
02.07 联网
网络中的两台主机可以相互通信,我们就说它“联网”了。互联网技术在主机上得到了很好的实现,我们就说它“可联网”。通常我们的联网需求都得到了很好的满足,因为市场上几乎所有的主机都具备联网能力。如果一台主机无法联网,又无法添加联网组件,它很有可能就卖不掉了。
02.08 概览小结
有了以上的知识,我们还需要回答以下问题:
- 当我们发送一个出站的IP包时,目标主机的Mac地址是如何确定的呢?
- 在发送出站IP包时,底层有多个网络接口,IP是如何确定应该使用哪一个的呢?
- 为什么既有TCP又有UDP,只要一个不行吗?
- 上层应用具备哪些特性才算是可靠应用?
所有这些疑问,在我们学习了以太网之后都会一一解答。
03 以太网
这一节是以太网技术的简介
一个以太帧包含有目标主机Mac地址、源主机Mac地址、类型字段以及数据。
Mac地址有6字节长。每一台网络设备都有自己的Mac地址,并且监听目标地址是自己Mac地址的以太帧。所有的网络设备还监听一个目标地址是“FF-FF-FF-FF-FF-FF”(16进制)的以太帧,这个地址叫做广播地址。
以太网使用的是载波监听多点接入/碰撞检测(CSMA/CD“Carrier Sense and Multiple Access with Collision Detection”)技术。载波监听多点接入/碰撞检测意味着所有的设备都在同一个媒介上通信,因此同一时间只有一个设备能够进行数据发送,而其余的设备此时只能接收数据。如果同一时间两台设备都试图发送数据,那么传输冲突就会被检测到,此时两台设备在尝试再次发送数据之前都会等待随机(短暂的)一段时间。
03.01 把CSMA/CD类比到人
以太网技术的一个很好的类比就是一群人在一个狭小、漆黑的屋子里谈话。在这个类比中,网络媒介由网络线缆中传输的电信号变成为了空气中传播的声音。
屋子里每一个人都能听到其他人说的话(载波监听“Carrier Sense”);每一个人都有相同的说话能力(多点接入“Multiple Access”),但是他们都不会发表冗长的、啰嗦的演讲,因为他们都特别有礼貌;要是谁没有礼貌,他就会被请出这间屋子(关闭设备)。
其他人在说话的时候,没有人会插嘴。但是同一时间如果有两个人都开口说话,这两人都是能够觉察到的,因为他们听到了不是自己说的话(碰撞检测“Collision Detection”)。当这两人意识到这个情况后,他们就会停下来等待一段时间,然后其中一人会再说,另一个人听到谈话后他会等待其把话说完再开始自己的讲话。
屋子中,每一个人都有一个唯一的名字(Mac地址唯一)以避免给大家带来困扰。每一次谈话,发言人都会给自己的谈话内容加上前言:我是谁,这话是对谁讲的(源主机Mac地址、目标主机Mac地址),即:“你好Jane,我是Jack,吧啦吧啦……”。如果发言人想对所有人谈话,他就会说“大家好(广播地址)!我是Jack,吧啦吧啦……”。
04 ARP
当发送一个出站IP包的时候,它是如何确定目标主机的Mac地址的呢?
地址解析协议“ARP (Address Resolution Protocol)”负责把IP地址翻译成为Mac地址。只有IP包出站的时候需要进行IP地址-->Mac地址的翻译,此时也是构建IP头和以太帧头的时候。
04.01 ARP翻译表
翻译其实就是一个表的查询操作。该表的表名叫ARP表,它存在于每台主机的内存中。表中有一个列存有IP地址,还有一个列存有Mac地址,把一个IP地址翻译成为Mac地址,实质就是在表中检索目标IP地址,取其对应的Mac地址。下面是一张简化的ARP表:
第一列按照人们的习惯,用十进制数字表示4字节的IP地址,中间用句点分隔;第二列Mac地址,6字节,十六进制表示,中间用减号或冒号分隔。
ARP表必须要有。因为IP地址和Mac地址是两个独立的存在,你无法通过一个算法或者公式把IP地址翻译成为Mac地址。IP地址是网络管理员根据主机在网络中的位置指派的,当主机在网络中的位置发生变化,IP地址随之改变。Mac地址是网络硬件制造商根据以太网地址空间使用许可来确定的,Mac地址随硬件接口的改变而改变。
04.02 典型的ARP翻译场景
网络上一个普通的主机间通信,比如Telnet远程主机:Telnet消息传递到TCP,TCP传递相应的TCP消息到IP。在这个过程中,Telnet、TCP、IP都是知道目标主机IP地址的。这个节点上,IP包已经构造完毕并且准备发往下一层(网卡驱动),但是首先,必须把目标主机的Mac地址确定下来。
ARP表就是被用作查找与目标主机IP地址相匹配的Mac地址的。
04.03 ARP请求/响应对
那么最开始的时候ARP表中的数据又是从哪里来的呢?答案就是ARP模块根据需要自动插入的。
当ARP表无法翻译一个IP地址时,会发生两件事情:
- 一个ARP的请求包会通过广播地址发给网络上的所有主机;
- 出站的IP包进入暂存队列。
其他主机收到广播帧以后,检查其类型字段并发往ARP模块。ARP请求包含有提问“你的IP地址与我目标主机的IP地址相同吗?如果相同请告诉我你的Mac地址”。ARP请求包看起来就像这样:
各主机的ARP模块检查自己的IP地址是否与ARP请求包中的目标地址相同,如果相同,它便会做出响应“是的,我就是你要找的。请记录我的Mac地址”。ARP响应包与ARP请求包有相似的结构,只是发送主机和目标主机的位置对调了:
发送广播的主机收到响应以后,检查其类型字段并发往ARP模块。ARP模块根据ARP响应包中的内容添加一条记录到ARP表当中。
更新后的ARP看起来就像这样:
04.04 尾声
毫秒之间ARP请求/响应对就完成了ARP表中新的IP地址到Mac地址映射关系的自动插入。刚才第二步我们提到,出站的IP包进入了暂存队列。接下来,通过查询ARP表便实现了从IP地址到Mac地址的翻译,最后以太帧发至网卡。因此,一个新的翻译,还有步骤3、4、5,对发送主机而言:
- 一个ARP请求包通过广播地址发给网络上的每台主机;
- 出站IP包进入暂存队列;
- ARP响应包返回,发送主机更新ARP表;
- 完成暂存队列中IP包的翻译;
- 以太帧发至网卡。
简而言之,当ARP不能完成一个翻译时,让IP包进入暂存队列,通过ARP请求/响应迅速实现ARP表更新,最后完成队列中待发送IP包的翻译。
每一台主机的每张网卡都有独立的ARP表。如果目标主机不存在,便不会有ARP响应返回,因此发送ARP请求的主机不会更新ARP表。这时IP就会忽略掉这个出站的IP包。上层协议是区分不了一张坏掉的网卡和一台不存在的主机之间的差别的。
有些IP和ARP不会在等待ARP响应的时候暂存待发送的IP包,而是采用忽略/恢复策略:忽略IP包,TCP模块或者采用UDP协议的上层应用意识到有丢包,重发该IP包。这个策略是通过超时与重发来实现的。重发的数据总会发送成功,因为第一次的出站消息已经触发广播,ARP请求/响应会完成ARP表更新。
05 IP(Internet Protocol)
IP模块是互联网技术的核心,而IP模块的核心是IP路由表,IP模块就是使用这张运行在内存中的表来确定IP包的去向应该经由哪条路线。IP路由表的内容是网络管理员设置的,如果设置不当会阻塞网络通信。
理解路由表的使用实质就是理解互联网是如何工作的,想要很好地管理和维护网络,就必须强化对它的理解。
学习路由表,我们分三步走:先看路由概要,再学习IP地址,最后研究其中的细节。
05.01 直接路由
下图展示了一个简单的互联网:有3台主机(A、B、C),使用了图1中的TCP/IP协议栈。每台主机的网卡都有自己的Mac地址,网络管理员还为每台主机指派了相应的IP地址和网络号。
当主机A发送一个IP包到主机B时,IP包头含有源主机的Mac地址、IP地址(A的Mac地址和IP地址)以及目标主机的Mac地址、IP地址(B的Mac地址和IP地址)。
在这个样例中,IP包的组装过程属于常规开销:它本身对以太网服务没有什么帮助,但是生成、传输和解析报文头却增加了CPU和网络宽带的开销。
当B主机的IP模块收到来自A的IP包,它会检查目标IP地址是否跟自己的匹配,如果是,便向上一层协议栈传递该数据。
这就是A、B两台主机直连的路由过程。
05.02 非直接路由
下图更加贴近实际的互联网:它有3个以太网和3个互联网并通过名为D的IP路由器相连。每个互联网中都包含有4台主机,每台主机都有自己的IP地址和Mac地址。
除了D以外,每台主机都使用了图1中的TCP/IP协议栈。D是一台IP路由器,它有3个IP地址、3个Mac地址、同时连接到了3个网络,它使用了图3中的协议栈,只不过它有3张网卡和3个ARP模块。注意:D只有一个IP模块。
网络管理员已经为每一个网络定义了网络号:一个唯一的数字。上图只展示了网络名称没有展示网络号。
当主机A发送一个IP包给主机B时,路由过程跟之前的直接路由完全是一样的。任何一个单独的网络上的主机间通信都跟之前讨论的直接路由样例相同。
主机D与A、D与E、D与H都是直接通信,因为他们每一组主机(DA、DE、DH)都在一个网络上。
但是当主机A需要与IP路由器D另一端的主机通信时,就无法直接通信了。A必须通过D来转发,IP包才能到达另一个网络。这样的通信过程就叫做非直接路由。
IP包的路由选择是由IP模块完成的,这个操作对TCP、UDP以及上层应用是透明的。
当主机A发送一个IP包给主机E时,源主机的IP地址、Mac地址就是A的IP地址和Mac地址,目标主机IP地址是E的IP地址,但是由于需要通过D来转发,此时目标主机的Mac地址是D的Mac地址。
D的IP模块收到这个IP包以后,检查其目标主机IP地址,发现不是发给自己的,于是直接转发给了E。
简单的说,直接通信中源主机IP地址、Mac地址就是发送者的IP地址和Mac地址,目标主机的IP地址和Mac地址就是接收者的IP地址和Mac地址。非直接通信就不完全是这样的了。
这个样例非常简单,现实生活中的网络要复杂得多:N个IP路由器,各种类型的物理网络……这个样例中的网络划分适用于把一个大的网络切割为几个小的网络以避免全网广播。
05.03 路由规则
前一节已经揭示了路由的大体过程,接下来我们继续研究IP模块用到的规则或算法。
- 对于一个出站的IP包,当数据从上层协议到达以后,IP模块必须判断它是直发还是非直发才能进一步确定应该走哪一个底层网络。这一系列操作是通过查询路由表来实现的。
- 对于一个从底层网络来的入站IP包,IP模块则须判断它是转发还是向上层协议传递。如果是转发,就视它为一个出站的IP包。
- 一个入站的IP包到达以后,它就不会再发回它原来的网络了。
这些操作在IP包往下一层协议传递和查询ARP表之前就必须完成。
05.04 IP地址
网络管理员根据主机所在的网络指派其IP地址。4字节的IP地址由网络位和地址位构成。例如表1中,主机IP地址是223.1.2.1
,其中网络位是223.1.2
,主机地址位是1
。
4字节的IP地址中,哪些用作网络位,哪些用作地址位是由高位地址(第一字节的前几位)来确定的。本文样例中IP地址都是C类地址,C类地址第一字节的前三位一定是110,接下来的21位是网络位,最末8位是主机地址位。C类地址可以至多含有2,097,152个网络,每个网络中至多可以有254台主机。
IP地址是由NIC(网络信息中心“Network Information Center”)来管理的。所有接入因特网的互联网都必须使用NIC指派的网络号。如果你组建了一个自己的互联网,即便不打算接入因特网,你还是应该从NIC中获取自己的网络号。因为如果你随意指定网络号,万一某天你的网络要与其他网络相连,就会有混乱和干扰的风险。
05.05 主机名与网络名
人们常常通过名称而非号码来区分主机。假设一台名为alpha的主机,IP地址是223.1.2.1。在小型网络中,各主机上的host文件保存了主机名称与主机地址间的映射关系。在大型网络中有专门的文件存储在特定的服务器上方便客户机随时调用。摘录几行这个文件的数据如下:
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地址为第一列,主机名称为第二列。
正常情况下,同一个网络中的所有主机都可以使用同一个host文件。你可能注意到了,为何主机delta有3个IP地址却只有一条记录?因为delta可以通过3个地址中的任意一个来访问。当delta收到一个IP包时,它会用它的每一个IP地址与IP包的目标地址进行匹配。
网络也是有名字的。如果你有3个网络,那么保存网络名字的networks文件看起来就像这样:
223.1.2 development
223.1.3 accounting
223.1.4 factory
网络号为第一列,网络名称为第二列。
从上面可以看出,alpha是development网络上的1号主机,beta是development网络上的2号主机,因此你还可以称之为:development.1
、development.2
。
对于普通用户而言,前面的host文件已经够用了。但是对于网络管理员,delta那一行可能会被替换为三行:
223.1.2.4 devnetrouter delta
223.1.3.1 facnetrouter
223.1.4.1 accnetrouter
host文件中的三行新记录,为delta的每一个IP地址都添加了一个直观的名字。事实上,第一个IP地址有两个名字(devnetrouter
、delta
),这两个名字指同一台主机。按照惯例,delta是针对普通用户的主机名,另外3个名字是给管理员维护路由表用的。
这些文件被网络命令和上层应用用到,可以返回直观的网络名/主机名,不用过多的操作网络,但极大的方便了人们的工作。
05.06 IP路由表
在发送一个出站IP包的时候,IP是如何确定应该走哪一个底层网络的呢?IP模块会从IP包中获取目标主机IP地址,并以此为关键字在路由表中检索相应的网络号。
每一条路由在路由表中都存有一条记录。路由表的前几列分别是:网络号,直发标记,路由器IP地址,网络接口号。IP模块使用此表来确定每一个出站IP包的去向。
大部分主机上的路由表都可以使用route
命令进行修改。路由表的内容由网络管理员维护,因为网络管理员负责指派主机的IP地址。
05.07 直接路由的细节
为了解释路由过程具体是怎样的,以前面讲的直接路由为例,我们再来详细探讨一下其中的细节。
alpha内部的路由表看起来就像这样:
在Unix操作系统中,可以使用命令netstat -r
查询这张视图。样例中这样简单的网络,所有的主机都使用相同的路由表。
为了便于讨论,我们把视图中的网络名称替换为网络号:
05.08 直接路由场景
当alpha发送一个IP包到beta时,IP包在alpha的IP模块,目标地址是beta或者223.1.2.2。IP模块从目标地址网络位中取出网络号,并在路由表的第一列中检索这个网络,再返回第一条匹配的记录。
另外,我们还可以从这条记录中得知:这个网络中的主机都可以通过网卡1直接通信。alpha查询ARP表得到beta的Mac地址,这样以太帧就通过网卡1直接发往了beta主机。
如果一个上层应用发送数据的目标地址不在development
网络上,在路由表中找不到能够匹配的记录,那么IP会忽略掉这个IP包。有些主机会返回“目标主机不可达”的错误信息。
05.09 非直接路由的细节
现在,我们再近距离地观察一下之前提到的更复杂的非直接路由过程。
alpha内部的路由表看起来就像这样:
为了方便讨论,我们还是把网络名称替换为网络号:
alpha的路由表中路由器指向了delta连接“development”网络的IP地址。
05.10 非直接路由场景
当alpha发送一个IP包到epsilon时。IP包在alpha的IP模块,目标地址是223.1.3.2。IP从目标地址网络位中取出网络号(223.1.3),并在路由表的第一列检索这个网络,表中第二条记录匹配上了,故返回此条记录。
这条记录表明,网络223.1.3上的主机都可以通过路由器devnetrouter访问。故alpha的IP模块查询ARP表得到路由器devnetrouter的Mac地址,IP包便通过网卡1直接发往devnetrouter,此时IP包中目标主机的IP地址仍然是epsilon的IP。
IP包穿过delta的development网络接口后,向上传递给delta的IP模块。检查其目标IP地址,由于不能跟自己的任意一个IP匹配上,delta便会转发该IP包。
delta的IP模块从目标地址网络位中取出网络号,在路由表中检索这个网络。delta的路由表看起来就像这样:
同样把网络名替换为网络号:
表中第二条记录匹配上了,返回。delta的IP模块便通过网卡3直接发送IP包至epsilon。此时IP包目标主机IP地址与Mac地址都是epsilon。
IP包到达epsilon以后向上传递,IP模块进行目标IP地址检查,发现正好匹配上自己的地址,便再传递给上层协议。
05.11 小结
当一个IP包穿过一个大型网络,到达目标主机之前,它可能会经过许多的路由器。路径的选择不是由某个中央服务器来决定的,而是不断的查询途经的各个路由器的路由表。每一台路由器都只决定下一个跃点的位置,并且依赖下一个跃点按照同样的方式来发送IP包。
05.12 管理网络
在大型网络中,保证每一台主机的路由表都正确是一项艰巨的任务,由于需求不断的变化,网络管理员可能会不停的修改网络配置。路由表出错就会阻塞网络通信,而排错又极其的痛苦、乏味。
所以保持一个简单的网络配置对构建一个可靠的网络是大有裨益的。例如,给以太网分配网络号最直观的方法就是给每一个以太网单独分配一个网络号。
某些协议或应用的帮助信息也是非常有用的。ICMP(“Internet控制报文协议”Internet Control Message Protocol)就会反馈某些路由问题。在小型网络中,各主机上的路由表是由网络管理员手动添加的;在大型网络中这个手工操作,可以使用路由协议自动分发路由信息到整个网络。
当一台主机从一个网络迁移到另一个网络时,其IP地址必须重新分配;当一台主机从一个网络上撤走时,它的IP地址也必然不可用了。这些变化需要频繁的更新host文件,即便是在中等规模的网络中,维护这个文件也是很困难的。DNS便应运而生了。
06 UDP(用户数据报协议“User Datagram Protocol”)
UDP是IP协议栈上层的两个主要协议之一。它直接为上层应用提供服务。常见使用UDP的应用有:网络文件系统(NFS “Network File System”),简单网络管理协议(SNMP “Simple Network Management Protocol”)。UDP可以看作IP的一个接口。
UDP属于无连接协议,因此它无法保证数据报一定能发送成功。相互通信的主机其UDP模块并不会建立端到端的连接,它只负责推送出站的数据报和接收入站的数据报。
UDP为IP添加了两个新的特性:一是不同的应用使用不同的端口,实现了信道充分利用;二是使用校验码实现了数据的完整性校验。
06.01 端口
数据是怎么从客户端到达服务器的呢?
应用与UDP模块间的通信是通过端口建立起来的。端口是从〇开始的一个有限整数(0 ~ 65535)。一个应用要对外提供服务,它便会监听一个指定的端口,它会在该端口耐心的等待客户端发起请求。
例如,SNMP服务器,又叫SNMP代理。它的监听端口是161。一台主机上只可能有一个SNMP代理,因为一台主机只有一个161端口。161是一个保留端口,一个在互联网内部已指定用途的端口,这是众所周知的。当一个SNMP客户端想要连接服务器时,它便会把请求发往SNMP代理的161号端口。
远端主机收到应用通过UDP发送的数据都是一个个独立的数据包。例如,一个应用通过UDP发送了5个数据包,那么远端主机上的应用也要从UDP中接收5个数据包。发送方与接收方的每个数据包大小完全是一样的。
UDP会保存应用定义的消息边界。UDP不会把两个不同应用的消息合并为一个数据包,也不会把一个应用的消息拆分为几个。
06.02 校验码
一个入站的IP包,IP头的类型字段会指明它采用了哪种协议,如果是UDP,IP便会把它传递给UDP模块。当UDP模块收到来自IP的数据报以后,它会检查其校验码。如果校验码为〇,意味着这个校验码不是发送者的计算结果,这个数据报可以忽略掉。发送主机的UDP模块可以开启或关闭生成校验码。如果一个网络上只有两台主机通过UDP通信,这时你可以不用校验数据,但还是建议你总是启用校验,因为谁也不知道何时路由表会改变,网络会变得不可靠。
如果校验码是有效的,UDP会检查是否有应用绑定在目标端口上。如果有,一个应用消息便进入队列等待应用读取,否则忽略这个数据报。如果UDP数据报的入站速度超过了应用读取消息的速度、队列中待读取的消息也达到了最大值,那么直到队列中有空间为止,后来的UDP数据报都会被忽略掉。
07 TCP(传输控制协议“Transmission Control Protocol”)
TCP提供了与UDP完全不同的另一种服务。TCP是面向连接的,字节流的,保证交付(可靠)的一种协议。
对可靠性要求较高(不能有超时或重发)的应用常选用TCP协议。最常见的两个使用TCP的应用是FTP(文件传输协议“File Transfer Protocol”)和Telnet。还有不少受欢迎的应用诸如X-Window图形化界面(X-Window System),rcp (remote copy)以及r家族命令(r-series commands)也是采用TCP。TCP的高可靠性也是有代价的:它需要更多的CPU开销和更大的网络带宽。TCP的内部构造要比UDP复杂得多。
跟UDP一样,TCP也通过端口与应用通信。不同的应用对应不同的端口,例如:Telnet服务对应的端口是23。Telnet客户端通过TCP协议连接指定主机的23号端口可以轻松地访问服务器。
当应用第一次使用TCP发消息时,客户端与服务器端的TCP模块便开始建立通信了。这一对端到端的TCP模块通过定义虚拟电路来维持连接状态。这个虚拟电路会同时给两台主机带来开销。虚拟电路采用全双工模式工作,即数据可以在两个方向上同时进行传输操作。本地应用往端口中写入数据,数据穿过网络被远端应用读取。
TCP对字节流的封包是任意的,它不会记录两次写操作间的边界。例如:一个应用在指定的TCP端口执行了5次写操作,远端应用有可能需要10次读操作才能取完所有数据,也有可能只用1次读操作就把所有数据取完了。两端的读操作与写操作的次数、大小都没有直接联系。
TCP使用滑动窗口机制,自带超时与重发功能。远端主机TCP必须发送回执确认收到的出站数据。回执由传输数据捎带过来。两端都能控制对端的数据流量,这样可以防止缓冲区溢出。
跟所有采用滑动窗口机制的协议一样,TCP也有窗口大小。窗口大小决定了在要求一次确认回执之前可以传输多少数据。对TCP而言,窗口数据的大小不是以TCP消息为单位,而是以字节为单位。
08 上层应用
为什么既有TCP又有UDP,只要一个不行吗?
答案是它们各自满足了不同的需求。许多上层应用都只采用了TCP/UDP中的一种协议。在编程的时候你也只需要选取一种能满足自己需求的协议就行了。如果你需要可靠的数据流服务,TCP是最好的选择;如果需要数据报服务,UDP是最好的选择;如果需要建立长连接,TCP是最好的选择;如果需要低延迟传输数据,UDP是最好的选择。如果你的需求不在以上范围以内,那该选哪种协议还真不好说。但是应用可以通过优化编程来弥补协议上的不足。例如,你的应用采用UDP协议,又想拥有高可靠性,那么在编程的时候就应该足够健壮;如果你选择了TCP协议,又想要优化写速度,那么在传输数据时就应往比特流中插入标记以拆分数据。
什么样的应用才算是可靠应用呢?
可靠的应用有太多的特点了,而且这些特点还在不断的增长中。
有些应用在创世纪之初就已经存在了:TELNET、FTP;还有一些是后来诞生的:X-Window、SNMP。下面简单地介绍一下文中提到的那些应用。
08.01 TELNET
TELNET通过TCP实现了远程登录。TELNET操作有点像通过电话交换系统进行键盘拨号。用户在命令行中输入“TELNET delta”时会收到主机delta的一个登录提示符。
TELNET虽然古老,但尚未被淘汰,今天它也仍然广泛存在于各种网络中。使用TELNET的场合往往是跨平台的登录,例如,TELNET客户端可能在VAX/VMS上,而TELNET服务端却在UNIX System V上。
08.02 FTP
文件传输协议(FTP“File Transfer Protocol”),跟Telnet一样古老,也是采用TCP协议,也还广泛地活跃在各种网络中。FTP有点像Telnet到远程主机之后执行的操作,只不过不是敲入常用的命令,而必须使用如显示目录(DIR/LS
)之类的FTP的一系列简短的命令。FTP方便我们在不同的主机间传输文件。
08.03 rsh
远程shell(rsh
或 remsh
)是Unix下r家族命令中的一员。Unix下的复制命令cp
演化为rcp
,登录查询命令who
演化为rwho
。r家族命令又叫r系列
命令或r*
命令,该家族命令还在不断的增长中。
r家族命令主要工作在Unix环境,设计的初衷是方便受信任的主机间通信。它对安全因素考虑较少,但是对用户非常友好。
想在远程主机delta执行命令cc file.c
,只需要输入rsh delta cc file.c
;想复制文件file.c
到主机delta,只需要输入rcp file.c delta:
;想登陆到delta,只需要输入rlogin delta
。如果你配置得当,使用这些命令甚至无需输入密码。
08.04 NFS
网络文件系统(NFS“Network File System”),最初由Sun公司开发,使用UDP协议,在多个主机挂载Unix文件系统上有着极好的性能。无硬盘工作站可以通过NFS连接到服务器分配给自己的硬盘上。主机alpha上数据库的一个单独的备份硬盘,可以供主机beta使用,如果beta的数据库文件系统采用的是NFS的话。
NFS会占用海量的网络带宽,在低网速环境中性能也很低,好在它带来的裨益也不少。NFS客户端已经集成到了操作系统核心当中,允许上层应用或者命令像挂载本地磁盘一样调用NFS挂载硬盘。
08.05 SNMP
简单网络管理协议(SNMP)使用UDP,主要用作核心网络设备的管理。它被人们所熟知的特点就是只要有足够的信息,网络管理员就能够诊断网络故障。核心交换机/路由器通过SNMP从网络上的其他主机收集该信息。SNMP仅定义数据格式,数据内容由核心网络设备或者网络管理员定义。
08.06 X-Window
图形化界面使用基于TCP的X-Window协议。X-Window不仅仅是一个图形化界面的组件,它还有一套完整的用户接口设计理念。
09 补充信息
互联网技术的许多内容在本文中都没有提到,对于那些想要了解更多知识的读者,下面的清单列出了下一阶段需要学习的内容:
- 管理命令:arp, route, netstat
- ARP:permanent entry, publish entry, time-out entry, ARP欺骗(spoofing)
- IP路由表:host entry, 默认网关(default gateway), 子网(subnets)
- IP:TTL(time-to-live counter), IP段(fragmentation), ICMP
- RIP,路由环路(routing loops)
- 域名系统(Domain Name System)
10 参考文献
- [1] Comer, D., "Internetworking with TCP/IP Principles, Protocols,
and Architecture", Prentice Hall, Englewood Cliffs, New Jersey,
U.S.A., 1988. - [2] Feinler, E., et al, DDN Protocol Handbook, Volume 2 and 3, DDN
Network Information Center, SRI International, 333 Ravenswood
Avenue, Room EJ291, Menlow Park, California, U.S.A., 1985. - [3] Spider Systems, Ltd., "Packets and Protocols", Spider Systems
Ltd., Stanwell Street, Edinburgh, U.K. EH6 5NG, 1990.
11 与其他RFC的关系
本文并未更新或者淘汰任何其他的RFC!
12 安全建议
这里有一些关于TCP/IP协议组件的安全建议,对某些用户而言至关重要;对其他用户而言可能无关紧要,这完全取决于用户的需求。
本文并未对这些问题展开讨论,如果你想了解更多的知识,建议从ARP欺骗开始,再到RFC1122-“安全建议”对各章节进行系统学习。
13 联系作者
Theodore John Socolofsky
Spider Systems Limited
Spider Park
Stanwell Street
Edinburgh EH6 5NG
United Kingdom
Phone:
- from UK 031-554-9424
- from USA 011-44-31-554-9424
Fax:
- from UK 031-554-0649
- from USA 011-44-31-554-0649
EMail: [email protected]
Claudia Jeanne Kale
12 Gosford Place
Edinburgh EH6 4BJ
United Kingdom
Phone:
- from UK 031-554-7432
- from USA 011-44-31-554-7432
EMail: [email protected]