第1章 概述
1.1 引言
TCP/IP起源于60年代末美国政府资助的一个分组交换网络研究项目,到90年代已经发展成为计算机之间最常应用的组网形式。
1.2 分层
网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。
TCP/IP通常被认为是一个四层协议系统。
| 应用层 | Telnet、FTP和e-mail等 |
| 运输层 | TCP和UDP |
| 网络层 | IP、ICMP和IGMP |
| 链路层 | 设备驱动程序及接口卡 |
⑴ 链路层:也称数据链路层或网络接口层。通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡(网卡)。他们一起处理与电缆(或其他任 何传输媒介)的物理接口细节。
⑵ 网络层:也称互联网层。处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括:IP协议(网际协议),ICMP协议 (Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
⑶ 运输层:主要为两台主机上得应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据 报协议)。
① TCP:为两台主机提供可靠性的数据通信。它把应用程序交给他的数据分成核实的小块交给下面的网络层,确认接受到的分组,设置发送最后确认分 组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
② UDP:为应用层提供过一种非常简单的服务。它只把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必 须的可靠性必须由应用层提供。
⑷ 应用层:负责处理待定的应用程序细节。几乎各种不同的TCP/IP实线都会提供下面这些通用的应用程序。
① Telnet 远程登录
② FTP 文件传输协议
③ SMTP 简单右键传送协议
④ SNMP 简单网络管理协议
| 应用层 |
FTP 客户 |
<---- FTP协议 ----> |
FTP 服务器 |
用户进程 |
处理应用 程序细节 |
| 运输层 | TCP | <---- TCP协议 ----> | TCP |
内核 (操作系统) |
处理通信细节 |
| 网络层 | IP | <---- IP协议 ----> | IP | ||
| 链路层 |
以太网 驱动程序 |
<---- 以太网协议 ----> |
以太网 驱动程序 |
||
| --------------------------------以太网-------------------------------- | |||||
应用层关心的是应用程序的细节,而不是数据在网络中的传输活动。运输层、网络层、链路层,对应用程序一无所知,但他们要处理所有通信细节。
所有的协议族统称为Internet协议族(Internet Protocol suite),通常称该协议族为TCP/IP。
网络接口层(链路层)和应用层的目的是显然的:链路层处理有关通信媒介的细节(以太网、令环牌网等),而应用层处理某个特定的用户应用程序(FTP、Telnet等)。但是从表面上看他们的区别并不是那么明显,那么为什么要把它们划分成两个不同的层次呢?(我们必须把视野从单网络扩展到组网络)
划分不同层的原因:
80年代,网络不断增长的原因之一是大家都认识到只有一台孤立的计算机构成的“孤岛”没有太大意义,于是把这些孤立的系统组在一起形成网络。
90年代,人们又意识到由单个网络构成更大的“岛屿”同样没有太大意义,于是人们又把多个网络连在一起形成网络的网络,成为互联网(internet)。
一个互联网就是一组通过相同协议族互连在一起的网络。
构成互联网最简单的方法:把两个或多个网络通过路由器进行连接。
路由器:为不同类型的物理网络提供连接:以太网、令牌环网、点对点的连接和FDDI(光纤分布式数据接口)等等。
拓展:这些盒子也称IP路由器(IP Router),但我们使用路由器(Router)这个术语。从历史上说,这些盒子称作网关(gateway),在很多TCP/IP文献中都使用这个数据。现在网关这个术语只用来表示应用层网关(一个连接两种不同协议族的进程,例如:TCP/IP和IBM的SNA),它为某个特定的应用程序服务(常常是电子邮件或文件传输)。
|
FTP 客户 |
<-------------- FTP协议 --------------> |
FTP 服务器 |
|||
| TCP | <-------------- TCP协议 --------------> | TCP | |||
| IP | <--- IP协议 ---> |
IP (路由器) |
<--- IP协议 ---> | IP | |
|
以太网 驱动程序 |
<-- 以太网协议 --> |
以太网 驱动程序 (路由器) |
令牌环 驱动程序 (路由器) |
<-- 令牌环协议 --> |
令牌环 驱动程序 |
| 以太网 | -- 通过上面路由器连接 -- | 令牌环 | |||
上图我们可以换分出端系统(End system)(两边的两台主机)和中间系统(Intermediate system)(中间的路由器:IP+以太网驱动程序+令牌环驱动程序)。应用层和运输层使用端到端(End-to-end)协议。在图中,只有端系统需要这两层协议。但是,网络层提供的确实逐跳(Hop-by-hop)协议,两个端系统和每个中间系统都要使用它。
运输层和网络层分别负责不同的功能:在TCP/IP协议族中,网络层IP提供的是一种不可靠的服务。也就是说,它只尽可能快地把分组从源节点送到目的节点,但并不提供任何可靠性保证。另一方面,TCP在不可靠的IP层上提供了一个可靠的运输层。为了提供这种可靠的服务,TCP采用了超时重传、发送和接收端到端的确认分组等机制。
从定义上看,一个路由器具有两个或多个网络接口层(因为它连接了两个或多个网络)。
任何具有多个接口的系统,英文都称作是多借口的(multihomed)。
一个主机也可以有多个接口,但一般不称作路由器(除非它的功能只是单纯地把分组从一个接口传送到另一个接口)。
同样,路由器并不一定指那种在互联网中用来转发分组的特殊硬件盒。大多数的TCP/IP实现也允许一个多接口主机来担当路由器功能,但是主机为此必须进行特殊的配置。在这种情况下,我们既可以称该系统为主机(当它运行某一应用程序时,如FTP或Telnet),也可以称之为路由器(当它把分组从一个网络转发到另一个网络时)。
互联网的目的之一是在应用程序中隐藏所有的物理细节。物理细节的隐藏使得互联网功能非常强大,也非常有用。
连接网络的另一个途径是使用网桥。网桥是在链路层上对网络进行互联,而路由器则是在网络层上对网络进行互联。网桥使得多个局域网(LAN)组合在一起,这样对上层来说就好像是一个局域网。
TCP/IP倾向于使用路由器(而不是网桥)来连接网络。文献【Perlman 1922】的第12章对路由器和网桥进行了比较。
1.3 TCP/IP的分层

