网络层
一、指引
负责在不同网络之间尽力转发数据包,基于数据包的IP地址转发,不负责丢失重传,如果前面处理不过来,则后来的数据包就会被丢弃。也不管你的数据包有什么顺序,反正来了就规划路线,然后转发出去。可靠传输由传输层来实现。
动态规划就是动态路由,指定就是静态路由
所以只要网络连接没有问题,就可以将复杂的互联网看成一个虚拟的网络,从而简化分析问题的复杂度。
二、PT搭建网络验证网络层功能
搭建两个局域网
使用路由去将两个局域网通过广域网连接
规划IP地址
路由器端口配置
no shutdown 表示打开这个端口,shutdown是关闭
router 1:由于是发送方,所以要设置时钟频率,就是发送速度
Would you like to enter the initial configuration dialog? [yes/no]: n
Router>enable
Router#config terminal
Router(config)#interface fastEthernet 0/0
Router(config-if)#no shutdown
Router(config-if)#ip address 10.0.0.1 255.0.0.0
Router(config-if)#exit
Router(config)#interface serial 2/0
Router(config-if)#no shutdown
Router(config-if)#clock rate 64000
Router(config-if)#ip address 11.0.0.1 255.0.0.0
router 2 :接收方,不需要配置时钟频率
Would you like to enter the initial configuration dialog? [yes/no]: n
Router>enable 进入特权模式
Router#config terminal 进入配置终端
Router(config)#interface serial 3/0
Router(config-if)#ip address 11.0.0.2 255.0.0.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config-if)#interface fastEthernet 0/0
Router(config-if)#ip address 12.0.0.1 255.255.0.0
Router(config-if)#no shutdown
测试网络是否连通
局域网和广域网都通了,但是左边的主机Ping 右边主机是不通的,因为路由器不知道下一跳要把数据包给谁,需要管理员进行配置路由表,或者它自己学习,这就是静态路由和动态路由。
查看路由表
Router#show ip route
配置静态路由
Router(config)#ip route 12.0.0.0 255.255.0.0 11.0.0.2
表示如果去12.0.0.0网段,下一跳就给到11.0.0.2
再Ping一次
C:>ping 12.0.0.2
Pinging 12.0.0.2 with 32 bytes of data:
Reply from 12.0.0.2: bytes=32 time=2ms TTL=126
Reply from 12.0.0.2: bytes=32 time=2ms TTL=126
Reply from 12.0.0.2: bytes=32 time<1ms TTL=126
Reply from 12.0.0.2: bytes=32 time=12ms TTL=126
Ping statistics for 12.0.0.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 12ms, Average = 4ms
这次就通了
三、发送数据的过程
数据链路层会比对目标IP地址的网段,看是否是同一网段的,然后分两种情况进行数据的发送。不过他们的数据报都是一样的,因为网络层封装的时候只看IP地址,然后传给数据链路层。
数据链路层一看,原来是同一网段的,那就发送一个ARP广播,询问网段中的所有计算机,看谁的IP地址和这个目标地址的IP地址相同,则目标计算机会返回他的MAC地址,然后封装MAC帧进行传输。
数据链路层一看,。竟然不是同一网段的,那就发送一个ARP广播,拿着网关去询问网段中的所有设备,看谁的IP地址和这个目标地址的IP地址相同,则目标计算机会返回他的MAC地址,然后封装MAC帧进行传输。这个目标MAC地址就是路由器的MAC地址,每个计算机配网关就是路由器的IP地址。
四、网络层协议
ARP协议
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。
ARP协议包是没有IP地址的,那是IP协议的作用,选定路径
ARP广播只会在通信前发送一次,之后传给这个IP地址的时候就不会再发了,直接使用本机ARP缓存中记录的MAC地址。
ARP数据包
查看本机ARP缓存
ARP欺骗
P2P终结者和网络执法官就是利用了ARP欺骗,ARP欺骗是一个数据链路层的故障,因为是MAC地址错误。
如果发现处于同个网段的两个计算机无法通信,或者其他外面的计算机无法访问本网段的服务器,那么就可以排查一下是不是ARP欺骗。通过两个计算机的arp -a指令比对一下是否相同,如果不同通过arp -s 目标IP地址 新MAC地址进行MAC地址的修改。
防止ARP欺骗
执行bat脚本arp -s命令
如果同一个网段的计算机和网关之间都知道了对方的MAC地址,则不会再使用ARP协议了,也就没机会ARP欺骗了。就是将对方的MAC地址设置为静态的,可以写一个.bat脚本,在计算机启动的时候就执行这个脚本,arp -s 目标IP地址 MAC地址,然后就能够将目标计算机的MAC地址设置为静态的了,-s就是表示static ,静态。
防火墙
ICMP协议
互联网控制消息协议(英语:Internet Control Message Protocol,缩写:ICMP)是互联网协议族的核心协议之一。它用于网际协议(IP)中发送控制消息,提供可能发生在通信环境中的各种问题反馈。通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。
ICMP [1]依靠IP来完成它的任务,它是IP的主要部分。它与传输协议(如TCP和UDP)显著不同:它一般不用于在两点间传输数据。它通常不由网络程序直接使用,除了 ping 和 traceroute 这两个特别的例子。 IPv4中的ICMP被称作ICMPv4,IPv6中的ICMP则被称作ICMPv6。
ping指令就是使用ICMP协议,测试网络是否畅通
ping IP或域名 -t表示一直Ping
使用PT演示Ping命令返回的两种错误
有去无回
让PC2PingPC4
由于返回的信息回不来所以请求超时了,如果网络拥堵也会超时,因为回不来。
到不了
让PC4去ping PC2
路由表不知道怎么走就返回目标地址无法到达
pathping命令
tracert指令
可以跟踪,但是不计算丢包
windows
路由器上
IGMP协议
网路群组管理协议(英语:Internet Group Management Protocol,缩写:IGMP)是用于管理网路协议多播组成员的一种通信协议。IP主机和相邻的路由器利用IGMP来创建多播组的组成员。像ICMP用于单播连接一样,IGMP也是IP多播说明的一个完整部分。 IGMP为互联网协议的一种,属于开放系统链接(OSI) 模块的第三层协议,IP主机用它将主机的多点发送成员人数报告给临近的多点发送路由器。
点播
就是两个计算机直接建立一份会话连接,可以想看哪里看哪里,有进度条。
广播
源计算机发送一个全F地址的广播信息,所有的计算机都会处理这个广播包。比如一个学校的全体学生都看同一个老师上课,如果使用点对点,那么就会发送很多份,占用带宽,所以使用广播就能节省带宽。
组播==多播
可能有些学生想要听数学老师的课,有些学生想要听英语老师的课,那么使用广播就不行了,可以使用一个多播地址,然后想上数学课的学生绑定数学老师的组播地址,这就将学生进行了分组,这就像是电视机调频道一样,想看哪个老师的,就调到那个组播地址。没有进度条,播到哪播什么都控制不了。多播不会建立会话
五、IP数据包
抓包分析
这个图直观展示了IP数据包的首部
分片
当IP数据包大于1500字节(因为网络层最大支持65535字节,而数据链路层最大支持1500字节),那么在数据链路层就会进行分片,然后再分别传输,到了目标地址,它会将这些片给合成完整的数据帧,如果等了好久还是没收齐这些片,那么之前收集的片也会丢掉,这个包就传输失败了。泪滴攻击就是利用这个分片的原理来攻击你的计算机。
泪滴攻击(TearDrop)指的是向目标机器发送损坏的IP包,诸如重叠的包或过大的包载荷。借由这些手段,该攻击可以通过TCP/IP协议栈中分片重组代码中的bug来瘫痪各种不同的操作系统
版本
首部长度
占2字节,如果可选字段没有的话值就为20字节,所以数据部分不分片的最大长度为1480字节区分服务
网络上的数据有优先级之分,所以根据区分服务的参数区分优先级
标识和标志
标识:占2字节,是用于在数据包分片的时候使得目标计算机知道哪些片是属于同一个数据包的
标志:占3位,表示分片的一些信息
这个3位字段用于控制和识别分片,它们是:
- 位0:保留,必须为0;
- 位1:禁止分片(Don’t Fragment,DF),当DF=0时才允许分片;
- 位2:更多分片(More Fragment,MF),MF=1代表后面还有分片,MF=0 代表已经是最后一个分片。
如果DF标志被设置为1,但路由要求必须分片报文,此报文会被丢弃。这个标志可被用于发往没有能力组装分片的主机。
当一个报文被分片,除了最后一片外的所有分片都设置MF为1。最后一个片段具有非零片段偏移字段,将其与未分片数据包区分开,未分片的偏移字段为0。
片偏移
占13位。片偏移:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
分片示例
结束的包
是一个ICMP协议的包
存活时间(Time to Live ,TTL)
存活时间(英语:Time To Live,简写TTL)是电脑网络技术的一个术语,指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。每当数据包经过一个路由器时,其存活次数就会被减一。当其存活次数为0时,路由器便会取消该数据包转发,IP网络的话,会向原数据包的发出者发送一个ICMP TTL数据包以告知跃点数超限。其设计目的是防止数据包因不正确的路由表等原因造成的无限循环而无法送达及耗尽网络资源。
和物理地址一样,每过一次路由器都会进行一次修改,物理地址是一个网段两个计算机之间可以直接通信,只有过了一个新路由器,到了新网段需要调整物理地址。
协议号
-
ICMP协议号 0x01
IGMP协议号 0x02
-
TCP 0x06
-
UDP 0x11
IPv6 41
OSPF 89
首部检验和
这个16位检验和字段只对首部查错,不包括数据部分。在每一跳,路由器都要重新计算出的首部检验和并与此字段进行比对,如果不一致,此报文将会被丢弃。重新计算的必要性是因为每一跳的一些首部字段(如TTL、Flag、Offset等)都有可能发生变化,不检查数据部分是为了减少工作量。数据区的错误留待上层协议处理——用户数据报协议(UDP)和传输控制协议(TCP)都有检验和字段。此处的检验计算方法不使用CRC。
选项
附加的首部字段可能跟在目的地址之后,但这并不被经常使用,从1到40个字节不等。请注意首部长度字段必须包括足够的32位字来放下所有的选项(包括任何必须的填充以使首部长度能够被32位整除)。当选项列表的结尾不是首部的结尾时,EOL(选项列表结束,0x00)选项被插入列表末尾。下表列出了可能
六、IP分片和重装
分片
当设备收到IP报文时,分析其目的地址并决定要在哪个链路上发送它。MTU决定了数据载荷的最大长度,如IP报文长度比MTU大,则IP数据包必须进行分片。每一片的长度都小于等于MTU减去IP首部长度。接下来每一片均被放到独立的IP报文中,并进行如下修改:
- 总长字段被修改为此分片的长度;
- 更多分片(MF)标志被设置,除了最后一片;
- 分片偏移量字段被调整为合适的值;
- 首部检验和被重新计算。
例如,对于一个长20字节的首部和一个MTU为1,500的以太网,分片偏移量将会是:0、(1480/8)=185、(2960/8)=370、(4440/8)=555、(5920/8)=740、等等。
如果报文经过路径的MTU减小了,那么分片可能会被再次分片。
比如,一个4,500字节的数据载荷被封装进了一个没有选项的IP报文(即总长为4,520字节),并在MTU为2,500字节的链路上传输,那么它会被破成如下两个分片:
# 总长 更多分片(MF)? DF 分片偏移量 首部 数据 1 2500 是 0 0 20 2480 2 2040 否 0 310 20 2020 现在,假设下一跳的MTU为1,500字节,那么每一个分片都会被再次分成两片(由于数据片段只有在目的主机才重新被组成数据报,因此再次分片是针对每个在网络中传输的数据帧):
# 总长 更多分片(MF)? DF 分片偏移量 首部 数据 1 1500 是 0 0 20 1480 2 1020 是 0 185 20 1000 3 1500 是 0 310 20 1480 4 560 否 0 495 20 540 第3和4片是从原始第2片再次分片而来,所以除了分片后的最后一个分片外MF为都为1。
七、使用抓包工具排除网络故障
有时网络故障是因为局域网内有台计算机不断在发ARP广播包,通过抓包可以看到发送者的IP地址,进而解决故障。如果这个IP地址是伪造的,则只能通过二分法来拔网线确定故障位置。
八、IP协议
路由器通过两种路由,静态路由和动态路由来进行数据的转发,由管理员指定的称为静态路由,自己学习的称为动态路由。所有能够使路由器学习路由表的协议都是IP协议。
网络畅通的条件:数据包有去有回
九、PT搭建路由通信实验
一定要一开始先规划好IP地址,不然后面就乱了
注意:广域网线在串口2端定义时钟频率
这里有个小钟表,表示需要定义时钟频率
定义时钟频率
不能乱写,有规范的
Router(config-if)#clock rate ?
Speed (bits per second
1200
2400
4800
9600
19200
38400
56000
64000
72000
125000
128000
148000
250000
500000
800000
1000000
1300000
2000000
4000000
<300-4000000> Choose clockrate from list above
Router(config-if)#clock rate 64000
Router(config-if)#ip address 172.16.0.1 255.255.255.0
Router(config-if)#no shutdown
此时路由器不知道到其他网段应该怎么走 ,PC0此时PingPC1会这样
C:>ping 192.168.1.2
Pinging 192.168.1.2 with 32 bytes of data:
Reply from 192.168.0.1: Destination host unreachable.
Reply from 192.168.0.1: Destination host unreachable.
Reply from 192.168.0.1: Destination host unreachable.
Reply from 192.168.0.1: Destination host unreachable.
Ping statistics for 192.168.1.2:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
网关回答说无法到达目的地
配置路由表:静态路由
网关的路由表配置了之后再Ping就是超时了,因为数据包已经从这个网段中发出去了,但是没回来,就超时了。
配置完成后出现了一个奇怪的问题,PC0去PingRouter0可以Ping的通,但是PingPC1却超时了。
猜测是Router0和PC1之间出现了问题。PC1PingRouter0也没有问题。
猜测是PC1的网关没设置或者设置错了,结果发现网关真的错了,配成了198.168.1.1,改正后就Ping的通了
静态路由
需要管理员告诉路由器没有直连的网络下一跳需要给谁,想要到达路由相邻的网络(就是路由器的端口所位于的网段,就是路由器相邻的网段,同一网段的通信不需要其他路由器转发,所以不用路由表)之外的网络的话就需要路由表中指定
静态路由不适合在网络规模比较大的情况下使用,要写很多条路由表,而且如果网络线路发生了变化就不通了。这个时候出现了动态路由。
动态路由
RIP协议
路由信息协议(英语:Routing Information Protocol,缩写:RIP)是一种内部网关协议(IGP),为最早出现的距离向量路由协议。属于网络层,其主要应用于规模较小的、可靠性要求较低的网络,可以通过不断的交换信息让路由器动态的适应网络连接的变化,这些信息包括每个路由器可以到达哪些网络,这些网络有多远等。
虽然RIP仍然经常的被使用,但是由于收敛慢和支持的广播网络规模有限等缺点(最大支持15跳,再多就认为不可到达),许多人认为它将会而且正在被诸如OSPF和IS-IS这样的路由协议所取代。当然,我们也看到EIGRP,一种和RIP属于同一基本协议类但更具适应性的路由协议,也有被使用。
路由器周期性的向周围的路由器广播路由表,还会说它到某个网段经过的路由器的个数,也就是需要几跳才能到达目标网段。然后,如果某个路由器想要到某一个网段就会根据它周围路由器的路由表,选择一个跳数最少的进行传输信号。
PT配置动态路由
Router#config t
Router(config)#router rip//执行这个命令就开启了动态路由
Router(config-router)#network 192.168.0.0//配置向外界路由器发送所能到达的网段,把和他直接相连的网段都给放上去
Router(config-router)#network 192.168.1.0
Router(config-router)#network 192.168.2.0
Router(config-router)#network 192.168.7.0
配置完成之后
这些路由器自动根据RIP协议去获得动态路由
现在PC0和PC2就能Ping通了
此时追踪跃点,路线可知
路由器选择了最优这条线路
如果最优线路此时发生了问题,比如网线给人剪断了
它会自动走次优的线路,所以说动态路由是可以应对网络变化的