2.4 TCP/IP参考模型***
TCP/IP是目前最成功、使用最频繁的互联协议。本节介绍TCP/IP参考模型以及ARP、RARP、ICMP、TCP和UDP等协议。
TCP/IP参考模型是四层结构,下面结合Sniffer软件来讲解TCP/IP参考模型的四层结构。Sniffer软件是NAI公司推出的功能强大的协议分析软件,具有捕获网络流量进行详细分析,实时监控网络活动,利用专家分析系统诊断问题,收集网络利用率和错误等功能。Sniffer的工作方式就是通过将网卡置为混杂模式,对网卡上接收到的数据包进行侦听、捕获和分析。有关Sniffer软件的具体使用这里不做介绍,如图2-4-1所示是Sniffer软件捕获的DNS查询和应答包。
在图2-4-1中,可以看到一个完整的TCP/IP应用数据包分为四层,分别是网络访问层(Network Access),也就是图2-4-1中的“DLC”层,包括OSI模型的物理层和数据链路层,在这一层可以看到数据帧的源和目的MAC地址;网际层(Internet),也就是图2-4-1中的“IP”层,相当于 OSI 模型中的网络层,在这一层可以看到数据包的源和目的 IP 地址;传输层(Transport),也就是图2-4-1中的“UDP”层,和OSI模型中的传输层一致,在这一层可以看到数据分段源和目的端口,以及所使用的协议,从图中可以看出,DNS服务主要使用的是UDP协议,服务端口是53;应用层(Application),也就是图2-4-1中的“DNS”层,包括 OSI 模型的上三层,即会话层、表示层和应用层,应用层中可以看到该DNS包是查询“www.nju.edu.cn”域名对应的IP地址。
图2-4-1 TCP/IP四层模型
ISO/OSI参考模型是在其协议被开发之前设计出来的。这意味着ISO/OSI模型并不是基于某个特定的协议集而设计的,因而它更具有通用性。但另一方面,也意味着 ISO/OSI模型在协议实现方面存在某些不足。而 TCP/IP 模型正好相反。先有协议,模型只是现有协议的描述,因而协议与模型非常吻合。问题在于TCP/IP模型不适合其他协议栈。因此,它在描述其他非 TCP/IP 网络时用处不大。下面来看看两种模型的具体差异。其中显而易见的差异是两种模型的层数不一样:ISO/OSI模型有七层,而TCP/IP模型只有四层。两者都有传输层和应用层,但其他层是不同的。两种模型之间的对应关系如图2-4-2所示。
图2-4-2 两种模型之间的对应关系
2.4.1 网络访问层***
网络访问层(Network Access)的功能包括IP地址与物理硬件地址的映射,以及将IP分组封装成帧。基于不同硬件类型的网络接口,网络访问层定义了和物理介质的连接。网络访问层包含了数据链路层的地址,如用在以太网上就是MAC 地址,在图2-4-1 中,可以看到数据帧的源MAC地址、目的MAC地址。此层是TCP / IP模型的最低层,负责接收从IP层传来的IP数据报,并将IP数据报通过低层物理网络发送出去,或者从低层物理网络上接收物理帧,解封装出IP数据报,交给IP层处理。
2.4.2 网际层***
网际层(Internet)的主要功能包括三个方面:
● 第一,处理来自传输层的分组发送请求:将分组装入 IP 数据报,填充报头,选择去往目的结点的路径,然后将数据报发往适当的网络接口。
● 第二,处理输入数据报:首先检查数据报的合法性,然后进行路由选择,假如该数据报已到达目的结点(本机),则去掉报头,将 IP 报文的数据部分交给相应的传输层协议;假如该数据报尚未到达目的结点,则转发该数据报。
● 第三,处理ICMP(Internet Control Message Protocol,网际控制信息协议)报文:即处理网络的路由选择、流量控制和拥塞控制等问题。
TCP/IP网络模型的互联网层在功能上非常类似于OSI参考模型中的网络层。
网际层上的协议如下:
1.IP协议
IP的责任就是把数据从源传送到目的地。它不负责保证传送可靠性、流控制、包顺序和其他对于主机到主机协议来说很普通的服务。IP实现两个基本功能:寻址和分段。IP可以根据数据报报头中包括的目的地址将数据报传送到目的地址,在此过程中 IP 负责选择传送的路线,这种选择路线称为路由功能。如果有些网络内只能传送小数据报,IP可以将数据报重新组装并在报头域内注明。
构成IP报头的字段如图2-4-3所示,括号中的数值表示该字段所占用的比特数。其中优先级和服务类型字段一般用于QoS(Quality of Service,服务质量);存活期(Time To Live, TTL)是数据报可以生存的时间上限,它由发送者设置,每经过一次路由,TTL至少减1,如果未到达目的地时生存时间减为零,则抛弃此数据报;源和目的 IP 地址用于表示数据从哪里来,要到哪里去。参加CCNA考试的考生没有必要记住IP报头中的每一个字段,简单了解上述几个字段就可以了。
图2-4-3 IP报头格式
IP不提供可靠的传输服务,它不提供端到端的或结点到结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。
2.ICMP(Internet Control Message Protocol,Internet控制消息协议)
提起ICMP,一些人可能会感到陌生,实际上,ICMP与我们息息相关。它是TCP/IP协议族的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
在网络体系结构的各层次中,都需要控制,而不同的层次有不同的分工和控制内容, IP层的控制功能是最复杂的,主要负责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的,在基于 IP 数据报的网络体系中,IP 协议自身没有内在机制来获取差错信息并处理。为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错误时,立即向信源主机发送ICMP报文,报告出错信息,让信源主机采取相应处理措施,它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。
我们在网络中经常会使用到ICMP协议,只不过觉察不到而已。比如经常使用的用于检查网络通不通的Ping命令,这个“Ping”的过程实际上就是ICMP协议工作的过程。发送主机首先发送一个ICMP Echo Request的包,包含64字节的数据,它被发送后,接收方会返回一个ICMP Echo Reply的包,返回的数据中包含了接收到的数据的拷贝。还有其他的网络命令,如跟踪路由的Tracert命令也是基于ICMP协议的。
ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文,IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。RFC定义了13种ICMP报文格式,具体如表2-4-1所示。
表2-4-1 ICMP报文格式
其中代码为15、16的信息报文已经作废。下面是几种常见的ICMP报文。
● 响应请求。我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个结点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的结点来确定主机与目标之间的网络距离。
● 目标不可到达、源抑制和超时报文。这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它提示的意思就是目标不可达。常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。
● 时间戳。时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。
3.ARP(Address Resolution Protocol,地址解析协议)
ARP负责将某个IP地址解析成对应的MAC 地址。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的,所谓“地址解析”就是主机在发送帧前根据目标IP地址得出目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
结合图2-4-4,讲解ARP的工作过程如下:
① 计算机A欲发送数据包到计算机B,计算机A确定要访问的计算机B与本计算机处在同一个网络192.168.1.0中,计算机A在本机的缓存中查询计算机B的IP地址所对应的MAC地址。
② 如果计算机A在本地缓存中找到192.168.1.3对应的MAC地址,则计算机A用此MAC地址封装帧,并发送出去。
③ 如果计算机A在本地缓存中没有找到192.168.1.3对应的MAC地址,则计算机A发送一个ARP的查询包(ARP Request)。ARP查询包中的源IP地址是计算机A的IP地址192.168.1.2,目标IP地址是计算机B的IP地址192.168.1.3,源MAC地址是计算机A的MAC 地址00-1B-24-7D-25-02,ARP 查询包中的目的MAC 地址是广播 MAC 地址FF-FF-FF-FF-FF-FF。计算机A封装完成后,把ARP查询包以广播的形式发送出去。
④ 计算机B和计算机C均收到此广播包,计算机B和计算机C解封装该数据包,计算机B和计算机C发现数据帧中的目的MAC不是本机网卡的MAC地址,但是广播MAC地址,计算机B和计算机C解封装该数据帧,把数据包传到网络层。计算机C检查数据包的目的IP地址,发现目的IP地址是192.168.1.3,与本机不同,计算机C放弃继续处理该数据包,同时在本地的缓存中增加或更新192.168.1.2对应的MAC地址条目。计算机B检查数据包中的目的IP地址,发现目的IP地址是192.168.1.3,与本机相同,计算机B在本地的缓存中增加或更新192.168.1.2对应的MAC地址条目。
⑤ 计算机B发现ARP查询包是询问本机IP地址所对应的MAC地址的,计算机B将发回ARP应答包(ARP Reply)。ARP应答包的源IP地址是192.168.1.3,目的IP地址是192.168.1.2,源MAC地址是00-1B-24-7D-25-03,目的MAC地址是00-1B-24-7D-25-02。该ARP应答包以单播的方式发送出去。
⑥ 如果是集线器相连的网络,则计算机A和计算机C均会收到此ARP应答包;如果是交换机相连的网络,因交换机可以基于目的MAC地址转发,则只有计算机A可以收到此ARP应答包。计算机C比较数据帧的目的MAC地址,发现与本机的不同,计算机C丢弃该数据包。计算机A收到此ARP应答包,可以获得计算机B对应的MAC地址。
⑦ 计算机A获得计算机B的MAC地址后,计算机A就可以向计算机B发送其他数据了。
图2-4-4 ARP工作过程
从上面的讲解中可知,ARP请求包是广播包,而ARP应答包是单播包。读者朋友如果想获知同一个局域网中某台计算机的MAC地址,可以先ping一下该计算机的IP地址,然后使用“arp-a”命令可以查看本机的ARP缓存表,从中可以找到某个IP地址对应的MAC地址。读者还可以使用“arp -d”命令删除本机的ARP缓存,使用“arp-s”命令把IP地址和MAC地址进行绑定。
注意:如果一台主机需要访问远端主机,数据帧封装的目的 MAC地址并不是远端主机的MAC地址,而是网关的MAC地址,有关这一点,本章后面有专门的讲解。
4.Proxy ARP(代理ARP)
前面介绍的 ARP 协议可以帮助主机或路由器获知局域以太网上某个 IP 地址对应的MAC地址,可却无法获知一台远程主机对应的IP地址,因为ARP查询包是广播包,路由器有隔离广播的作用,致使 ARP 查询包无法穿越路由器而到达远端的目的主机。局域网内的主机可以配置默认网关来访问远端主机,可主机不允许配置多个默认网关,考虑一下,如果某个默认网关(一般是路由器)因故障停机,会怎么样呢?即使该局域网还有另一台出口路由器,主机也不会向其他的路由器发送数据,此时需要重新配置主机的网关。而代理 ARP 则可以在这种情况下自动帮助那些在某个子网中的主机,在不重新配置路由甚至默认网关的情况下,发送数据到远端主机。
使用代理ARP可以在网络中单独增加一台路由器,而不会影响其他路由器的路由表。但是使用代理ARP也带来严重不足:使用代理ARP将会明显增加网络分段中的传输业务量,并且网络中的主机也将会保持比正常时大许多的ARP表,并以此来处理全部的IP到MAC的地址映射。有关这一点,可以在启用代理ARP网段的主机上使用“arp-a”命令查看,会发现有很多非本地子网中IP地址的映射条目,在没有启用代理ARP的情况下,主机只会有本地子网中主机的ARP缓存。
默认时,所有Cisco路由器以太网接口上都启用了代理ARP,如果不打算使用它,可以在路由器接口下使用“no ip proxy-arp”命令来关闭该功能。
5.RARP(Reverse Address Resolution Protocol,反向地址转换协议)
前面介绍的ARP是已知其他计算机的IP地址,查询其他计算机的MAC地址。而RARP是已知本机的MAC地址,询问本机的IP地址。典型用在无盘工作站上,当一台无盘工作站启动时,它没有办法在其初始化时了解自己的IP地址,但是,它可以知道自己的MAC地址。无盘工作站可以通过发送RARP的包来询问与此MAC地址相对应的IP地址,网络上会指定一个被称为RARP服务器的计算机来响应这个请求,这样无盘工作站就会得到自己的IP地址。
在前面ARP/RARP中曾提到过使用BOOTP和DHCP可以代替RARP,RARP是早期提供的通过硬件地址获取IP的解决方案,但它有自身的局限性,比如RARP客户与RARP服务器不在同一网段,中间有路由器等设备连接,这时候利用RARP就显得无能为力,因为RARP请求报文不能通过路由器。BOOTP协议提供了很好的解决方法,同样,在今天的大中型网络中,DHCP协议也是常用协议之一。接下来对BOOTP和DHCP进行简单介绍。
BOOTP:今天的网络,正常通信主机一般需要如下信息:IP 地址、子网掩码、网关(路由器地址)以及 DNS。BOOTP 是一种客户/服务器的协议,可以为无盘操作系统或第一次启动的计算机提供以上信息。实现过程分两种情况:
● 情况一:这与RARP工作环境一样,即客户与服务器在同一网段,BOOTP服务器被动打开UDP端口67,客户端通过UDP端口68发送请求,因为客户端不知道自己的IP地址,也不知道服务器的IP地址,客户机使用全0的源地址与全1的目标地址,服务器通过单播或广播方式响应。
● 情况二:客户与服务器在不同网段,实现的方法是,每个网段中设置一个中继代理,中继代理知道服务器的地址,其收到目标端口为67 的广播报文,就将该报文封装成单播数据报,然后发送给BOOTP服务器,服务器知道该报文来自于中继代理,因为在中继代理发送的报文中有其IP地址,中继代理收到BOOTP服务器的回应后,把它发送给BOOTP请求客户。
DHCP:DHCP与BOOTP协议差不多,但DHCP功能更强,不仅可以通过租期方便地实现动态分配,而且还可以提供除IP地址、子网掩码、网关以及DNS以外的几十个的网络参数。
ARP、Proxy ARP和RARP也属于网络访问层,可以说ARP协议跨越OSI七层模型的二层和三层。正因为如此,一些处在网络层的防火墙对低层的ARP攻击显得无能为力。
2.4.3 传输层***
在TCP/IP网络中,IP采用无连接的数据报机制,对数据进行“尽力而为的传递”,即只管将报文尽力传送到目的主机,无论传输正确与否,不做验证,不发确认,也不保证报文的顺序。TCP/IP的可靠性体现在传输层,传输层协议之一的TCP协议提供面向连接的服务(传输层的另一个协议 UDP 是无连接的)。传输层的主要功能是可靠而又准确地传输并控制源主机与目的主机之间的信息流,提供端到端的控制,通过滑动窗口机制提供流控制,通过序列号和确认机制来保证可靠性。TCP传输控制协议发送数据分段时,可以保证数据的完整性。流控制可以避免发送数据的主机使接收主机的缓存溢出的问题,缓存溢出会导致数据的丢失。可靠的传输可以通过下列方法实现:
● 接收方对收到的数据分段向发送方进行确认;
● 发送方向接收方重传所有未被确认的数据分段;
● 在目的端将数据分段按正确的顺序重组,并删除重复的数据分段;
● 提供避免和控制拥塞的机制。
1.TCP
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的传输层协议,能提供可靠的数据传输。在面向连接的环境中,开始传输数据之前,端点之间先要建立连接。TCP负责将消息拆分成数据分段,重传丢失的数据分段并将数据分段在目的主机重组成消息。TCP的数据分段格式如图2-4-5所示,参加CCNA考试的考生没有必要了解每一个字段,但了解 TCP 报头中的源端口、目的端口、序列号、确认号和窗口,有助于理解TCP传输的可靠性和TCP的滑动窗口机制。
图2-4-5 TCP的数据分段格式
TCP/IP协议组常用的协议如图2-4-6所示,其中使用TCP的应用层协议有FTP、HTTP、SMTP、POP3、Telnet和DNS等,使用UDP的协议有DNS和TFTP等。
图2-4-6 TCP/IP协议组常用协议
2.UDP
UDP(User Datagram Protocol,用户数据报协议)是TCP/IP协议栈中无连接的传输协议,其数据分段格式如图2-4-7所示。UDP是一种简单协议,它交换数据报而没有确认机制或传输保证,错误处理和重传机制必须由上层协议来完成。从TCP和UDP的数据分段格式中可以看出,UDP的简单性非常明显。UDP协议主要面向请求/应答式的交易型应用,一次交易往往只有一来一回两次报文交换,假如为此而建立连接和撤销连接,开销是相当大的。这种情况下使用UDP就非常有效。另外,UDP协议也应用于那些对可靠性要求不高,但要求网络的延迟较小的场合,如话音和视频数据的传送。
图2-4-7 UDP的数据分段格式
组播一般使用的都是UDP协议,很多广播教学软件,譬如“极域电子教室”教学软件等使用的就是组播地址和UDP协议,教师机只需要发送一份数据到组播地址,所有的学生机加入这个组播地址,接收教师机的广播教学,学生机的多少对教师机的性能影响不大。
Netmeeting程序又称网络会议,也可以用于广播教学,教师机可以共享自己的屏幕,可是这款软件使用的是TCP协议,是端到端的连接,需要确认重传机制,教师机的性能受学生机数量多少的影响,教师机最多只可以直接连接十几台学生机。
3.三次握手
TCP协议是面向连接的,所以它在开始传输数据之前需要先建立连接。要建立或初始化一个连接,两端主机必须同步双方的初始序号。同步是通过交换连接建立数据分段和初始序号来完成的,在连接建立数据分段中包含一个SYN(同步)的控制位。同步需要双方都发送自己的初始序号,并且发送确认的ACK。如图2-4-8所示,此交互过程就是所谓的三次握手。
图2-4-8 TCP三次握手
① 主机A发往主机B,主机A的初始序号是X,设置SYN位,未设置ACK位。
② 主机B发往主机A,主机B的初始序号是Y,确认号(ACK)是X+1,X+1确认号暗示已经收到主机A发往主机B的同步序号。设置SYN位和ACK位。
③ 主机A发往主机B,主机A的序号是X+1,确认号是Y+1,Y+1确认号暗示已经收到主机B发往主机A的同步序号。设置ACK位,未设置SYN位。
三次握手解决的不仅仅有序号问题,还解决了包括窗口大小、MTU(Maximum Transmission Unit,最大传输单元)以及所期望的网络延时等其他问题。
4.滑动窗口
在大多数可靠、面向连接的数据传输中,数据分组必须以与发送时相同的顺序传输到接收端。任何数据分组丢失、损坏、重复或接收时乱序都将导致协议出错。最基本的解决方法就是让接收方在接收到每一个数据分段后都确认。
如图2-4-9所示,如果发送方在发送每一个数据分段后都要等候确认,吞吐量是很低的,因此大多数面向连接、可靠的协议都允许一次发送多个数据分段。因为发送方在发送完数据分组之后和处理完接收到的确认之前是有一段时间间隔的,这段间隔可以用来传输更多的数据。在没有收到确认的情况下,窗口是允许发送方发送数据分组的个数的。
TCP 使用期待确认,即确认号就是所期待接收的下一个字节。滑动窗口是指在 TCP会话中窗口大小是动态协商的。滑动窗口是一种流控机制,允许源设备在向目的设备发送一定数量的数据之后接收一个确认。
图2-4-9 窗口大小为1
假设窗口大小为3,如图2-4-10所示。源设备可以发送3个字节到目的设备,然后需要等待一个确认。目的设备接收到这3个字节之后,向源设备返回一个确认,这时候源设备就可以继续传输下面3个字节了。如果目的设备没有收到这3个字节,它就不会返回确认,源设备没有接收到确认,它知道这些字节需要重传。
5.确认机制
TCP在传输前,需要对每个数据分段进行编号。接收端主机将数据分段重组成完整信息,TCP必须恢复由Internet通信系统导致的数据损坏、丢失、重复或乱序。TCP通过为传输的每个字节指定序号,并且要求接收端TCP的主动确认(ACK)来实现,如图2-4-11所示。
图2-4-10 窗口大小为3
① 源主机A远程登录目的主机B,源主机使用一个本地的随机端口1058,访问目的主机的23号服务端口。源主机初始序号是100,没有确认号。
② 主机 B 收到主机 A 的数据包进行响应,返回的数据包源端口是23,目的端口是1058,主机B返回的包中的端口号和主机A发过来的端口号中的源和目的端口刚好相反。主机B的初始序号是1,确认号101表示已经收到主机A的序号100,希望接收序号101的包。
③ 主机A对主机B发过来的包进行响应,发送的序号是101,确认号2表示已经收到主机B的序号1。
图2-4-11 TCP确认机制
2.4.4 应用层***
应用层包括所有的高层协议,与OSI的应用层协议相差不大,包括HTTP(超文本传输协议,使用TCP的端口80)、Telnet(远程登录协议,使用TCP的端口23)、FTP(文件传输协议,使用TCP的端口21)、SMTP(简单邮件传输协议,使用TCP的端口25)、POP3 (邮局3协议,使用TCP的端口110)、DNS(域名服务,使用UDP和TCP的端口53)等。