TCP和UDP是两种最为著名的运输层协议,二者都使用IP作为网络层协议。
TCP:虽然TCP使用不可靠的IP服务,但它却提供一种可靠的运输层服务。
UDP:UDP为应用程序发送和接收数据报。一个数据报是指从发送方传输到接收方的一个信息单元(例如:发送方指定的一定字节数的信息)。但与TCP不同的是,它不能保证数据报能安全无误地到达最终目的。
IP:IP是网络层上的主要协议,同时被TCP和UDP使用。TCP和UDP的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。上图中,我们给出了一个直接访问IP的应用程序。这是很少见的,但也是可能的(一些较老的选路协议就是以这种方式来实现的,当然新的运输层协议也有可能使用这种方式)。
ICMP:ICMP是IP协议的附属协议。IP层用它来与其他主机或路由器交换错误报文和其他重要信息。
IGMP:IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。
ARP和RARP:ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。
1.4 互联网地址
互联网上得每个接口必须有一个唯一的Internet地址(也称作IP地址)。IP地址长32 bit。Internet地址并不采用平面形式的地址空间(如1,2,3等)。IP地址具有一定的结构,五类不同的互联网地址格式如下图:
| 7位 | 24位 | ||||||
| A类 | 0 | 网络号 | 主机号 | ||||
| 14位 | 16位 | ||||||
| B类 | 1 | 0 | 网络号 | 主机号 | |||
| 21位 | 8位 | ||||||
| C类 | 1 | 1 | 0 | 网络号 | 主机号 | ||
| 28位 | |||||||
| D类 | 1 | 1 | 1 | 0 | 多播组号 | ||
| 27位 | |||||||
| E类 | 1 | 1 | 1 | 1 | 0 | (留待后用) | |
这些32位的地址通常写成4个十进制的数,其中每个证书对应一个字节。这种表示方法称作“点分十进制表示法(Dotted decimal notation)”。
区分各类地址的最简单方法是看它第一个十进制整数。
| 类型 | 范围 |
| A类 | 0.0.0.0 到 127.255.255.255 |
| B类 | 128.0.0.0 到 191.255.255.255 |
| C类 | 192.0.0.0 到 223.255.255.255 |
| D类 | 224.0.0.0 到 239.255.255.255 |
| E类 | 240.0.0.0 到 255.255.255.255 |
多接口主机具有多个IP地址,其中每个接口都对应一个IP地址。
由于互联网上得每个接口必须有一个唯一的IP地址,因此必须要有一个管理机构为接入互联网的网络分配IP地址。这个管理机构就是互联网络信息中心(Internet Network Information Center),称作InterNIC。InterNIC只分配网络号。主机号的分配由系统管理员来负责。
Internet注册服务(IP地址和DNS域名)过去由NIC来负责,其网络地址是nic.ddn.mil。1933年4月1日,InterNIC成立。现在NIC只负责处理国防数据网的注册请求,所有其他的Internet用户注册请求均由InterNIC负责处理,其网址是:rs.internic.net。
事实上InterNIC由三部分组成:注册服务(rs.internic.net),目录和数据库服务(ds.internic.net),以及信息服务(is.internic.net)。
有三类IP地址:单播地址(目的端为单个主机)、广播地址(目的端为给定网络上得所有主机)以及多播地址(目的端为同一组内的所有主机)。
1.5 域名系统
在TCP/IP领域中,域名系统(DNS)是一个分布的数据库,由它来提供IP地址和主机名之间的映射信息。
任何应用程序都可以调用一个标准的库函数来查看给定名字的主机的IP地址。类似地,系统还提供一个逆函数:给定主机的IP地址,查看它对应的主机名。
大多数使用主机名作为参数的应用程序也可以把IP地址作为参数。(例如第4章我们用Telnet进行登录时,可以是主机名也可以是IP地址)
1.6 封装
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当做一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)。TCP传给IP的数据单元称作TCP报文段或简称TCP段(TCP segment)。IP传给网络接口层的数据单元称作IP数据报(IP datagram)。通过以太网传输的比特流称作帧(Frame)。

