网络互联层具备连接异构网的功能。图11显示了连接以太网和令牌环网的方式。以太网和令牌环网是不同类型的网,两者有不同的网络拓扑结构。以太网和令牌环网都向网络互联层提供了统一的访问接口,访问接口向网络互联层隐藏了下层网络的差异,使得两个网络之间可以顺利传递数据包。

图11 网络互联层连接以太网和令牌环网
网络互联层采用IP协议(Internet Protocol),它规定了数据包的格式,并且规定了为数据包寻找路由的流程。 (3)传输层 传输层的功能是使源主机和目标主机上的进程可以进行会话。在传输层定义了两种服务质量不同的协议,即TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)。TCP协议是一种面向连接的、可靠的协议。它将源主机发出的字节流无差错地发送给互联网上的目标主机。在发送端,TCP协议负责把上层传送下来的数据分成报文段并传递给下层。在接收端,TCP协议负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免接收速度缓慢的接收方没有足够的缓冲区来接收发送方发送的大量数据。应用层的许多协议,如HTTP、FTP和TELNET协议等都建立在TCP协议基础上。
UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。UDP不能保证数据报的接收顺序同发送顺序相同,甚至不能保证它们是否全部到达目标主机。应用层的一些协议,如SNMP和DNS协议就建立在UDP协议基础上。如果要求可靠地传输数据,则应该避免使用UDP协议,而要使用TCP协议。
(4)应用层
TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。针对各种各样的网络应用,应用层引入了许多协议。基于TCP协议的应用层协议主要包括:
l FTP(File Transfer Protocol):文件传输协议,允许在网络上传输文件。
l TELNET:虚拟终端协议,允许从主机A登录到远程主机B,使得主机A充当远程主机B的虚拟终端。
l HTTP(Hyper Text Transfer Protocol):超文本传输协议,允许在网络上传送超文本。
l HTTPS(Secure Hypertext Transfer Protocol):安全超文本传输协议,允许在网络上安全地传输超文本,网上传输的是经过加密的数据,到达目的地后再对数据解秘。
l POP3(Post Office Protocol - Version 3):邮局协议-版本3,允许用户在客户程序中访问在远程服务器上的电子邮件。
l IMAP4(Internet Message Access Protocol Version 4):Internet消息访问协议-版本4,允许用户访问和操纵远程服务器上的邮件和邮件夹。IMAP4改进了POP3的不足,用户可以通过浏览信件头来决定是不是要下载此信,还可以在服务器上创建或更改文件夹或邮箱,删除信件或检索信件的特定部分。在POP3中,信件是保存在服务器上的,当用户阅读信件时,所有内容都会被立刻下载到用户的机器上。IMAP4服务器可以看成是一个远程文件服务器,而POP3服务器可以看成是一个存储转发服务器。
l SMTP(Simple Mail Transfer Protocol):简单邮件传送协议,是发送电子邮件的协议。
基于UDP协议的的应用层协议主要包括:
l SNMP(Simple Network Management Protocol):网络管理协议,为管理本地和远程的网络设备提供了一个标准化途径,是分布式环境中的集中化管理协议。
l DNS(Domain Name System):域名系统协议,把主机的域名转换为对应的IP地址。
2.IP协议
IP网络(即在网络层采用IP协议的网)中每台主机都有唯一的IP地址 ,IP地址用于标识网络中的每个主机。IP地址是一个32位的二进制序列。为了便于在上层应用中方便地表示IP地址,可以把32位的二进制序列分为四个单元,每个单元占8位,然后用十进制整数来表示每个单元,这些十进制整数的取值范围是0~255。如某一台主机的IP地址可为:192.166.3.4。
IP地址由两部分组成:IP网址和IP主机地址。IP网址表示网络的地址,IP主机地址表示网络中的主机的地址。网络掩码用来确定IP地址中哪部分是网址,哪部分是主机地址。
网络掩码的形式与IP地址相同,但有一定的限制。在网络掩码的二进制序列中,前面部分都为1,后面部分都为0。假定IP地址192.166.3.4的网络掩码为255.255.255.0。这个网络掩码的二进制序列为11111111.11111111. 11111111.00000000。把网络掩码与IP地址进行二进制与操作,得到的结果就是IP网址。因此,IP地址192.166.3.4的网址为192.166.3.0。如果把网络掩码设为255.255.0.0,那么IP网址为192.166.0.0。
图12显示了两个互联的网络的配置,从该图可以看出,每个网络都有IP网址,两个网络之间用路由器连接。

