一分钟一幅图搞定TCP/IP,移动一分钟移动通话多少钱一分钟

&nbsp>&nbsp
&nbsp>&nbsp
linux教程 &nbsp>&nbsp
TCP/IP协议三次握手与四次握手流程解析
摘要:转载自:http://www.2cto.com/net/896.htmlTCP/IP协议三次握手与四次握手流程解析&一、TCP报文格式&TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图:图1TCP报文格式&上图中有几个字段需要重点介绍下:&(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。&(2)确认序号:Ack序号
转载自:http://www.2cto.com/net/896.html
TCP/IP协议三次握手与四次握手流程解析
&一、TCP报文格式
& TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图:
图1 TCP报文格式
& 上图中有几个字段需要重点介绍下:
& (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
& (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
& (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
& (A)URG:紧急指针(urgent pointer)有效。
& (B)ACK:确认序号有效。
& (C)PSH:接收方应该尽快将这个报文交给应用层。
& (D)RST:重置连接。
& (E)SYN:发起一个新连接。
& (F)FIN:释放一个连接。
&需要注意的是:
& (A)不要将确认序号Ack与标志位中的ACK搞混了。
& (B)确认方Ack=发起方Req+1,两端配对。&
二、三次握手
& 所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
图2 TCP三次握手
& (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
& (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
& (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
& SYN攻击:
& 在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
& #netstat -nap | grep SYN_RECV
三、四次挥手
&三次握手耳熟能详,四次挥手估计就
,所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:
图3 TCP四次挥手
& 由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
&(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
& (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
&(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
& (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
& 上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
图4 同时挥手
& 流程和状态在上图中已经很明了了,在此不再赘述,可以参考前面的四次挥手解析步骤。
& 关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:
& (1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
& (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
& 这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
TCP/IP协议三次握手与四次握手流程解析相关信息,包括
的信息,所有TCP/IP协议三次握手与四次握手流程解析相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
服务与支持
账号与支持
关注阿里云
International移动和联通打电话到底多少钱一分钟啊?【靖宇吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:67,616贴子:
移动和联通打电话到底多少钱一分钟啊?收藏
现在都搞不清楚,有朋友说他的电话是8分钱,我的记得我的是1.5毛,差这么多为啥呢?有懂的吗?用了好多年了也不知道个价。。。我的电话段:移动1384397xxxx
1359675xxxx
联通 1550020xxxx
看什么资费,什么套餐,
有的卡就是1.5毛!!早就换号了。1.5我用3g卡,业务太多了没办法
1550020联通1.5全国无漫游
老号都贵........././././..././././././.
看什么资费,什么套餐,在本地打或本省打,在或或或外省打等等吧
登录百度帐号推荐应用TCP/IP 详解 1 概述 1.1 引言 很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但 TCP/IP 协 议组件允许它们互相进行通信。 这一点很让人感到吃惊, 因为它的作用已远远超出了起初的 设想。TCP/IP 起源于 60 年代末美国政府资助的一个分组交换网络研究项目,到现在 90 年 代已发展成为计算机之间最常应用的组网形式。 它是一个真正的开放系统, 因为协议组件的 定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。 它成为被称作 “全球互联 网”或“因特网”(Internet)的基础,该广域网(WAN)已包含超过 100 万台遍布世界各地 的计算机。 本章主要对 TCP/IP 协议组件进行概述, 其目的是为本书其余章节提供充分的背景知识。 如果读者要从历史的角度了解有关 TCP/IP 的早期发展情况,请参考文献[Lynch 1993]。 1.2 分层 网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议组件, 比如 TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP 通常被认为是一个四层协议系 统,如图 1.1 所示。 图 1.1 TCP/IP 协议组件的四个层次 每一层负责不同的功能: 1. 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程 序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口 细节。 2. 网络层,有时也称作互连网层,处理分组在网络中的活动,例如分组的路由选择。 在 TCP/IP 协议组件中,网络层协议包括 IP 协议(网际协议) ,ICMP 协议(Internet 互连网 控制报文协议) ,以及 IGMP 协议(Internet 组管理协议) 。 3. 运输层主要为两台主机上的应用程序提供端到端的通信。在 TCP/IP 协议组件中,有 两个互不相同的传输协议:TCP(传输控制协议)和 UDP(用户数据报协议) 。 TCP 为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数 据分成合适的小块交给下面的网络层, 确认接收到的分组, 设置发送最后确认分组的超时时 钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。 而另一方面,UDP 则为应用层提供一种非常简单的服务。它只是把称作数据报的分组 从一台主机发送到另一台主机, 但并不保证该数据报能到达另一端。 任何必需的可靠性必须 由应用层来提供。 这两种运输层协议分别在不同的应用程序中有不同的用途,这一点我们将在后面看到。 4. 应用层负责处理特定的应用程序细节。几乎各种不同的 TCP/IP 实现都会提供下面这 些通用的应用程序: ?Telnet 远程登录 ?FTP 文件传输协议 ?SMTP 用于电子邮件的简单邮件传输协议 ?SNMP 简单网络管理协议 另外还有许多其他应用,我们在后面章节中将介绍其中的一部分。 假设我们在一个局域网(LAN)如以太网中有两台主机,二者都运行 FTP 协议,图 1.2 列出了该过程所涉及到的所有协议。 图 1.2 局域网上运行 FTP 的两台主机 这里,我们列举了一个 FTP 客户程序和另一个 FTP 服务器程序。大多数的网络应用程 序都被设计成客户-服务器模式。 服务器为客户提供某种服务, 在本例中就是访问服务器所 在主机上的文件。 在远程登录应用程序 Telnet 中, 为客户提供的服务是登录到服务器主机上。 在同一层上,双方都有对应的一个或多个协议进行通信。例如,某个协议允许 TCP 层 进行通信,而另一个协议则允许两个 IP 层进行通信。 在图 1.2 的右边,我们注意到应用程序通常是一个用户进程,而下三层则一般在(操作 系统)内核中执行。尽管这不是必需的,但通常都是这样处理的,例如 UNIX 操作系统。 在图 1.2 中,顶层与下三层之间还有另一个关键的不同之处。应用层关心的是应用程序 的细节,而不是数据在网络中的传输活动。下三层对应用程序一无所知,但它们要处理所有 的通信细节。 我们在图 1.2 中例举了四种不同层次上的协议。FTP 是一种应用层协议,TCP 是一种运 输层协议,IP 是一种网络层协议,而以太网协议则应用于链路层上。TCP/IP 协议组件是一 组不同的协议组合在一起构成的协议族。尽管通常称该协议组件为 TCP/IP,但 TCP 和 IP 只是其中的两种协议而已。 (该协议组件的另一个名字是 Internet 协议族(Internet Protocol Suite)。 网络接口层和应用层的目的是很显然的DD前者处理有关通信媒介的细节 (以太网, 令 牌环网等) ,而后者处理某个特定的用户应用程序(FTP,Telnet 等) 。但是,从表面上看, 网络层和运输层之间的区别不那么明显。 为什么要把它们划分成两个不同的层次呢?为了理 解这一点,我们必须把视野从单个网络扩展到一组网络。 在 80 年代, 网络不断增长的原因之一是大家都意识到只有一台孤立的计算机构成的 “孤 岛”没有太大意义,于是就把这些孤立的系统组在一起形成网络。随着这样的发展,到了 90 年代,我们又逐渐认识到这种由单个网络构成的新的更大的“岛屿”同样没有太大的意 义。于是,人们又把多个网络连在一起形成一个网络的网络,或称作互连网(internet)。一个 互连网就是一组通过相同协议族互连在一起的网络。 构造互连网最简单的方法是把两个或多个网络通过路由器进行连接。 它是一种特殊的用 于网络互连的硬件盒。 路由器的好处是为不同类型的物理网络提供连接: 以太网, 令牌环网, 点对点的链接,FDDI(光纤分布式数据接口)等等。 (下面是原书 p.4①的译文) 这些盒子也称作 IP 路由器(IP Routers) ,但我们这里使用路由器(Router)这个术语。 从历史上说,这些盒子称作网关(gateways) ,在很多 TCP/IP 文献中都使用这个术语。现在 网关这个术语只用来表示应用层网关:一个连接两种不同协议组件的进程(例如,TCP/IP 和 IBM 的 SNA) ,它为某个特定的应用程序服务(常常是电子邮件或文件传输) 。 图 1.3 是一个包含两个网络的互连网:一个以太网和一个令牌环网,通过一个路由器互 相连接。 尽管这里是两台主机通过路由器进行通信, 实际上以太网中的任何主机都可以与令 牌环网中的任何主机进行通信。 在图 1.3 中,我们可以划分出端系统(end system) (两边的两台主机)和中间系统 (intermediate system) (中间的路由器) 。应用层和运输层使用端到端(end-to-end)协议。 在我们的图中,只有端系统需要这两层协议。但是,网络层提供的却是逐跳(hop-by-hop) 协议,两个端系统和每个中间系统都要使用它。 图 1.3 通过路由器连接的两个网络 在 TCP/IP 协议组件中,网络层 IP 提供的是一种不可靠的服务。也就是说,它只是尽可 能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。而另一方面,TCP 在不可靠的 IP 层上提供了一个可靠的运输层。为了提供这种可靠的服务,TCP 采用了超时 重传,发送和接收端到端的确认分组等机制。由此可见,运输层和网络层分别负责不同的功 能。 从定义上看, 一个路由器具有两个或多个网络接口层 (因为它连接了两个或多个网络) 。 任何具有多个接口的系统英文都称作是多接口的 multihomed。一个主机也可以有多个接口, 但一般不称作路由器, 除非它的功能只是单纯地把分组从一个接口传送到另一个接口。同 样,路由器并不一定指那种在互连网中用来转发分组的特殊硬件盒。大多数的 TCP/IP 实现 也允许一个多接口主机来担当路由器的功能, 但是主机为此必须进行特殊的配置。 在这种情 况下,我们既可以称该系统为主机(当它运行某一应用程序时,如 FTP 或 Telnet) ,也可以 称之为路由器(当它把分组从一个网络转发到另一个网络时) 。我们在不同的场合下使用不 同的术语。 互连网的目标之一是在应用程序中隐藏所有的物理细节。虽然这一点在图 1.3 由两个网 络组成的互连网中并不很明显,但是应用层不能关心(也不关心)一台主机是在以太网上, 而另一台主机是在令牌环网上,它们通过路由器进行互连。随着增加不同类型的物理网络, 可能会有 20 个路由器, 但应用层仍然是一样的。 物理细节的隐藏使得互连网功能非常强大, 也非常有用。 连接网络的另一个途径是使用网桥。 网桥是在链路层上对网络进行互连, 而路由器则是 在网络层上对网络进行互连。网桥使得多个局域网(LAN)组合在一起,这样对上层来说 就好像是一个局域网。 TCP /IP 倾向于使用路由器而不是网桥来连接网络,因此我们将着重介绍路由器。文献 [Perlman 1992]的第 12 章对路由器和网桥进行了比较。 1.3 TCP/IP 的分层 在 TCP/IP 协议组件中,有很多种协议。图 1.4 给出了本书将要讨论的其他协议。 图 1.4 TCP/IP 协议组件中不同层次的协议 TCP 和 UDP 是两种最为著名的运输层协议,二者都使用 IP 作为网络层协议。 虽然 TCP 使用不可靠的 IP 服务,但它却提供一种可靠的运输层服务。本书第 17 章到 第 22 章将详细讨论 TCP 的内部操作细节。然后,我们将介绍一些 TCP 的应用,如第 26 章 中的 Telnet 和 Rlogin,第 27 章中的 FTP,以及第 28 章中的 SMTP 等。这些应用通常都是用 户进程。 UDP 为应用程序发送和接收数据报。一个数据报是指从发送方传输到接收方的一个信 息单元(例如,发送方指定的一定字节数的信息) 。但是与 TCP 不同的是,UDP 是不可靠 的,它不能保证数据报能安全无误地到达最终目的。本书第 11 章将讨论 UDP,然后在第 14 章(域名系统:Domain Name System) ,第 15 章(简单文件传输协议 Trivial File Transfer Protocol) 以及第 16 章 , (引导程序协议 Bootstrap Protocol) 介绍使用 UDP 的应用程序。 SNMP (简单网络管理协议)也使用了 UDP 协议,但是由于它还要处理许多其他的协议,因此本 书把它留到第 25 章再进行讨论。 IP 是网络层上的主要协议,同时被 TCP 和 UDP 使用。TCP 和 UDP 的每组数据都通过 端系统和每个中间路由器中的 IP 层在互连网中进行传输。在图 1.4 中,我们给出了一个直 接访问 IP 的应用程序。这是很少见的,但也是可能的。 (一些较老的路由选择协议就是以这 种方式来实现的。当然新的运输层协议也有可能试用这种方式。 )第 3 章主要讨论 IP 协议, 但是为了使内容更加有针对性,一些细节将留在后面的章节中进行讨论。第 9 章和第 10 章 讨论 IP 如何进行路由选择。 ICMP 是 IP 协议的附属协议。IP 层用它来与其他主机或路由器交换错误报文和其他重 要信息。第 6 章对 ICMP 的有关细节进行讨论。尽管 ICMP 主要被 IP 使用,但应用程序也 有可能访问它。我们将分析两个流行的诊断工具,Ping 和 Traceroute(第 7 章和第 8 章) , 它们都使用了 ICMP。 IGMP 是 Internet 组管理协议。它用来把一个 UDP 数据报多播到多个主机。我们在第 12 章中描述广播(把一个 UDP 数据报发送到某个指定网络上的所有主机)和多点传送的一 般特性,然后在第 13 章中对 IGMP 协议本身进行描述。 ARP(地址解析协议)和 RARP(逆地址解析协议)是某些网络接口(如以太网和令牌 环网)使用的特殊协议,用来转换 IP 层和网络接口层使用的地址。我们分别在第 4 章和第 5 章对这两种协议进行分析和介绍。 1.4 互连网的地址 互连网上的每个接口必须有一个唯一的 Internet 地址 (也称作 IP 地址)IP 地址长 32 bit。 。 Internet 地址并不采用平面形式的地址空间,如 1,2,3 等。IP 地址具有一定的结构,五类 不同的互连网地址格式如图 1.5 所示。 这些 32 位的地址通常写成四个十进制的数,其中每个整数对应一个字节。这种表示方 法称作“点分十进制表示法” (dotted decimal notation) 。例如,作者的系统就是一个 B 类地 址,它表示为:140.252.13.33。 区分各类地址的最简单方法是看它的第一个十进制整数。图 1.6 列出了各类地址的起止 范围,其中第一个十进制整数用加黑字体表示。 图 1.5 五类互连网地址 图 1.6 各类 IP 地址的范围 需要再次指出的是,多接口主机具有多个 IP 地址,其中每个接口都对应一个 IP 地址。 由于互连网上的每个接口必须有一个唯一的 IP 地址,因此必须要有一个管理机构为接入互 连网的网络分配 IP 地址。 这个管理机构就是互连网络信息中心 (Internet Network Information Centre)称作 InterNIC。InterNIC 只分配网络号。主机号的分配由系统管理员来负责。 (下面是原书 p.8①的译文) Internet 注册服务(IP 地址和 DNS 域名)过去由 NIC 来负责,其网络地址是 nic.ddn.mil。 1993 年 4 月 1 日,InterNIC 成立。现在,NIC 只负责处理国防数据网的注册请求,所有其 他的 Internet 用户注册请求均由 InterNIC 负责处理,其网址是:rs.internic.net。 事实上 InterNIC 有三部分组成: 注册服务 (rs.internic.net)目录和数据库服务 , (ds.internic.net) , 以及信息服务(is.internic.net) 。有关 InterNIC 的其他信息参见习题 1.8。 有三类 IP 地址:单目传送地址(目标为单个主机) ,广播传送地址(目的端为给定网络 上的所有主机) ,以及多目传送地址(目的端为同一组内的所有主机) 。第 12 章和第 13 章将 分别讨论广播传送和多目传送的更多细节。 在 3.4 节中,我们在介绍 IP 路由选择以后将进一步介绍子网的概念。图 3.9 给出了几个 特殊的 IP 地址:主机号和网络号为全 0 或全 1。 1.5 域名系统 尽管通过 IP 地址可以识别主机上的网络接口,进而访问主机,但是人们最喜欢使用的 还是主机名。在 TCP/IP 领域中,域名系统(DNS)是一个分布的数据库,由它来提供 IP 地 址和主机名之间的映射信息。我们在第 14 章将详细讨论 DNS。 现在, 我们必须理解, 任何应用程序都可以调用一个标准的库函数来查看给定名字的主 机的 IP 地址。类似地,系统还提供一个逆函数DD给定主机的 IP 地址,查看它所对应的主 机名。 大多数使用主机名作为参数的应用程序也可以把 IP 地址作为参数。例如,在第 4 章中 当我们用 Telnet 进行远程登录时,我们既可以指定一个主机名,也可以指定一个 IP 地址。 1.6 封装 当应用程序用 TCP 传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当 作一串比特流送入网络。 其中每一层对收到的数据都要增加一些首部信息 (有时还要增加尾 部信息) ,该过程如图 1.7 所示。TCP 传给 IP 的数据单元称作 TCP 报文段或简称为 TCP 段 (TCP segment) 传给网络接口层的数据单元称作 IP 数据报(IP datagram)。通过以太网传 。IP 输的比特流称作帧(frame)。 图 1.7 中帧头和帧尾下面所标注的数字是典型以太网帧首部的字节长度。在后面的章节 中我们将详细讨论这些帧头的具体含义。 以太网数据帧的物理特性是其长度必须在 46-1500 字节之间。我们将在 4.5 节遇到最 小长度的数据帧,在 2.8 节中遇到最大长度的数据帧。 (下面是原书 p.9①的译文) 所有的 Internet 标准和大多数有关 TCP/IP 的书都使用 octet 这个术语来表示字节。使用 这个过分雕琢的术语是有历史原因的,因为 TCP/IP 的很多工作都是在 DEC-10 系统上进行 的,但是它并不使用 8 bit 的字节。由于现在几乎所有的计算机系统都采用 8 bit 的字节,因 此我们在本书中使用字节(byte)这个术语。 更准确地说,图 1.7 中 IP 和网络接口层之间传送的数据单元应该是分组(packet) 。分 组既可以是一个 IP 数据报,也可以是 IP 数据报的一个片(fragment) 。我们将在 11.5 节讨 论 IP 数据报分片的详细情况。 UDP 数据与 TCP 数据基本一致。 唯一的不同是 UDP 传给 IP 的信息单元称作 UDP 数据 报(UDP datagram) ,而且 UDP 的首部长为 8 字节。 图 1.7 数据进入协议栈时的封装过程 回想第 6 页中的图 1.4,由于 TCP,UDP,ICMP 和 IGMP 都要向 IP 传送数据,因此 IP 必须在生成的 IP 首部中加入某种标识,以表明数据属于哪一层。为此,IP 在首部中存入一 个长度为 8 比特的数值,称作协议域。1 表示为 ICMP 协议,2 表示为 IGMP 协议,6 表示 为 TCP 协议,17 表示为 UDP 协议。 类似地,许多应用程序都可以使用 TCP 或 UDP 来传送数据。运输层协议在生成报文首 部时要存入一个应用程序的标识符。TCP 和 UDP 都用一个 16 bit 的端口号来表示不同的应 用程序。TCP 和 UDP 把源端口号和目的端口号分别存入报文首部中。 网络接口分别要发送和接收 IP,ARP 和 RARP 数据,因此也必须在以太网的帧首部中 加入某种形式的标识, 以指明生成数据的网络层协议。 为此, 以太网的帧首部也有一个 16 bit 的帧类型域。 1.7 分用(Demultiplexing) 当目的主机收到一个以太网数据帧时, 数据就开始从协议栈中由底向上升, 同时去掉各 层协议加上的报文首部。 每层协议盒都要去检查报文首部中的协议标识, 以确定接收数据的 上层协议。这个过程称作分用,图 1.8 显示了该过程是如何发生的。 图 1.8 以太网数据帧的分用过程 (下面是原书 p.11①的译文) 为协议 ICMP 和 IGMP 定位一直是一件很棘手的事情。在图 1.4 中,我们把它们与 IP 放在同一层上,那是因为事实上它们是 IP 的附属协议。但是在这里,我们又把它们放在 IP 层的上面,这是因为 ICMP 和 IGMP 报文都被封装在 IP 数据报中。 对于 ARP 和 RARP 我们也遇到类似的难题。在这里我们把它们放在以太网设备驱动程 序的上方,这是因为它们和 IP 数据报一样,都有各自的以太网数据帧类型。但在图 2.4 中, 我们又把 ARP 作为以太网设备驱动程序的一部分,放在 IP 层的下面,其原因在逻辑上是合 理的。 当进一步描述 TCP 的细节时,我们将看到协议确实是通过目的端口号,源 IP 地址和源 端口号进行解包的。 1.8 客户服务器模型 大部分网络应用程序在编写时都假设一端是客户, 另一端是服务器, 其目的是为了让服 务器为客户提供一些特定的服务。 我们可以将这种服务分为两种类型: 重复型或并发型。 重复型服务器通过以下步骤进行 交互: I1. 等待一个客户请求的到来。 I2. 处理客户请求。 I3. 发送响应给发送请求的客户。 I4. 返回 I1 步骤。 重复型服务器主要的问题发生在 I2 状态。在这个时候,它不能为其他客户机提供服务。 相应地,并发型服务器采用以下步骤: C1. 等待一个客户请求的到来 C2. 启动一个新的服务器来处理这个客户的请求。在这期间可能生成一个新的进程、任务或 线程,并依赖底层操作系统的支持。这个步骤如何进行取决于操作系统。生成的新服务器对 客户的全部请求进行处理。处理结束后,终止这个新服务器。 C3.返回 C1 步骤。 并发服务器的优点在于它是利用生成其他服务器的方法来处理客户的请求。也就是说, 每个客户都有它自己对应的服务器。 如果操作系统允许多任务, 那么就可以同时为多个客户 同时服务。 我们对服务器, 而不是对客户进行分类的原因是因为对于一个客户来说, 它通常并不能 够辨别自己是与一个重复型服务器或并发型服务器进行对话。 一般来说,TCP 服务器是并发的,而 UDP 服务器是重复的,但也存在一些例外。我们 将在 11.12 节对 UDP 对其服务器产生的影响进行详细讨论,并在 18.11 节对 TCP 对其服务 器的影响进行讨论。 1.9 端口号 我们前面已经指出过,TCP 和 UDP 采用 16 比特的端口号来识别应用程序。那么这些 端口号是如何选择的呢? 服务器一般都是通过人们所熟知的端口号来识别的。 例如, 对于每个 TCP/IP 实现来说, FTP 服务器的 TCP 端口号都是 21, 每个 Telnet 服务器的 TCP 端口号都是 23, 每个 TFTP(简 单文件传输协议)服务器的 UDP 端口号都是 69。任何 TCP/IP 实现所提供的服务都用众所周 知的 1-1023 之间的端口号。这些人们所熟知的端口号由 Internet 端口号分配机构(Internet Assigned Numbers Authority, IANA)来管理。 (下面是原书 p.13①的译文) 到 1992 年为止,人们所熟知的端口号介于 1-255 之间。256-1023 之间的端口号通常 都是由 Unix 系统占用,以提供一些特定的 Unix 服务DD也就是说,提供一些只有 Unix 系 统才有的, 而其他操作系统可能不提供的服务。 现在 IANA 管理 1-1023 之间所有的端口号。 Internet 扩展服务与 Unix 特定服务之间的一个差别就是 Telnet 和 Rlogin。 它们二者都允许我 们通过计算机网络登录到其他主机上。Telnet 是采用端口号为 23 的 TCP/IP 标准且几乎可以 在所有操作系统上进行实现。相反,Rlogin 最开始时只是为 Unix 系统设计的(尽管许多非 Unix 系统现在也提供该服务) ,因此在 80 年代初,它的有名端口号为 513。 客户端通常对它所使用的端口号并不关心, 只需保证该端口号在本机上是唯一的就可以 了。客户端口号又称作临时端口号(即存在时间很短暂) 。这是因为它通常只是在用户运行 该客户程序时才存在,而服务器则只要主机开着的,其服务就运行。 大多数 TCP/IP 实现给临时端口分配
之间的端口号。大于 5000 的端口号是 为其他服务器预留的(Internet 上并不常用的服务)。我们可以在后面看见许多这样的给临时 端口分配端口号的例子。 (下面是原书 p.13②的译文) Solaris 2.2 是一个很有名的例外。 通常 TCP 和 UDP 的缺省临时端口号从 32768 开始。 E.4 在 节中,我们将详细描述系统管理员如何对配置选项进行修改以改变这些缺省项。 大多数 Unix 系统的 file/etc/services 都包含了人们熟知的端口号。为了找到 Telnet 服务器和 域名系统的端口号,我们可以运行以下语句: (见原书 p.13 的③) 保留端口号 Unix 系统有保留端口号的概念。只有具有超级用户特权的进程才允许给它自己分配一 个保留端口号。 这些端口号介于 1 到 1023 之间,一些应用程序(如有名的 Rlogin,26.2 节)将它作为 客户与服务器之间身份认证的一部分。 1.10 标准化过程 究竟是谁控制着 TCP/IP 协议组件,又是谁在定义新的标准以及其他类似的事情?事实 上,有四个小组在负责 Internet 技术。 1. Internet 协会(ISOC: Internet Society)是一个推动、支持和促进 Internet 不断增长和 发展的专业组织,它把 Internet 作为全球研究通信的基础设施。 2. Internet 体系结构委员会(IAB:Internet Architecture Board)是一个技术监督和协调 的机构。它由国际上来自不同专业的 15 个志愿者组成,其职能是负责 Internet 标准的最后 编辑和技术审核。IAB 隶属于 ISOC。 3. Internet 工程专门小组(IETF:Internet Engineering Task Force)是一个面向近期标准 的组织,它分为 9 个领域(应用,寻径和寻址,安全等等) 。IETF 开发成为 Internet 标准的 规约。 为帮助 IETF 主席, 又成立了 Internet 工程指导小组 (IESG: Internet Engineering Steering Group) 。 4. Internet 研究专门小组主要对长远的项目进行研究。 IRTF 和 IETF 都隶属于 IAB。文献[Crocker 1993]提供了关于 Internet 内部标准化进程更 为详细的信息,同时还介绍了它的早期历史。 1.11 RFC 所有关于 Internet 的正式标准都以 RFC(Request for Comment)文档出版。另外,大量 的 RFC 并不是正式的标准,出版的目的只是为了提供信息。RFC 的篇幅从 1 页到 200 页不 等。每一项都用一个数字来标识,如 RFC 1122,数字越大说是 RFC 的内容越新。 所有的 RFC 都可以通过电子邮件或用 FTP 从 Internet 上免费获取。如果发送下面这份电子 邮件,你就会收到一份获取 RFC 的方法清单: To: rfc-info@ISI.EDU Subject: getting rfcs help: ways_to_get_rfcs 最新的 RFC 索引总是搜索信息的起点。 这个索引列出了 RFC 被替换或局部更新的时间。 下面是一些重要的 RFC 文档: 1. 赋值 RFC(Assigned Numbers RFC)列出了所有 Internet 协议中使用的数字和常数。 至本书出版时为止, 最新 RFC 的编号是 1340 [Reynolds and Postel 1992]。 所有著名的 Internet 端口号都列在这里。 当这个 RFC 被更新时(通常每年至少更新一次) ,索引清单会列出 RFC 1340 被替换的 时间。 2. Internet 正式协议标准,目前是 RFC 1600[Postel 1994]。这个 RFC 描述了各种 Internet 协议的标准化现状。 每种协议都处于下面几种标准化状态之一: 标准, 草案标准, 提议标准, 实验标准,信息标准,和历史标准。另外,对每种协议都有一个要求的层次:必需的,建议 的,可选择的,限制使用的,或者不推荐的。 与赋值 RFC 一样,这个 RFC 也定期更新。请一定随时查看最新版本。 3. 主机需求 RFC,1122 和 1123[Braden 1989a, 1989b]。RFC 1122 针对链路层,网络层 和运输层,RFC 1123 针对应用层。这两个 RFC 对早期重要的 RFC 文档作了大量的纠正和 解释。如果要查看有关协议更详细的细节内容,它们通常是一个入口点。它们列出了协议中 关于“必须”“应该”“可以”“不应该”或者“不能”等特性及其实现细节。 , , , 文献[Borman 1993b]提供了有关这两个 RFC 的实用内容。RFC 1127[Braden 1989c]对工 作小组开发主机需求 RFC 过程中的讨论内容和结论进行了非正式的总结。 4.路由器需求 RFC,目前正式版是 RFC 1009[Braden and Postel 1987],但一个新版已 接近完成[Aknqyust 1993]。它与主机需求 RFC 类似,但是只单独描述了路由器的需求。 1.12 标准的简单服务 有一些标准的简单服务几乎每种实现都要提供。 在本书中我们将使用其中的一些服务程 序, 而客户程序通常选择 Telnet。 1.9 描述了这些服务。 图 从该图我们可以看出, 当使用 TCP 和 UDP 提供相同的服务时,一般选择相同的端口号. (下面是原书 p.15①的译文) 如果仔细检查这些标准的简单服务以及其他标准的 TCP/IP 服务(如 Telnet, FTP, SMTP 等)的端口号时,我们发现它们都是奇数。这是有历史原因的,因为这些端口号都是从 NCP 端口号派生出来的。 (NCP, 即网络控制协议, ARPANET 的运输层协议, TCP 的前身。 是 是 NCP 是单工的,不是全双工的,因此每个应用程序需要两个连接,需预留一对奇数和偶数 端口号。当 TCP 和 UDP 成为标准的运输层协议时,每个应用程序只需要一个端口号,因此 就使用了 NCP 中的奇数。 (以下是原书 p.16 图 1.9 的译文) 名字 TCP 端口号 UDP 端口号 RFC 描述 echo 7 7 862 服务器返回客户发送的所有内容。 discard 9 9 863 服务器丢弃客户发送的所有内容。 daytime 13 13 867 服务器以可读形式返回时间和日期。 chargen 19 19 864 当客户发送一个数据报时,TCP 服务器发送一串连续的字符流,直到客户中断连接。UDP 服务器发送一个随机长度的数据报。 time 37 37 868 服务器返回一个二进制形式的 32 bit 数, 表示从 UTC 时间 1900 年 1 月 1 日午夜至今的秒数。 图 1.9 大多数实现都提供的标准的简单服务 1.13 互连网 在图 1.3 中,我们列举了一个由两个网络组成的互连网-一个以太网和一个令牌环网。 在 1.4 节和 1.9 节中, 我们讨论了世界范围内的互连网-Internet, 以及集中分配 IP 地址的需 要(InterNIC) ,还讨论了著名的端口号(IANA) 。internet 这个词第一个字母是否大写决定 了它具有不同的含义。 internet 意思是用一个共同的协议族把多个网络连接在一起。 Internet 指的是世界范围 而 内通过 TCP/IP 互相通信的所有主机集合 (超过 100 万台) Internet 是一个 internet 互连网) 。 ( , 但 internet 不等于 Internet。 1.14 实现 既成事实标准的 TCP/IP 软件实现来自于位于伯克利的加利福尼亚大学的计算机系统研 究小组。从历史上看,软件是随同 4.x BSD 系统(Berkeley Software Distribution)的网络版 一起发布的。它的源代码是许多其他实现的基础。 图 1.10 列举了各种 BSD 版本发布的时间,并标注了重要的 TCP/IP 特性。列在左边的 BSD 网络版,其所有的网络源代码可以公开得到:包括协议本身以及许多应用程序和工具 (如 Telnet 和 FTP) 。 在本书中,我们将使用“伯克利派生系统”来指 SunOS 4.x, SVR4, 以及 AIX 3.2 等那 些基于伯克利源代码开发的系统。这些系统有很多共同之处,经常包含相同的错误。 (以下是原书 p.17 图 1.10 的译文) 4.2BSD (1983) 第一个广泛可用的 TCP/IP 发布 4.3BSD (1986) TCP 性能得到改善 4.3BSD Tahoe (1988) 启动慢,拥塞避免措施 BSD 网络软件 1.0 版(1989):Net/1 4.3BSD Reno(1990) TCP 首部预测,SLIP 首部压缩 路由表修改 BSD 网络软件 2.0 版(1991):Net/2 4.4BSD(1993) 多播,长胖管道修改 4.4BSD-Lite (1994) 又称为 Net/3 图 1.10 不同的 BSD 版及其重要的 TCP/IP 特性 起初关于 Internet 的很多研究现在仍然在伯克利系统中应用-新的拥塞控制算法(21.7 节) ,多目传送(12.4 节)“又长又胖的管道”修改(24.3 节) , ,以及其他类似的研究。 1.15 应用编程接口 使用 TCP/IP 协议的应用程序通常采用两种应用编程接口(API) :socket 和 TLI(运输 层接口:Transport Layer Interface) 。前者有时称作“Berkeley socket” ,表明它是从伯克利版 发展而来的。 后者起初是由 AT&T 开发的, 有时称作 XTI (X/Open 传输接口) 以承认 X/Open , 这个自己定义标准的国际计算机生产产商所做的工作。XTI 实际上是 TLI 的一个超集。 本书不是一本编程方面的书,但是偶尔会引用一些内容来说明 TCP/IP 的特性,不管大多数 的 API (socket) 是否提供它们。 所有关于 socket 和 TLI 的编程细节请参阅文献[Stevens 1990]。 1.16 测试网络 图 1.11 是本书中所有的例子运行的测试网络。为阅读时参考方便,该图还复制在本书 的封面内侧。 图 1.11 本书例子运行的测试网络,所有的 IP 地址均从 140.252 开始编址。 在这个图中(作者的子网) ,大多数的例子都运行在下面四个系统中。图中所有的 IP 地 址属于 B 类地址,网络号为 140.252。所有的主机名属于.tuc.noao.edu 这个域。 (noao 代表 National Optical Astronomy Observatories,tuc 代表 Tucson) 。例如,右下方的系统有一个完 整的名字: svr4.tuc.noao.edu,其 IP 地址是:140.252.13.34。每个方框上方的名称是该主机运 行的操作系统。这一组系统和网络上的主机及路由器运行于不同的 TCP/IP 实现。 需要指出的是,noao.edu 这个域中的网络和主机要比图 1.11 中的多得多。这里列出来 的只是本书中将要用到的系统。 在 3.4 节中, 我们将描述这个网络所用到的子网形式, 4.6 中我们将更介绍 sun 与 netb 在 之间的拔号 SLIP 的有关细节。2.4 节将详细讨论 SLIP。 小结 本章快速地浏览了 TCP/IP 协议族,介绍了我们在后面的章节中将要详细讨论的许多术 语和协议。 TCP/IP 协议族分为四层:链路层,网络层,运输层和应用层,每一层各有不同的责任。 在 TCP/IP 中,网络层和运输层之间的区别是最为关键的:网络层(IP)提供点到点的服务, 而运输层(TCP 和 UDP)提供端到端的服务。 一个互连网是网络的网络。构造互连网的共同基石是路由器,它们在 IP 层把网络连在 一起。第一个字母大写的 Internet 是指分布在世界各地的大型互连网,其中包括 1 万多个网 络和超过 100 万台主机。 在一个互连网上,每个接口都用 IP 地址来标识,尽管用户习惯使用主机名而不是 IP 地 址。域名系统为主机名和 IP 地址之间提供动态的映射。端口号用来标识互相通信的应用程 序。服务器使用众所周知的端口号,而客户使用临时设定的端口号。 1.17习题 1.1 请计算最多有多少个 A 类、B 类和 C 类网络号。 1.2 用匿名 FTP 见 27.3 节) ( 从主机 nic.merit.edu 上获取文件 nsfnet/statistics/history.netcount。 该文件包含在 NSFNET 网络上登记的国内和国外的网络数。画一坐标系,横坐标代表年, 纵坐标代表网络总数的对数值。纵坐标的最大值是习题 1.1 的结果。如果数据显示一个明显 的趋势,请估计按照当前的编址体制推算,何时会用完所有的网络地址。 (3.10 节讨论解决 该难题的建议。 ) 1.3 获取一份主机需求 RFC 拷贝[Braden 1989a], 阅读有关应用于 TCP/IP 协议族每一层的稳 健性原则。这个原则的参考对象是什么? 1.4 获取一份最新的赋值 RFC 拷贝。 “quote of the day&协议的有名端口号是什么?哪个 RFC 对该协议进行了定义? 1.5 如果你有一个接入 TCP/IP 互连网的主机帐号,它的主 IP 地址是多少?这台主机是否接 入了 Internet?它是多接口主机吗? 1.6 获取一份 RFC 1000 的拷贝,了解 RFC 这个术语从何而来。 1.7 与 Internet 协会联系,isoc@isoc.org 或者+1 703 648 9888,了解有关加入的情况。 1.8 用匿名 FTP 从主机 is.internic.net 处获取文件 about-internic/information-about-the-internic。 1-1 2 链路层 2.1 引言 从图 1.4 我们可以看出,在 TCP/IP 协议族中,链路层主要有三个目的: (1)为 IP 模块 发送和接收 IP 数据报; (2)为 ARP 模块发送 ARP 请求和接收 ARP 应答; (3)为 RARP 发 送 RARP 请求和接收 RARP 应答。TCP/IP 支持多种不同的链路层协议,这取决于网络所使 用的硬件,如以太网,令牌环网,FDDI(光纤分布式数据接口) ,RS-232 串行线路等。 在本章中, 我们将详细讨论以太网链路层协议, 两个串行接口链路层协议 (SLIP 和 PPP) , 以及大多数实现都包含的环回(loopback)驱动程序。以太网和 SLIP 是本书中大多数例子 使用的链路层。我们对 MTU(最大传输单元)进行了介绍,这个概念在本书的后面章节中 将多次遇到。我们还讨论了如何为串行线路选择 MTU。 2.2 以太网和 IEEE 802 封装 以太网这个术语一般是指数字设备公司(Digital Equipment Corp.) 英特尔公司(Intel 、 Corp.) 、和 Xerox 公司联合在 1982 年公布的一个标准。它是当今 TCP/IP 采用的主要的局域 网技术。它采用一种称作 CSMA/CD 的媒体接入方法,其意思是载波侦听多路接入/冲突检 测(Carrier Sense, Multiple Access with Collision Detection) 。它的速率为 10 Mb/s,地址为 48 bit。 几年后,IEEE(电子电气工程师协会)802 委员会公布了一个稍有不同的标准集,其中 802.3 针对了整个 CSMA/CD 网络,802.4 针对令牌总线网络,802.5 针对令牌环网络。这三 者的共同特性由 802.2 标准来定义,那就是 802 网络共有的逻辑链路控制(LLC) 。不幸的 是, 802.2 和 802.3 定义了一个与以太网不同的帧格式。 文献[Stallings 1987]对所有的 IEEE 802 标准进行了详细的介绍。 在 TCP/IP 世界中,以太网 IP 数据报的封装是在 RFC 894[Hornig 1984]中定义的,IEEE 802 网络的 IP 数据报封装是在 RFC 1042[Postel and Reynolds 1988]中定义的。 主机需求 RFC 要求每台 Internet 主机都与一个 10Mbit/s 的以太网电缆相连接: 1. 必须能发送和接收采用 RFC 894(以太网)封装格式的分组。 2. 应该能接收与 RFC 894 混合的 RFC 1042(IEEE 802)封装格式的分组。 3. 也许能够发送采用 RFC 1042 格式封装的分组。 如果主机能同时发送两种类型的分组 数据,那么发送的分组必须是可以设置的,而且默认条件下必须是 RFC 894 分组。 最常使用的封装格式是 RFC 894 定义的格式。图 2.1 显示了两种不同形式的封装格式。 图中每个方框下面的数字是它们的字节长度。 两种帧格式都采用 48 bit(6 字节)的目标地址和源地址。 (802.3 允许使用 16 bit 的地 址,但一般是 48 bit 地址。 )这就是我们在本书中所称的硬件地址。ARP 和 RARP 协议(第 4 章和第 5 章)对 32 bit 的 IP 地址和 48 bit 的硬件地址进行映射。 接下来的 2 个字节在两种帧格式中互不相同。 802 标准定义的帧格式中, 在 长度字段是 指它后续数据的字节长度,但不包括 CRC 检验码。以太网的类型字段定义了后续数据的类 型。在 802 标准定义的帧格式中,类型字段则由后续的子网接入协议(Sub-network Access Protocol,SNAP)的首部给出。幸运的是,802 定义的有效长度值与以太网的有效类型值无 一相同,这样,就可以对两种帧格式进行区分。 在以太网帧格式中,类型字段之后就是数据,而在 802 帧格式中,跟随在后面的是 3 字节的 802.2 LLC 和 5 字节的 802.2 SNAP。 目的服务访问点 (Destination Service Access Point, DSAP)和源服务访问点(Source Service Access Point, SSAP)的值都设为 0xaa。ctrl 字段的 值设为 3。随后的 3 个字节 org code 都置为 0。再接下来的 2 个字节类型字段和以太网帧格 式一样。 (其他类型字段值可以参见 RFC 1340 [Reynolds and Postel 1992]) 。 CRC 字段用于帧内后续字节差错的循环冗余码检验(检验和)(它也被称为 FCS 或帧 。 检验序列) 802.3 标准定义的帧和以太网的帧都有最小长度要求。802.3 规定数据部分必须至少为 38 字节,而对于以太网,则要求最少要有 46 字节。为了保证这一点,必须在不足的空间插 入填充(pad)字节。我们在开始观察线路上的分组时将遇到这种最小长度的情况。 在本书中, 我们在需要的时候将给出以太网的封装格式, 因为这是最为常见的封装格式。 图 2.1 IEEE 802.2/802.3(RFC 1042)和以太网的封装格式(RFC 894) 2.3 尾部封装 RFC 893[Leffler and Karels 1984]描述了另一种用于以太网的封装格式,称作尾部封装 (trailer encapsulation) 。这是一个早期 BSD 系统在 DEC VAX 机上运行时的试验格式,它通 过调整 IP 数据报中字段的次序来提高性能。在以太网数据帧中,开始的那部分是变长的字 段(IP 首部和 TCP 首部) 。把它们移到尾部(在 CRC 之前) ,这样当把数据复制到内核时, 就可以把数据帧中的数据部分映射到一个硬件页面,节省内存到内存的复制过程。TCP 数 据报的长度是 512 字节的整数倍, 正好可以用内核中的页表来处理。 两台主机通过协商使用 ARP 扩展协议对数据帧进行尾部封装。这些数据帧需定义不同的以太网帧类型值。 现在, 尾部封装已遭到反对, 因此我们不对它举任何例子。 有兴趣的读者请参阅 RFC 893 以及文献[Leffler et al. 1989]的 11.8 节。 2.4 SLIP:串行线路 IP SLIP 的全称是 Serial Line IP。 它是一种在串行线路上对 IP 数据报进行封装的简单形式, 在 RFC 1055[Romkey 1988]中有详细描述。 SLIP 适用于家庭中每台计算机几乎都有的 RS-232 串行端口和高速调制解调器接入 Internet。 下面的规则描述了 SLIP 协议定义的帧格式: 1.IP 数据报以一个称作 END(0xc0)的特殊字符结束。同时,为了防止数据报到来之 前的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个 END 字符。 (如 果有线路噪声,那么 END 字符将结束这份错误的报文。这样当前的报文得以正确的传输, 而前一个错误报文交给上层后,会被发现其内容毫无意义而被丢弃。 ) 2.如果 IP 报文中某个字符为 END,那么就要连续传输两个字节 0xdb, 0xdc 来取代它。 0xdb 这个特殊字符被称作 SLIP 的 ESC 字符,但是它的值与 ASCII 码的 ESC 字符(0x1b) 不同。 3.如果 IP 报文中某个字符为 SLIP 的 ESC 字符, 那么就要连续传输两个字节 0xdb,0xdd 来取代它。 图 2.2 中的例子就是含有一个 END 字符和一个 ESC 字符的 IP 报文。 在这个例子中, 在 串行线路上传输的总字节数是原 IP 报文长度再加 4 个字节。 SLIP 是一种简单的帧封装方法,还有一些值得一提的缺陷: 1. 每一端必须知道对方的 IP 地址。没有办法把本端的 IP 地址通知给另一端。 2. 数据帧中没有类型字段 (类似于以太网中的类型字段)如果一条串行线路用于 SLIP, 。 那么它不能同时使用其他协议。 3. SLIP 没有在数据帧中加上检验和(类似于以太网中的 CRC 字段) 。如果 SLIP 传输的 报文被线路噪声影响而发生错误,只能通过上层协议来发现。 (另一种方法是,新型的调制 解调器可以检测并纠正错误报文。 )这样,上层协议提供某种形式的 CRC 就显得很重要。在 第 3 章和第 17 章中,我们将看到 IP 首部和 TCP 首部及其数据始终都有检验和。在第 11 章 中,我们将看到 UDP 首部及其数据的检验和却是可选的。 图 2.2 SLIP 报文的封装 尽管存在这些缺点,SLIP 仍然是一种广泛使用的协议。 (下面是原书 p.25①的译文) SLIP 的历史要追溯到 1984 年,Rick Adams 第一次在 4.2BSD 系统中实现。尽管它本身 的描述是一种非标准的协议,但是随着调制解调器的速率和可靠性的提高,SLIP 越来越流 行。现在,它的许多产品可以公开获得,而且很多产家都支持这种协议。 2.5 压缩的 SLIP 由于串行线路的速率通常较低 (19200 b/s 或更低) 而且通信经常是交互式的 , (如 Telnet 和 Rlogin,二者都使用 TCP) ,因此在 SLIP 线路上有许多小的 TCP 分组进行交换。为了传 送 1 个字节的数据需要 20 个字节的 IP 首部和 20 个字节的 TCP 首部,总数超过 40 个字节。 (19.2 节描述了 Rlogin 会话过程中,当敲入一个简单命令时这些小报文传输的详细情况。 ) 既然承认这些性能上的缺陷,于是人们提出一个被称作 CSLIP(即压缩 SLIP)的新协 议,它在 RFC 1144[Jacobson 1990a]中被详细描述。CSLIP 一般能把上面的 40 个字节压缩到 3 或 5 个字节。它能在 CSLIP 的每一端维持多达 16 个 TCP 连接,并且知道其中每个连接的 首部中的某些字段一般不会发生变化。 对于那些发生变化的字段, 大多数只是一些小的数字 和的改变。这些被压缩的首部大大地缩短了交互响应时间。 (下面是原书 p.25②的译文) 现在大多数的 SLIP 产品都支持 CSLIP。 作者所在的子网 (参见封面内页) 中有两条 SLIP 链路,它们均是 CSLIP 链路。 2.6 PPP:点对点协议 PPP,点对点协议修改了 SLIP 协议中的所有缺陷。PPP 包括以下三个部分: 1.在串行链路上封装 IP 数据报的方法。PPP 既支持数据为 8 位和无奇偶检验的异步模 式(如大多数计算机上都普遍存在的串行接口) ,还支持面向比特的同步链接。 2.建立、配置及测试数据链路的链路控制协议(LCP:Link Control Protocol) 。它允许 通信双方进行协商,以确定不同的选项。 3.针对不同网络层协议的网络控制协议(NCP:Network Control Protocol)体系。当前 RFC 定义的网络层有 IP,OSI 网络层,DECnet,以及 AppleTalk。例如,IP NCP 允许双方 商定是否对报文首部进行压缩,类似于 CSLIP。 (缩写词 NCP 也可用在 TCP 的前面) 。 RFC 1548[Simpson 1993]描述了报文封装的方法和链路控制协议。RFC 1332[McGregor 1992]描述了针对 IP 的网络控制协议。 PPP 数据帧的格式看上去很像 ISO 的 HDLC(高层数据链路控制)标准。图 2.3 是 PPP 数据帧的格式。 图 2.3 PPP 数据帧的格式 每一帧都以标志字符 0x7e 开始和结束。紧接着是一个地址字节,值始终是 0xff,然后 是一个值为 0x03 的控制字节。 接下来是协议字段,类似于以太网中类型字段的功能。当它的值为 0x0021 时表示信息 字段是一个 IP 数据报,值为 0xc021 时表示信息字段是链路控制数据,值为 0x8021 时表示 信息字段是网络控制数据。 CRC 字段(或 FCS,帧校验序列)是一个循环冗余检验码,以检测数据帧中的错误。 由于标志字符的值是 0x7e,因此当该字符出现在信息字段中时,PPP 需要对它进行转 义。在同步链路中,该过程是通过一种称作比特填充(bit stuffing)的硬件技术来完成的 [Tanenbaum 1989]。在异步链路中,特殊字符 0x7d 用作转义字符。当它出现在 PPP 数据帧 中时,那么紧接着的字符的第六个比特要取其补码,具体实现过程如下: 1. 当遇到字符 0x7e 时,需连续传送两个字符:0x7d 和 0x5e,以实现标志字符的转义。 2. 当遇到转义字符 0x7d 时,需连续传送两个字符:0x7d 和 0x5d,以实现转义字符的 转义。 3. 默认情况下,如果字符的值小于 0x20(比如,一个 ASCII 控制字符) ,一般都要进 行转义。例如,遇到字符 0x01 时需连续传送 0x7d 和 0x21 两个字符。 (这时,第六个比特取 补码后变为 1,而前面两种情况均把它变为 0。 ) 这样做的原因是防止它们出现在双方主机的串行接口驱动程序或调制解调器中, 因为有 时它们会把这些控制字符解释成特殊的含义。 另一种可能是用链路控制协议来指定是否需要 对这 32 个字符中的某一些值进行转义。默认情况下是对所有的 32 个字符都进行转义。 与 SLIP 类似,由于 PPP 经常用于低速的串行链路,因此减少每一帧的字节数可以降低 应用程序的交互时延。 利用链路控制协议, 大多数的产品通过协商可以省略标志符和地址字 段,并且把协议字段由 2 个字节减少到 1 个字节。如果我们把 PPP 的帧格式与前面的 SLIP 的帧格式(图 2.2)进行比较会发现,PPP 只增加了 3 个额外的字节:1 个字节留给协议字 段,另 2 个给 CRC 字段使用。另外,使用 IP 网络控制协议,大多数的产品可以通过协商采 用 Van Jacobson 报文首部压缩方法(对应于 CSLIP 压缩) ,减小 IP 和 TCP 首部长度。 总的来说,PPP 比 SLIP 具有下面这些优点: (1)PPP 支持在单根串行线路上运行多种 协议,不只是 IP 协议; (2)每一帧都有循环冗余检验; (3)通信双方可以进行 IP 地址的动 态协商 (使用 IP 网络控制协议)(4) CSLIP 类似, TCP 和 IP 报文首部进行压缩; ; 与 对 (5) 链路控制协议可以对多个数据链路选项进行设置。 为这些优点我们付出的代价是在每一帧的 首部增加 3 个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。 (下面是原书 p.27①的译文) 尽管 PPP 比 SLIP 有更多的优点,但是现在的 SLIP 用户仍然比 PPP 用户多。随着产品 越来越多,产家也开始逐渐支持 PPP,因此最终 PPP 应该取代 SLIP。 2.7 环回接口 大多数的产品都支持环回接口(Loopback Interface) ,以允许运行在同一台主机上的客 户程序和服务器程序通过 TCP/IP 进行通信。A 类网络号 127 就是为环回接口预留的。根据 惯例,大多数系统把 IP 地址 127.0.0.1 分配给这个接口,并命名为 localhost。一个传给环回 接口的 IP 数据报不能在任何网络上出现。 我们想象, 一旦传输层检测到目的端地址是环回地址时, 应该可以省略部分传输层和所 有网络层的逻辑操作。 但是大多数的产品还是照样完成传输层和网络层的所有过程, 只是当 IP 数据报离开网络层时把它返回给自己。 图 2.4 是环回接口处理 IP 数据报的简单过程。 图 2.4 环回接口处理 IP 数据报的过程 需要指出图中的关键点是: 1. 传给环回地址(一般是 127.0.0.1 )的任何数据均作为 IP 输入。 2. 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这 是因为广播传送和多播传送的定义(第 12 章)包含主机本身。 3. 任何传给该主机 IP 地址的数据均送到环回接口。 看上去用传输层和 IP 层的方法来处理环回数据似乎效率不高,但它简化了设计,因为 环回接口可以被看作是网络层下面的另一个链路层。网络层把一份数据报传送给环回接口, 就像传给其他链路层一样,只不过环回接口把它返回到 IP 的输入队列中。 在图 2.4 中,另一个隐含的意思是送给主机本身 IP 地址的 IP 数据报一般不出现在相应 的网络上。例如,在一个以太网上,分组一般不被传出去然后读回来。某些 BSD 以太网的 设备驱动程序的注释说明, 许多以太网接口卡不能读回它们自己发送出去的数据。 由于一台 主机必须处理发送给自己的 IP 数据报,因此图 2.4 所示的过程是最为简单的处理办法。 (下面是原书 p.29①的译文) 4.4BSD 系统定义了变量 useloopback,并初始化为 1。但是,如果这个变量置为 0,以 太网驱动程序就会把本地分组送到网络,而不是送到环回接口上。它也许不能工作,这取决 于你所使用的以太网接口卡和设备驱动程序。 2.8 最大传输单元 MTU 正如我们在图 2.1 看到的那样,以太网和 802.3 对数据帧的长度都有一个限制,其最大 值分别是 1500 和 1492 字节。链路层的这个特性称作 MTU,最大传输单元。不同类型的网 络大多数都有一个上限。 如果 IP 层有一个数据报要传,而且数据的长度比链路层的 MTU 还大,那么 IP 层就需 要进行分片 (fragmentation) 把数据报分布若干片, , 这样每一片都小于 MTU。 我们将在 11.5 节讨论 IP 分片的过程。 图 2.5 列出了一些典型的 MTU 值,它们摘自 RFC 1191[Mogul and Deering 1990]。点到 点的链路层(如 SLIP 和 PPP)的 MTU 并非指的是网络媒体的物理特性。相反,它是一个 逻辑限制,目的是为交互使用提供足够快的响应时间。在 2.10 节中,我们将看到这个限制 值是如何计算出来的。 在 3.9 节中,我们将用 netstat 命令打印出网络接口的 MTU。 图 2.5 几种常见的最大传输单元(MTU) 2.9 路径 MTU 当在同一个网络上的两台主机互相进行通信时,该网络的 MTU 是非常重要的。但是如 果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的 MTU。重 要的不是两台主机所在网络的 MTU 的值,重要的是两台通信主机路径中的最小 MTU。它 被称作路径 MTU。 两台主机之间的路径 MTU 不一定是个常数。它取决于当时所选择的路由。而路由选择 不一定是对称的 (从 A 到 B 的路由可能与从 B 到 A 的路由不同) 因此路径 MTU 在两个方 , 向上不一定是一致的。 RFC 1191[Mogul and Deering 1990]描述了路径 MTU 的发现机制,即在任何时候确定路 径 MTU 的方法。我们在介绍了 ICMP 和 IP 分片方法以后再来看它是如何操作的。在 11.6 节中,我们将看到 ICMP 的不可到达错误就采用这种发现方法。在 11.7 节中,我们还会看 到,traceroute 程序也是用这个方法来确定到达目标节点的路径 MTU。 11.8 节和 24.2 节, 在 我们将介绍当产品支持路径 MTU 的发现方法时,UDP 和 TCP 是如何进行操作的。 2.10 串行线路吞吐量计算 如果线路速率是 9600 b/s,而一个字节有 8 bit,加上一个起始比特和一个停止比特,那 么线路的速率就是 960 B/s(字节/秒) 。以这个速率传输一个 1024 字节的分组需要 1066 ms。 如果我们用 SLIP 链接运行一个交互式应用程序, 同时还运行另一个应用程序如 FTP 发送或 接收 1024 字节的数据,那么一般来说我们就必须等待一半的时间(533 ms)才能把交互式 应用程序的分组数据发送出去。 假定我们的交互分组数据可以在其它“大块”分组数据发送之前被发送出去。大多数的 SLIP 实现确实提供这类服务排队方法,把交互数据放在大块的数据前面。交互通信一般有 Telnet,Rlogin,以及 FTP 的控制部分(用户的命令,而不是数据) 。 (下面是原书 p.31①的译文) 这种服务排队方法是不完善的。它不能影响已经进入下游(如串行驱动程序)队列的非 交互数据。同时,新型的调制解调器具有很大的缓冲区,因此非交互数据可能已经进入该缓 冲区了。 对于交互应用来说,等待 533 ms 是不能接受的。关于人的有关研究表明,交互响应时 间超过 100-200 ms 就被认为是不好的[Jacobson 1990a]。这是发送一份交互报文出去后,直 到接收到响应信息(通常是出现一个回显字符)为止的往返时间。 把 SLIP 的 MTU 缩短到 256 就意味着链路传输一帧最长需要 266 ms, 它的一半是 133 ms (这是我们一般需要等待的时间) 。这样情况会好一些,但仍然不完美。我们选择它的原因 (与 64 或 128 相比)是因为大块数据提供良好的线路利用率(如大文件传输) 。假设 CSLIP 的报文首部是 5 个字节,数据帧总长为 261 个字节,256 个字节的数据使线路的利用率为 98.1%,帧头占了 1.9%,这样的利用率是很不错。如果把 MTU 降到 256 以下,那么将降低 传输大块数据的最大吞吐量。 在图 2.5 列出的 MTU 值中,点对点链路的 MTU 是 296 个字节。假设数据为 256 字节, TCP 和 IP 首部占 40 个字节。由于 MTU 是 IP 向链路层查询的结果,因此该值必须包括通 常的 TCP 和 IP 首部。这样就会导致 IP 如何进行分片的决策。IP 对于 CSLIP 的压缩情况一 无所知。 我们对平均等待时间的计算 (传输最大数据帧所需时间的一半) 只适用于 SLIP 链路 (或 PPP 链路)在交互通信和大块数据传输这两种情况下。当只有交互通信时,如果线路速率是 9600 b/s,那么任何方向上的 1 字节数据(假设有 5 个字节的压缩帧头)往返一次都大约需 要 12.5 ms。它比前面提到的 100-200 ms 足够小。需要注意的是,由于帧头从 40 个字节压 缩到 5 个字节,使得 1 字节数据往返时间从 85 ms 减到 12.5 ms。 不幸的是,当使用新型的纠错和压缩调制解调器时,这样的计算就更难了。这些调制解 调器所采用的压缩方法使得在线路上传输的字节数大大减少, 但纠错机制又会增加传输的时 间。不过,这些计算是我们进行合理决策的入口点。 在后面的章节中, 我们将用这些串行线路吞吐量的计算来验证数据从串行线路止通过的 时间。 2.11 小结 本章讨论了 Internet 协议族中的最底层协议,链路层协议。我们比较了以太网和 IEEE 802.2/802.3 的封装格式,以及 SLIP 和 PPP 的封装格式。由于 SLIP 和 PPP 经常用于低速的 链路,二者都提供了压缩不常变化的公共字段的方法。这使交互性能得到提高。 大多数的实现都提供环回接口。访问这个接口可以通过特殊的环回地址,一般为 127.0.0.1,也可以通过发送 IP 数据报给主机所拥有的任一 IP 地址。当环回数据回到上层的 协议栈中时,它已经过传输层和 IP 层完整的处理过程。 我们描述了很多链路都具有一个重要特性,MTU,相关的一个概念是路径 MTU。根据 典型的串行线路 MTU,我们对 SLIP 和 CSLIP 链路的传输时延进行了计算。 本章内容只覆盖了当今 TCP/IP 所采用部分数据链路公共技术。TCP/IP 成功的原因之一 是它几乎能在任何数据链路技术上运行。 习题 2.1 如果你的系统支持 netstat(1)命令(参见 3.9 小节) ,那么请用它确定系统上的接口及其 MTU。2-1 3 IP:网际协议 3.1 引言 IP 是 TCP/IP 协议族中最为核心的协议。所有的 TCP,UDP,ICMP,及 IGMP 数据都 以 IP 数据报格式传输(图 1.4) 。许多刚开始接触 TCP/IP 的人对 IP 提供不可靠、无连接的 数据报传送服务感到很奇怪,特别是那些具有 X.25 或 SNA 背景知识的人。 不可靠(unreliable)的意思是它不能保证 IP 数据报能成功地到达目的地。IP 仅提供最 好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP 有一个简单的 错误处理算法:丢弃该数据报,然后发送 ICMP 消息报给信源端。任何要求的可靠性必须由 上层来提供(如 TCP) 。 无连接(connectionless)这个术语的意思是 IP 并不维护任何关于后续数据报的状态信 息。每个数据报的处理是相互独立的。这也说明,IP 数据报可以不按发送顺序接收。如果 一信源向相同的信宿发送两个连续的数据报(先是 A,然后是 B) ,每个数据报都是独立地 进行路由选择,可能选择不同的路线,因此 B 可能在 A 到达之前先到达。 在本章,我们将简要介绍 IP 首部中的各个字段,讨论 IP 路由选择和子网的有关内容。 我们还要介绍两个有用的命令:ifconfig 和 netstat。关于 IP 首部中一些字段的细节,我们将 留在以后使用这些字段的时候再进行讨论。RFC 791[Postel 1981a]是 IP 的正式规约文件。 3.2 IP 首部 IP 数据报的格式如图 3.1 所示。普通的 IP 首部长为 20 个字节,除非含有选项字段。 图 3.1 IP 数据报格式及首部中的各字段 我们来分析图 3.1 中的首部。最高位在左边,记为 0 bit,最低位在右边,记为 31 bit。 4 个字节的 32 bit 值以下面的次序传输:首先是 0-7 bit,其次 8-15 bit,然后 16-23 bit, 最后是 24-31 bit。这种传输次序称作 big endian 字节次序。由于 TCP/IP 首部中所有的二进 制整数在网络中传输时都要求以这种次序, 因此它又称作网络字节次序。 以其他形式存储二 进制整数的机器,如 little endian 格式,则必须在传输数据之前把首部转换成网络字节次序。 目前的协议版本号是 4,因此 IP 有时也称作 IPv4。3.10 节将对一种新版的 IP 协议进行 讨论。 首部长度指的是首部占 32 bit 字的数目, 包括任何先期选项。 由于它是一个 4 比特字段, 因此首部最长为 60 个字节。在第 8 章中,我们将看到这种限制使某些选项如路由记录选项 在当今已没有什么用处。普通 IP 数据报(没有任何选择项)该字段的值是 5。 服务类型(TOS)字段包括一个 3 bit 的优先权子字段(现在已被忽略) bit 的 TOS ,4 子字段,和 1 bit 未用位但必须置 0。4 bit 的 TOS 分别代表:最小时延,最大吞吐量,最高 可靠性,最小费用。4 bit 中只能置其中 1 bit。如果所有 4 bit 均为 0,那么就意味着是普遍 服务。RFC 1340 [Reynolds and Postel 1992]描述了所有的标准应用如何设置这些服务类型。 RFC 1349 [Almquist 1992]对该 RFC 进行了修正,更为详细地描述了 TOS 的特性。 图 3.2 列出了对不同应用建议的 TOS 值。在最后一列中,我们给出的是十六进制值, 因为这就是在后面我们将要看到的 tcpdump 命令输出。 图 3.2 服务类型字段推荐值 Telnet 和 Rlogin 这两个交互应用要求最小的传输时延, 因为人们主要用它们来传输少量 的交互数据。另一方面,FTP 文件传输则要求有最大的吞吐量。最高可靠性被指明给网络管 理(SNMP)和路由选择协议。用户网络新闻(Usenet news, NNTP)是唯一要求最小费用的 应用。 现在大多数的 TCP/IP 实现都不支持 TOS 特性, 但是自 4.3BSD Reno 以后的新版系统都 对它进行了设置。另外,新的路由协议如 OSPF 和 IS-IS 都能根据这些字段的值进行路由决 策。 (下面是原书 p.35①的译文) 在 2.10 节中,我们提到 SLIP 一般提供基于服务类型的排队方法,允许对交互通信数据 在处理大块数据之前进行处理。由于大多数的实现都不使用 TOS 字段,因此这种排队机制 由 SLIP 自己来判断和处理,驱动程序先查看协议字段(确定是否是一个 TCP 段) ,然后检 查 TCP 信源和信宿的端口号,以判断是否是一个交互服务。一个驱动程序的注释这样认为, 这种“令人厌恶的处理方法”是必需的,因为大多数实现都不允许应用程序设置 TOS 字段。 总长度字段是指整个 IP 数据报的长度,以字节为单位。利用首部长度字段和总长度字 段,我们就可以知道 IP 数据报中数据内容的起始位置和长度。由于该字段长 16 比特,所以 IP 数据报最长可达 65535 字节。 (回忆图 2.5,超级通道的 MTU 为 65535。它的意思其实不 是一个真正的 MTU-―它使用了最长的 IP 数据报。 )当数据报被分片时,该字段的值也随 着变化,这一点我们将在 11.5 节中进一步描述。 尽管可以传送一个长达 65535 字节的 IP 数据报,但是大多数的链路层都会对它进行分 片。而且,主机也要求不能接收超过 576 字节的数据报。由于 TCP 把用户数据分成若干片, 因此一般来说这个限制不会影响 TCP。我们在后面的章节中将遇到大量使用 UDP 的应用 (RIP,TFTP,BOOTP,DNS,以及 SNMP) ,它们都限制用户数据报长度为 512 字节,小 于 576 字节。但是,事实上现在大多数的实现(特别是那些支持网络文件系统,NFS 的实 现)允许超过 8192 字节的 IP 数据报。 总长度字段是 IP 首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数 据以达到最小长度。尽管以太网的最小帧长为 46 字节(图 2.1) ,但是 IP 数据可能会更短。 如果没有总长度字段,那么 IP 层就不知道 46 字节中有多少是 IP 数据报的内容。 标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加 1。 我们在 11.5 节介绍分片和重组时再详细讨论它。同样,在讨论分片时我们再来分析标志字 段和片偏移字段。 (下面是原书 p.36①的译文) RFC 791 [Postel 1981a]认为标识字段应该由让 IP 发送数据报的上层来选择。假设有两 个连续的 IP 数据报,其中一个是由 TCP 生成的,而另一个是由 UDP 生成的,那么它们可 能具有相同的标识字段。尽管这也可以照常工作(由重组算法来处理) ,但是在大多数从伯 克利派生出来的系统中,每发送一个 IP 数据报时,IP 层都要把一个内核变量的值加 1,不 管交给 IP 的数据来自哪一层。内核变量的初始值根据系统引导时的时间来设置。 生存时间字段(time-to-live)TTL 设置了数据报可以经过的最多路由器数。它指定了数 据报的生存时间。TTL 的初始值由源主机设置(通常为 32 或 64) ,一旦经过一个处理它的 路由器,它的值就减去 1。当该字段的值为 0 时,数据报就被丢弃,并发送 ICMP 报文通知 源主机。第 8 章我们讨论 Traceroute 程序时将再回来讨论该字段。 我们已经在第 1 章讨论了协议字段,并在图 1.8 中示出了它如何被 IP 用来对数据报进 行分用。根据它可以识别是哪个协议向 IP 传送数据。 首部检验和字段是根据 IP 首部计算的检验和码。它不对首部后面的数据进行计算。 ICMP,IGMP,UDP 和 TCP 在它们各自的首部中均含有同时覆盖首部和数据检验和码。 为了计算一份数据报的 IP 检验和, 首先把检验和字段置为 0。 然后, 对首部中每个 16 bit 的二进制反码进行求和(整个首部看成是由一串 16 bit 的字组成) ,结果存在检验和字段中。 当收到一份 IP 数据报后,同样对首部中每个 16 bit 的二进制反码进行求和。由于收方在计 算过程中包含了发方存在首部中的检验和, 因此首部在传输过程中没有发生任何差错时, 收 方计算的结果应该为全 1。如果结果不是全 1(即检验和错误) ,那么 IP 就丢弃收到的数据 报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。 ICMP,IGMP,UDP 和 TCP 都采用相同的检验和算法,尽管 TCP 和 UDP 除了本身的 首部和数据外,在 IP 首部中还包含不同的字段。在 RFC 1071[Braden,Borman and Patridge 1988]中有关于如何计算 Internet 检验和的实现技术。 由于路由器经常只修改 TTL 字段 (减 1) , 因此当路由器转发一份报文时可以增加它的检验和, 而不需要对 IP 整个首部进行重新计算。 RFC 1141[Mallory and Kullberg 1990]为此给出了一个很有效的方法。 (下面是原书 p.37①的译文) 但是,标准的 BSD 实现在转发数据报时并不是采用这种增加的办法。 每一份 IP 数据报都包含源 IP 地址和目的 IP 地址。 我们在 1.4 节中说过, 它们都是 32 bit 的值。 最后一个字段是任选项,是数据报中的一个可变长的可选信息。目前,这些任选项定义 如下: ?安全和处理限制(用于军事领域,详细内容参见 RFC 1108[Kent 1991]) ?记录路径(让每个路由器都记下它的 IP 地址,见 7.3 节) ?时间戳(让每个路由器都记下它的 IP 地址和时间,见 7.4 节) ?宽松的源站选路(为数据报指定一系列必须经过的 IP 地址,见 8.5 节) ?严格的源站选路(与宽松的源站选路类似,但是它要求只能经过指定的这些地址,不 能经过其它的地址) 。 这些选项很少被使用,并非所有的主机和路由器都支持这些选项。 选项字段一直都是以 32 bit 作为界限,在必要的时候插入值为 0 的填充字节。这样就保 证 IP 首部始终是 32 bit 的整数倍(这是首部长度字段所要求的) 。 3.3 IP 路由选择 从概念上说,IP 路由选择是简单的,特别对于主机来说。如果目的主机与源主机直接 相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网) ,那么 IP 数据报就直接 送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。 大多数的主机都是采用这种简单机制。 在本节和第 9 章中,我们将讨论更一般的情况,即 IP 层既可以配置成路由器的功能, 也可以配置成主机的功能。当今的大多数多用户系统,包括几乎所有的 Unix 系统,都可以 配置成一个路由器。 我们可以为它指定主机和路由器都可以使用的简单路由算法。 根本上的 区别在于主机从不把数据报从一个接口转发到另一个接口, 而路由器则要转发数据报。 内含 路由器功能的主机应该从不转发数据报,除非它被设置成那样。在 9.4 小节中,我们将进一 步讨论配置的有关问题。 在一般的体制中,IP 可以从 TCP,UDP,ICMP,IGMP 接收数据报(即在本地生成的 数据报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)进行发送。IP 层在内层中有一个路由表。当收到一份数据报进行发送时,它都要对该表搜索一次。当数据 报来自某个网络接口时,IP 首先检查目的 IP 地址是否为本机的 IP 地址之一或者 IP 广播地 址。如果确实是这样,数据报就被送到由 IP 首部协议字段所指定的协议模块进行处理。如 果数据报的目的不是这些地址,那么(1)如果 IP 层被设置为路由器的功能,那么就对数据 报进行转发(也就是说,像下面对待发出的数据报一样处理) ,否则(2)数据报被丢弃。 路由表中的每一项都包含下面这些信息: ?目的 IP 地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目 中的标志字段来指定(如下所述) 。主机地址有一个非 0 的主机号(图 1.5) ,以指定某一特 定的主机,而网络地址中的主机号为 0,以指定网络中的所有主机(如以太网,令牌环网) 。 ?下一站(或下一跳)路由器(next-hop router)的 IP 地址,或者有直接连接的网络 IP 地址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一站 路由器不是最终的目的,但是它可以把我们传送给它的数据报转发到最终目的。 ?标志。其中一个标志指明目的 IP 地址是网络地址还是主机地址,另一个标志指明下 一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。 (我们将在 9.2 节中详 细介绍这些标志。 ) ?为数据报的传输指定一个网络接口。 IP 路由选择是逐跳地(hop-by-hop)进行的。从这个路由表信息可以看出,IP 并不知道 到达任何目的的完整路径(当然,除了那些与主机直接相连的目的) 。所有的 IP 路由选择只 为数据报传输提供下一站路由器的 IP 地址。它假定下一站路由器比发送数据报的主机更接 近目的,而且下一站路由器与该主机是直接相连的。 IP 路由选择主要完成以下这些功能: 1. 搜索路由表,寻找能与目的 IP 地址完全匹配的表目(网络号和主机号都要匹配) 。 如果找到, 则把报文发送给该表目指定的下一站路由器或直接连接的网络接口 (取决于标志 字段的值) 。 2. 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表 目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值) 。目的网络上的所有 主机都可以能过这个表目来处置。 例如, 一个以太网上的所有主机都是通过这种表目进行寻 径的。 这种搜索网络的匹配方法必须考虑可能的子网掩码。 关于这一点我们在下一节中进行讨 论。 3.搜索路由表,寻找标为“默认” (default)的表目。如果找到,则把报文发送给该表目 指定的下一站路由器。 如果上面这些步骤都没有成功, 那么该数据报就不能被传送。 如果不能传送的数据报来 自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的 错误。 完整主机地址匹配在网络号匹配之前执行。 只有当它们都失败后才选择默认路由。 默认 路由,以及下一站路由器发送的 ICMP 间接报文(如果我们为数据报选择了错误的默认路 由) ,是 IP 路由选择机制中功能强大的特性。我们在第 9 章对它们进行讨论。 为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是 IP 路由选择机 制的另一个基本特性。这样做可以极大地缩小路由表的规模,比如 Internet 上的路由器有只 有几千个表目,而不会是超过 100 万个表目。 例子 首先考虑一个简单的例子:我们的主机 bsdi 有一个 IP 数据报要发送给主机 sun。双方 都在同一个以太网上(参见封面内侧的图) 。数据报的传输过程如图 3.3 所示。 当 IP 从某个上层收到这份数据报后, 它搜索路由表, 发现目的 IP 地址 (140.252.13.133) 在一个直接相连的网络上(以太网 140.252.13.0) 。于是,在表中找到匹配网络地址。 (在下 一节中,我们将看到,由于以太网的子网掩码的存在,实际的网络地址是 140.252.13.32,但 是这并不影响这里所讨论的路由选择。 ) 数据报被送到以太网驱动程序, 然后作为一个以太网数据帧被送到 sun 主机上 (图 2.1) 。 IP 数据报中的目的地址是 sun 的 IP 地址(140.252.13.33) ,而在链路层首部中的目的地址是 48 bit 的 sun 主机的以太网接口地址。这个 48 bit 的以太网地址是用 ARP 协议获得的,我们 将在下一章对此进行描述。 图 3.3 数据报从主机 bsdi 到 sun 的传送过程 现在让我们来看另一个例子:主机 bsdi 有一份 IP 数据报要传到 ftp.uu.net 主机上,它的 IP 地址是 192.48.96.9。经过的前三个路由器如图 3.4 所示。首先,主机 bsdi 搜索路由表, 但是没有找到与主机地址或网络地址相匹配的表目, 因此只能用默认的表目, 把数据报传给 下一站路由器,即主机 sun。当数据报从 bsdi 被传到 sun 主机上以后,目的 IP 地址是最终 的信宿机地址(192.48.96.9) ,但是链路层地址却是 sun 主机的以太网接口地址。这与图 3.3 不同,在那里数据报中的目的 IP 地址和目的链路层地址都指的是相同的主机(sun) 。 当 sun 收到数据报后,它发现数据报的目的 IP 地址并不是本机的任一地址,而 sun 已 被设置成具有路由器的功能, 因此它把数据报进行转发。 经过搜索路由表, 选用了默认表目。 根 据 sun 的 默 认 表 目 , 它 把 数 据 报 转 发 到 下 一 站 路 由 器 netb , 该 路 由 器 的 地 址 是 140.252.1.183。数据报是经过点对点 SLIP 链路被传送的,采用了图 2.2 所示的最小封装格 式。这里,我们没有给出像以太网链路层数据帧那样的首部,因为在 SLIP 链路中没有那样 的首部。 当 netb 收到数据报后,它执行与 sun 主机相同的步骤:数据报的目的地址不是本机地 址,而 netb 也被设置成具有路由器的功能,于是它也对该数据报进行转发。采用的也是默 认路由表目,把数据报送到下一站路由器 gateway(140.252.1.4) 。位于以太网 140.252.1 上 的主机 netb 用 ARP 获得对应于 140.252.1.4 的 48 bit 以太网地址。这个以太网地址就是链路 层数据帧头上的目的地址。 路由器 gateway 也执行与前面两个路由器相同的步骤。 它的默认路由表目所指定的下一 站路由器 IP 地址是 140.252.104.2。 (我们将在图 8.4 中证实,使用 Traceroute 程序时,它就 是 gateway 使用的下一站路由器。 ) 对于这个例子我们需要指出一些关键点: 1. 该例子中的所有主机和路由器都使用了默认路由。事实上,大多数主机和一些路由 器可以用默认路由来处理任何目的,除非它在本地局域网上。 图 3.4 从 bsdi 到 ftp.uu.net (192.48.96.9)的初始路径 2. 数据报中的目的 IP 地址始终不发生任何变化。 (在 8.5 节中,我们将看到,只有使用 源路由选项时目的 IP 地址才有可能被修改,但这种情况很少出现。 )所有的路由选择决策都 是基于这个目的 IP 地址。 3. 每个链路层可能具有不同的数据帧首部,而且链路层的目的地址(如果有的话)始 终指的是下一站的链路层地址。 在我们的例子中, 两个以太网封装了含有下一站以太网地址 的链路层首部,但是 SLIP 链路没有这样做。以太网地址一般通过 ARP 获得。 在第 9 章,我们在描述了 ICMP 之后将再次讨论 IP 路由选择问题。我们将看到一些路 由表的例子,以及如何用它们来进行路由决策的。 3.4 子网寻址 现在所有的主机都要求支持子网编址(RFC 950 [Mogul and Postel 1985]) 。不是把 IP 地 址看成由单纯的一个网络号和一个主机号组成, 而是把主机号再分成一个子网号和一个主机 号。 这样做的原因是因为 A 类和 B 类地址为主机号分配了太多的空间,可分别容纳主机数 224-2 和 216-2。事实上,在一个网络中人们并不安排这么多的主机。 (各类 IP 地址的格式 如图 1.5 所示。 )由于全 0 或全 1 的主机号都是无效的,因此我们把总数减去 2。 在 InterNIC 获得某类 IP 网络号后,就由当地的系统管理员来进行分配,由他(或她) 来决定是否建立子网,以及分配多少比特给子网号和主机号。例如,这里有一个 B 类网络 地址(140 .252) ,在剩下的 16 bit 中,8 bit 用于子网号,8 bit 用于主机号,格式如图 3.5 所 示。这样就允许有 254 个子网,每个子网可以有 254 台主机。 图 3.5 B 类地址的一种子网编址 许多管理员采用自然的划分方法,即把 B 类地址中留给主机的 16 bit 中的前 8 bit 作为 子网地址,后 8 bit 作为主机号。这样用点分十进制方法表示的 IP 地址就可以比较容易确定 子网号。但是,并不要求 A 类或 B 类地址的子网划分都要以字节为划分界限。 大多数的子网例子都是 B 类地址。其实,子网还可用于 C 类地址,只是它可用的比特 数较少而已。很少出现 A 类地址的子网例子是因为 A 类地址本身就很少。 (但是,大多数 A 类地址都是进行子网划分的。 ) 子网对外部路由器来说隐藏了内部网络组织(一个校园或公司内部)的细节。在我们的 网络例子中,所有的 IP 地址都有一个 B 类网络号 140.252。但是其中有超过 30 个子网,多 于 400 台主机分布在这些子网中。由一台路由器提供了 Internet 的接入,如图 3.6 所示。 在这个图中,我们把大多数的路由器编号为 Rn,n 是子网号。我们给出了连接这些子 网的路由器,同时还包括了封二图中的九个系统。在图中,以太网用粗线表示,点对点链路 用虚线表示。我们没有画出不同子网中的所有主机。例如,在子网 140.252.3 上,就超过 50 台主机,而在子网 140.252.1 上则超过 100 台主机。 与 30 个 C 类地址相比, 用一个包含 30 个子网的 B 类地址的好处是, 它可以缩小 Internet 路由表的规模。B 类地址 140.252 被划分为若干子网的事实对于所有子网以外的 Internet 路 由器都是透明的。为了到达 IP 地址开始部分为 140.252 的主机,外部路由器只需要知道通 往 IP 地址 140.252.104.1 的路径。这就是说,对于网络 140.252 只需一个路由表目,而如果 采用 30 个 C 类地址, 则需要 30 个路由表目。 因此, 子网划分缩减了路由表的规模。 (在 10.8 小节中,我们将介绍一种新技术,即使用 C 类地址也可以缩减路由表的规模。 ) 图 3.6 网络 noao.edu(140.252)中的大多数子网安排 子网对于子网内部的路由器是不透明的。如图 3.6 所示,一份来自 Internet 的数据报到 达 gateway,它的目的地址是 140.252.57.1。路由器 gateway 需要知道子网号是 57,然后把 它送到 kpno。同样,kpno 必须把数据报送到 R55,最后由 R55 把它送到 R57。 3.5 子网掩码 任何主机在引导时进行的部分配置是指定主机 IP 地址。 大多数系统把 IP 地址存在一个 磁盘文件里供引导时读用。在第 5 章我们将讨论一个无盘系统如何在引导时获得 IP 地址。 除了 IP 地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这 也是在引导过程中通过子网掩码来确定的。这个掩码是一个 32 bit 的值,其中值为 1 的比特 留给网络号和子网号,为 0 的比特留给主机号。图 3.7 是一个 B 类地址的两种不同的子网掩 网格式。第一个例子是 noao.edu 网络采用的子网划分方法,如图 3.5 所示,子网号和主机号 都是 8 bit 宽。第二个例子是一个 B 类地址划分成 10 bit 的子网号和 6 bit 的主机号。 图 3.7 两种不同的 B 类地址子网掩码例子 尽管 IP 地址一般以点分十进制方法表示,但是子网掩码却经常用十六进制来表示,特 别是当界限不是一个字节时,因为子网掩码是一个比特掩码。 给定 IP 地址和子网掩码以后,主机就可以确定 IP 数据报的目的是: (1)本子网上的主 机; (2)本网络中其它子网中的主机; (3)其它网络上的主机。如果知道本机的 IP 地址, 那么就知道它是否为 A 类,B 类或 C 类地址(从 IP 地址的高位可以得知) ,也就知道网络 号和子网号之间的分界限。而根据子网掩码则知道子网号与主机号之间的分界限。 例子 假设我们的主机地址是 140.252.1.1(一个 B 类地址) ,而子网掩网为 255.255.255.0(其 中 8 bit 为子网号,8 bit 为主机号) . 如果目的 IP 地址是 140.252.4.5,那么我

我要回帖

更多关于 移动通话多少钱一分钟 的文章

 

随机推荐