上图帧头和帧尾下边所标注的数字是典型以太网帧首部的字节长度。
以太网数据帧的物理特性:长度必须在46~1500字节之间。
上图中IP和网络接口层之间传送的数据单元应该是分组(packet)。
分组既可以是一个IP数据报,也可以是IP数据报的一个片(fragment)。
UDP数据与TCP数据基本一致。唯一的不同是UDP传给IP的信息单元称作UDP数据报(UDP datagram),而UDP的首部长为8字节。
由于TCP、UDP、ICMP和IGMP都要向IP传送数据,因此IP必须在生成IP首部中加入某种标识,以标兵数据属于哪一层。为此,IP在首部中存入一个长度为8bit的数值,称作协议域。1表示为ICMP协议(互联网控制报文协议),2表示为IGMP协议(组管理协议),6表示为TCP协议(网际协议),17表示为UDP协议(用户数据报协议)。
类似地,许多应用程序都可以使用TCP或UDP来传送数据。运输层协议在生成报文首部时要存入一个应用程序的标识符。TCP和UDP都用一个16bit的端口号来表示不同的应用程序。TCP和UDP把源端口号和目的端口号分别存入报文首部中。
网络接口分别要发送和接收IP、ARP和RARP数据,因此也必须在以太网的帧首部加入某种形式的标识,以指明生成数据的网络层协议。为此,以太网的帧首部也有一个16bit的帧类型域。
1.7 分用(检查报文首部,确认接收数据的上层协议)
当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上报文首部。每层协议盒都要去检查报文首部的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing)。

