TCP/IP第三层--网络层
一.功能目的
1)、主要功能:负责点到点(point-to-point)的传输(这里的“点”指主机或路由器)
网络层是为传输层提供服务的,传送的协议数据单元称为数据包或分组。该层的主要作用是解决如何使数据包通过各结点传送的问题,即通过路径选择算法(路由)将数据包送到目的地。另外,为避免通信子网中出现过多的数据包而造成网络阻塞,需要对流入的数据包数量进行控制(拥塞控制)。当数据包要跨越多个通信子网才能到达目的地时,还要解决网际互连的问题。
2)、网络地址: 网络层地址由两部分地址组成:网络地址和主机地址。网络地址是全局唯一的。
2)、路由寻址:
1.通过路由选择算法为分组通过通信子网选择最佳路么.
2.实现路由选择,拥塞控制以及网络互联等.
二.网络层协议
网络层的主要协议:IP,ARP、RARP
ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息。数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数据信息。
1.IP协议
IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制(这被认为是上层协议TCP或UDP要做的事情)。所以这也就出现了TCP是一个可靠的协议,而UDP就没有那么可靠的区别。
1.1.IP协议头
数据格式如图所示:
IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。
4位版本字段: 对于IPv4,4位版本字段是4。
4位首部长度:该数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。
8位TOS字段:8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。总长度是整个数据报(包括IP首部和IP层payload)的字节数。每传一个IP数据报,
16位的标识加1,可用于分片和重新组装数据报。
3位标志和13位片偏移用于分片。
TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64,Tracerouter这个工具就是用这个原理工作的,tranceroute的-m选项要求最大值是255,也就是因为这个TTL在IP协议里面只有8bit。
协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和,只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。
1.2.IP路由选择
当一个IP数据包准备好了的时候,IP数据包(或者说是路由器)是如何将数据包送到目的地的呢?它是怎么选择一个合适的路径来"送货"的呢?
最特殊的情况是目的主机和主机直连,那么主机根本不用寻找路由,直接把数据传递过去就可以了。至于是怎么直接传递的,这就要靠ARP协议了,后面会讲到。
稍微一般一点的情况是,主机通过若干个路由器(router)和目的主机连接。那么路由器就要通过ip包的信息来为ip包寻找到一个合适的目标来进行传递,比如合适的主机,或者合适的路由。路由器或者主机将会用如下的方式来处理某一个IP数据包
如果IP数据包的TTL(生命周期)已到(已经被减为0),则该IP数据包就被抛弃。
搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机
搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码(1.3.)”的协助。如果找到路由器,则将该包发向路由器。
搜索路由表,如果匹配同子网路由器失败,则匹配同网号路由器,如果找到路由器,则将该包发向路由器。
搜索陆游表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包
如果都失败了,就丢掉这个包。
这再一次证明了,ip包是不可靠的。因为它不保证送达。
1.3.子网寻址
IP地址的定义是网络号+主机号。但是现在所有的主机都要求子网编址,也就是说,把主机号在细分成子网号+主机号。最终一个IP地址就成为 网络号码+子网号+主机号。例如一个B类地址:210.30.109.134。一般情况下,这个IP地址的红色部分就是网络号,而蓝色部分就是子网号,绿色部分就是主机号。至于有多少位代表子网号这个问题上,这没有一个硬性的规定,取而代之的则是子网掩码,校园网相信大多数人都用过,在校园网的设定里面有一个255.255.255.0的东西,这就是子网掩码。子网掩码是由32bit的二进制数字序列,形式为是一连串的1和一连串的0,例如:255.255.255.0(二进制就是11111111.11111111.11111111.00000000)对于刚才的那个B类地址,因为210.30是网络号,那么后面的109.134就是子网号和主机号的组合,又因为子网掩码只有后八bit为0,所以主机号就是IP地址的后八个bit,就是134,而剩下的就是子网号码--109。
2. ARP协议
还记得数据链路层的以太网的协议中,每一个数据包都有一个MAC地址头么?我们知道每一块以太网卡都有一个MAC地址,这个地址是唯一的,那么IP包是如何知道这个MAC地址的?这就是ARP协议的工作。
我们知道交换机是通过MAC地址通信的,但是我们是如何获得目标主机的MAC地址呢?这时我们就需要使用ARP协议了,在每台主机中都有一张ARP表,它记录着主机的IP地址和MAC地址的对应关系。
ARP协议:ARP协议是工作在网络层的协议,它负责将IP地址解析为MAC地址。
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。
ARP工作原理:
1)ARP缓存表直接封装MAC:
每台主机都维护一个ARP缓存表,当源主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存)。如果主机A想发送数据给主机B,主机A首先会检查自己的ARP缓存表,查看是否有主机B的IP地址和MAC地址的对应关系。如果有,则会将主机B的MAC地址作为源MAC地址封装到数据帧中。
2)ARP缓存没有IP-MAC, 则向网络发送一个ARP协议广播包:
如果查询的IP-MAC值对不存在,那么源主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址
主机A则会发送一个ARP请求信息,请求的目标IP地址是主机B的IP地址(比如询问“IP地址是192.168.1.2的主机的硬件地址是多少”),目标MAC地址是MAC地址的广播帧(即FF-FF-FF-FF-FF-FF),源IP地址和MAC地址是主机A的IP地址和MAC地址。
(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)。
3)交互机向非接收的所有接口发送出去
当交换机接受到此数据帧之后,发现此数据帧是广播帧,因此,会将此数据帧从非接收的所有接口发送出去。
4) 接收的主机检查自己的IP和mac地址
直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现IP地址与本机相符,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的源主机,而广播源主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。
因此当主机B接受到此数据帧后,会校对IP地址是否是自己的,并将主机A的IP地址和MAC地址的对应关系记录到自己的ARP缓存表中,同时会发送一个ARP应答,其中包括自己的MAC地址。
4)发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。
主机A在收到这个回应的数据帧之后,在自己的ARP缓存表中记录主机B的IP地址和MAC地址的对应关系。而此时交换机已经学习到了主机A和主机B的MAC地址了。
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。
[dev@writedb ~]$ arp -a
(192.168.1.145) at 24:1f:a0:c0:f7:bc [ether] on em1
(192.168.1.1) at 3c:8c:40:99:24:05 [ether] on em1
(192.168.1.137) at 3c:15:c2:ee:a8:b2 [ether] on em1
(192.168.1.122) at 28:b2:bd:4f:1e:ba [ether] on em1
缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。想一想,为什么表项要有过期时间而不是一直有效?
ARP数据报的格式如下所示:
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。
三. IP地址和网段
1、IPv4由网络号和主机号组成
IPv4的IP地址长度为4字节,通常采用点分十进制表示法(dotted decimal representation)例如0xc0a80002表示为192.168.0.2。Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。
网络号:保证相互连接的两个网段具有不同的标识。
主机号:同一网段内,主机之间虽然具有相同的网络号,但是必须有不同的主机号,这样才能找得到。
如图所以,网段不同则必须配置不同的网络号,同一网段内的主机网络号相同但是主机号不同:
这里写图片描述
过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示:
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到247.255.255.255
一个A类网络可容纳的地址数量最大,一个B类网络的地址数量是65536,一个C类网络的地址数量是256。D类地址用作多播地址,E类地址保留未用。
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。这种方式对网络的划分是flat的而不是层级结构(hierarchical)的,Internet上的每个路由器都必须掌握所有网络的信息,随着大量C类网络的出现,路由器需要检索的路由表越来越庞大,负担越来越重。
2、子网掩码
针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)。网络号和主机号的划分需要用一个额外的子网掩码(subnet mask)来表示,而不能由IP地址本身的数值决定,也就是说,网络号和主机号的划分与这个IP地址是A类、B类还是C类无关,因此称为Classless的。这样,多个子网就可以汇总(summarize)成一个Internet上的网络,例如,有8个站点都申请了C类网络,本来网络号是24位的,但是这8个站点通过同一个ISP(Internet service provider)连到Internet上,它们网络号的高21位是相同的,只有低三位不同,这8个站点就可以汇总,在Internet上只需要一个路由表项,数据包通过Internet上的路由器到达ISP,然后在ISP这边再通过次级的路由器选路到某个站点。
1)子网掩码(Subnet Mask:
又叫网络掩码、地址掩码,必须结合IP地址一起对应使用。子网掩码不能单独存在,它必须结合IP地址一起使用,它的主要作用有两个:
一是就是将某个IP地址划分成网络地址和主机地址两部分,并说明该IP地址是在局域网上,还是在远程网上。
二是用于将一个大的IP网络划分为若干小的子网络。
2)子网掩码组成:
子网掩码的长度也是32位,和ip地址一样,用点分十进制表示,每一个用点分隔的十进制整数代表8位;
左边是网络位,用二进制数字1表示(1111 1111),一个1111 1111的十进制为255;
右边是主机位,用二进制数字0表示(0000 0000)一个0000 0000的十进制为0。
下面举两个例子:
划分子网的例子1
IP地址 140.252.20.68 8C FC 14 44
子网掩码 255.255.255.0 FF FF FF 00
网络号 140.252.20.0 8C FC 14 00
子网地址范围 140.252.20.0~140.252.20.255
划分子网的例子2
IP地址 140.252.20.68 8C FC 14 44
子网掩码 255.255.255.240 FF FF FF F0
网络号 140.252.20.64 8C FC 14 40
子网地址范围 140.252.20.64~140.252.20.79
3)子网掩码和IP地址的关系
通过上面的例子,我们可以发现子网掩码和IP地址的关系:
网络号:IP地址与子网掩码做与运算 。
主机号:子网掩码取反再和IP做与运。
地址范围:主机号从全0到全1就是子网的地址范围。
是否同一网段:通过计算机的子网掩码判断两台计算机是否属于同一网段的方法是,将计算机十进制的IP地址和子网掩码转换为二进制的形式,然后进行二进制“与”(AND)计算(全1则得1,不全1则得0),如果得出的结果是相同的,那么这两台计算机就属于同一网段。
4)子网掩码表示:
一个完整IP描述包含IP 地址和子网掩码
具体标识有两种
1)二进制转换十进制,每8位用点号隔开。 例如:192.168.0.n 255.255.255.0
2)CIDR斜线记法:IP地址/n , 例如192.168.0.n/24 /24表示子网掩码二进制标识法中前面高24位全是1,即255.255.255.0
注:n为1到32的数字,表示子网掩码中网络号的长度,通过n的个数确定子网的主机数=2^(32-n)-2(-2的原因:主机位全为0时表示本网络的网络地址,主机位全为1时表示本网络的广播地址,这是两个特殊地址)。
因此上面的ip分类的子网掩码:
A类:000~127,默认子网掩码:255.0.0.0 用CIDR表示为/8 一个子网最多可以容纳1677万多主机
B类:128~191,默认子网掩码:255.255.0.0 用CIDR表示为/16 一个子网最多可以容纳6万多主机
C类:192~223,默认子网掩码:255.255.255.0 用CIDR表示为/24 一个子网最多可以容纳254主机
D类:224~239
E类:240~255
IP总数 子网掩码 C段个数
/30 4 255.255.255.252 1/64
/29 8 255.255.255.248 1/32
/28 16 255.255.255.240 1/16
/27 32 255.255.255.224 1/8
/26 64 255.255.255.192 1/4
/24 256 255.255.255.0 1
/23 512 255.255.254.0 2
/22 1024 255.255.252.0 4
/21 2048 255.255.248.0 8
/20 4096 255.255.240.0 16
/19 8192 255.255.224.0 32
/18 16384 255.255.192.0 64
/17 32768 255.255.128.0 128
/16 65536 255.255.0.0 256
3、局域网的私有IP地址
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址,这些地址不会出现在Internet上,如下表所示。
10.*,前8位是网络号,共16,777,216个地址
172.16.*到172.31.*,前12位是网络号,共1,048,576个地址
192.168.*,前16位是网络号,共65,536个地址
4、本机环回地址
除了私有IP地址之外,还有几种特殊的IP地址。127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。loopback是系统中一种特殊的网络设备,如果发送数据包的目的地址是环回地址,或者与本机其它网络设备的IP地址相同,则数据包不会发送到网络介质上,而是通过环回设备再发回给上层协议和应用程序,主要用于测试。如下图所示)。
loopback设备
5、特殊地址
还有一些不能用作主机IP地址的特殊地址:
目的地址为255.255.255.255,表示本网络内部广播,路由器不转发这样的广播数据包。
主机号全为0的地址只表示网络而不能表示某个主机,如192.168.10.0(假设子网掩码为255.255.255.0)。
目的地址的主机号为全1,表示广播至某个网络的所有主机,例如目的地址192.168.10.255表示广播至192.168.10.0网络(假设子网掩码为255.255.255.0)。
四、路由原理
4.1路由的名词解释:
下面介绍路由的过程,首先正式定义几个名词:
路由(名词):数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。
路由(动词):某个路由节点为数据报选择投递方向的选路过程。
路由节点:一个具有路由能力的主机或路由器,它维护一张路由表,通过查询路由表来决定向哪个接口发送数据包。
接口:路由节点与某个网络相连的网卡接口。
路由表:由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接口发送,其中最后一条是缺省路由条目。
路由条目:路由表中的一行,每个条目主要由目的网络地址、子网掩码、下一跳地址、发送接口四部分组成,如果要发送的数据包的目的网络地址匹配路由表中的某一行,就按规定的接口发送到下一跳地址。
缺省路由条目:路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:
$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:7E
inet addr:192.168.10.223 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:420 (420.0 b)
Interrupt:10 Base address:0x10a0
eth1 Link encap:Ethernet HWaddr 00:0C:29:C2:8D:88
inet addr:192.168.56.136 Bcast:192.168.56.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:603 errors:0 dropped:0 overruns:0 frame:0
TX packets:110 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:55551 (54.2 Kb) TX bytes:7601 (7.4 Kb)
Interrupt:9 Base address:0x10c0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:37 errors:0 dropped:0 overruns:0 frame:0
TX packets:37 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3020 (2.9 Kb) TX bytes:3020 (2.9 Kb)
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
192.168.56.0 * 255.255.255.0 U 0 0 0 eth1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
网络接口:
这台主机有两个网络接口,既有两个网卡,网卡的名称是eth0和eth1.
eth0 一个网络接口连到192.168.10.0/24网络,
eth1 另一个网络接口连到192.168.56.0/24网络。
route路由表解释:
Destination: 是目的网络地址,
Gateway: 是下一跳地址/网关,
Genmask : 是子网掩码,指定了目的地址的子网号。
Flags:
U:标志表示此条目有效(可以禁用某些条目)即该路由可用,
G:标志该路由是到一个网关(路由器)。,没有G标志表示目的网络地址Destination是与本机接口直接相连的网络,不必经路由器转发,因此下一跳Gateway地址处记为*号。
H:表明该路由是到一个主机,如果没有该标志,说明Destination是一个网络,换句话说Destination就应该写成一个网络号和子网号的组合,而不包括主机号(主机号码处为0),例如 192.168.11.0
D“表明该路由是为重定向报文创建的
M:该路由已经被重定向报文修改
U没啥可说的,G说明这是一个网关,如果你要发数据给Destination,IP头应该写Destination的IP地址,而数据链路层的MAC地址就应该是GateWay的Mac地址了;反之,如果没有G标志,那么数据链路层和IP层的地址应该是对应的。H说明了Destination的性质,如果是H的,则说明该地址是一个完整的地址,既有网络号又有主机号,那么再匹配的时候就既要匹配网络号,又要匹配主机号;反之,Destination就代表一个网络,在匹配的时候只要匹配一下网络号就可以了。
Iface:是发送网卡接口。即使用哪个网卡发送。
如果要发送的数据包的目的地址是192.168.56.3,跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去,由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
如果要发送的数据包的目的地址是202.10.1.2,跟前三行路由表条目都不匹配,那么就要按缺省路由条目,从eth0接口发出去,首先发往192.168.10.1路由器,再让路由器根据它的路由表决定下一跳地址。
在路由器中也有一张表,这张表叫路由表,记录着到不同网段的信息。路由表中的信息分为直连路由和非直连路由。
直连路由:是直接连接在路由器接口的网段,由路由器自动生成。
非直连路由:就是不是直接连接在路由器接口上的网段,此记录需要手动添加或者是使用动态路由。
路由表中记录的条目有的需要手动添加(称为静态路由),有的测试动态获取的(称为动态路由)。直连路由属于静态路由。
4.2.静态路由
静态路由:是在路由器中设置的固定的路由表,一般是手工通过route来配置静态路由信息。
除非网络管理员干预,否则静态路由不会发生变化由于静态路由不能对网络的改变作出反映,一般用于网络规模不大、拓扑结构固定的网络中。静态路由的优点是简单、高效、可靠。在所有的路由中,静态路由优先级最高。当动态路由与静态路由发生冲突时,以静态路由为准。
路由关系是需要双向解析的,和NAT单向不同的。在几个网段互联时就需要配置静态路由来指定某一个网段通过哪个地址去访问。简单的举个例子,你公司一台电脑接的局域网A,配置了网关192.168.0.1(公司外网路由器),通过网关去访问Internet网。然后公司还有一个网段B,这个网段有自己的外网路由器192.168.1.1。B网段的电脑通过这个路由访问Internet。那么A网段和B网段的电脑该怎么互访呢?在A,B网段之间添加一个路由器,一边连接A网段,地址为192.168.0.2,一边连接B网段,地址为192.168.1.2。现在能互访了吗?当然不能,你电脑还没有指向B网段的静态路由,你需要添加一条静态路由让你的电脑需要访问B网段时知道该往哪个地址发送数据包。
用Route add命令添加。格式如下route add 192.168.1.0 mask 255.255.255.0 192.168.0.2 -p
4.2.1.一个简单的路由表
选路是IP层最重要的一个功能之一。前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由。这里就不重复了。首先来看看一个简单的系统路由表。
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.11.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.11.1 0.0.0.0 UG 0 0 0 eth0
IP选路的方式就可以更加具体化了。如下:
首先用IP地址来匹配那些带H标志的DestinationIP地址。
如果1失败就匹配那些网络地址。
如果2失败就发送到Default网关
一般,我们在配置好一个网络接口的时候,一个路由就被直接创建好了。当然我们也可以手动添加路由。用route add命令就可以了。
而当一个IP包在某一个路由器的时候发现没有路由可走,那么该路由器就会给源主机发送“主机不可达”或者“网络不可达”的ICMP包来报错。
From 10.172.229.55 icmp_seq=2 Destination Host Unreachable
From 10.172.229.55 icmp_seq=3 Destination Host Unreachable
From 10.172.229.55 icmp_seq=4 Destination Host Unreachable
From 10.172.229.55 icmp_seq=5 Destination Host Unreachable
From 10.172.229.55 icmp_seq=6 Destination Host Unreachable
注意,一般的操作系统默认是没有路由功能的,这需要自己配置。这些历史原因就不细说了。
4.2.2.ICMP的IP重定向报文和路由发现报文
当IP包在某一个地方转向的时候,都回给发送IP报的源主机一个ICMP重定向报文,而源主机就可以利用这个信息来更新自己的路由表,这样,随着网络通信的逐渐增多,路由表也就越来越完备,数据转发的速度也会越来越快。我们需要注意的是:
重定向报文只能由路由器发出。
重定向报文为主机所用,而不是为路由器所用。
在主机引导的时候,一般会发送在网内广播一个路由请求的ICMP报文,而多个路由器则会回应一个路由通告报文。而且,路由其本身不定期的在网络内发布路由通告报文,这样,根据这些报文,每一个主机都会有机会建立自己的路由表而实现网络通信。路由器在一份通告报文中可以通告多个地址,并且给出每一个地址的优先等级,这个优先等级是该IP作为默认路由的等级,至于怎么算的就不深究了。
路由器一般会在450-600秒的时间间隔内发布一次通告,而一个给定的通告报文的寿命是30分钟。而主机在引导的时候会每三秒发送一次请求报文,一旦接受到一个有效的通告报文,就停止发送请求报文。
在TCP/IP详解编写的时候,只有Solaris2.x支持这两种报文,大多数系统还不支持这两种报文。(后面还会讲到一些有用的路由报文)
4.3、动态路由
前面的选路方法叫做静态路由,简要地说就是在配置接口的时候,以默认的方式生成路由表项。并通过route来增加表项,或者通过ICMP报文来更新表项(通常在默认方式出错的情况下)。 而如果上诉三种方法都不能满足,那么我们就使用动态选路。
动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整。动态路由机制的运作依赖路由器的两个基本功能:对路由表的维护;路由器之间适时的路由信息交换。
动态选路协议是用于动态选路的重要组成部分,但是他们只是使用在路由器之间,相邻路由器之间互相通信。系统(路有选择程序)选择比较合适的路有放到核心路由表中,然后系统就可以根据这个核心路有表找到最合适的网路。也就是说,动态选路是在系统核心网络外部进行的,它只是用一些选路的策略影响路由表,而不会影响到最后通过路由表选择路由的那一部分。选路协议有一大类常用的叫做内部网关协议(IGP),而在IGP中,RIP就是其中最重要的协议。一种新的IGP协议叫做开放最短路经优先(OSPF)协议,其意在取代RIP。另一种最早用在网路骨干网上的IGP协议--HELLO,现在已经不用了。
如今,任何支持动态选路的路由器都必须同时支持OSPF和RIP,还可以选择性的支持其他的IGP协议。
五.网络层主要设备
路由器在网络层,所以是第三层设备。Internet上有大量路由器负责根据IP地址选择合适的路径转发数据包,数据包从Internet上的源主机到目的主机往往要经过十多个路由器。路由器是工作在第三层的网络设备,同时兼有交换机的功能,可以在不同的链路层接口之间转发数据包,因此路由器需要将进来的数据包拆掉网络层和链路层两层首部并重新封装。IP协议不保证传输的可靠性,数据包在传输过程中可能丢失,可靠性可以在上层协议或应用程序中提供支持。
二层交换机和三层路由器是性能和功能的矛盾体,交换机交换速度快,但控制功能弱,路由器控制性能强,但报文转发速度慢。解决这个矛盾的最新技术是三层交换,既有交换机线速转发报文能力,又有路由器良好的路由和寻址控制功能。
1、路由器主要功能
1)异种网络的互联
可用完全不同的数据分组和介质访问方法互联各种子网。只接收源站或其他路由器的信息,而不关心各子网所用的硬件设备(但要求运行与网络层协议相一致的软件)。
2)网络地址判断、最佳路由选择和数据处理(加密/优先级/过滤等)
3)支持复杂的网络拓扑结构
4)络互联和路由选择(中间节点路由器)
5)分隔子网和隔离广播(边界路由器)
2、路由与桥接:性能特点
两者均为网络互联,但
桥接 功能发生在数据链路层,转发的依据是帧中的信息(MAC地址)。硬件处理,转发速度较快,无广播抑制功能,价格较低,适合于局域网、企业 网等内部子网间互联。
路由 功能发生在网络层,转发的依据是数据报中的信息(IP地址)。软件处理,转发速度较慢,可完全抑制广播,价格较高,适用于大网络和复杂网络拓扑结构,主要用在外网与内网的隔离处或在广域网中作中间转发结点。
3、路由器在网络层是如何运行的
路由器的某个接口收到一个包时,路由器会读取包中相应的目标的逻辑地址的网络部分,然后在路由表中进行查找。如果在路由表中找到目标地址的路由条目,则把包转发到路由器的相应接口,如果在路由表中没有找到目标地址的路由条目,那么,如果路由配置默认路由,就科举默认路由的配置转发到路由器的相应接口;如果没有配置默认路由,则将该包丢弃,并返回不可到达的信息。这就是数据路由的过程。
路由器在工作时能够按照某种路由通信协议查找设备中的路由表。如果到某一特定节点有一条以上的路径,则基本预先确定的路由准则是选择最优(或最经济)的传输路径。由于各种网络段和其相互连接情况可能会因环境变化而变化,因此路由情况的信息一般也按所使用的路由信息协议的规定而定时更新。
网络中,每个路由器的基本功能都是按照一定的规则来动态地更新它所保持的路由表,以便保持路由信息的有效性。为了便于在网络间传送报文,路由器总是先按照预定的规则把较大的数据分解成适当大小的数据包,再将这些数据包分别通过相同或不同路径发送出去。当这些数据包按先后秩序到达目的地后,再把分解的数据包按照一定顺序包装成原有的报文形式。路由器的分层寻址功能是路由器的重要功能之一,该功能可以帮助具有很多节点站的网络来存储寻址信息,同时还能在网络间截获发送到远地网段的报文,起转发作用;选择最合理的路由,引导通信也是路由器基本功能;多协议路由器还可以连接使用不同通信协议的网络段,成为不同通信协议网络段之间的通信平台。
一般来说,路由器的主要工作是对数据包进行存储转发,具体过程如下:
第一步:当数据包到达路由器,根据网络物理接口的类型,路由器调用相应的链路层功能模块,以解释处理此数据包的链路层协议报头。这一步处理比较简单,主要是对数据的完整性进行验证,如CRC校验、帧长度检查等。
第二步:在链路层完成对数据帧的完整性验证后,路由器开始处理此数据帧的IP层。这一过程是路由器功能的核心。根据数据帧中IP包头的目的IP地址,路由器在路由表中查找下一跳的IP地址;同时,IP数据包头的TTL(Time To Live)域开始减数,并重新计算校验和(Checksum)。
第三步:根据路由表中所查到的下一跳IP地址,将IP数据包送往相应的输出链路层,被封装上相应的链路层包头,最后经输出网络物理接口发送出去。
简单地说,路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳传输路径,并将该数据包有效地传送到目的站点。由此可见,选择最佳路径策略或叫选择最佳路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用。上述过程描述了路由器的主要而且关键的工作过程,但没有说明其它附加性能,例如访问控制、网络地址转换、排队优先级等。
4、详细介绍路由器的工作原理
首先来看一下路由器是怎么工作的。对于普通用户来说,所能够接触到的只是局域网的范围,通过在PC上设置默认网关就可以是局域网的计算机与Internet进行通信,
其实在计算机上所设置的默认网关就是路由器以太口的IP地址,如果局域网的计算机要和外面的计算机进行通信,只要把请求提交给路由器的以太口就可以了,接下来的工作就由路由器来完成了。因此可以说路由器就是互联网的中转站,网络中的包就是通过一个一个的路由器转发到目的网络的。
那么路由器是如何 进行包的转发的呢?就像一个人如果在去某个地方,一定要在他的脑海里有一张地图,在每个路由器的内部也有一张地图,这张地图就是路由表。
在这个路由表中包含有该路由器掌握的所有目地网络地址,以及通过此路由器到达这些网络中最佳路径,这个最佳路径指的是路由器的某个接口或下一条路由器的地址。
这是由于路由表的存在,路由器才可以依据路由表进行包的转发,如下面图所示网络为例。介绍路由器转发数据的过程。
1) 源主机决定是否发送路由器:网段是否一样
HostA在网络层将来自上层的报文封装成IP数据包,其中源IP地址为自己,目标IP地址是HostB,HostA会用本机配置的24位子网掩码与目标地址进行“与”运算,得出目标地址与本机不是同一网段,因此发送HostB的数据包需要经过网关路由A的转发。
2) 源主机封装数据帧
HostA通过ARP请求获取网关路由A的E0口的MAC地址,并在链路层将路由器E0接口的MAC地址封装成目标MAC地址,源MAC地址是自己。
3) 路由器A重新封装数据帧
路由器A从E0可接收到数据帧,把数据链路层的封装去掉,并检查路由表中是否有目标IP地址网段(即192.168.2.2的网段)相匹配的的项,根据路由表中记录到192.168.2.0网段的数据请发送给下一跳地址10.1.1.2,因此数据在路由器A的E1口重新封装,此时,源MAC地址是路由器A的E1接口的MAC地址,封装的目标MAC地址则是路由器B的E1接口的MAC地址。
4) 路由器B重新封装数据帧
路由B从E1口接收到数据帧,同样会把数据链路层的封装去掉,对目标IP地址进行检测,并与路由表进行匹配,此时发现目标地址的网段正好是自己E0口的直连网段,路由器B通过ARP广播,获知HostB的MAC地址,此时数据包在路由器B的E0接口再次封装,源MAC地址是路由器B的E0接口的MAC地址,目标MAC地址是HostB的MAC地址。封装完成后直接从路由器的E0接口发送给HostB。
5) 此时HostB才会收到来自HostA发送的数据。
六、SNAT和DNAT
6.1 背景
在linux操作系统中,Netfilter组件是集成在linux内核中扩展各种网络服务的结构化底层框架,在内核级提供防火墙功能。内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。
报文流向:
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程-->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
内核中数据包的传输过程:
(1)当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
(2)如果数据包就是进入本机的,数据包就会到达INPUT链。经INPUT链检查后,数据包被发往本地进程。本地进程进行相应处理后发送响应数据包,数据包经过OUTPUT链,然后到达POSTROUTING链输出;如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
企业内部的主机A若配了一个公网地址6.6.6.6,访问互联网上其他网段的公有地址不受限制,但若访问互联网上同网段的地址即6.0.0.0/8网段的地址,由于A的路由表就有到达该网段的路由记录,就直接访问了,不会去查询路由器,但是实际上访问的不是互联网上的主机,而是本地局域网的主机,也就是说该网段的所有公有地址A都将无法访问。所以企业内部的主机一般是私有地址,但是互联网上没有私有地址的路由,也就是说私有地址无法连接互联网,可以利用防火墙的nat表(network address translation 地址转换规则表)将私有地址转换为公有地址再去访问互联网。
6.2、SNAT
局域网内部的主机A想访问互联网上的主机C:
1)首先将请求数据包(源:ipA,目标:ipC)发送到网关所在公网主机B,
2)B收到后将数据包源地址改为本机公网网卡的ip(源:ipB,目标:ipC),然后经互联网发送给C;
3)C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器, 经互联网将回应包转发给B.
4)B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。
在这个过程中,修改了请求报文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域网访问互联网。
SNAT: 是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址。
我们看看,没有SNAT,会是怎么样的结果:
如果没有第二步SNAT对A主机进行源地址转换,A与C主机的通讯会不正常中断:
因为当路由器将内网的数据包发到公网主机ipC后,公网ipC会给你的私网IP回数据包,这时,公网ipC根本就无法知道你的私网ipA应该如何走了。所以问它上一级路由器,当然这是肯定会失败的,因为从公网上根本就无法看到私网IPA,因此你无法给他通信。
为了实现数据包的正确发送及返回,网关必须将A的址转换为一个合法的公网地址,同时为了以后C主机能将数据包发送给A,这个合法的公网地址必须是网关的外网地址,如果是其它公网地址的话,C会把数据包发送到其它网关,而不是A主机所在的网关,A将收不到C发过来的数据包,所以内网主机要上公网就必须要有合法的公网地址。
而得到这个地址的方法就是让网关进行SNAT(源地址转换),将内网地址转换成公网址(一般是网关的外部地址),所以大家经常会看到为了让内网用户上公网,
我们必须在routeros的firewall中设置snat,俗称IP地址欺骗或伪装(masquerade)。
不能在routeros(网关)的防火墙B的prerouting链上设置转换源地址的防火墙策略,因为若在B的prerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip,需在postrouting设置转换源地址的防火墙策略。
实验环境:(本实验中用172.18.0.0/16网段模拟公网ip)
局域网主机A:192.168.25.106黄色提示符 白色字
防火墙B:eth0 192.168.25.107 eth1 172.18.0.107绿色提示符 白色字
互联网主机C:172.18.0.108紫色提示符 白色字
每个主机都有路由表,具有基础的路由功能。主机A上有两张网卡:eth0ip有192.168.25.106,eth1有172.18.0.106,则主机A的路由表上就会有两条记录:
destination gateway netmask iface
192.168.25.0 0.0.0.0 255.255.255.0 eth0
172.18.0.0 0.0.0.0 255.255.0.0 eth1
表示主机A可以到达192.168.25.0/24、172.18.0.0/16两个网络,网关为0.0.0.0也就是说怎么都可以到达,所以每台主机不需经过路由器就可以与和它同网段的主机通讯,若主机A想与和它不同网段的主机通讯,需要添加路由记录,添加时可以不指定接口,主机A会自动使用与网关ip同网段的ip所在网卡
0.0.0.0 172.18.0.107 255.255.0.0 eth1
即表示到达任何未知网络时将数据包转发到网关,也就是路由器的某个网卡,网关ip必须是本机可以到达的某个网段的ip,即必须是192.168.25.0/24、172.18.0.0/16两个网端的某个ip
路由器的路由表实际上也是类似的,也有本机ip所在网段的路由和到其他网段的路由,只是在普通主机的基础上启用了路由转发功能,普通主机收到目标主机不是自己的数据包后会抛弃,路由器收到目标主机不是自己的数据包后会检查路由表,将数据包转发出去,也就是说普通主机的路由表只能供自己发送数据包时使用,路由器的路由表是公用的。
本实验中,A是局域网主机,将数据包转发至防火墙主机B,B实际上也充当了路由器的作用。实际环境中,B与C之间会有多个路由器,本实验只是为了说明SNAT的工作原理,不再考虑这些因素。
nat表共有4个链:INPUT、OUTPUT、PREROUTING、POSTROUTING
-t 指定防火墙策略应用哪个表
-A 指定防火墙策略应用在该表的哪个链
--to-source 指定转换后的源地址
上述命令将来自192.168.25.0/24网段的数据包的源地址替换为172.18.0.107
192.168.25.106通过172.18.0.107访问172.18.0.108
172.18.0.108上抓包,如图,显示源地址为172.18.0.107
在C看来,是B在访问C,而不是A,但是实际上是A在访问C,数据包是从A发往C的,只是经过B时将源地址改为B,但实际上是A发过来的数据包
若企业内部有A、C、D等主机都要访问互联网,
A 请求数据包源地址 ip1端口12345 替换为 B公网ip端口12345
C请求数据包源地址 ip2端口23456 替换为 B公网ip端口23456
D 请求数据包源地址 ip3端口23456 替换为 B公网ip端口24414
SNAT中,将请求数据包的源地址替换时,端口一般不替换,即A用什么端口B就用什么端口,但若产生冲突,即C、D使用同一随机端口,B可以将端口替换为其他空闲端口,否则当C或D的响应包到达时,B就不知道替换为C还是D了,端口和IP都进行修改,称为PNAT。
6.3 DNAT
互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时:
1)、C可以访问A的公网网关地址ipB,C的请求数据包(源:ipC,目标:ipB)到达网关B后。
2)、在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。
3)、A收到后进行回复发送响应包(源:ipA,目的ipC)到网关B.
4)、网关B收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。
利用这种机制可以将企业内部的服务发布到互联网。
在这个过程中,修改了请求报文的目标地址,叫做DNAT(destination NAT POSTROUTING),用于互联网访问局域网。
必须在防火墙的prerouting上设置修改目标地址的防火墙策略,因为若不在此处修改,请求数据包通过prerouting和路由表后,由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。
实验环境:(本实验中用172.18.0.0/16网段模拟公网ip)
局域网web服务器A:192.168.25.106黄色提示符 白色字
防火墙B:eth0 192.168.25.107 eth1 172.18.0.107绿色提示符 白色字
互联网主机C:172.18.0.108紫色提示符 白色字
打开服务配置文件
Httpd默认监听在标准端口80,将端口改为非标准端口8000
因为selinux阻止使用非标准端口,所以重启失败
使用setenforce 0临时关闭selinux
-t 指定防火墙策略应用哪个表
-A 指定防火墙策略应用在该表的哪个链
--to-destination 指定转换后的源地址
当数据包的目标地址为172.18.0.107,目标端口为80,使用协议为tcp时,将数据包的目标地址修改为192.168.25.106:8000
172.18.0.108通过172.18.0.107访问192.168.25.106:8000
因为修改的是数据包的目标地址,并未修改源地址,所以192.168.25.106认为是172.18.0.107发起的请求,与SNAT不同
七、常用命令
1、 tracert命令
跟踪本地主机和目标主机之间的连接。其原理是向目标主机发送带有不断变化TTL值(第一个为1,然后每次增1)的ICMP回应数据包,直到目标作出响应或者TTL达到最大值(30个中断段)为止,以确定到目标主机的路由。格式:
tracert/ traceroute(linux) IP地址或域名
2、router配置路由
路由器不仅在硬件结构上相当复杂,而且集成了丰富的软件。路由器的主要功能通过软件实现。
路由器有自己独立的嵌入式操作系统。不同品牌的路由器操作系统不尽相同。
配置方式
¨控制台方式 通过console口和终端仿真软件
¨远程拨号方式 利用AUX口接MODEM拨号设备
¨TFTP服务器方式 通过以太网上的TFTP服务器配置路由器
¨远程登录方式 通过以太网上的telnet程序远程登录
¨网管工作站方式 通过以太网上的SNMP网管工作站
router> 用户模式, 登录成功时进入
¨用户命令状态(用户可查看路由器当前连接情况,不能查看和更改路由器的配置内容)
router# 特权模式, 在用户命令状态下输入enable进入
¨特权命令状态(可查看配置但不能修改)
router(config)# 配置模式
¨进入方法 router#config terminal
¨可修改路由器配置(如静态路由表设置等)
router(config)#interfaceEthernet 端口配置模式
¨如 router(config)#interfaceEthernet0 或Serial0
对话状态
¨在特权模式下使用setup命令进入(新路由器则在登录成功时自动进入)
————————————————
版权声明:本文为CSDN博主「hguisu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hguisu/article/details/8583552