日升时奋斗,日落时自省
目录
1、地址管理
1.1、子网掩码
2、路由选择
针对网络层的IP协议理解
TCP/IP协议栈==TCP+IP
此处详细解析IPv4协议(v4版本)
4位版本:此处的取值只有两个v4 ,v6
4位首部长度 :描述了IP报头多长(IP报头是变长的)报头中有一个选项部分,是变长的,是可有可无的,选项的长度会影响首部长度,此处的单位也是4字节
8位服务类型(TOS) : 8位大小,实际上只有4位有效,这4位中只有1位可以是1,其他的都是0.4位就表示IP协议的四种形态/四种工作模式;
四种形态:最小延时,最大吞吐量,最高可靠性,最小成本
针对以上四种形态实际开发中就可以根据需要,来切换IP的模式,达到最优效果
对此处的形态理解:
举个例子:类似于动作游戏,打斗中切换不同的形态,攻击形态、速度形态、防御形态
16位总长度(字节数):描述了一个IP数据包的长度(头+载荷)
这个长度减去前面的IP报头长度,剩下的就是载荷长度,一个完整的TCP/UDP数据报长度,16位总长度,是否意味着一个IP数据报,最大只能支持64KB,但这就是一个限制,但是IP自身就支持对包的拆分和组装(接收来的数据总不能都是下于64KB)
以下也是分包的原因???
一个IP数据报携带的数据载荷太长了,超过64KB,就会在网络层针对数据进行拆分,把一个数据拆成多个IP数据报,再分别发送,然后接收方,重新拼接
例如:
发送方:把200KB的数据报,交给传输层(封装),传输层交给网络层(封装),网络层就把这个200KB的数据拆包(比如拆成两份)64KB+64KB+64KB+8KB
分包为四份后交给数据链路层,由以太网分装成四个个数据帧
接收方:数据链路层,针对四个数据帧进行分用,得到四个IP数据报,交给网络层,网络层针对这四个IP数据报进行解析,把里面的载荷拼成一个,向后进行以后的操作
此处说是64kb ,实际上,IP协议包不一定就按照64kb为单位进行拆分,实际的单位往往更小(取决数据链路层的情况)
16位标识:同一数据拆分成的多个包标识是一样的
3位标志:结束标志
13位片偏移:标识了多个包的先后顺序
8位生存时间(TTL):一个数据报在网络上能够传输的最大时间,这个时间的单位不是“秒”,而是“次数”,一个数据报构造出来,会有一个初始的TTL数值(比如32或者64,或者128...)这个报每次经过一个路由器转发,TTL-1(生存时间不如说是生存次数)
如果一直减到0了,还没有到达目标,此时就认为这个包永远也到不了了,就可以丢弃了。
8位协议:描述了当前载荷部分内容是属于那个协议(例如:TCP/UDP)
16位首部检验和:此处只需要针对首部进行校验,因为其余层面也有校验载荷部分(TCP/UDP数据报)
32位源IP地址这个是IP协议中,最重要的部分,此处地址是32位的整数,但是我们看见的IP地址是一串数字 此处随便举一个例子(不一定存在):222.111.123.108;
使用三个点把32位的4个字节的数字给分割开,分成4个部分,每个部分分别使用0-255十进制整数表示
地址,期望每个设备都不相同,但是32位数字,只能表示42亿9千万数字,这个数字表示了全世界所有的上网设备(智能手机+PC+服务器等等)
但是联想42亿数字相较于世界人口都比较小,上网设备数量更甚,那IP地址肯定是不够用的。
IP地址不够用有以下三种方法:
(1)动态分配IP地址.此时就可以剩下一批ip地址了(因为不是所有设备都在使用,所以一批一批轮换)这个方案没有从根本上增加IP地址,只是提高了利用率
注:此方法有一个弊端,在时间发展下,上网设备数量增长,根本上不能解决
(2)NAT网络地址转换,本质是使用一个IP代表一批设备也能提高利用率,使用端口号区分
网络也有分别,所以NAT就针对IP地址分为两类
<1>内网IP(私有IP) 10.0.*开头 或者 172.16.* -172.31.* 或者192.168.*
<2>外网IP(公网IP) 除以上IP其他的是公网IP
NAT要求,公网IP必须是唯一的,私网IP可以在不同的局域网中重复出现
内网IP只要在局域网内部不重复即可,不同局域网中则是允许重复的
私网访问公网设备,需要NAT对应NAT设备(路由器),把IP地址进行映射,从而完成网络访问,反之,公网的设备,无法直接访问私网的设备的,私网的设备,也无法直接相互访问
这里能够看到自己电脑的IP地址是,我们自己的电脑都是私有IP地址
想查看私有IP地址 使用win + r 打开运行框 输入cmd 打开命令行输入 ipconfig
局域网内部的私有IP
这些接入与运营商路由器的电脑,去访问 外部服务器都会先将自己的电脑的IP转换成路由器的外网IP(图解)
每个私网电脑想要访问运营商服务器都需要经过运营商路由器转发个服务器,服务器看到的源IP1就都一样。
试问:如果多台电脑访问,服务器看到的源IP都是一样的了,那怎么知道返回数据的是给谁的??
答:服务器的响应会先给路由器,路由器根据这些电脑不同的端口号来区分,决定发给哪个设备(传输层的端口号的端口)
可能会担心的自己的IP被发现然后被攻击(一般是不会的,因为价值不高)
还有就是服务器拿到的只是路由器的IP不能拿到电脑的内网IP如果我电脑不主动和服务器联系,服务器也就不知道我的端口了从而就无法主动找到自己(就是一般不要点击陌生的网站或者二维码)
NAT机制能够有效的解决IP不够用的问题(副作用:网络环境更加复杂)
(3)IPv6直接解决根本问题
IPv6相比IPv4更大(不兼容),IPv6为16字节表示IP地址128位,16字节表示的地址的个数,是比4字节表示的个数,大的4次方
一个4字节是42亿 16个字节相当于是 4字节*4字节*4字节*4字节 =42亿*42亿*42亿*42亿数字相当大,就够用
1、地址管理
网络号:标识网段 ,保证相互连接的两个网段具有不同的表示
主机号:标识主机,同一网段内,主机之间具有相同的网络号
把一个IP地址,分成了两个部分,一个叫做网络号,一个叫做主机号
举个例子:192.168.1.12 一个常见的设定,网络号是192.168.1 主机号是 12
一个典型的局域网环境
WAN口连接运营商设备,LAN口连接有线终端 (针对路由器后面的接口)
1.1、子网掩码
一个IP地址中那部分是网络号,那部分是主机号,如何进行分界??
此处引入一个单独的概念:子网掩码
格式:
子网掩码格式和IP地址一样,也是一个32位的二进制数,其中左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机为的长度
此时,IP地址组成为:网络号+子网号+主机号,网络号和子网号统一为网络标识
网络号怎么计算???
将IP地址和子网掩码进行“按位与”操作,得到的结果就是网络号
将子网掩码二进制按位取反,再与IP地址位与计算,得到的就是主机号
查看子网掩码的步骤:
win+r 打开了运行窗口:然后输入cmd 后打开命令行 :输入ipconfig/all
一般的家用网络都是以上子网掩码
<1>将IP地址中的主机地址全部设为0,成为了网络号,代表这个局域网
<2>将IP地址中的主机地址全部设为1,变为了广播地址,用于给同一个链路中相互连接的所有主机发送数据
<3>127.*的IP地址用于本机环回测试,通常是127.0.0.1(测试程序是否能正常工作)
192.168.0.2 主机号为 2
2、路由选择
路由选择就是规划路径,正所谓条条大路通罗马,我们也会尽可能的选择比较好走的路,网络环境非常复杂,任何一个节点(路由器)都是无法感知到网络环境的全貌的一个路由器最多只能到相邻的节点进行一个比较长的路径的转发
这里只是简单解析路由选择,基本的走法(并不详细)
核心思路:
每个路由器都会保存一定的周围设备的信息(路由表),每次有一个IP数据报经过路由器,就需要匹配路由器,看看接下来回怎么走;如果路由表上有匹配的项(该路由器认识路其实就是有衔接的路径)按照要求直接走,如果没有匹配的项(路由器不认识路也就是没有可以依附的节点),但还是会提供一个默认路径,大体方向是不会错的,继续一问一走
IP是有生存时间的(TTL) ,路由器问以一次,生命周期的次数-1也就是TTL-1 如果减到0了,还没送往目的地,说明这个包就永远也到不了,找不到也就意味着放弃