(为协议ICMP盒IGMP定位一直是一件很棘手的事情。之前把他们与IP放在同一层,那是因为事实上它们是IP的附属协议。这里我们把它们放在IP层的上面,是因为ICMP和IGMP报文都被封装在IP数据报中。)
(对于ARP和RARP也一样,在这里它们放在以太网设备驱动程序的上方,因为它们和IP数据报一样,都有各自的以太网数据帧类型。但在图2-4中,我们又把ARP作为以太网设备驱动程序的一部分,放在IP层的下面,其原因在逻辑上是合理的。)
1.8 客户--服务器模型
大部分网络应用程序在编写时都假设一端是客户,另一端是服务器,其目的是为了让服务器为客户提供一些特定的服务。
可以将这种服务分为两种类型:复杂型和并发型。
⑴重复型服务器通过以下步骤进行交互:
i1. 等待一个客户请求的到来。
i2. 处理客户请求。(此时进入锁状态,不可为其他客户机提供服务)
i3. 发送相应给发送请求的客户。
i4. 返回i1步。
⑵并发型服务器步骤:
c1. 等待一个客户请求的到来。
c2. 启动一个新的服务器来处理这个客户的请求。在这期间可能生成一个新的进程、任务或线程,并依赖底层操作系统的支持。这个步骤如何进行取决于操作系统。生成的新服务器对客户的全部请求进行处理。处理结束后,终止这个新服务器。(可以同时为多个客户服务)
c3. 返回c1步。
服务器不是对客户进行分类的原因是对于一个客户来说,它通常不能够辨别自己是与一个重复型服务器还是并发型服务器进行对话。
一般来说,TCP服务器是并发的,UDP服务器是重复的,但也存在一些例外。
1.9 端口号
TCP和UDP采用16bit的端口号来识别应用程序。
服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器UDP端口号都是69。任何TCP/IP实现所提供的服务都用知名的1~1023之间的端口号。这些知名端口号由Internet号分配机构(Internet Assigned Numbers Authority,IANA)来管理。
(到1992年为止,知名端口号介于1~255之间。256~1023之间的端口号通常都是由Unix系统占用,以提供一些特定的Unix服务——也就是说,提供一些只有Unix系统才有的,而其他操作系统可能不提供的服务。现在IANA管理1~1023之间所有的端口号。)
(Internet扩展服务于Unix特定服务之间的一个差别就是Telnet和Rlogin。它们二者都允许通过计算机网络登录到其他主机上。Telnet是采用端口号为23的TCP/IP标准且几乎可以在所有操作系统上进行实现。相反,Rlogin最开始时只是为Unix系统设计的(尽管许多非Unix系统现在也提供该服务),因此在80年代初,它的知名端口号为513。)
客户端通常对它所使用的端口号不关心,只需保证该端口号在本机上是唯一的就可以了。客户端口号又称作临时端口号(即存在时间很短)。这是因为它通常只是在运行该客户程序时才存在,而服务器则只要主机开着的,其服务就运行。
大多数TCP/IP实现给临时端口分配1024~5000之间的端口号。大于5000的端口号是为其他服务器预留的(Internet上并不常用的服务)。
保留端口号:Unix系统有保留端口号的概念。只有具有超级用户特权的进程才允许给他自己分配一个保留号端口号。(这些端口号介于1~1023之间,一些应用程序(如有名的Rlogin)将它作为客户与服务器之间身份认证的一部分。)
1.10 标准化过程
有四个小组在负责Internet技术:
⑴ Internet协会(ISOC,Internet Society)是一个推动、支持和促进Internet不断增长和发展的专业组织,它把Internet作为全球研究通信的基础设施。
⑵ Internet体系结构委员会(IAB,Internet Architecture Board)是一个技术监督和协调的机构。它由国际上来自不同专业的15个志愿者组成,其职能是负责Internet标准的最后编辑和技术审核。IAB隶属于ISOC。
⑶ Internet工程专门小组(IETF,Internet Engineering Task Force)是一个面向近期标准的组织,它分9个领域(应用、寻径和寻址、安全等等)。IETF开发成为Internet标准的规范。为帮助IETF主席,又成立了Internet工程知道小组(IESG,Internet Engineering Steering Group)。
⑷ Internet研究专门小组(IRTF,Internet Research Task Force)主要对长远的项目进行研究。
IRTF和IETF都隶属于IAB。
1.11 RFC
所有关于Internet的正式标准都以RFC(Request for Comment)文档出版。
后期补充...
1.12 标准的简单服务
当使用TCP和UDP提供相同服务时,一般选择相同的端口号。
| 名字 | 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 | 服务器返回一个二进制形式的32bit数,表示从UTC时间1900年1月1日午夜至今的秒数。 |
大多数实现都提供的标准的简单服务。
(如果仔细检查这些标准的简单服务以及其他标准的TCP/IP服务(如Telnet、FTP、SMTP等)的端口号时,我们发现它们都是奇数。这是有历史原因的,因为这些端口号都是从NCP端口号派生出来的(NCP,即网络控制协议,是ARPANET的运输层协议,是TCP的前身)。NCP是单工的,不是全双工的,因此每个应用程序需要两个链接,需预留一对奇数和偶数端口号。当TCP和UDP成为标准的运输层协议时,每个应用程序只需要一个端口号,因此就使用了NCP中的奇数。)
1.13 互联网
internet:用一个共同的协议族把多个网络链接在一起。
Internet:世界范围内通过TCP/IP互相通信的所有主机集合(超过100万台)。
Internet是一个internet,但internet不等于Internet。
1.14 实现
实际上,TCP/IP软件实现来自于伯克利的加利福尼亚大学的计算机系统研究小组。从历史上看,软件是随同4.xBSD系统(Berkeley Software Distribution)的网络版一起发布的。它的源代码是许多其他实现的基础。
(更多细节,查看书《TCP/IP详解 卷一:协议》的P12)
1.15 应用编程接口
使用TCP/IP协议的应用程序通常采用两种应用编程接口(API):socket 和 TLI(运输层接口:Transport Layer Interface)。前者有时称作:Berkeley socket,表明它是从伯克利版发展而来的。后者起初是AT&T开发的,有时称作XTI(X/Open运输层接口),以承认X/Open这个自己定义标准的国际计算机生产商所做的工作。XTI实际上是TLI的一个超级。
(所有关于socket和TLI的编程细节,参阅文献【Stevens 1990】)
1.16 测试网络
下图是本书所有的例子运行的测试网络。

在这个图中,大多数的例子都运行在下面四个系统中。途中所有的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. TCP/IP协议分为四层:链路层、网络层、运输层和应用层。
2. 网络层和运输层的区别:网络层(IP)提供点到点的服务。运输层(TCP和UDP)提供端到端的服务。
3. 一个互联网是网络的网络。构造互联网的共同基石是路由器,它们在IP层把网络链接在一起。
4. 第一个字母大写的Internet是指分布在世界各地的大型互联网,其中包括1万多个网络和超过100万台主机。
5. 在一个互联网上,每个接口都用IP地址来标识,尽管用户习惯使用主机名而不是IP地址。
6. 域名系统为主机名和IP地址之间提供动态的映射。
7. 端口号用来标识互相通信的应用程序。
8. 服务器使用知名端口号,而客户端使用临时设定的端口号。

浙公网安备 33010602011771号