网络层:在数据链路层已经实现局域网内部主机间可以通信的前提下,实现跨LAN的主机间通信
完成路由功能,路由器这个设备就是工作在网络层的
网络层最重要的协议:IP(Internal Protocol)网际协议
IP地址有:IPv4和IPv6版本
- IPv4:32位的无符号整数(4个字节),通常,每个字节以十进制表示,中间以
.
连接,例如192.168.18.253,这种分法称为点分法- IPv6:长度128位,是IPv4的4倍,目前正在推广,但是还是广泛使用IPv4
IP地址由网络号 + 主机号组成,WAN是由一个个小网络组成的,每个小网络对应这一个网络号,就好像身份证的前几位就代表你所在省市,IP地址也是这样的
怎么把IP地址拆解成网络号和主机号?
比如一个ip地址:10.138.25.184
把最左侧的第一个十进制转化为二进制就是
0b
00001010,以0开头的就是A类地址但是这种静态方式使用不多,因为运营商在分配的时候经常分配一整个网络号,太浪费了
网络掩码:无符号32位整数,特点,前面全是1,后边全是0,比如:11111111 00000000
如果是1和0交替的,那就不是网络掩码,比如:11101101 11010011
网络掩码的写法有两种:一种是点分发,比如
224.0.0.0
;另一种就是只写1的个数,比如/3
,表示前三个二进制都是1,后面都是0
通过IP地址 + 网络掩码,如何计算网络号和主机号?
网络号 = ip地址 & mask
主机号 = ip地址 & (~mask)
第一个:180.210.242.131/21 网络号:180.210.240.0 主机号:0.0.2.131
第二个:10.253.182.113 网络号:10.192.0.0 主机号:0.61.182.113
常用的内网地址:
10.0.0.0 ~ 10.255.255.255,即10.?.?.?/8
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255,最常见
除了这些内网地址,剩下的就是公网地址
网络中的IP地址可以重复,但同一个网络内不允许重复:
意思是不同的内网之间,都可以存在都一个IP地址,但是同一个内网之间不允许IP地址重复,且这些内网的外网地址也是不重复的
比如几个独立的内网之间,可以都用192.168.1.1,这些内网的外网地址是不同的
UDP/TCP发送数据的时候,本机IP(提前绑定好),目标IP地址,这个目标IP就是长期目标
但是想要到达长期目标需要短期目标,那么如何根据长期目标得到短期目标?
通过主机内部维护着的路由表来完成,只要工作在网络层及以上的设备,都有路由表
所以交换机是没有路由表的,交换机工作在数据链路层,那么也就意味着交换机没有寻路功能
Windows系统下电脑中的路由表:
网关:上图中192.168.1.1就是出口,即下一跳的地址;一旦匹配命中,就通过网卡得到短期目标(下一跳地址),如果是在链路上,就是在同一个LAN中,此时的长期目标就是短期目标
匹配方式:长期目标(IP) & 网络掩码 == 网络目标
比如长期目标:192.168.1.3,从下往上匹配,当匹配到24/的时候,结果是192.168.1.0,就匹配上了,如果网关是在链路上,则下一跳IP是就是目标IP,即192.168.1.3
比如长期目标:118.252.137.68,匹配到0.0.0.0,结果是0.0.0.0,匹配上了,则下一跳IP(下一个短期目标)就是该网关192.168.1.1
这种网络掩码为0.0.0.0的,任意IP地址都能与其匹配,一般这条记录就称为“默认网关”,这个一般就是路由器的IP地址了,总的来说,能自己搞定就自己搞定,如果搞不定,就交给路由器
路由器中的记录来源:
静态(手动配置)、动态计算(路由算法生成)
Header部分:
上面的这些比较容易理解,在首部中,还有3个内容没有提及,分别是:16位标识、3位标志以及13位片偏移
在介绍这3个之前,我们先假设一个场景:在网络层的下层(数据链路层)一般是有每次能发送的数据大小限制的,假设有4台主机分别以千兆以太网、令牌环网、无线网这3个不同的数据链路层协议连接,以太网和无线网协议下假设能够发送100字节的数据,而令牌环网只能发送10字节的数据,那么在数据传输的过程中,就会有传不过去的情况
在这种情况下,有两种处理方式:
- 方式一:如果发送不过去,干脆直接丢掉好了,这种处理方式造成了网络不可靠,但是网络层并不负责可靠性的职责
- 方式二:进行分片发送,把100字节的数据分成10份10字节的数据,分别发送,到达目的之后在组装
一般电脑上的分片功能都是关闭的
第二种处理方式引出了新的挑战,对于接收端来说,分片发送来的数据并不能保证其顺序,也不知道哪些数据是一起的
唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么属于同一份数据的分片里面的这个id都是相同的
通过16位标识,我们能够将哪些分片属于哪部分数据区分开来,但是每份数据中分片之间的顺序还不能确定
是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置
当我们能够对每份数据中的分片进行正确排序之后,我们还有最后一个问题,什么时候分片组装完成了?换言之,我们需要知道哪个分片是这份数据中的最后一个分片?
- 第一位:保留保留的意思是现在不用,但是还没想好说不定以后要用到
- 第二位:“不分片”的标志(DF),为0表示可以分片,为1表示不允许分片
- 第三位:“更多分片”的标志(MF),表示后面是否还有分片,为1则说明后面还有分片,为0则说明后面没有分片,该分片已是最后一位了
Windows下通过tracert命令,可以看到每一跳的IP地址