网络层
IP协议
网络层的主要功能:通过TCP或者UDP协议绘制网络地图,数据包选取合适的路径进行传输(网络层基本单位 : 数据包 Package)
(1)编址(目标端的IP地址),数据传输的过程当中就必须表明要发送目标端的IP地址;
(2)路由选择:选择一条最快的路径进行数据包的传输;
(3)拥塞控制:防止数据包传输的过程当中出现拥塞现象,造成数据包的丢失和延迟。
IP协议的功能:
(1)寻址和路由;(根据对方的IP地址,寻找最佳路径传输信息);
(2)传递服务:① 不可靠(IP协议只是尽自己最大努力去传输数据包),可靠性由上层协议提供(TCP协议);② 无连接;(事先不建立会话);
(3)数据包的分片和重组。
IP数据包详解
-
版本号:占4位,就是IP协议的版本,通信双方的IP协议必须要达到一致,IPv4的版本就是4.
-
首部长度:占4位,IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节。
-
服务类型:占8位,4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置位1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登陆程序需要的是最小延时服务,而文件传输程序ftp则需要最大吞吐量的服务。
-
总长度:占16位,这个的意思就是ip数据报中首部和数据的总和的长度,因为占16位,所以很好理解,总长度的最大值就是2的16次方减一,65535,这玩意也对应着还有一个很简单的概念,最大传输单元mtu,意味着一个IP数据报的最大长度就只能装下65535个字节,要是传输的长度超过这个怎么办,很简单,分片。 对于分片我们放在片偏移里面进行详细分析。
-
标识:占16位,标识这玩意很好理解,IP在存储器中维持一个计数器,每产生一个 数据报,计数器就加1,并将此值赋给标识字段。但这个标识并不是平常的序号,因为IP是 无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分 片时,这个标识字段的值就被复制到所有的数据报片的标识字段中,等到重组的时候,相同标识符的值的数据报就会被重新组装成一个数据报。
-
标志:占3位,一般有用的是前两位,
最低位叫做MF,MF=1表示后面还有若干个数据报,MF=0表示这已经是最后一个数据报了。
中间位叫做DF,DF表示不能进行分片,DF=0才可以进行分片操作。
-
片偏移:占13位,片偏移就是,在原来的数据报分片以后,该片在原分组中的相对位置,片偏移中的基本单位是8字节,所以,也就是说,只要是分片,每个分片的长度都是8字节的整数倍,最后一个分片不够八字节的一样是填充。因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。
-
生存时间ttl:占8位,(time to live),表明数据报在网络中的寿命,这个值被设定成跳数,一般是64,就是这个数据报可以经过多少个路由器的数量,每经过一个路由器,该值就减一,减到为零的时候就被抛弃,这个字段主要是用来防止出现路由循环。
-
协议:表示上层协议的类型,占8位。
-
首部效验和:占16位,这个字段用来效验数据报首段,下面给出简单的计算方法:
首先在发送端的时候,将效验和全部置为0,然后把数据报首段数据全部进行反码相加,得到的值为效验和,放入首段效验和里面,然后接收端将数据报首段数据和效验和一起全部反码相加,最后若是得到零,则保留,若是不为零,则说明数据报在传输的过程中发生了改变,则丢弃该数据报。 -
IP源地址:占32位,将IP地址看作是32位数值则需要将网络字节顺序转化位主机字节顺序。转化的方法是:将每4个字节首尾互换,将2、3字节互换。
-
IP目的地址:也占32位,转换方法和来源IP地址一样。
在IP协议中,IP协议是面向非连接的,所谓的非连接就是在数据的传递过程中,不需要检测网络是否连通,所以是不可靠的数据报协议。IP协议主要用于在主机之间的寻址和选择数据包路由。
网段划分
IP地址由网络号和主机号两部分来标识。处于不同网段内的主机必须有不同的网络标识。而处于同一网段内的主机的网络号表示相同,但主机号标识必须不同。所以,在某网段内新增一台主机后,该主机的网络号与该网段的网络号相同,但是主机号不能与该网段里的其他主机的主机号相同。
通过合理设置网络号和主机号,就可以保证在相互连接的网络中,每台主机的IP地址都是唯一的。
有一种DHCP技术,可以自动为网段内新增结点主机分配IP地址。一般的路由器都带有DHCP功能,因此路由器可以看做一个DHCP服务器。
通过将IP地址划分为网络号和主机号来标识,可以有如下特点:
- IP地址管理机构在分配IP地址时只分配网络号。剩下的主机号由得到该网络号的单位自行分配,这样就方便了管理就够的管理;
- 路由器在寻找目的主机的IP地址时,只需找到目的主机所在的局域网,再在该局域网内寻找目的主机;
- 具有不同网络号的局域网必须有路由器进行连接,所以路由器总是有两个或两个以上网络号不同的IP地址。
IP地址分类
IP地址可以分为五类:A-E类
各类地址的表示范围是:
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类地址的网络号占1个字节,只有7位可以使用。可以指派的A类网络号为126(27-2)个。A类IP地址中网络字段全0表示的是“本网络(A类网络)”的意思,不用于分配给具体的主机。IP地址中网络号全1表示的是本地环回地址,用于测试本主机的进程之间的通信,即网络号为127的IP地址。A类地址的主机号占3个字节,所以一个A类网络中可以连接的最大主机数为:224-2。主机号全0表示该主机连接的单个网络地址(某个A类网络),主机号全1表示该网络中的所有主机。
B类地址的网络号占2个字节,只有14位可以使用。可以指派的B类网络号为214-1(128.0.0.0)不用,最小的网络号为:128.1.0.0。每一个B类网路可以连接的最大主机数为:216-2=65534。(扣除主机号全0和全1的IP地址)。
C类地址的网络号占3个字节,只有21位可以使用。可以指派的C类网络号为221(192.0.0.0不用),最小的网络号为:192.0.1.0。每一个C类主机可以连接的最大主机数为:28-2=254(扣除主机号为全0和全1的IP地址)。
在上述的分类中,存在以下问题:
(1)IP地址空间的利用率降低:一个B类网络中最多可以表示的IP地址为65534个,而某些种类网络由于链路的特点能够连接的结点个数有限,所以就会造成大量的IP地址浪费;由于C类网络能连接的结点个数有限。所以,单位会申请B类网络,但一般又用不了这么多的IP地址,所以会造成IP地址的浪费。同理,A类网络的IP地址也会造成大量的浪费;
(2)如果给每一个物理网络都分配一个网络号,就会导致路由表过大。此时就会造成路由表的管理成本增加,同时查询的效率也会增加。
(3)当一个单位申请了一个网络号。他想将该网络能表示的IP地址再分给它下属的几个小单位时。如果在申请新的网络就会造成浪费。
为了解决上述的问题,引入子网划分的概念。
子网划分和子网掩码
子网划分
子网划分实际是在将原A类,B类,C类网络中的主机号的部分作为子网号,将原来的ABC类网络细化的过程,将原来的一个网络分为多个网络,但是在对外表现上,还是表现为原来的一个网络。
所以,此时,IP地址组成为:网络号+子网号+主机号。
在数据进行通信的过程中,首先根据目的IP地址找到目标主机所在的网络(路由器),再根据目的IP地址的子网号找到目标主机所在的子网,最后找到目标主机。
比如,一个B类IP地址为:192.168.0.0。先将该网络划分多个子网,假定子网号占用了8位。由于原B类网络中主机号一共占用了16位,子网络拿走8位之后,一个子网中的主机号所占的位数就变成了8位。假定其中一个子网为192.168.5.0。在数据通信时,目的主机为该子网中的IP地址为192.168.5.8的主机。因此,在数据传输过程中,首先会根据目的IP地址找到该主机所在的网络192.168.0.0(其实是找到该网络上的路由器),再通过IP地址找到目的主机所在的子网192.168.5.0。最后在该子网内找到目的主机。
此时,可以将网络号和子网号统一为网络标识。
子网掩码
当数据报到达目的主机所在网络的路由器时,如何将它转发到子网上呢?
为了使目的主机所在网路的路由器能够很方便的找到目的子网,引入“子网掩码”的概念。子网掩码也是一个32位的整数,它是由一串1和一串0构成,1对应于目的主机所在的网络号和子网号,0对应于目的主机所在的主机号。对于没有划分子网的网络号,也有子网掩码,此时子网掩码中的1对应于网络号,0对应于主机号。将网络号和子网号统称为网络号后,子网掩码中的1就对应于网络号,0对应于主机号。
将目的主机的IP地址与子网掩码进行按位与操作,便可以确定目的主机所在的网络号。
此时,将目的主机IP与子网掩码按位与之后得到就是该目的主机所在的网络地址IP。在本例中,该子网的主机IP的表示范围是:145.13.3.0~145.13.3.255。能够连接的主机个数为254台(去除主机号为全0和全1的IP地址)。
上述中,子网掩码与主机IP按位与之后得到网络地址,然后主机号由全0到全1即表示该子网的地址范围。
子网掩码除了上述的表示方法外,还有一种表示方法:在每个IP地址之后追加网络地址的位数。如上例中:
145.13.3.10/24。表示的是IP地址为145.13.3.10的主机IP,子网掩码的高24位为全1。因此网络地址的高24位与该IP地址相同即145.13.3.0。
所以,在路由表中既要有目的网络地址,也要有该网络的子网掩码。才能判断目的IP是否与目的网络地址对应。
特殊的IP地址
与上述的ABC类相同,主机号为全0的表示“该网络”,主机号为全1的表示“所有主机”即广播地址。127.开头的为本机环回测试,一般为127.0.0.1。
IP地址的数量有限
我们知道, IP地址(IPv4)是一个4字节32位的正整数.,那么一共只有 2的32次方 个IP地址, 大概是43亿左右。 而TCP/IP协议规定, 每个主机都需要有一个IP地址。
这意味着, 一共只有43亿台主机能接入网络么?
实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的,,而是每一个网卡都需要配置一个或多个IP地址。
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用。 这时候有三种方式来解决:
- 动态分配IP地址: 只给接入网络的设备分配IP地址, 因此同一个MAC地址的设备,每次接入互联网中,,得到的IP地址不一定是相同的;
- NAT技术(后面会重点介绍);
- IPv6:IPv6并不是IPv4的简单升级版,这是互不相干的两个协议,,彼此并不兼容; IPv6用16字节128位来表示一个IP地址, 但是目前IPv6还没有普及。
IP分片
- 链路层有能承载的最大数据量MTU,当数据报过大时,会将数据报的数据进行分片,称为多个更多的小数据报,然后用帧封装这些小数据报。这些较小的数据报被称为片。其中MTU = IP数据报 = 数据部分+IP首部。
- 不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。
- 当数据包比MTU大且DF = 0 时表示可以进行分片,每个片的最大尺寸就是MTU减去IP的首部。
- 举例:在不够分之前每个分片都分最大值,即MTU-20 = 1480, 第一个1480,偏移量0/8 = 0; 第二个 1480, 偏移量1480/8 = 185;此时还剩4000-1480×2 = 1040,偏移量(1480×2/8)= 370
路由
IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径,路由主要的功能实现跨网络通信。
路由分类:
- 主机路由:描述网络中某主机怎么到达
- 网络路由:描述主机所在网络怎么到达,到达网络之后在ARP广播
- 默认路由:指明走的方向就能到达
访问时可能三种路由都知道,由优先级决定
路由的优先级:精度越高,优先级越高
路由表
路由器、主机中都有路由表,路由表有路由记录组成
有路由表主机与不在同一网段的主机通信才能出去,注: 路由是核心,网关是形式
路由记录的组成:
- 网络ID:目标主机所在网络id/子网掩码 (其中可以是主机ip,网络id,默认路由)
- 接口(interface):本路由器要到达对应的网络所发送的本地接口(即路由器到达对应网络应该从哪一个接口转发)
- 网关(gateway):要到达目标网络,需要发送到下一个路由器的接口ip(即目标主机不是与本机路由器直接相连的链路时,应该要转发至去目标主机且与本机当相邻的路由—>每个路由只负责与自己直连的链路和转发)
- meric:数字越小优先级越高(当有多条路径可供选择时)
假设某主机上的网络接口配置和路由表如下:
- 这台主机有两个网络接口,一个网络结构连到192.168.10/24网络,另一个网络接口连到192.168.56.0/24网络;
- 路由表Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3:
- 跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符;
- 再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;
- 由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
- 依次和路由表前几项进行对比, 发现都不匹配;
- 按缺省路由条目, 从eth0接口发出去,发往192.168.10.1路由器;
- 由192.168.10.1路由器根据它的路由表决定下一跳地址。