图12 每个IP网络有自己的网址,通过路由器与其他网络连接
(1)发送数据包的过程
IP是面向包的协议,即数据被分成若干小数据包,然后分别传输它们。IP网络上的主机只能直接向本地网上的其他主机(也就是具有相同IP网址的主机)发送数据包。主机实际上有两个不同性质的地址:物理地址和IP地址。物理地址是由主机上的网卡来标识的,物理地址才是主机的真实地址。如图13所示,主机A向同一个网络上的另一个主机B发包时,会通过地址解析协议(ARP,Address Resolution Protocol)获得对方的物理地址,然后把包发给对方。ARP协议的运行机制为:主机A在网络上广播一个ARP消息:“要寻找地址为192.166.3.5的主机”,接着,具有这个IP地址的主机B就会做出响应,把自身的物理地址告诉主机A。

图13 在同一个网络中,主机A直接向主机B发送IP数据包
当主机A向另一个网络上的主机B发送包时,主机A利用ARP协议找到本地网络上的路由器的物理地址,把包转发给它。路由器会按照如下步骤处理数据包:
1)如果数据包的生命周期已到,则该数据包被抛弃。
2)搜索路由表,优先搜索路由表中的主机,如果能找到具有目标IP地址的主机,则将数据包发送给该主机。
3)如果匹配主机失败,则继续搜索路由表,匹配同子网的路由器,如果找到匹配的路由器,则将数据包转发给该路由器。
4)如果匹配同子网的路有器失败,则继续搜索路由表,匹配同网络的路由器,如果找到匹配的路由器,则将数据包转发给该路由器。
5)如果以上匹配操作都失败,就搜索默认路由,如果默认路由存在,则按照默认路由发送数据包,否则丢弃数据包。
从以上路由器的处理步骤可以看出,IP协议并不保证一定把数据包送达目标主机,在发送过程中,会因为数据包结束生命周期,或者找不到路由而丢弃数据包。
(2)域名
尽管IP地址能够唯一标识网络上的主机,但IP地址是数字型的,用户记忆数字型的IP地址很不方便,于是人们又发明了另一种字符型的地址,即所谓的域名(Domain Name)。域名地址具有易于理解的字面含义,便于记忆。IP地址和域名一一对应。例如JavaThinker网站的域名为www.javathinker.org,对应的IP地址为:221.130.187.148。 域名是从右至左来表述其意义的,最右边的部分为顶层域,最左边的则是这台主机的机器名称。域名一般可表示为:主机机器名.单位名.网络名.顶层域名。如:mail.xyz.edu.cn,这里的mail是xyz学校的一个主机的机器名,xyz代表一个学校的名字,edu代表中国教育科研网,cn代表中国,顶层域一般是网络机构或所在国家地区的名称缩写。
DNS(Domain Name System)协议采用DNS服务器来提供把域名转换为IP地址的服务。DNS服务器分布在网络的各个地方,它们存放了域名与IP地址的映射信息。用户需要访问网络上某个主机时,只需提供主机的直观的域名, DNS协议首先请求地理上比较近的DNS服务器进行域名到IP地址的转换,如果在该服务器中不存在此域名信息,DNS协议再让远方的DNS服务器提供服务。
(3)URL(统一资源定位器)
URL是Uniform Resource Locator的缩写,表示统一资源定位器。它是专为标识网络上资源位置而设的一种编址方式,大家熟悉的网页地址就属于URL。URL一般由三部分组成:
应用层协议://主机IP地址或域名/资源所在路径/文件名
例如JavaThinker网站的BBS的URL为:http://www.javathinker.org/bbs/index.jsp。其中“http”指超文本传输协议,“www.javathinker.org”是Web服务器的域名,“bbs”是网页所在路径,“index.jsp”才是相应的网页文件。
在URL中,常见的应用层协议还包括ftp和file等,比如:
ftp://www.javathinker.org/image/
file:///C:\atomcat\webapps\javathinker\admin.jsp
以上file协议用于访问本地计算机上的文件,使用这种协议的URL以“file:///”开头。
3.TCP协议以及端口
IP协议在发送数据包时,途中会遇到各种事情,例如可能路由器突然崩溃,使包丢失。再例如一个包可能沿低速链路移动,而另一个包可能沿高速链路移动而超过前面的包,最后使得包的顺序搞乱。
TCP协议使两台主机上的进程顺利通信,不必担心包丢失或包顺序搞乱。TCP跟踪包顺序,并且在包顺序搞乱时按正确顺序重组包。如果包丢失,则TCP会请求源主机重发包。
如图14所示,两台主机上都会运行许多进程。当主机A上的进程A1向主机B上的进程B1发送数据时,IP协议根据主机B的IP地址,把进程A1发送的数据送达主机B。接下来TCP需要决定把数据发送到主机B中的哪个进程。TCP采用端口来区分进程。端口不是物理设备,而是用于标识进程的逻辑地址,更确切地说,是用于标识TCP连接的端点的逻辑地址。当两个进程进行一次通信,就意味着建立了一个TCP连接,TCP连接的两个端点用端口来标识。在图15中,进程A1与进程B1之间建立了一个TCP连接,进程B1的端口为80,因此进程B1的地址为:主机B:80。进程A1的端口为1000,因此进程A1的地址为:主机A :1000。每个进程有了惟一的地址,TCP就能保证把数据顺利送达到特定的进程。

