网络层的一个重要作用就是把世界上的地址能够以一定的规范定义出来。
地址管理
路由选择
网络层的代表:IP协议
4位版本指的是:此处的取值只有两个ipv4,ipv6
4位首部长度:描述了ip报头有多长(ip报头是变长的)报头中有一个选项部分,是变长的,也是可有可无的,此处的单位是4字节
8位服务类型(TOS):表面上是8位,实际上只有4位有效,这4位中只有1位可以是1,其他的都是0,4位就表示ip协议的四种形态/四种工作模式,这四种形态,四种工作模式分别是:最小延时,最大吞吐量,最高可靠性,最小成本。
实际开发中就可以根据需要,来切换ip的模式,达到最优的效果。
16位总长度:描述了一个ip数据报的长度,这个长度减去前面的IP报头长度,剩下的就是载荷长度,一个完整的TCP/UDP数据报长度
16位总长度也就是64kb,这是不是意味着一个IP数据报,最大只能支持64kb呢?那如果传输层过来的一个数据报携带的数据载荷太长了,超过了64KB,就会在网络层针对数据进行拆分,把一个数据拆成多个IP数据报,再分别发送,接收方,再重新拼装。
发送方:把80KB的数据,交给传输层(封装),传输层交给网络层(封装),网络层就把这80KB的数据拆包(拆成两份)64KB+16KB,这两份再交给数据链路层,由以太网分装成两个数据帧,
接收方:数据链路层,针对两个数据帧进行分用,得到两个ip数据报,交给网络层,网络层对这两IP数据报进行解析,把里面的载荷拼成一个,交给传输层。
此处说是64KB,实际上IP协议包不一定就按照64KB为单位进行拆分,实际的单位往往更小(取决于数据链路层的情况)
这几个字段都是辅助拆包/组包提供的
8位生存空间:一个数据报在网络上能够传输的最大时间,这个时间的单位不是“秒”而是“次数”,一个数据报构造出来的,会有一个初始的TTL数值(比如32或者64,或者128等等)这个报每次经过一个路由器转发TTL-1 如果一直减到0了,还没有达到目标,此时就认为这个包永远也到不了,就可以丢弃了。例如:我们发一个快递,写了一个收件地址,但是如果这个收件地址压根不存在。
8位协议:描述了当前载荷部分内容属于那个协议。
16位首部校验和:此处只属于针对首部进行校验,载荷部分(TCP/UDP数据报)自身已经有校验和了,
32位源IP地址:
32位目的IP地址:
此处看到的IP地址是32位的整数,我们日常见到的IP则是一串数字,例如:78.162.56.2,使用三个.把32位,4个字节的数字给分割开,分成4个部分,每个部分使用0-255十进制整数表示。地址期望每个设备都不相同,但是32位数字,只能表示大约42亿个数字,我们希望能够表示全世界的上网设备,这还是不够的。
为了解决IP地址不够用的问题,我们采取了很多办法:
动态分配IP地址,谁当前用给谁分配IP地址,这个方案没有从根本上增加IP地址,只是提高了利用率
NAT网络地址转换:本质上使用一个IP代表一批设备,也提高了IP地址的利用率,使用端口号区分,
在NAT背景下,IP地址被分成两类,
内网IP(私有IP) 10.* 172.16.*-172.31.* 192.168.*
外网(公网IP) 剩下的是公网IP
NAT要求,公网IP必须是唯一的,私网IP可以在不同的局域网中重复出现,如果某个私网里的设备想访问公网的设备,就需要对应的NAT设备(路由器),把IP地址进行映射,从而完成网络访问,不同局域网的私网的设备没法直接相互访问。
但是这里要注意服务器只能拿到路由器的ip,不能拿到我电脑的内网IP如果我电脑不主动和服务器联系,服务器也就不知道我的端口,从而无法主动找到我。
NAT机制能够有效的解决IP地址不够用的问题,但是带来的副作用就是网络环境更加复杂了。
IPv6从根本上解决了IP不够用的问题 使用16个字节表示IP地址,相比于IPv4,能够提供更多的IP地址,IPv6看起来很好,但是当前世界上仍然是以NAT+IPv4+动态分配来进行网络组建的,真正使用IPv6的地方非常少。
一.IP协议:地址管理
网络号:表识网段,保证相互连接的两个网段具有不同的标识(局域网)
主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
把一个IP地址,分成了两个部分,一个叫做网络号,一个叫做主机号,例如:192.168.0.10 ,一个常见的设定,网络号是192.168.0 主机号是10,当前的局域网下的设备,网络号都是192.168.0
一个典型的局域网环境:
路由器都是有两个IP分别属于不同的网段(路由器的功能就是把两个局域网连接在一起)
一个IP地址,前面从哪到哪是网络号,后面从哪到哪是主机号,分界是怎么定的?
二.路由选择
给大家举个简单的例子帮助我们更好的理解路由选择
比如我从家到恐龙公园,但是我不知道路,但是我可以问
1我先出门,问A,它让我去路口做377往北走
我坐着337到了水上公园,然后我又问B,让我做399,继续往北走
我做399到了洪喜家园,然后又问C,问C,然后.......
一边走一边问,每次问都距离目的地更近
路由选择其实它的核心也是问路。每个路由器都会保存一定的周围设备的信息,每次有一个IP数据报经过路由器,就需要匹配路由表,看接下来怎么走,如果路由器表上有匹配的项(该路由器认识路)直接按要求走就行了,如果没有匹配的项(路由器不认识路)会提供一个默认路径(大体方向)沿着这个方向走,继续问,每经过一个路由器问一次,TTL都会减1,如果减到0了,还没到,说明和这个包永远丢不了,这个地址不存在,这个包就被丢弃了。