网络层
传输单位为数据报,任务是把网络层的协议数据单元从源点传到目的点(主机之间),协议有IP、ICMP协议,ARP和RARP等。IP层为因特网提供了选路和转发的功能。
2.1路由器
路由器主要完成两个功能:路由选择和分组转发
2.1.1路由选择
动态的改变所选择的相邻路由器,可通过静态路由算法(手工配置路由信息)或动态路由算法(通过相邻的路由器之间彼此交换信息,然后按照一定算法优化得到转发表,并不断更新以适应不断变化的网络。
动态配置是通过DHCP,即动态主机配置协议实现的,它不仅可以用于获取IP信息,还可以获取子网掩码,第一条路由器,DNS服务器地址等信息,是很重要很常用的协议)
2.1.2分组转发
根据转发表将IP数据报转发出去
2.2拥塞控制
流量控制与其的区别主要是:
(1)流量控制是指发送端和接收端之间点对点通信量的控制,即抑制发送端发送的速率,以便接收端来得及接收。
(2)拥塞控制则必须保证子网能承载待发送的数据,一般有静态预防的并环控制阀和检测发生拥塞的动态的闭环控制法。
计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。
所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网
拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。(单独写一篇文章介绍)
2.3 IPv4
一个IP数据报包括首部和数据:
主要有版本号(一般是4),首部长(占4位,一般是20字节),总长度(16位,即数据报最大长度为2^16-1=65535字节),首部校验和(只校验首部而不管数据),生存时间TTL(数据报可在网络中通过的路由器的最大值,每经过一个路由器转发,减一,为0时丢弃。表示数据的生命以确保不会永远在网络中循环),协议(6表示TCP,17UDP),源IP地址和目的IP地址
2.3.1 Ip数据报分片
一个链路层数据报能承载的最大数据量为最大传输单元MTU(不同的链路协议不同),IP数据报需要封装在链路层数据报中发送,故MTU限制IP数据报的长度,当IP数据报的总长度>MTU,则需要分片为多个较小的IP数据报,即为片,然后在目的地的网络层重新组装,所以需要IP数据报首部的标识号和片偏移。
2.3.2 Ipv4地址
在因特网中,无论是主机还是路由器,都通过接口接入网络。接口是主机或路由器接入网络的装置,一般情况下,一个主机由一个接口,而路由器有多个接口。为了使得接口能够工作在网络层,每个接口都需要有IP地址。因此,IP实际上是和接口相关联的,而不是与主机或路由器相连的。
Ip地址由网络号+主机号,分等级的地址结构,其好处在于:IP地址管理机构分配IP地址时只分配第一级的网络号,而主机号则由得到该网络的单位自行分配,方便Ip地址管理;路由器则根据目的主机的网络号来转发分组,从而减小路由表占用的存储空间。
子网划分是因为两级IP不够灵活,给每个物理网络分配一个网络号会使路由表太大使网络性能变坏,所以在IP地址添加一个子网号字段,使其变为三级IP地址(网络号+子网号+主机号):从主机号借用若干bit来作为子网号(IP地址与对应的子网掩码按位与,即可得到子网的网络号),网络号不变。其他网络发送到本单位的IP数据报还是先根据目的地址的网络号发送到本单位的路由器,然后再根据目的网络号和子网号找到目的子网,再交付给目的主机。
ipv6的地址空间扩张到128位。
2.3.3IP地址与Mac地址
Mac地址是数据链路层使用的地址,在网络层及网络层之上使用IP地址,通过数据封装将Ip数据报分组封装为Mac帧,数据链路层看不到Mac帧中的IP地址,是通过路由器转发IP分组时在每个路由器解封得到IP地址,然后根据路由表选择到目标网络(子网号)需要转发的下一跳,重新以路由器的Mac地址封装好Mac帧(意味着Mac地址换了)再进行传送。IP层就抽象了互联网的,屏蔽了下层的复杂细节,使得我们的上层协议只需要使用统一的、抽象的Ip地址来研究主机与主机或路由器之间的通信(为什么使用IP)。
2.3.4地址解析协议ARP
在实际网络链路中传送数据帧时,最终必须使用Mac地址,ARP完成IP地址到Mac地址的映射。每个主机设有ARP高速缓存(ARP表),存放本局域网中各主机和路由器间的映射,使用ARP协议来动态维护此表。这个是网络层协议!
原理:当网络主机A需要向主机B(本局域网内!)发送IP数据报,
1、先通过ARP协议查看B的Mac地址;
2、若找到则将其写入Mac帧并发送至B;
3、否则使用目的Mac地址为全1的帧封装并广播ARP请求分组使得局域网内的每个主机都收到ARP请求,当B收到该请求,解析得到IP数据报发现IP地址是自己,则对A发出响应ARP分组,包含B的IP地址和Mac地址的映射关系,然后A存起来。
2.3.5 网际控制报文协议ICMP(Internet Control Message Protocol)
ICMP是IP层协议,用于在IP主机、路由器之间传递控制消息(控制消息指:网络通不通、主机是否可达、路由是否可用等网络本身的消息)。
把ICMP报文作为IP数据报的数据,组成IP数据报发送出去,ICMP报文分为差错报告报文和ICMP询问报文,最常见的ICMP的应用是ping和traceroute。
(1)差错报文:
发送出错报文返回到发送源数据的设备,发送设备收到以后根据ICMP报文确定发生错误的类型,并确定如何才能更好的重发失败的数包,ICMP只是报告问题,纠正错误由发送方完成。
不会产生ICMP差错报文的情形:
1、 ICMP差错报文的地址是广播地址或多播地址的IP数据报。
2、作为链路层广播的数据报。
3、 不是IP分片的第一片。
4、源地址不是单个主机的数据报。
这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
ICMP差错报文中的一些组合(类型和代码的组合)描述:如网络不可达、协议不可达、端口不可达等。
端口不可达的意思:UDP的规则之一是,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文,将报文中的类型和代码的组合设定为端口不可达。Traceroute程序就是利用端口不可达来产生ICMP差错报文的。
(2)查询报文:
ICMP协议大致分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:
ping查询(PING (Packet Internet Grope),因特网包探索器,用于测试网络连接量的程序Ping发送一个ICMP回声请求消息给目的地并报告是否收到所希望的ICMP回声应答。它是用来检查网络是否通畅或者网络连接速度的命令)
子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
时间戳查询(可以用来同步时间)
而差错报文则产生在数据传送发生错误的时候。
Ping程序目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。我们称发送回显请求的ping程序为客户,而称被ping的主机为服务器。大多数的TCP/IP实现都在内核中直接支持Ping服务器—这种服务器不是一个用户进程。
ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。
我们可以看到,ping给出来了传送的时间和TTL的数据。
ping还给我们一个看主机到目的主机的路由的机会。这是因为,ICMP的ping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数据报中。而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机。但是,无论如何,ip头所能纪录的路由列表是非常的有限。如果要观察路由,我们还是需要使用更好的工具,就是要讲到的Traceroute(windows下面是tracert)。
Traceroute
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管ping工具也可以进行侦测,但是,因为ip头的限制,ping不能完全的记录下所经过的路由器。所以Traceroute正好就填补了这个缺憾。
Traceroute的原理是非常非常的有意思,它收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包(TTL字段的目的是防止数据报在选路时无休止地在网络中流动。),而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。
有人要问,我怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较小的端口,比如说80,23等等。而traceroute发送的是端口号>30000(真变态)的UDP报,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了,所以,说Traceroute是一个骗子一点也不为过:)
TTL:TTL是生存时间的意思,就是说这个ping的数据包能在网络上存在多少时间。当我们对网络上的主机进行ping操作的时候,我们本地机器会发出一个数据包,数据包经过一定数量的路由器传送到目的主机,但是由于很多的原因,一些数据包不能正常传送到目的主机,那如果不给这些数据包一个生存时间的话,这些数据包会一直在网络上传送,导致网络开销的增大。当数据包传送到一个路由器之后,TTL就自动减1,如果减到0了还是没有传送到目的主机,那么就自动丢失。