图14 TCP采用端口来区分进程间的通信
端口号的范围为0到65535,其中0到1023的端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输)服务,80端口分配给Http(超级文本传输)服务,135端口分配给RPC(远程过程调用)服务等。 从1024到65535的端口号供用户自定义的服务使用。比如假定EchoServer服务使用8000端口。当EchoServer程序运行时,就会占用8000端口,当程序运行结束,就会释放所占用的端口。 客户进程的端口一般由所在主机的操作系统动态分配,当客户进程要求与一个服务器进程进行TCP连接,操作系统为客户进程随机地分配一个还未被占用的端口,当客户进程与服务器进程断开连接,这个端口就被释放。
此外还要指出的是,TCP和UDP都用端口来标识进程。在一个主机中,TCP端口与UDP端口的取值范围是各自独立的,允许存在取值相同的TCP端口与UDP端口。如图15所示,在主机A中,进程A1占用FTP端口1000,进程A2占用UDP端口1000,这是允许的。

图15 TCP端口与UDP端口的取值范围各自独立
4.RFC简介
TCP/IP协议是以RFC(Request For Comment)文档的形式发布的。RFC 是描述互联网相关技术规范的文档。
RFC由个人编写,这些人自愿编写某一新协议或规范的提议草案,并提交给IETF(The Internet Engineering Task Force ,Internet工程任务组织)。IETF负责审阅和发布这些统称为RFC的文档,每个文档都有一个RFC编号,并且处于以下六种类型之一:
l 标准协议:Internet 的官方标准协议。
l 标准协议草案:正在积极地考虑和审阅以便成为标准协议。
l 标准协议提议:将来可能变成标准协议。
l 实验性协议:为实验目的而设计的协议。实验性协议不投入实际运用。
l 报告性协议:由其他标准组织开发的协议。
l 历史性协议:已经过时的协议,被其他协议代替。
FRC的官方网站为:http://www.ietf.org/rfc.html。在该网站上已经发布了4000多份RFC文档。表2列出了与TCP/IP 协议相关的 RFC文档编号。
表2 与TCP/IP 协议相关的 RFC文档编号
RFC 编号 |
协议 |
768 |
用户数据报协议 (UDP) |
783 |
日常文件传输协议 (TFTP) |
791 |
Internet协议 (IP) |
792 |
Internet控制消息协议 (ICMP) |
793 |
传输控制协议 (TCP) |
821 |
邮件传输协议(SMTP) |
826 |
地址解析协议 (ARP) |
854 |
Telnet协议 (TELNET) |
862 |
回应协议 (ECHO) |
959 |
文件传输协议 (FTP) |
1157 |
简单网络管理协议 (SNMP) |
1939 |
邮局协议-版本3(POP3) |
1945 |
超级文本传输协议-版本1.0(HTTP1.0) |
2060 |
Internet消息访问协议-版本4(IMAP4) |
2068 |
超级文本传输协议-版本1.1(HTTP1.1) |
在FRC的官方网站上输入网址:http://www.ietf.org/rfc/rfcXXXX.txt,就能察看相关的FRC文档,这里的XXXX表示文档编号。例如FTP协议的RFC文档的网址为:http://www.ietf.org/rfc/rfc959.txt。
RFC文档一旦正式发布,其编号和内容就不允许改变。如果需要更新RFC文档,则会对更新后的RFC文档赋予新的编号,再将它发布。例如HTTP1.0协议对应的RFC文档为RFC1945,它的升级版本HTTP1.1协议对应的RFC文档为RFC2068。
5.客户/服务器通信模式
TCP/UDP协议推动了客户/服务器通信模式的广泛运用。在通信的两个进程中,一个进程为客户进程,另一个进程为服务器进程。客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求。如图16所示,通常,一个服务器进程会同时为多个客户进程服务,图16中服务器进程B1同时为客户进程A1、A2和B2提供服务。以下伪代码演示了服务器进程的大致工作流程:
while(true){
监听端口,等待客户请求;
响应客户请求;
}

图16 客户进程A1、A2和B2请求服务器进程B1的服务
|