前言
网络层:在复杂的网络环境中确定一个合适的路径
目录
一IP协议
1预备知识
主机B要真正的把数据发送给主机C,是需要网络层和数据链路层(暂时忽略)的配合才能实现
而通过网络发送实际上时借助路由器来实现:那路由器有怎么知道要发送给哪个(下个)路由器呢?
通过目的IP!
IP的意义:IP地址提供了一种‘能力’:将数据跨网络送到主机C的能力!
那究竟什么叫做能力?
这就好像现实生活中有的人平时也就上上课,下来作业也不做,题目也没写,当等到考试时总能考到很高的分:我们就认为他有考高分的能力!次次能考100分,但也有失误的时候考了99,98分:所以‘能力’:有很大的概率去做成一件事情~
就假设这个人就张三,他有一个教授父亲;这次考试只考了98分,教授父亲不满意,令该年级重新组织这场考试:势必要张三考到100分!如果一次不行就两次直到达到目的!
在上面的例子中,教授父亲作用:策略;张三:有执行能力和具体的操作:两者结合才能保证张三能实现次次考100分的能力!
而IP地址也是这样,需要传输层协议的配合才有:将数据跨网络可靠送到主机C的能力
而IP地址 = 网络号 + 主机号
理解IP地址:这就好比学校的学号,里面规定了从前几位到几位代表院,专业,班级;我在路上拿到了丢失的学生卡,就能根据前几位到几位去问别人这时哪个院的,哪个专业的,哪个班级的:依照这些信息一步一步找到丢失学生卡的人!IP地址在路由器中路由器也是如此(但真实较复杂)
2基本概念
主机: 配有 IP 地址的设备(也可以进行路由控制)
路由器: 即配有 IP 地址, 又能进行路由控制;
节点: 主机和路由器的统称;
3格式
a如何分离
在TCP报头中有4位首部长度(单位4字节)范围[0,15] ->换成字节范围[0,60]
如果报头大小为20字节,那么4位首部长度为:0101(20/4=5)
1.提取20字节(报头大小);
2.读取4位首部长度,用它 - 报头大小看看等不等于0;如果为0则没有选项:剩下的都是数据
不为0则有选项(选项=首部长度-报头大小):(假设选项大小为16)提取16字节:剩下的都是数据
b如何分用
通过8为协议来识别是UDP还是TCP后交给上层
• 4位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4
• 8位服务类型(Type Of Service): 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和1 位保留字段(必须置为 0),4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性,最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延时比较重要
• 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了;这个字段主要是用来解决路由循环(BUG)
• 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏
8位协议,源IP,目的IP(IP协议),源端口,目的端口(传输层协议) 五元组标识一个网络通信
4网段划分
4.1理解IP
在这之前我们先来简单理解下IP:IP地址:2^64字节,它是有限且有用的资源
所以我们要对IP进行合理分配来充分利用它:经过合理划分来给不同的区域,国家,组织,学校等... 也就是说:我们的网络世界是被精心设计过的,从硬件到软件...
4.2IP组成
IP 地址分为两个部分, 网络号和主机号
• 网络号: 保证相互连接的两个网段具有不同的标识;
• 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
• 不同的子网其实就是把网络号相同的主机放到一起.
• 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
• 这个工作我们可以手动设置(过时),也可以让路由器来自动分配:这种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便
也就是说:路由器不仅具有路由的功能,也具有构建子网的功能!
4.3划分方式
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示
• 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
随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址;
针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing)
• 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
• 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
• 将 IP 地址和子网掩码进行 "&" 操作, 得到的结果就是网络号;
• 网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关;
例子1
只用最后一位来计算 | ||
---|---|---|
IP地址 | 140.252.20.68 | 0100 0100 |
子网掩码 | 255.255.255.0 | 0000 0000 |
网络号 | 140.252.20.0 | 0000 0000 |
子网地址范围 | 140.252.20.0~140.252.20.255 | 0000 0000~1111 1111 |
例子2
最后一位来计算 | ||
---|---|---|
IP地址 | 140.252.20.68 | 0100 0100 |
子网掩码 | 255.255.255.240 | 1111 0000 |
网络号 | 140.252.20.64 | 0100 0000 |
子网地址范围 | 140.252.20.64~140.252.20.79 | 0100 0000~0100 1111 |
例子1的子网掩码方式也可以写成:140.252.20.68/28(前28位bit为1)
4.4为什么要网段划分
在学校中每个人都有自己的学号,学号中规定:前几位为院号,剩下的为自己的编号(网段划分);有一天张三(发送方主机)在操场散步时捡到一个钱包(报文):里面有几十块钱现金和学生卡(目的IP地址);由于张三没有学过网络,它去找钱包的主人是逮住一个人就询问学生号与钱包里的学习好进行核对,相同便是找到了钱包的主人;但学校里有几千人,找下来的话明年毕业也可能找不到主人,于是舍友建议它把钱包交给院学生会主席(出入口路由器),把缘由跟他说下叫他帮忙寻找;小李(学习会主席)看到钱包里的学生号时就明白该学生不是我们院的,是隔壁工程学院的(排除),于是在群里(各个院的学习会主席群)(公网)@小赵(工程学习会主席)跟他说我们院的学生捡到了你们院的钱包,你去你们院找下这个人,小赵一看到钱包里的学生卡就知道钱包的主人是小王(接收方主机)就在院群(子网)里@小王说有人捡到了你的钱包。加他微信沟通下
要进行网段划分与学校划分学号类似:经过精心的设计和合理的划分,可以高效支持未来的报文路径查找,大大提高查找目标主机的效率!
5特殊的IP地址
• 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网;
• 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
• 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1
6IP地址的限制
我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址.
这意味着, 一共只有 43 亿台主机能接入网络么?
实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
• 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;(IP地址共享)
• NAT 技术(下面会介绍);
• IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 目前 IPv6 还没有普及;
7私有IP和公网IP
如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet 上,理论上 使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
• 10.*,前 8 位是网络号,共 16,777,216 个地址(大型企业)
• 172.16.*到 172.31.*,前 12 位是网络号,共 1,048,576 个地址(校园网)
• 192.168.*,前 16 位是网络号,共 65,536 个地址(家用路由器)
私有IP不能出现在公网,但私有IP地址,可以出现在不同的私网
也就是说:虽然存在公网,但我们平时要想上网,都必须先接入一个指定的内网中,也就是我们所有人在都在各自的内网中上网,不能出现在公网(除了运营商)
那你可能就要问了:我买的云服务器不就可以访问到公网吗?
其实不是的:使用云服务器势必要通过xshell来连接,而连接的网络也是在私网中~
• 一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网IP)
• 路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中
• 不同的路由器, 子网 IP 其实都是一样的(通常都是 192.168.1.1). 子网内的主机IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了
• 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN 口 IP 就是一个公网 IP 了
为什么运营商有访问公网的权利呢?
因为互联网就是运营商精心设计出来的!为了能实现上网,运营商要埋光纤,建基站,建机房,做着投入比产出高的工作,那让其它企业来做行吗?也可以,但大家都不愿做这件事:那为什么运营商愿意做呢?背后肯定是有人要他们这样的的:就是我们国家政府意识到网络的重要性而要求运营商这样做的!基础设施建好了,能够上网的人多了,也就慢慢诞生出如字节腾讯这样的互联网公司,也就是实现了现在的万物互联的情景!所以说运营商的功不可没(除了恶意乱扣话费外)
8NAT技术
主机A要发送报文给XXX软件服务器时,报文会先到达路由器(主机A知道发送的目的IP不在内网中(知道自己的网络号));路由器会把srcIP替换成WAN 口IP(私网不能出现在公网中),先往上进行交付直到到达XXX软件服务器!这里路由器进行IP替换的过程就叫做NAT(Net Address Translation)技术
9理解公网
公网也是有一个个内网共同组成的!运营商根据各地区实际情况来选择构建子网要用NAT技术还是用IP地址!
10路由
• 在复杂的网络结构中, 找出一条通往终点的路线
• 路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程
• 所谓 "一跳" 就是数据链路层中的一个区间:具体在以太网中指从源 MAC 地址到目的MAC 地址之间的帧传输区间
IP 数据包的传输过程
• 当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP;
• 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
那么如何判定当前这个数据包该发送到哪里呢?
这时就要依靠每个节点内部维护的一张路由表
Destination目的IP | Gateway 下一跳地址 | Genmask 子网掩码 | Flags | Metric | Ref | Use | Iface |
---|---|---|---|---|---|---|---|
192.168.10.0 | * | 255.255.255.0 | U | 0 | 0 | 0 | eth0 |
192.168.56.0 | * | 255.255.255.0 | U | 0 | 0 | 0 | eth1 |
127.0.0.0 | * | 255.0.0.0 | U | 0 | 0 | 0 | lo |
default | 192.168.10.1 | 0.0.0.0 | UG | 0 | 0 | 0 | eth0 |
例 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 路由器根据它的路由表决定下一跳地址;
11分片
a为什么会分片
在数据链路层(下篇讲)里规定:MTU(Maximum Transmission Unit)为1500字节,报文大小超过1500字节便不能发出(通过网络给接收方);决定报文大小的不是网络层,而是传输层;所以在传输层中填写报文时尽量不要超过MTU:但这时传输层非要发送2000字节报文,到达网络层,网络层知道如果继续往下交付报文是不会发送成功的,所以将报文进行分片成2个1000字节报文发出;到达对方的网络层时将报文进行组装成一个往上交付:这样在接收方传输层看来接收到的报文与发出的报文是相同的!
网络层进行分片组装的过程传输层与数据链路层是毫不知情的,所以说在网络世界里只有IP报文
b为什么不想分片
如果分片发送出去的两个报文中有一个丢了,在接收方网络层是不会再往上交付了:在分片中,一片丢失,则报文丢失
所以到底是1个报文还是10个报文丢失概率高?当然是10个报文,那也就是说分片会提高丢包概率,对传输层也会受影响(进行补发报文)不应该(不能)成为网络的主流的!(传输层是TCP还好,如果是UDP的话丢包了就真的丢包了!)
c如何做到不分片
既然进行分片后对双方都有影响,这时网络层就对传输层说了:数据链路层规定给我MTU是1500字节,减去20字节报文,你给我发送的报文大小尽量不要超过1480字节,不然对双方都不好!传输层一听觉得是有点道理,也掰起自己的手指头算:只要应用层给我发的报文不超过1460自己就能保证网络层不分片了!(传输层是tcp)这不就是通过滑动窗口来实现吗!
12组装
a如何区分收到的报文分片了
• 16 位标识: 唯一的标识主机发送的报文;报文被分片则16为标识时相同的
• 3 位标志: 第一位保留,第二位置为 1 表示禁止分片,第三位表示"更多分片":如果分片了, 最后一个分片置为 0, 其他是 1
• 13位片偏移: 是分片相对于原始 IP 报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移是这个片偏移值 <<3(乘8) 得到的. 因此, 除了最后一个报文之外(之前如果都是 8 的整数倍,最后一片的偏移量也一定是 8 的整数倍), 其他报文的长度必须是 8 的整数倍(否则报文就不连续了)
我们可以通过报头来区分报文分片
第一片:3位标记的更多分片为1 片偏移为0
中间片:3位标记的更多分片为1 片偏移大于0
最后片:3位标记的更多分片为0 片偏移一定大于0
也就是:if(更多分片 == 1 || 片偏移 > 0 ) 我们就说报文分片了
如果没分片:if(更多分片 == 0 && 片偏移 == 0)
b如何保证收齐了
没有头:找不到偏移量为0的报文
没有尾:找不到3位标记的更多分片为0
没有中间:按照片偏移进行升序排序(片偏移 + 有效载荷 = 下一个偏移量) 不等于就说明中间片丢了!
13分片组装的场景
以上便是网络层相关的内容,有错误欢迎指正,感谢你的观看~