终于来到了网络层,这一层就好好熟悉我们经常见到的IP地址。
目录
一、功能
网络层的功能主要在于路由功能,路由就是路径选择,也就是为数据包在复杂的网络环境中找一条合适的路径。
例如,某市的A大学的G同学和B大学的M同学在异地恋,每个周末G同学都会去找M同学,从A大学到B大学有很多条路:
①公交->地铁->出租
②地铁->蹦蹦->公交
③出租-->公交
所以这三条路径可以选择其中一条合适,时间短的,便宜的路径到达B学校。
在本节我也弄一写协议:
把具有ip地址但是不自己进行路由选择的设备称为主机;
把具有多个ip地址的且进行路由选择的设备称为路由器
把路由器和主机统称为结点
二、IP协议格式
- 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4,对于IPv6来说就是6,4位最大为15。
- 4位头部⻓度(header length):单位是 4 字节,和前面的TCP头部长度是一样的,计算方式一样,结果也是一样,因为都有一个不确定长度的选项,所以头部长度最大是60字节。4bit表⽰最大的数字是15,因此IP头部最⼤⻓度是15 * 4字节。
- 8位服务类型(Type Of Service): 3位优先权字段(已经弃⽤),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示: 最⼩延时、最⼤吞吐量、最⾼可靠性、最⼩成本。这四是互斥的,只能选择一个,就行迪迦奥特曼的三个形态,虽然能切换,但是只能每次保持一个形态战斗,不能同时是力量型也是迅捷型。这四个里面,对于ssh/telnet这样的应⽤程序,最⼩延时⽐较重要;对于ftp这样的程序,最⼤吞吐量⽐较重要。
- 16位总⻓度(total length):IP数据报整体占多少个字节。最多65535字节。
- 16位标识(id): 唯⼀的标识主机发送的报⽂,如果IP报⽂在数据链路层被分⽚了,那么每⼀个片里面的这个id都是相同的。至于为什么会分片,这就和链路层的MSS有关了。
- 3位标志字段:第⼀位保留(保留的意思是现在不⽤,但是还没想好说不定以后要⽤到),第⼆位置为1表⽰禁⽌分⽚,这时候如果报⽂⻓度超过MTU(链路层的概念,数据帧的一个大小限制),IP模块就会丢弃报⽂。第三位表⽰"更多分片", 如果分片了的话, 最后⼀个分⽚置为1, 其他是0,为0的就说明这是最后一个片,类似于⼀个结束标记。
- 13位分⽚偏移(framegament offset):是分⽚相对于原始IP报⽂开始处的偏移,其实就是在表示当前分片在原报⽂中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的,因此, 除了最后⼀个报⽂之外,其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了)。
- 8位⽣存时间(Time To Live,TTL):数据报到达目的地的最⼤报⽂跳数,⼀般是64. 每次经过⼀个路由, TTL -= 1, ⼀直减到0还没到达, 那么就丢弃了,这个字段主要是⽤来防⽌出现路由循环 。这个就类似与六度空间理论:你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个中间人你就能够认识任何一个陌生人,例如你和你的偶像,你就可以在你朋友的朋友的朋友的朋友的朋友之内就有的偶像。
- 8位协议:表示上层协议的类型。
- 16位头部校验和:使⽤CRC进⾏校验,来鉴别头部是否损坏。
- 32位源地址和32位目的标地址:表示发送端的IP地址和接收端的IP地址。
- 选项字段(不定⻓, 最多40字节):因为头部最长60字节,前面是固定的20字节,所以最多40字节。选项内容就太多了。
三、IP地址
-
IP地址
我们看到的IP地址是一个点分十进制的四个字节的整数,其实它就是一个4字节的二进制数。
IP地址由两部分组成,第一部分是网络号,标识一个网段;第二部分是主机号,标识一个主机。同以网段内的主机具有相同的网络号,但是主机号不同,这样在同一网段内就能有不同的地址,不同网段内也是不同的地址。
由于⼿动管理IP不方便,因此有⼀种技术叫做DHCP,能够⾃动的给⼦网内新增主机节点分配IP地址,避免了。
⼀般的路由器都带有DHCP功能,因此路由器也可以看做⼀个DHCP服务器。
特殊的IP地址:0.0.0.0这个IP地址是一个保留地址,就是本网络,这个在链路层的arp协议中会涉及到。
网络号127为的作为本地软件的换回测试,就是用于主机上进程与进程之间通信用。
-
五类IP地址
在曾经网络还不是很发达的时候,网络中的主机数量层次不齐,有的网络的主机很多,而有的网络的主机则很少。于是更好的满足用户的需求,于是诞生了五类IP地址。
网络类别 | 最大可以分配的网络地址数量 | 第一个可以分配的网络号 | 最后一个可以分配的网络号 | 网络中最大可以有多少个主机 |
A | 126(2的7次方-2)(0和127不能用) | 1 | 124 | 16777214 |
B | 16383(2的14次方-1)(0不能用) | 128.1 | 191.255 | 65534 |
C | 2097151(2的21次方-1)(0不能用) | 192.0.1 | 223.255.255 | 254 |
随着Internet的高速发展,B类的IP地址很快被分配完了,因为大部分单位的主机都是大于254台的,所以B类的主机非常合适。虽然提供了这五类的IP地址满足了用户的需求,但是却又极大的浪费,例如哪个单位会有1677万个主机,所以A类IP地址非常浪费。于是针对这种浪费提出了子网掩码这一概念。
-
⼦网掩码
⼦网掩码(subnet mask)用来区分网络号和主机号,也是⼀个32位的正整数,通常⽤⼀串 0 来结尾,0 前面的位则全是1 。将IP地址和子网掩码进⾏ "按位与" 操作,得到的结果就是网络号。于是就没有了上面的五类IP地址了。
下面说一个例子来理解这个操作。
IP地址 | 192.168.121.121 | 11000000.10101000.01111001.01111001 |
子网掩码 | 255.255.255.0 | 11111111.11111111.11111111.0 |
网络号 | 192.168.121.0 | 11000000.10101000.01111001.0 |
主机号 | 2 ~ 254 | 00000010 ~ 11111110(如果是0就成了网络号,1是网关用的,255则变成了全1成为子网掩码) |
后面写IP地址就会在后面把子网掩码带上,方便求出网路号。如上面的IP地址就是:192.168.121.121/24(一共是24个1)
网关:标识着这个网段,它是一个子网到上层网络的通道
网络不仅在发展,电子产品也在发展,IPv4是一个32位的无符号数,最左也就42亿九千万,现在国家在发展,经济在发展,现在每个人最少也是一个手机,一个电脑,还不说一个单位的服务器什么的。这需求量根本不是42亿九千万就能解决的。
正所谓“兵来将挡,水来土掩”,于是就有了下面三种方法。
- 动态IP分配
- NAT技术
- IPv6
-
IP地址的进阶技术
1、动态IP分配
有人干活就有人休息,于是动态IP地址分配就是只给上网的人分配地址。
于是同一个主机设备,在不同时间连入互联网,IP地址是不一样的。
2、NAT技术
NAT,即:Network Address Translation。网络地址转换技术。这个就是说,路由器中的每个网段的所有主机,都共享该网段的一个IP地址,于是网关的作用,就出现了。网关标识着这个网段,网段里面的主机的IP地址都在这个网段内。路由器还有一个接口是连接公网的。所以这些主机通过这个路由器来进入公网。
但是我们这样的话会带来一个问题。
但是这样还是存在一个问题,如果相同网段下的主机都发送消息,那路由器收到的消息怎么确定是哪个主机呢?
其实在路由器转换地址的时候会给每个IP加上一个端口,这样在收到的时候,就可以根据端口,再返回给主机
这就是NAT转换的流程,上面记录转换的端口,地址的叫做地址转换表。
3、IPv6
IPv6⽤16字节128位来表⽰⼀个IP地址,这样就有无数个IP地址,传言IPv6可以为地球上的每一粒沙子都分配一个IP地址。
IPv6并不是IPv4的简单升级版,这是互不相干的两个协议,彼此并不兼容。
由于IPv4有了良好的解决IP地址不够用的方案,所以一开始的程序都是用的IPv4。如果现在要升级成IPv4的话,要花费很多的财力和人力,所以目前前IPv6还没有普及。
-
私有IP地址和公网IP地址
在前面的简单模型上,就可以看到着两个概念的影子。
私有的IP地址,就是局域网内的;共有IP地址就是互联网上的。
也就是或私有的IP地址是可以自己分配的,公网IP地址则是运营商给的。
官方规定组建局域网的IP地址格式如下:
10.*,前8位是网络号,共16777216个地址
172.16.到172.31.,前12位是网络号,共1048576个地址
192.168.*,前16位是网络号,共65536个地址包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP)
四、路由
将前面的技术结合起来便为路由搭建好了基础。
说一个简单的例子就可以认识到路由了——《西游记》
在前面说是路由选择的过程,路由器中有一个路由表,里面记录着可以到达的地方的IP地址,所以每当数据报到达路由器,都会将数据中的目的IP与路由便里面的数据进行比较,如果符合就直接发给目的主机,如果不符合,在最后一行有一个有一个缺省网络,然后发给这个缺省的网络地址处,这个缺省网络其实就是路由器的网关,也就是它的上层网络,上层网络肯定知道这个IP地址是去哪的,如果它也不知道,它还有上层呢,直到交付的公网。
其实路由器中还有很多路由表生成算法,会自己没事的时候,就会去认识朋友、朋友的朋友,这样路由便表上就更加详细,就会大大增加路由选择的效率。