第1章 网络基础知识
本章总结了深入理解TCP/IP所必备的基础知识,其中包括计算机与网络发展的历史及其标准化过程、OSI参考模型、网络概念的本质、网络构建的设备等。
第2章 TCP/IP基础知识
TCP(Transmission Control Protocol)和IP(InternetProtocol)是互联网的众多通信协议中最为著名的。本章旨在介绍TCP/IP的发展历程及其相关协议的概况。
它只是利用IP进行通信时所必须用到的协议群的统称。具体来讲,IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP的协议。有时TCP/IP也称网际协议族。
TCP/IP的协议的标准化过程有两大特点:一是具有开放性,二是注重实用性,即被标准化的协议能否被实际运用。
区别:OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。
1.应用程序处理(应用层)-----编码处理与建立TCP连接。
2.TCP模块的处理(传输层)----- TCP根据应用的指示,复制建立连接、发送数据以及断开连接。
3.IP模块的处理(互联网层) ----- IP将TCP传过来的TCP首部和TCP数据合起来当做自己的数据,并在TCP首部的前端在加上自己的IP首部。因此,IP数据包中IP首部后面紧跟着TCP首部,然后才是应用的数据首部和数据本身。IP首部中包含接收端IP地址以及发送端IP地址。紧随IP首部的还有用来判断其后面数据时TCP还是UDP的信息。
4.网络接口(以太网驱动)的处理
包流动时,从前往后依次被附加了以太网包首部、IP包首部、TCP包首部(或UDP包首部)以及应用自己的包首部和数据。而包的最后则追加上了以太网包尾。
①每个包首部中至少都会包含两个信息:一个是发送端和接受端的地址,另一个是上一层的协议类型。
经过每个协议分层时,都必须有识别包发送端和接受端的信息。以太网会用MAC地址、IP会用IP地址,而TCP/UDP则会用端口号作为识别两端主机的地址。
②每个分层的包首部中还包含一个识别位,它是用来标识上一层协议的种类信息。例如以太网的包首部中的以太网类型,IP中的协议类型以及TCP/UDP中两个端口的端口号等都起着识别协议类型的作用。
1.网络接口(以太网驱动)的处理
主机收到以太网包后,首先从以太网的包首部找到MAC地址判断是否为发给自己的包。如果不是发给自己的包则丢弃。而如果是发给自己的包,就查找以太网包首部中的类型域从而确定以太网协议所传送过来的数据类型。如果这时不是IP而是其他诸如ARP的协议,就把数据传给ARP处理。总之,如果以太网包首部的类型域包含了一个无法识别的协议类型,则丢弃数据。
2.IP模块的处理
IP模块收到IP包首部及后面的数据部分以后,也做类似的处理。如果判断得出包首部中的IP地址与自己的IP地址匹配,则可以接收数据并从中查找上一层的协议。即如果上一层是TCP则交给TCP处理,如果是UDP则交给UDP处理。对于有路由器的情况下,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送达的主机或路由器以后再转发数据。
3.TCP模块的处理
在TCP模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接受数据。最后检查端口号,确定具体的应用程序。数据接收完毕后,接收端会发生一个“确认回执”给发送端。如果这个回执未能到达发送端,则发送端会认为接收端没有接收到数据而一直反复发送。
4.应用程序的处理
接收端应用程序接收数据。通过解析获取目的地址,如果没有该地址,会给发送端返回一个报错信息表明找不到目标。如果发送正常完成,就会给发送端发送一个“处理正常”的回执,反之发送“处理异常”。
第3章 数据链路
本章主要介绍计算机网络最基本的内容——数据链路层。如果没有数据链路层,基于TCP/IP的通信也就无从谈起。因此,本章将着重介绍TCP/IP的具体数据链路,如以太网、无线局域网、PPP等。
MAC地址用于识别数据链路中互连的节点(如图3.4)。以太网或FDDI中,根据IEEE02.3的规范使用MAC地址。其他诸如无线LAN、蓝牙等设备中也是用相同规格的MAC地址。
MAC地址长48比特,如下图。任何一个网卡的MAC地址都是唯一的。但存在例外情况,实际上即使MAC地址相同,只要不是同属一个数据链路就不会出现问题。
从通信介质的使用方法上看,网络可分为共享介质型和非共享介质型。
共享介质型网络指多个设备共享一个通信介质的一种网络,如最早的以太网和FDDI,在这种方式下,设备之间使用同一个载波信道进行发送和接收。为此,基本上采用半双工通信方式,并有必要对介质进行访问控制。
共享介质型网络有两种介质访问控制方式:
1.争用方式
争用方式是指多去数据传输的权利,也叫CSMA(载波监听多路访问)。这种方式通常令网络中的各个站采用先到先得的方式占用信道发送数据,如果多个站同时发送帧,则会发送冲突现象,因此导致网络拥堵与性能下降。
减弱冲突现象:
采用改良CSMA的另一种方式——CSMA/CD(载波监听多路访问/冲突检测)方式。CSMA/CD要求每个站提前检查冲突,一旦发生冲突,则尽早释放信道。
CSMA/CD工作原理(如图3.7):
①如果载波信道上没有数据流动,则任何站都可以发送数据。
②检查是否会发生冲突。一旦发生冲突,放弃发送数据,同时立即释放载波信道。
③放弃发送以后,随机延时一段时间,再重新争用介质,重新发送帧。
2.令牌传递方式
令牌传递方式是沿着令牌环发送一种叫做“令牌”的特殊报文,是控制传输的一种方式。只有获取令牌的站才能发送数据。 但在网络不太拥堵的情况下数据链路的利用率也达不到100%。
这种方式有两个特点:
①不会有冲突
②每个站都有通过平等循环获得令牌的机会。因此,既是网络拥堵也不会导致性能下降。
网络中的每个站直连交换机,由交换机转发帧。此方式下,发送端和接收端并不共享通信介质,因此很多情况下采用全双工通信方式。在一对一连接全双工的方式下不会发生冲突,因此不需要CSNA/CD就可以实现更高效的通信。
该方式还可以根据交换机的高效特性构建虚拟局域网(VLAN)、进行流量控制等。缺点是一旦换机发生故障,与之相连的计算机之间都无法通信。
以太网交换机就是持有多个端口的网桥。它们根据数据链路层中每个帧的目的MAC地址,决定从哪个网络接口发送数据。这时所参考的、用以记录发送接口的表叫做转发表。转发表的内容是自动生成的,这一过程叫自学过程。
解决网络中的环路问题有生成树和源路由两种方式。
1.生成树方式
每个网桥必须在每1~10秒内相互交换BPDU包,从而判断哪些端口使用哪些不使用,以便消除环路。一旦发生故障,则自动切换通信线路,利用那些没有被使用的端口继续进行传输。
2.源路由法
该方法可以判断发送数据的源地址是哪个网桥实现传输的,并将帧写入RIF。网桥根据这个RIF信息发送帧给目标地址。因此网桥中即使出现环路,数据帧也不会被反复转发。
相比一般的网桥/2层交换机,VLAN可以过滤多余的包,提高网络的承载效率。
如图3.15所示,该交换机按照其端口区分了多个网段,从而区分了广播数据传播的范围,减少了网络负载并提高了网络的安全性。
TAG VLAN中对每个网段都用一个VLAN ID 的标签进行唯一表示。在交换机传输帧时,在以太网首部加入这个VID标签,根据这个值决定将数据帧发送给哪个网段(如图3.16)。
以太网中以时钟频率决定传输速度。
1K=1000
1M=1000K
1G=1000M
以太网帧前端有一个前导码,它由0、1数字交替组成,表示一个以太网帧的开始,也是对端网卡能够确保与其同步的标志。如图3.19所示。前导码末尾是一个叫做SFD的域,它的值时“11”。在这个域之后就是以太网帧的本体。前导码与SFD合起来占8个字节。
以太网帧本体的前端是以太网的首部,它总共占14个字节。分别是6个字节的目标MAC地址、6个字节的源MAC地址以及2个字节的上层协议类型。
紧随帧头后面的是数据。一个数据帧所能容纳的最大数据范围是46~1500个字节。帧尾是一个叫做FCS(帧检验序列)的4个字节。它可以检查帧是否有所损坏,通过检查这个FCS字段的值可以将那些受到噪声干扰的错误帧丢弃。FCS中保存着整个帧除以生成多项式的余数。在接收端也用同样的方法计算,如果得到的FCS值相同,就说明帧没有差错。
PPP是指点对点,即1对1连接计算机的协议。PPP相当于位于OSI参考模型第2层的数据链路层。PPP可以使用电话线或ISDN、专线、ATM线路。
在PPP的主要功能中包含两个协议:一个是不依赖上层的LCP(Link Control Protocol)协议,另一个是依赖上层的NCP(Network Control Protocol)协议,如果上层为IP,也叫做IPCP(IP Control Protocol)。
LCP主要负责建立和断开连接、设置最大接受单元、设置验证协议(PAP或CHAP)以及设置是否进行通信质量的监控。
IPCP负责IP地址设置以及是否进行TCP/IP首部压缩等设备。
PPP的数据帧如图3.26所示。其中标志码用来区分每一个帧。在两个标志码中间不允许出现连续6个以上的“1”,因此在发送帧的时候,当连续出现5个“1”时后面必须插入一个0,接受端则当收到连续5个“1”且后面是0,则必须删除后面的0。
有些互联网接入服务商在以太网上利用PPPoE提供PPP功能。
ATM(Asunchronous Transfer Mode)是以一个叫做信元(5字节首部加488字节数据)的单位进行传输的数据链路,由于其线路占用时间短和能够高效传输大容量数据等特点主要用于广域网络的连接。
特点:
1.是一种面向连接的数据链路。允许同时与多个对端建立通信连接。
2.允许任何时候发送任何数据。因此,当大量计算机同时发送大量数据时容易引发网络拥堵甚至使网络进入收敛状态。
收敛状态:指当网络非常拥堵时,路由器或交换机无法完成包的处理,从而丢弃这些包的一种状态。
ATM与上层协议:
ATM的一个信元只能发送固定的48字节数据。这48个字节的数据部分若包含IP首部和TCP首部,则基本无法存放上层的数据。为此,一般不会单独使用ATM,而是使用上层的AAL。在上层为IP的情况下叫做AAL5。如图3.30所示,每个IP包被附加各层的协议首部以后,最多可以被分为192个信元发送出去。
弊端:在ATM网中即使只是一个信元丢失,也要重新发送最多192个信元。
所以在构建ATM网络的时候。必须保证终端的带宽合计小于主干网的带宽,还要尽量保证信元不易丢失。
虚拟专用网络(VPN)用于连接距离较远的地域。这种服务包括IP-VPN和广域以太网。
IP-VIN
指在IP网络(互联网)上建立VPN。
网络服务商提供一种在IP网络上使用MPLS技术构建VPN的服务。其中MPLS在IP包中附加一个叫做标签的信息进行传输控制。每个用户的标签信息不同,因此在通过MPLS网时,可以轻松地判断出目标地址。
广域以太网
服务提供商所提供的用于连接相距较远的地域一种服务。IP-VPN是在IP层面的连接,广域以太网则是在作为数据链路层的以太网上利用VLAN实现VPN的技术。
第4章 IP协议
IP(IPv4、IPv6)相当于OSI参考模型中的第3层——网络层。
网络层的主要作用是实现终端节点之间的通信。这种终端节点之间的通信也叫做“点对点(ebd-to-end)通信”。
网络层可以跨越不同的数据链路层,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。
主机与节点
准确的说,主机的定义是指“配置有IP地址,但是不进行路由控制的设备”。既配有IP地址又具有路由控制能力的设备叫做路由器。
数据链路层提供直连两个设备之间的通信功能。与之相比,作为网络层的IP则负责在没有直连的两个网络之间进行通信传输。以旅行为例:
本章我们来学习IP(Internet Protocol,网际协议)。IP作为整个TCP/IP中至关重要的协议,主要负责将数据包发送给最终的目标计算机。因此,IP能够让世界上任何两台计算机之间进行通信。本章旨在详细介绍IP协议的主要功能及其规范。
IP大致分为三大作用模块:IP寻址、路由(最终节点为止的转发)以及IP分包与组包。
在数据链路中MAC地址是用来标识同一个链路中的不同计算机的一种识别码,而网络层的IP也有这种地址信息,叫做IP地址。IP地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。因此,在TCP/IP通信中所有主机或路由器必须设定自己的IP地址。
路由控制(Routing)是指将分组数据发送到最终目标地址的功能。一个数据包之所以能够成功的到达最终的目标地址,全靠路由控制。
发送数据至最终目标地址
“跳”是指网络中的一个区间。IP路由也叫多跳路由,在每个区间内决定着包在下一跳被转发的路径。
多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指出来。如图4.6,以乘坐火车旅游为例:
路由控制表
为了将数据包发送给目标主机,所有主机都维护着一张路由控制表(Routing Table)。该表记录IP数据在下一步应该发送给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。
不同数据链路有个最大的区别,就是它们各自的最大传输单位(MTU)不同。如图4.9展示:
MTU的值在以太网中是1500字节,在FDDI中是4352字节,而ATM则为9180字。IP的上一层可能会要求传送比这些MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。
为了解决这个问题,IP进行分片处理,就是将较大的IP包分成多个较小的IP包。分片的包到了对端目标地址以后会再被组合起来传给上一层。即从IP的上次层来看,它完全可以忽略数据包在途中的各个数据链路上的MTU,而只需按照源地址发送的长度接收数据包。
采用面向无连接的原因一是为了简化,二是为了提速。面向连接比起面向无连接处理相对复杂。每次通信之前都要事先建立连接,降低了处理速度。
为了提高可靠性,上一层的TCP采用面向有连接型。
IP地址(IPv4地址)由32位正整数来表示。IP地址在计算机内部以二进制方式被处理。将32位的IP地址以每8位为一组,分成4组,每组以“.”隔开,再将每组数转换成十进制数。如:
如图4.11,网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。
IP地址的“主机标识”则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠。即IP地址具有了唯一性。
如图4.12所示,IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。
IP地址分为四个等级,分别为A类、B类、C类、D类。它根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。
A类地址:
A类地址:0.0.0.0~127.0.0.0是A类地址的网络地址。A类地址的后24位相当于主机标识。
B类地址:
B类地址:128.0.0.1~191.255.0.0是B类地址的网络地址。B类地址的后16位相当于主机标识。
C类地址:
C类地址:192.168.0.0~239.255.255.0是C类地址的网络地址。C类地址的后8位相当于主机标识。
D类地址:
D类地址:224.0.0.0~239.255.255.255是D类地址的网络地址。D类地址没有主机标识,常被用于多播。
关于分配IP主机地址的注意事项
主机地址不可以全为0或全为1,因为只有0在表示对应的网络地址或IP地址不可获知的情况下才使用。全为1的主机地址通常作为广播地址。
广播地址用于在同一个链路中相互连接的主机之间发送数据包。
两种广播: 本地广播和直接广播。
本地广播:在本网络内的广播叫做本地广播。例如网络地址为192.168.0.0/24的情况下,广播地址是192.168.0.255。因为这个广播地址会的IP包会被路由器屏蔽,所以不会到达192.168.0.0/24以外的其他链路上。
直接广播:在不同网络之间的广播叫做直接广播。例如网络地址为192.168.0.0/24的主机向192.168.1.255/24的目标地址发送IP包。收到这个包的路由器,将数据转发给192.168.1.255/24,从而使得所有192.168.1.1~192.168.1.254的主机都能接收到这个包。
多播用于将包发送给特定组内的所有主机。由于其直接使用IP地址,因此也不存在可靠传输。多播既可以穿透路由器(广播不可以),又可以实现只给那些必要的组发送数据包。
IP多播与地址
多播使用D类地址。因此,如果从首位开始到第4位是“1110”,就可以认为是多播地址。而剩下的28位可以成为多播的组编号。
从224.0.0.0到239.255.255.255都是多播地址的可用范围。其中从224.0.0.0到224.0.0.255的范围不需要路由控制,在同一个链路内也能实现多播。而在这个范围之外设置多播地址会给全网所有组内成员发送多播的包。
此外,对于多播,所有的主机(路由器意外的主机和终端主机)必须属于224.0.0.1的组,所有的路由器必须属于224.0.0.2的组。
子网与子网掩码
这种方式实际上就是将原来的A类、B类、C类等分类中的主机地址部分用作子网地址,可以将原网络分为多个物理网络的一种机制。
自从引入子网以后,一个IP地址就有了两种识别码。一是IP地址本身,另一个是表示网络部的子网掩码。子网掩码对应IP地址网络标识部分的位全部为“1”,对应IP地址主机标识的部分全部为“0”。子网掩码必须是IP地址的首位开始连续的“1”。
私有网络的IP地址范围如下:
如果配有私有IP的地址主机联网时,则通过NAT进行通信。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址,所谓最为吻合是指相同位数最多的意思。
主机路由
例如,192.168.153.15/32就是一种主机路由。它的意思是整个IP地址的所有位都将参与路由。
环回地址
127.0.0.1/localhost,使用这个IP或主机名时,数据包不会流向网络。
图4.24展示了网络传输过程中进行分片处理的一个例子。
经过分片后的IP数据报在被重组的时候,只能有目标主机进行。路由器虽然做分片但不会进行重组。因为即使在途中某一处被重组,但如果下一站再经过其他路由是还会面临被分片的可能。这会给路由器带来多余的负担,也会降低网络传送效率。
分片机制的不足:
为了应对以上问题,产生了“路径MTU发现”(Path MTU Discovery)。所谓路径MTU发现是指从发送端到接收端主机之间不需要分片时最大MTU的大小。即路径中存在的所有数据链路中最小的MTU。
路径MTU发现工作原理:
首先在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1。根据这个标志位,途中的路由器即使遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。随后,通过一个ICMP的不可达消息将数据链路上MTU的值发送给主机。
下一次,从发送给同一个目标主机的IP报获得ICMP所通知的MTU值以后吗,将它设置为当前MTU。
路径MTU发现的机制(UDP): IP层负责分片!
路径MTU发现的机制(TCP): TCP负责分片,IP层不分片!!
1. IP地址的扩大与路由控制表的聚合
IP地址依然适应互联网分层构造。分配与其地址结构相适应的IP地址,尽可能避免路由表膨大。
2.性能提升
包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负荷。路由器不再做分片处理(通过路径MTU发现只由发送端主机进行分片处理)。
3.支持即插即用功能
即使没有DHCP服务器也可以实现自动分配IP地址。
4.采用认证与加密功能
5.多播、Mobile IP成为扩展功能
版本
由4比特构成。
首部长度
由4比特构成,标识IP首部的大小,单位为4字节。
区分服务
总长度
由16比特构成。
标识(ID)
由16比特构成,用于分片重组。同一个分片的标识值相同。通常,每发送一个IP包,它的值也逐渐增加。此外,即使ID相同,如果目标地址、源地址或协议不同的话也认为是不同的分片。
标志(Flags)
由3比特构成。
片偏移(FO)
由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。由于FO域占13位,因此最多可以表示8192(=2^13)个相对位置。单位为8字节,因此最大可表示原始数据8 x 8192 = 65536字节的位置。
生存时间(TTL)
由8比特构成,实际中是指可以中转多少个路由器,每经过一个路由器TTL就减1,直到变成0则丢弃该包。
协议
由8比特构成,标识IPO首部的下一个首部隶属于哪个协议。
首部校验和
由16比特(2个字节)构成,也叫IP首部校验和。该字段只校验数据报的首部,不校验数据部分。它主要用来确保IP数据报不被破坏。校验和的计算过程,首先要将该校验和的所有位置置0,然后以16比特为单位划分IP首部,并用1补救所有的16位字的和。最后将所得到的这个和的1补救赋给首部校验和字段。
源地址
由32比特(4个字节)构成。
目标地址
由32比特(4个字节)构成。
可选项
长度可变。
填充
数据
IPv6中为了减少路由器的负担,省略了首部校验和字段。因此路由器不再需要计算校验和,从而也提高了包的转发效率。
版本
由4比特构成。
通信量类
由8比特构成。
流标号
由20比特构成。
有效载荷长度
有效载荷是指包的数据部分,不包含首部。
下一个首部
跳数限制(Hop Limit)
由8比特构成。
源地址
目标地址
扩展首部
扩展首部通常介于IPv6首部与TCP/IP首部之间。
第5 章IP协议相关技术
IP(Internet Protocol)旨在让最终目标主机收到数据包,但是在这一过程中仅仅有IP是无法实现通信的。必须还有能够解析主机名称和MAC地址的功能,以及数据包在发送过程中异常情况处理的功能。此外,还会涉及IP必不可少的其他功能。
本章主要介绍作为IP的辅助和扩展规范的DNS、ARP、ICMP以及DHCP等协议。
可以有效管理主机名和IP地址之间对应关系的系统,那就是DNS。在这个系统中主机的管理机构可以对数据进行变更和设定。也就是说,它可以维护一个用来表示组织内部主机名和IP地址之间对应关系的数据库。
解析器(进行DNS查询的主机和软件叫做DNS解析器,如工作站或个人电脑)为了调查IP地址,向域名服务器进行查询处理。接收这个查询请求的域名服务器首先在自己的数据库进行查找。如果有该域名所对应的IP地址就返回。如果没有,则域名服务器再向上一层根域名服务器进行查询处理。
解析器和域名服务器将最新了解到的信息暂时保存在缓存中。这样,可以减少每次查询时的性能消耗。
ARP是一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路由器的MAC地址。不过ARP只适用于IPv4,IPv6可以用ICMPv6代替ARP发送邻居探索消息。
ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。
如图5.6,主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其MAC地址的主机IP地址。也就是说,ARP请求包中已经包含了主机B的IP地址172.20.1.2。ARP的请求包会被这同一个链路上的所有主机或路由器接收,如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。
总之,从一个IP地址发送ARP请求以了解其MAC地址,目标地址将自己的MAC地址填入其中的ARP响应包返回到IP地址。由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。
如果每发送一个IP数据报都有进行一次ARP请求以确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存一段时间。 在发送主机端和接收主机端缓存MAC地址也是一种提高效率的方法。
一、有了mac为什么还需要ip
有唯一mac固然可以寻址,但是却不方便。mac地址是出厂自带的,至于后续设备到了哪里都是不可控的,所以mac没有规律可循。就好像快递员只用身份证号找人,由于人口是流动的,不一定就待在身份证号上的户籍地址,所以寻找难度过大。ip的优势正在于此。因为ip地址是可变的,且分为网络地址和主机地址,每一个接入网络的设备由DHCP服务器自动分配ip地址,同一个子网中的ip前几位是一样的,空间上靠近的设备ip前几位一样大大方便了寻址过程,再也不用满世界去找了,可以先找到子网,再在子网内找设备。
二、有了ip为什么还需要mac
(1)ip地址不是与生俱来,需要在接入网络后设备发送广播请求ip,DHCP服务器收到请求发送一个空闲的ip,设备收到回复发送租用请求,最后DHCP发送消息表示租用成功。在这个过程中由于设备还没有ip地址,所以需要mac地址来标识自己。假如同时有两个没有mac的设备接入网络,同时请求ip,那么DHCP服务器将不能区分是收到了两个请求还是同一个请求收到了两遍。
(2)mac先于ip存在,tcp/ip协议诞生之前就有五花八门的网络,互相之间协议不互通,mac就是其中一个,tcp/ip在更高层次上将他们连接起来,至于底层是什么交由各自管理。后来mac接近一统江湖,但是大局已定,而且这样做并没有明显的缺点,如果改动反而是困难重重(ipv6比v4那么大的优势缺还是难以取代),所以便沿用早期设计。
RARP是将ARP反过来,从MAC地址定位IP地址的一种协议。如图5.9
通常ARP包会被路由器隔离,但是采用代理ARP(Proxy ARP)的路由器可以将ARP请求转发给邻近的网段。由此,两个以上网段的节点之间可以像在同一个网段中一样进行通信。
构架IP网络时需要注意两点:确定网络是否正常运行以及遇到异常时进行问题诊断。ICMP(Internet Control Message Protocol)网际控制报文协议,正时提供这类功能的一种协议。
主要功能:
1.确认IP包是否发送成功送达目标地址
2。通知在发送过程当中IP包被废弃的具体原因
3.改善网络设置等。
4.有了这些功能,就可以获取网络是否正常、设置是否有误以及设备有何异常等信息,从而便于进行网络上的问题诊断。
如图5.10,主机A向主机B发送了数据包,由于某种原因,途中的路由器2未能发现主机B的存在,这时,路由器2就会向主机A发送一个ICMP包,说明发往主机B的包未能成功。
ICMP的这种通知消息会使用IP进行发送。因此,从路由器2返回的ICMP包会按照往常的路由控制先经过路由器1再转发给主机A。收到该ICMP包的主机则分解ICMP的首部和数据域以后得知具体发送问题的原因。
ICMP的消息大致可分为两类:一类是通知出错原因的错误消息,另一类是用于诊断的查询消息。
ICMP目标不可达消息(类型3)
IP路由器无法将IP数据包发送给目标地址时,会给发送端主机返回一个目标地址不可达的ICMP消息,并在这个消息中显示不可达的具体原因。如表5.3所示
ICMP重定向消息(类型5)
如果路由器发现发送端主机使用了次优的路径发送数据,那么它会返回一个ICMP重定向的消息给这个主机。在这个消息中包含了最合适的路由信息和源数据。这主要发生在路由器持有更好的路由信息的情况下。路由器会通过这样的ICMP消息给发送端主机一个更合适的发送路由。
ICMP超时消息(类型11)
IP包中有一个字段叫做TTL(Time to Live,生存周期),它的值随着每经过一次路由器就会减1,直到减到0时该IP包会被丢弃。此时,IP路由器将会发送一个ICMP超时的消息给发送端主机,并通知该包已被丢弃。
设置IP包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免IP包无休止地在网络上上被转发。此外,有时可以用TTL控制包的到达范围,例如设置一个较小的TTL值。
ICMP回送消息(类型0、8)
用于进行通信的主机或路由器之间,判断所发送的数据包是否成功到达对端的一种消息。可以向对端主机发送回送请求的消息,也可以接收对端主机发回来的回送应答消息,网络上最常用的ping命令就是利用这个消息实现的。
为了实现自动设置IP地址、统一管理IP地址分配,就产生了DHCP协议。DHCP在IPv4和IPv6都可以使用。
使用DHCP之前,首先要架构一台DHCP服务器。然后将DHCP所要分配的IP地址设置到服务器上。此外,还需要将响应的子网掩码、路由控制信息以及DNS服务器的地址等设置到服务器上。
关于从DHCP中获取IP地址的流程,以图5.17为例
为了检查所要分配的IP地址以及已经分配了的IP地址是否可用,DHCP服务器或客户端必须具备以下功能:
DHCP服务器
在分配IP地址前发送ICMP回送请求包,确定没有返回应答。
DHCP客户端
针对从DHCP那里获得的IP地址发送ARP请求包,确认没有返回应答。
一个企业或学校等大规模组织机构的网络环境当中,会有多个以太网(无线LAN)网段。在这种情况下,若要针对每个网段都设置DHCP服务器将会是个庞大的工程。
因此,在这类网络环境中,往往需要将DHCP统一管理。具体方法可以使用DHCP中继代理来实现。
DHCP客户端会向DHCP中继代理发送DHCP请求包,而DHCP中继代理在收到这个广播包以后再以单播的形式发给DHCP服务器。服务器端收到该包以后再向DHCP中继代理返回应答,并由DHCP中继代理将此包转发给DHCP客户端。由此,DHCP服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。
NAT(Network Address Translator)是用于在本地网络中使用私有地址,在连接到互联网时转而使用全局IP地址的技术。除转换IP地址外,还出现了可以转换TCP、UDP端口号的NAPT。
如图5.19所示
包含端口号的转换方式(NAPT)
在使用TCP/UDP的通信当中,只有目标地址、源地址、目标端口、源端口以及协议类型(TCP还是UDP)五项内容都一致时才被认为是同一个通信连接。此时所使用的正是NAPT。
如图5.20所示,生成一个NAPT路由器的转换表,就可以正确地转换地址跟端口的组合。这种转换表在NAT路由器上自动生成。例如,在TCP的情况下,建立TCP连接首次握手时的SYN包一经发出,就会生成这个表。而后又随着收到关闭连接时发出FIN包的确认应答从表中被删除。
NAT-PT是将IPv6的首部转换为IPv4的首部的一种技术。
IP任播是指为那些提供同一种服务的服务器配置同一个IP地址,并与最近的服务器进行通信的一种方法。主要用于110报警和119。
通信质量的定义
通信线路上的拥塞叫做收敛。当网络发生故障时,路由器和集线器(交换集线器)的队列溢出,会出现大量的丢包现象,从而极端影响通信性能。
控制通信质量的机制
① IntServ
IntServ是针对特定应用之间的通信进行质量控制的一种机制。这里的“特定的应用”是指源IP地址、目标IP地址、源端口、目标端口、以及协议号五项内容完全一致。
IntServ所涉及的通信并非一直进行,只是在必要的时候进行。一次IntServ也只有在必要的时候才要求在路由器上进行设置,这也叫“流量设置”,实现这种流量控制的协议正是RSVP。
RSVP中在接收端针对发送端传送控制包,并在它们之间所有的路由器上进行有质量控制的设定。
② DiffServ
IntServ针对应用的连接进行详细的通信质量控制。相比之下,DiffServ则针对特定的网络进行较粗粒度的通信质量控制。
进行DiffServ质量控制的网络叫做DiffServ域。在该域中的路由器会对所有进入该域IP包首部的DSCP字段进行替换。对于期望被优化处理的包设置一个优先值。
当发生网络拥塞时,发生主机应该减少数据包的发送量。作为IP上层协议,TCP虽然也能控制网络拥塞,不过它是通过数据包的实际损坏情况来判断是否发生拥塞。然而这种方法并不能在数据包损坏之前减少数据包的发送量。
为了解决这个问题,人们在IP层新增了一个使用显示拥塞通知的机制,即ECN。
ECN的机制概况起来就是在发送包的IP首部中记录路由器是否遇到拥塞,并在返回包的TCP首部中通知是否发生拥塞。拥塞检查在网络层进行,而拥塞通知则在传输层进行,这两层的互相协助实现了拥塞通知的功能。
第6章 TCP与UDP
本章旨在介绍传输层的两个主要协议TCP(Transmission ControlProtocol)与UDP(User Datagram Protocol)。
TCP
TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构。当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。
TCP为提供可靠性传输、实行“顺序控制”或“重发控制”机制。此外还具有“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
UDP
UDP是不具备可靠性的数据报协议。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。
UDP主要用于对高速传输和实时性有较高要求的通信或广播通信。以IP电话通信为例,如果使用TCP,数据在传送过程中如果丢失被重发,这样无法流畅地传输通话人的声音,会导致无法正常交流。而采用UDP,它不会进行重发处理。即使有部分数据丢失,也只是影响一小部分的通话。此外,在多播和广播通信中也使用UDP。RIP、DHCP等基于广播的协议也要依赖于UDP。
UDP是User Datagram Protocol的缩写。
UDP不提供复杂的控制协议,利用IP提供面向无连接的通信服务。
即使是出现网络拥塞的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。传输途中如果出现丢包,UDP也不负责重发。当出现包顺序乱掉的时候也没有纠正的功能。
由于UDP面向无连接,它可以随时发送数据。再加上UDP本身的处理既简单又高效,因此经常用于以下几个方面:
TCP与UDP的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。TCP作为一种面向连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
TCP通过检验和、序列化、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。
在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个亿收到消息的通知。这个消息叫做确认应答(ACK)。
如图6.8与6.9所示
这些确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现。序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。
TCP在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。如果对端发来确认应答,则认为可以进行数据通信。此外,在通信结束时会进行断开连接的处理(FIN包)。
可以使用TCP首部用于控制的字段来管理TCP连接。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成。
在建立TCP连接时,也可以确定发送数据包的单位,称为“最大消息长度”(MSS:Maximun Segment Size)。最理想的情况是:最大消息长度正好是IP中不会被分片处理的最大数据长度。
TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。
MSS是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小,然后在两者之间选择一个较小的值。
窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。图6.15中,窗口大小为4个段。
滑动窗口方式:
在使用窗口控制中,如果出现段丢失该怎么办?
首先,我们先考虑确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的。然而,在没有使用窗口控制的时候,没有收到确认应答的数据都会被重发。而使用了窗口控制,就如图6.17所示,某些确认应答即便丢失也无需重发。
其次,我们来考虑一下某个报文段丢失的情况。如图6.18所示,接收主机如果收到一个自己应该接收的序号以外的数据时,会针对当前为止收到数据返回确认应答(不过即使接收端主机收到的包序号并不连续,也不会将数据丢弃而是暂时保存至缓冲区中)。
如图6.18所示。当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,这个确认应答好像在提醒发送端“我想接收的是从1001开始的数据”。因此,在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答 ,就会将其所对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称作高速重发控制。
发送端根据自己的实际情况发送数据。但是,接收端可能收到的是一个毫无关系的数据包又可能会在处理其他问题上花费一些时间。为了防止这种现象的发生,TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量。这就是所谓的流控制。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。
TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。
不过,接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制。这也就形成了一个完整的TCP流控制(流量控制)。
图6.19为根据窗口大小控制流量过程的示例。
如图6.19所示,当接收端收到从3001号开始的数据段后其缓冲区即满,不得不暂时停止接收数据。之后,在收到发送窗口更新通知后通信才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会导致无法继续通信。为避免此类问题的发生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。
一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。
TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。
首先,为了在发送端调节所要发送数据的量,定义了一个叫做“拥塞窗口”的概念。于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1MSS) 发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小那个值,发送比其还要小的数据量。
如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。有了上述这些机制,就可以有效地减少通信开始时连续发包导致的网络拥堵,还可以避免网络拥塞情况的发生。
不过,随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超出这个阀值,在每收到一次确认应答时,只允许以下面这种比例放大拥塞窗口:
拥塞窗口越大,确认应答的数目也会增加。不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过比一个数据段还要小的字节数。因此,拥塞窗口的大小会呈直线上升的趋势。
TCP的通信开始时,并没有设置相应的慢启动阀值 。而是在超时重发时,才会设置为当时拥塞窗口一半的大小。
由重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同。因为前者要求至少3次的确认应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。
而由重复确认应答进行高速重发控制时,慢启动阀值的大小被设置为当时窗口大小的一半(严格来说,是设置为“实际已发送但未收到确认应答的数据量”的一半)。然后将窗口的大小设置为该慢启动阀值+3个数据段的大小。
有了这样一种控制,TCP的拥塞窗口如图6.21所示发生变化。由于窗口的大小会直接影响数据被转发时的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。
UDP-Lite(Lightweight User Datagram Protocol,轻量级用户数据报协议)是扩展UDP机能的一种传输层协议。在基于UDP的通信当中如果校验和出现错误,所收到的包将被全部丢弃。然而,现实操作中,有些应用(例如那些使用H.263+,H.264,MPEG-4等图像与音频数据格式的应用。) 在面对这种情况时并不希望把已经收到的所有包丢弃。
UDP-Lite提供与UDP几乎相同的功能,不过计算校验和的范围可以由应用自行决定。这个范围可以是包加上伪首部的校验和计算,可以是首部与伪首部的校验和计算,也可以是首部、伪首部与数据从起始到中间某个位置的校验和计算 。有了这样的机制,就可以只针对不允许发生错误的部分进行校验和的检查。对于其他部分,即使发生了错误,也会被忽略不计。而这个包也不会被丢弃,而是直接传给应用继续处理。
SCTP(Stream Control Transmission Protocol,流控制传输协议)与TCP一样,都是对一种提供数据到达与否相关可靠性检查的传输层协议。其主要特点如下:
SCTP主要用于进行通信的应用之间发送众多较小消息的情况。这些较小的应用消息被称作数据块(Chunk),多个数据块组成一个数据包。
此外,SCTP具有支持多重宿主以及设定多个IP地址的特点。多重宿主是指同一台主机具备多种网络的接口。例如,笔记本电脑既可以连接以太网又可以连接无线LAN。同时使用以太网和无线LAN时,各自的NIC会获取到不同的IP地址。进行TCP通信,如果开始时使用的是以太网,而后又切换为无线LAN,那么连接将会被断开。因为从SYN到FIN包必须使用同一个IP地址。
然而在SCTP的情况下,由于可以管理多个IP地址使其同时进行通信,因此即使出现通信过程当中以太网与无线LAN之间的切换,也能够保持通信不中断。所以SCTP可以为具备多个NIC的主机提供更可靠的传输(持有多个NIC的应用服务器中,即使某一个NIC发生故障,只要有一个能够正常工作的NIC就可以保持通信无阻) 。
DCCP(Datagram Congestion Control Protocol,数据报拥塞控制协议)是一个辅助UDP的崭新的传输层协议。UDP没有拥塞控制机制。为此,当应用使用UDP发送大量数据包时极容易出现问题。于是便出现了DCCP这样的规范。
DCCP具有如下几个特点:
图6.24展示了UDP首部的格式。除去数据的部分正是UDP的首部。UDP首部由源端口号,目标端口号,包长和校验和组成。
■ 源端口号(Source Port)
表示发送端端口号,字段长16位。该字段是可选项,有时可能不会设置源端口号。没有源端口号的时候该字段的值设置为0。可用于不需要返回的通信中。
■ 目标端口号(Destination Port)
表示接收端端口,字段长度16位。
■ 包长度(Length)
该字段保存了UDP首部的长度跟数据的长度之和 。单位为字节(8位字节)。
■ 校验和(Checksum)
校验和是为了提供可靠的UDP首部和数据而设计。
图6.26展示了TCP首部的格式。TCP首部相比UDP首部要复杂得多。另外,TCP中没有表示包长度和数据长度的字段。可由IP层获知TCP的包长由TCP的包长可知数据的长度。
■ 源端口号(Source Port)
表示发送端端口号,字段长16位。
■ 目标端口号(Destination Port)
表示接收端端口号,字段长度16位。
■ 序列号(Sequence Number)
字段长32位。序列号(有时也叫序号)是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。
序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。
■ 确认应答号(Acknowledgement Number)
确认应答号字段长度32位。是指下一次应该收到的数据的序列号。实际上,它是指已收到确认应答号减一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。
■ 数据偏移(Data Offset)
该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看作TCP首部的长度。该字段长4位,单位为4字节(即32位)。不包括选项字段的话,如图6.26所示TCP的首部为20字节长,因此数据偏移字段可以设置为5。反之,如果该字段的值为5,那说明从TCP包的最一开始到20字节为止都是TCP首部,余下的部分为TCP数据。
■ 保留(Reserved)
该字段主要是为了以后扩展时使用,其长度为4位。一般设置为0,但即使收到的包在该字段不为0,此包也不会被丢弃 。
■ 控制位(Control Flag)
字段长为8位,每一位从左至右分别为CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫做控制位。当它们对应位上的值为1时,具体含义如图6.27所示。
CWR(Congestion Window Reduced)
CWR标志 与后面的ECE标志都用于IP首部的ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小。
ECE(ECN-Echo)
ECE标志 表示ECN-Echo。置为1会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1。
URG(Urgent Flag)
该位为1时,表示包中有需要紧急处理的数据。
ACK(Acknowledgement Flag)
该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1。
PSH(Push Flag)
该位为1时,表示需要将受到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。
RST(Reset Flag)
该位为1时表示TCP连接中出现异常必须强制断开连接。例如,一个没有被使用的端口即使发来连接请求,也无法进行通信。此时就可以返回一个RST设置为1的包。
SYN(Synchronize Flag)
用于建立连接。SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定(Synchronize本身有同步的意思。也就意味着建立连接的双方,序列号和确认应答号要保持同步) 。
FIN(Fin Flag)
该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。每个主机又对对方的FIN包进行确认应答以后就可以断开连接。不过,主机收到FIN设置为1的TCP段以后不必马上回复一个FIN包,而是可以等到缓冲区中的所有数据都因已成功发送而被自动删除之后再发。
■ 窗口大小(Window Size)
该字段长为16位。用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小(8位字节)。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。但这个数据必须是1个字节。
■ 校验和(Checksum)
TCP和UDP一样在计算校验和的时候使用TCP伪首部。这个伪首部如图6.28所示。为了让其全长为16位的整数倍,需要在数据部分的最后填充0。首先将TCP校验和字段设置为0。然后以16位为单位进行1的补码和计算,再将它们总和的1的补码和放入校验和字段。
接收端在收到TCP数据段以后,从IP首部获取IP地址信息构造TCP伪首部,再进行校验和计算。由于校验和字段里保存着除本字段以外其他部分的和的补码值,因此如果计算校验和字段在内的所有数据的16位和以后,得出的结果是“16位全部为1 ”说明所收到的数据是正确的。
使用校验和的目的是什么?
TCP或UDP如果能够提供校验和计算,也可以判断协议首部和数据是否被破坏。
■ 紧急指针(Urgent Pointer)
该字段长为16位。只有在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。正确来讲,从数据部分的首位到紧急指针所指示的位置为止为紧急数据。因此也可以说紧急指针指出了紧急数据的末尾在报文段中的位置。
■ 选项(Options)
选项字段用于提高TCP的传输性能。因为根据数据偏移(首部长度)进行控制,所以其长度最大为40字节。
窗口大小与吞吐量
TCP通信的最大吞吐量由窗口大小和往返时间决定。假定最大吞吐量为Tmax ,窗口大小为W,往返时间是RTT的话,那么最大吞吐量的公式如下:
假设窗口为65535字节,RTT为0.1秒,那么最大吞吐量Tmax 如下:
以上公式表示1个TCP连接所能传输的最大吞吐量为5.2Mbps。如果建立两个以上连接同时进行传输时,这个公式的计算结果则表示每个连接的最大吞吐量。也就是说,在TCP中,与其使用一个连接传输数据,使用多个连接传输数据会达到更高的网络吞吐量。在Web浏览器中一般会通过同时建立4个左右连接来提高吞吐量。
第7章 路由协议
在互联网世界中,夹杂着复杂的LAN和广域网。然而,再复杂的网络结构中,也需要通过合理的路由将数据发送到目标主机。而决定这个路由的,正是路由控制模块。本章旨在详细介绍路由控制以及实现路由控制功能的相关协议。
互联网是由路由器连接的网络组合而成的。为了能让数据包正确达地到达目标主机,路由器必须在途中进行正确地转发。这种向“正确的方向”转发数据所进行的处理就叫做路由控制或路由。
路由器根据路由控制表(Routing Table)转发数据包。它根据所收到的数据包中目标主机的IP地址与路由控制表的比较得出下一个应该接收的路由器。因此,这个过程中路由控制表的记录一定要正确无误。但凡出现错误,数据包就有可能无法到达目标主机。
路由控制分静态(Static Routring) 和动态(Dynamic Routing) 两种类型。
静态路由是指事先设置好路由器和主机中并将路由信息固定的一种方法。而动态路由是指让路由协议在运行过程中自动地设置路由控制信息的一种方法。这些方法都有它们各自的利弊。
静态路由的设置通常是由使用者手工操作完成的。例如,有100个IP网的时候,就需要设置近100个路由信息。并且,每增加一个新的网络,就需要将这个新被追加的网络信息设置在所有的路由器上。因此,静态路由给管理者带来很大的负担,这是其一。还有一个不可忽视的问题是,一旦某个路由器发生故障,基本上无法自动绕过发生故障的节点,只有在管理员手工设置以后才能恢复正常。
使用动态路由的情况下,管理员必须设置好路由协议,其设定过程的复杂程度与具体要设置路由协议的类型有直接关系。例如在RIP的情况下,基本上无需过多的设置。而根据OSPF进行较详细路由控制时,设置工作将会非常繁琐。
如果有一个新的网络被追加到原有的网络中时,只要在新增加网络的路由器上进行一个动态路由的设置即可。而不需要像静态路由那样,不得不在其他所有路由器上进行修改。对于路由器个数较多的网络,采用动态路由显然是一个能够减轻管理员负担的方法
况且,网络上一旦发生故障,只要有一个可绕的其他路径,那么数据包就会自动选择这个路径,路由器的设置也会自动重置。路由器为了能够像这样定期相互交换必要的路由控制信息,会与相邻的路由器之间互发消息。这些互换的消息会给网络带来一定程度的负荷。
动态路由如图7.2所示,会给相邻路由器发送自己已知的网络连接信息,而这些信息又像接力一样依次传递给其他路由器,直至整个网络都了解时,路由控制表也就制作完成了。而此时也就可以正确转发IP数据包了。
路由协议大致分为两大类。一类是外部网关协议EGP,另一类是内部网关协议IGP(Interior Gateway Protocol)。
EGP与IGP的关系与IP地址网络部分和主机部分的关系有相似之处。就像根据IP地址中的网络部分在网络之间进行路由选择、根据主机部分在链路内部进行主机识别一样,可以根据EGP在区域网络之间(或ISP之间)进行路由选择,也可以根据IGP在区域网络内部(或ISP内部)进行主机识别。
IGP中还可以使用RIP(Routing Information Protocol,路由信息协议)、RIP2、OSPF(Open Shortest Path First,开放式最短路径优先)等众多协议。与之相对,EGP使用的是BGP(Border Gateway Protocol,边界网关协议)协议。
路由控制有各种各样的算法,其中最具代表性的有两种,是距离向量(Distance-Vector)算法和链路状态(Link-State)算法。
距离向量算法(DV)是指根据距离和方向决定目标网络或目标主机位置的一种方法。
链路状态算法是路由器在了解网络整体连接状态的基础上生成路由控制表的一种方法。该方法中,每个路由器必须保持同样的信息才能进行正确的路由选择。
RIP(Routing Information Protocol)是距离向量型的一种路由协议,广泛用于LAN。
RIP将路由控制信息定期(30秒一次)向全网广播。如果没有收到路由控制信息,连接就会被断开。不过,这有可能是由于丢包导致的,因此RIP规定等待5次。如果等了6次(180秒)仍未收到路由信息,才会真正关闭连接。
RIP基于距离向量算法决定路径。距离(Metrics)的单位为“跳数”。跳数是指所经过的路由器的个数。RIP希望尽可能少通过路由器将数据包转发到目标IP地址,如图7.7所示。根据距离向量生成距离向量表,再抽出较小的路由生成最终的路由控制表。
RIP虽然不交换子网掩码信息,但可以用于使用子网掩码的网络环境。不过在这种情况下需要注意以下几点:
例如,路由器的接口地址为192.168.1.33/27。很显然,这是一个C类地址,因此按照IP地址分类它的网络地址192.168.1.33/24。与192.168.1.33/24相符合的IP地址,其网络地址长度都被视为27位。除此之外的地址,则采用每个地址的分类所确定的网络地址长度。
因此,采用RIP进行路由控制的范围内必须注意两点:一是,因IP地址的分类而产生不同的网络地址时;二是,构造网络地址长度不同的网络环境时。
RIP的基本行为可归纳为如下两点:
如图7.9,路由器A将网络A的连接信息发送给路由器B,路由器B又将自己掌握的路由信息在原来的基础上加1跳后发送给路由器A和路由器C。假定这时与网络A发生了故障。
路由器A虽然觉察到自己与网络A的连接已经断开,无法将网络A的信息发送给路由器B,但是它会收到路由器B曾经获知的消息。这就使得路由器A误认为自己的信息还可以通过路由器B到达网络A。
像这样收到自己发出去的消息,这个问题被称为无限计数(Counting to Infinity)。为了解决这个问题可以采取以下两种方法:
■ 使用多播
RIP中当路由器之间交换路由信息时采用广播的形式,然而在RIP2中改用了多播。这样不仅减少了网络的流量,还缩小了对无关主机的影响。
■ 支持子网掩码
与OSPF类似的,RIP2支持在其交换的路由信息中加入子网掩码信息。
■ 路由选择域
与OSPF的区域类似,在同一个网络中可以使用逻辑上独立的多个RIP。
■ 外部路由标志
通常用于把从BGP等获得的路由控制信息通过RIP传递给AS内。
■ 身份验证密钥
与OSPF一样,RIP包中携带密码。只有在自己能够识别这个密码时才接收数据,否则忽略这个RIP包。
OSPF(Open Shortest Path First)是根据OSI的IS-IS 协议而提出的一种链路状态型路由协议。由于采用链路状态类型,所以即使网络中有环路,也能够进行稳定的路由控制。
另外,OSPF支持子网掩码。由此,曾经在RIP中无法实现的可变长度子网构造的网络路由控制成为现实。
甚至为了减少网络流量,OSPF还引入了“区域”这一概念。区域是将一个自治网络划分为若干个更小的范围。由此,可以减少路由协议之间不必要的交换。
OSPF为链路状态型路由器。路由器之间交换链路状态生成网络拓扑信息,然后再根据这个拓扑信息生成路由控制表。
RIP的路由选择,要求途中所经过的路由器个数越少越好。与之相比,OSPF可以给每条链路赋予一个权重(也可以叫做代价),并始终选择一个权重最小的路径作为最终路由。也就是说OSPF以每个链路上的代价为度量标准,始终选择一个总的代价最小的一条路径。如图7.14对比所示,RIP是选择路由器个数最少的路径,而OSPF是选择总的代价较小的路径。
在OSPF中,把连接到同一个链路的路由器称作相邻路由器(Neighboring Router)。在一个相对简单的网络结构中,例如每个路由器仅跟一个路由器相互连接时,相邻路由器之间可以交换路由信息。但是在一个比较复杂的网络中,例如在同一个链路中加入了以太网或FDDI等路由器时,就不需要在所有相邻的路由器之间都进行控制信息的交换,而是确定一个指定路由器(Designated Router),并以它为中心交换路由信息即可。
在OSPF中,根据作用的不同可以分为5种类型的包。
通过发送问候(HELLO)包确认是否连接。每个路由器为了同步路由控制信息,利用数据库描述包相互发送路由摘要信息和版本信息。如果版本比较老,则首先发出一个链路状态请求包请求路由控制信息,然后由链路状态更新包接收路由状态信息,最后再通过链路状态确认包通知大家本地已经接收到路由控制信息。
有了这样一个机制以后,OSPF不仅可以大大地减少网络流量,还可以达到迅速更新路由信息的目的。
OSPF中进行连接确认的协议叫做HELLO协议。
LAN中每10秒(可自行设置)发送一个HELLO包。如果没有HELLO包到达,则进行连接是否断开的判断。具体为,允许空等3次,直到第4次(40秒后)仍无任何反馈就认为连接已经断开。之后在进行连接断开或恢复连接操作时,由于链路状态发生了变化,路由器会发送一个链路状态更新包通知其他路由器网络状态的变化。
链路状态更新包所要传达的消息大致分为两类:一是网络LSA ,另一个是路由器LSA。
网络LSA是以网络为中心生成的信息,表示这个网络都与哪些路由器相连接。而路由器LSA是以路由器为中心生成的信息,表示这个路由器与哪些网络相连接。
BGP(Border Gateway Protocol),边界网关协议是连接不同组织机构(或者说连接不同自治系统)的一种协议。因此,它属于外部网关协议(EGP)。具体划分,它主要用于ISP之间相连接的部分。只有BGP、RIP和OSPF共同进行路由控制,才能够进行整个互联网的路由控制。BGP是路径向量协议
。
现如今,在转发IP数据包的过程中除了使用路由技术外,还在使用标记交换技术。路由技术基于IP地址中最长匹配原则进行转发,而标记交换则对每个IP包都设定一个叫做“标记”的值,然后根据这个“标记”再进行转发。标记交换技术中最具代表性的当属多协议标记交换技术,即MPLS(Multi Protocol Label Switching)。
由于基于标记的转发通常无法在路由器上进行,所以MPLS也就无法被整个互联网采用。如图7.22所示,它的转发处理方式甚至与IP网也有所不同。
MPLS网络中实现MPLS功能的路由器叫做标记交换路由器(LSR,Label Switching Router)。特别是与外部网路连接的那部分LSR叫做标记边缘路由器(LER,Label Edge Router)。MPLS正是在LER上对数据包进行追加标记和删除标记的操作。
在一个数据包上附加标记是一个及其简单的动作。如果数据链路本来就有一个相当于标记的信息,那么可以直接进行映射。如果数据链路中没有携带任何相当于标记的信息(最典型的就是以太网),那么就需要追加一个全新的垫片头(Shim Header)。这个垫片头中就包含标记信息 。
如图7.23展示了数据从以太网的IP网开始经过MPLS网再发送给其他IP网的整个转发过程。数据包在进入MPLS时,在其IP首部的前面被追加了32比特的垫片头(其中包含20比特的标记值)。MPLS网络内,根据垫片头中的标记进一步进行转发。当数据离开MPLS时,垫片头就被去除。在此我们称附加标记转发的动作为Push,替换标记转发的动作为Swap,去掉标记转发的动作为Pop。
MPLS中目标地址和数据包都要通过由标记决定的同一个路径,这个路径叫做标记交换路径(LSP,Label SwitchPath)。LSP又可以划分为一对一连接的点对点LSP,和一对多绑定的合并LSP两类。
扩展LSP有两种方式。可以通过各个LSR向自己邻接的LSR分配MPLS标记,也可以由路由协议载着标记信息进行交互。LSP属于单方向的通路,如果需要双向的通信则需要两个LSP。
① 转发速度快。
通常,路由器转发IP数据包时,首先要对目标地址和路由控制表中可变长的网络地址进行比较,然后从中选出最长匹配的路径才能进行转发。MPLS则不然。它使用固定长度的标记信息,使得处理更加简单,可以通过高速的硬件实现转发。
此外,相比互联网中的主干路由器需要保存大量路由表才能进行处理的现状,MPLS只需要设置必要的几处信息即可,所要处理的数据量也大幅度减少。而且除了IPv4、IPv6之外,针对其他协议,MPLS仍然可以实现高速转发。
②利用标记生成虚拟的路径,并在它的上面实现IP等数据包的通信。
基于这些特点,被称之为“尽力而为”的IP网也可以提供基于MPLS的通信质量控制、带宽保证和VPN等功能。
第8章 应用协议
一般情况下,人们不会太在意网络应用程序实际上是按照何种机制正常运行的。本章则旨在介绍TCP/IP中所使用的几个主要应用协议,它们多处于OSI模型的第5层以上。
远程登录是为了实现TSS环境,是将主机和终端的关系应用到计算机网络上的一个结果。TSS中通常有一个处理能力非常强的主机,围绕着这台主机的是处理能力没有那么强的多个终端机器。这些终端通过专线与主机相连。
类似地,实现从自己的本地计算机登录到网络另一端计算功能的应用就叫做远程登录。通过远程登录到通用计算机或UNIX工作站以后,不仅可以直接使用这些主机上的应用,还可以对这些计算机进行参数设置。远程登录主要使用TELNET和SSH(Secure SHell) 两种协议。
TELNET利用TCP的一条连接,通过这一条连接向主机发送文字命令并在主机上执行。本地用户好像直接与远端主机内部的Shell 相连着似的,直接在本地进行操作。
TELNET可以分为两类基本服务。一是仿真终端功能,二是协商选项机制。
TELNET经常用于登录路由器或高性能交换机等网络设备进行相应的设置 。通过TELNET登录主机或路由器等设备时需要将自己的登录用户名和密码注册到服务端。
■ 选项
TELNET中除了处理用户所输入的文字外,还提供选项的交互和协商功能。例如,为实现仿真终端所用到的界面控制信息就是通过选项功能发送出去的。而且,如图8.4所示TELNET中的行模式或透明模式两种模式的设置,也是通过TELNET客户端与TELNET服务端之间的选项功能进行设置的。
所谓TELNET客户端是指利用TELNET协议实现远程登录的客户端程序。很多情况下,它的程序名就是telnet命令。
TELNET客户端通常与目标主机的23号端口建立连接,并与监听这个端口的服务端程序telnetd进行交互。当然,也可以与其他的TCP端口号连接,只要在该端口上有监听程序能够处理telnet请求即可。
SSH是加密的远程登录系统。TELNET中登录时无需输入密码就可以发送,容易造成通信窃听和非法入侵的危险。使用SSH后可以加密通信内容。即使信息被窃听也无法破解所发送的密码、具体命令以及命令返回的结果是什么。
SSH还包括很多非常方便的功能:
端口转发是指将特定端口号所收到的消息转发到特定的IP地址和端口号码的一种机制。由于经过SSH连接的那部分内容被加密,确保了信息安全,提供了更为灵活的通信。
FTP是在两个相连的计算机之间进行文件传输时使用的协议。
■ FTP的工作机制概要
它使用两条TCP连接:一条用来控制,另一条用于数据(文件)的传输。
用于控制的TCP连接主要在FTP的控制部分使用。例如登录用户名和密码的验证、发送文件的名称、发送方式的设置。利用这个连接,可以通过ASCII码字符串发送请求和接收应答。在这个连接上无法发送数据,数据需要一个专门的TCP进行连接。
FTP控制用的连接使用的是TCP21号端口。在TCP21号端口上进行文件GET、PUT、以及文件一览等操作时,每次都会建立一个用于数据传输的TCP连接。数据的传输和文件一览表的传输正是在这个新建的连接上进行。当数据传送完毕之后,传输数据的这条连接也会被断开,然后会在控制用的连接上继续进行命令或应答的处理。
通常,用于数据传输的TCP连接是按照与控制用的连接相反的方向建立的。因此,在通过NAT连接外部FTP服务器的时候,无法直接建立传输数据时使用的TCP连接。此时,必须使用PASV命令修改建立连接的方向才行。
数据传输用的TCP连接通常使用端口20。不过可以用PORT命令修改为其他的值。最近,出于安全的考虑,普遍在数据传输用的端口号中使用随机数进行分配。
提供电子邮件服务的协议叫做SMTP(Simple Mail TransferProtocol)。SMTP为了实现高效发送邮件内容,在其传输层使用了TCP协议。
早期电子邮件是在发送端主机与接收端主机之间直接建立TCP连接进行邮件传输。发送人编写好邮件以后,其内容会保存在发送端主机的硬盘中。然后与对端主机建立TCP连接,将邮件发送到对端主机的硬盘。当发送正常结束后,再从本地硬盘中删除邮件。而在发送过程中一旦发现对端计算机因没有插电等原因没有收到邮件时,发送端将等待一定时间后重发。
为此,在技术上改变了以往直接在发送端与接收端主机之间建立TCP连接的机制,而引进了一种一直会连接电源的邮件服务器 。发送和接收端通过邮件服务器进行收发邮件。接收端从邮件服务器接收邮件时使用POP3(Post Office Protocol)协议。
电子邮件的机制由3部分组成,它们分别是邮件地址,数据格式以及发送协议。
很长一段时间里,互联网中的电子邮件只能处理文本格式的邮件。不过现在,电子邮件所能发送的数据类型已被扩展到MIME ,可以发送静态图像、动画、声音、程序等各种形式的数据。鉴于MIME规定了应用消息的格式,因此在OSI参考模型中它相当于第6层表示层。
MIME基本上由首部和正文(数据)两部分组成。
SMTP是发送电子邮件的协议。它使用的是TCP的25号端口。SMTP建立一个TCP连接以后,在这个连接上进行控制和应答以及数据的发送。客户端以文本的形式发出请求,服务端返回一个3位数字的应答。每个指令和应答的最后都必须追加换行指令(CR、LF)。
该协议是一种用于接收电子邮件的协议。发送端的邮件根据SMTP协议将被转发给一直处于插电状态的POP服务器。客户端再根据POP协议从POP服务器接收对方发来的邮件。在这个过程中,为了防止他人盗窃邮件内容,还要进行用户验证。
POP与SMTP一样,也是在其客户端与服务器之间通过建立一个TCP连接完成相应操作。