java-ee|网络编程(7)(网络层协议)-----------javaweb

1 网络层协议:核心协议是IP协议 IpV4
IPV6:她还没有被广泛使用
下面是网络层的报头:
java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

1)四位版本号:区分是IPV4还是IPV6 2)四位首部长度描述的是报头部分,而不是载荷的长度,单位也是四个字节; 3)8位服务类型,1位保留字段,它的取值只能是0,四位TOS字段,只能有一位是1,其他的只能是0,不能由多个是1,因为最小延时,最大吞吐量,最高可靠性,最小成本,这四者是相互冲突的,并且只能选择一个

1.4 16位总长度:IP数据报整体占多少个字节,64K
虽然IP数据看起来也有一个最大64K的限制,但是IP内部设置了分包组包功能 ,传输多大的数据都没关系了;
如果一个数据太长了,IP协议就会自动的拆出多个数据包,然后再进行传输,然后接收方就会重新进行组包功能
为什么IP都有这个功能,UDP却没有内置呢? 因为TCP/IP网络协议栈,这里面会涉及到很多的协议,其实这些网络协议其实上大多数是被分别独立设计实现的
1.5 16位标识,3位标志,13位片偏移
这三个字段是主动实现拆包的,16位标识相当于IP数据报的身份标识,当一个IP数据报被拆成多个IP数据报时,这多个IP数据包的标识是相同的;如果多个IP数据包的16位身份标识是相同的,组包的时候就会把它们放在一起;
13位片偏移,这里面就描述了这个报的位置与顺序,片偏移小的在前面,大的在后面;当时怎么拆开的,谁在前面,谁在后面,如今就怎么进行组装;
三位标志位,第一位没啥用,第二位表示禁止分片,第三位表示更多分片(如果这一位表示为1,表明当前这个分片就是最后一个分片了,如果表示是0,就表明当前这个分片不是最后一个分片,后面还有),它类似于链表中的null一样;
如果有一天,真的要在应用层的UDP协议实现拆包组包功能,如何进行实现?
可以对网络层的IP协议的形式,16位标识,13位片偏移,3位标志位,接收方根据这些信息来进行组包;
实现一个负载均衡模块,期望这个版本可以支持容灾功能,根据下游服务器的处理能力,来动态的切换流量
java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

这是当大量的请求进入到入口服务器中,为了防止大量的数据把服务器搞崩,这是就增加机器的数量让系统变得更加高效,让不同的机器处理更多的请求,下游的机器可能会处于宕机状态或其他异常的状态;还可能出现响应时间太长,系统资源不足,这是就给他分配一些更少的流量(给他少分配一些任务),类似于拥塞控制(先发送小范围的数据,再发送多的数据)
1.6 8位生存时间
一个IP数据报最多可以存活多久,他不是一个时间概念;他是以次数来描述的,下面来举个例子:
java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

例如A给B发送一个IP数据报,这个时候假设TTL的初始值是64,每经过一个路由器转发,TTL的值就减少1,要是减到0,数据还没有送到怎么办? 直接丢弃。。。。。为啥要有TTL,就是为了防止环路转发的情况,A->B->C->A,例如A本来是想给D发的,这样就节省了资源;
1.7 八位协议:
指当前的数据被接收方收到后,分用的时候要把载荷内容要交给传输层(是交给TCP协议还是UDP协议)的哪个协议,分用的时候就要保证载荷数据内容的和接下来交给的协议相配;例如:java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

如果在传输层马上进行分用的时候,接收方收到这个数据的时候,肯定要进行解析如果把这个IP载荷部分(里面是一个完整的UDP数据)交给TCP协议来解析,那就肯定凉凉了;
这时的IP报头中的8位协议就会进行约定,传输层来使用那个协议来解析数据;
那么类似的,在传输层的报头中,是否应该指定应用层来使用那个协议呢?
其实在端口号(目的端口关联到具体的应用程序)就有所体现了,应用程序知道了就行;
1.8 16位校验和:
在这个部分,只需要检验首部即可,载荷部分,其实就是一个完整的TCP/UDP数据报,其实已经被TCP/UDP自己校验了
1.9 32位源IP就表示发件人地址,32位目的IP就表示收件人地址,IP协议最重要的就是做这个事情;
2.IP协议的核心功能: 1)地址管理:通过一系列的规则,可以把网络上设备的地址给描述出来
2)路由地址:根据当下的源IP和目的地址,规划成一条合适的路径
但是在实际上,在IPV4中,32位的IP地址根本就不够用,那怎么来解决这个问题呢?
关于IP地址,其实设计者最初用的是点分三进制,例如123.139.93.2121 动态分配;使用三个点,把一个32位的数字分成4份,每一份就是8bit;
1)动态设备,并不是所有的设备都在连接网络,哪个设备联网了,就给他分配IP地址,没有连接网络就不分配(这种方法治标不治本);
2)NAT机制:网络地址替换,本质上是使用一个IP地址,来表示一批主机;java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

此时直接连接到广域网(外网)的路由器设备,就叫做外网IP,实际上这些局域网里面的设备有很多,网络结构也有可能很复杂;
一个局域网里面的若干设备都在使用着同一个外网IP,先通过路由器的外网IP来确定把这个数据交给哪一个局域网,再通过局域网中的内网IP来确定把这个数据交给局域网中的哪一台主机
一个外网IP可能就包含着,几百,几千,甚至几万个网络设备;
如果局域网内部的数据尝试往广域网上发送的时候,此时的路由器就会悄悄地把其中的源IP给换了;例如上面的192.168.0.10向外面发送数据,通过路由器转发,就被替换成了外网IP;
一个局域网中的所有设备,共同使用一个外网IP;当我们在电脑端输入IP地址的时候,所展现出来的IP地址就是我这个电脑对应的接外网的路由器设备的外网IP,这个设备具体管理多少个内网设备,不从得知;
我们不在意局域网里面的IP是否重复,那么只要外网IP不重复即可;
下面三种IP都表示局域网IP 10.*,172.16.*-172.31.*, 192.168.*;
NAT机制虽然解决了IP地址不够用的问题,但是也引入了新的问题,比如说我想要在自己的机器上面搭建一个服务器,此时想要让其他用户通过外网来访问你的服务器这个时候是做不到的,我们自己的机器,只是一个局域网IP,内网IP是可以进行重复的;其他主机是无法通过一个内网IP来查询到你的服务器,除非是在同一个局域网里面
问题1:但是一个路由器所控制的局域网的一台机器不可以访问另一个路由器所控制的局域网的一台机器(除非是在局域网里面),怎么办呢?
除非通过内网穿透
java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

问题二:一个路由器的所管辖的一片局域网中的一台主机访问广域网的流程是怎么样的?
答:路由器本身是有自己固定的内网地址和外网地址,这个设备的源IP地址经过路由器后会转变成路由器的外网地址(因为这个局域网的所有设备经过路由器后都会转变成相同的路由器外网地址,所以为了区分,就用端口号进行区分)
当数据发送回来的时候,曾经路由器的外网地址会转变成具体的路由器的内网地址,此时再通过端口号来区分具体是哪台主机维护一个转换机制;
3 IPV6机制
这是用16个字节来表示端口号的问题,他从本质上解决了IP地址不够用的问题,但由于我们之前使用过的是IPV4,所以要把路由器改成IPV6,所以要花钱;
4 IP协议其他知识的补充,IP地址本质上是做两件事:
1)地址管理:网段划分,我们在组建局域网中非常重要的要点;
例如在同一个局域网里面的主机,网络号要相同,主机号不可以相同;
两个相邻的局域网,通过同一个路由器连接的局域网,网络号必须不相同;
下面的路由器1左边是一个局域网范围,右边是一个局域网范围;
java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

那么具体从哪里来区分那部分是网络号呢 ?
java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

子网掩码非常有特点:左面全是1,右面全是0,将子网掩码和IP地址进行按位与操作,得到的就是网络号(笔试面试题)
下面我们来介绍一下特殊的IP地址:
(1)如果主机号全是0,这个IP地址就表示网络号,表示当前这个网段;(2) 如果主机号为1,这个IP地址通常表示网关,这个路由器也就是网络的出入口;(3)如果主机号是255,就表示这个IP是广播IP,如果你搞一个UDP数据报,把目的IP写成主机号为255的IP,此时这个数据包就会发给每个局域网中的设备;假设手机里面装遥控器APP,也是可以操作电视的,但是前提是手机和电视必须在同一个局域网中,手机APP发送一个UDP数据报,把目的IP改成主机号是255的IP,此时电视就会返回响应;(4)127.0.0.1环回IP表示自己;
2)路由选择:此处的路由,表示的是IP地址的数据规划功能java-ee|网络编程(7)(网络层协议)-----------javaweb
文章图片

此处的路由规划指的就是IP协议中的路径规划功能,路由选择的过程,其实就是在A和B之间选择一条合适的路径,这个选择其实不要是一个容易衡量的事情,环境比较复杂,要综合考虑路径的长短,通信的速度,设备开销的大小;
IP协议中选择具体的过程,和地图中的路径规划还有一定的区别; 地图这里是知道整体的路况,综合进行会考虑
事实上在数据到达某个路由器后,这个路由器并不知道网络整体的环境(这个太复杂了),这个路由器只是知道它附近的情况(它了解他邻近的设备的情况),IP协议寻路过程,其实就是一个探索式启发式的过程;
例如我想要去内蒙古工业大学,假设没有地图,但是我可以去问路
一:一出门,我就抓住一个路人去问路,我怎么去内蒙古工业大学,如果他知道,就直接告诉我具体路线了,如果不知道,就会告诉我,你先去公交站牌上面问问路
,但是唯一确定的是你必须先去坐公交,先去公交站上去问问;
二:如果到达公路牌,在抓到一个路人,继续问内蒙古工业大学怎么走;如果他知道怎么走,他就直接告诉我的具体路线,如果她不知道,他就会说,虽然我不知道工业大学怎么走,但是你得先坐车,到下一个公交站到了小吃街问问;
三:到了小吃街之后,我继续问人,在抓住一个人,他说,你再继续向东走走,应该就到了;
在这个过程的推移当中,我就逐渐靠近了内蒙古工业大学,当我逐渐靠近之后,此时我抓住一个路人,就直接知道学校在哪里,一旦他知道了路线,我就可以按照他说的路线,直接找到学校;
上面是一个最简单的情况,但是事实上,远比这更复杂,也许你问的路人啥也不知道,告诉你的方向也不是正确的方向;他有可能知道目标在哪里,但是他知道好几条路线,你必须做权衡;
这里我们举例的每一个路人,都相当于是一个路由器,每个路人都有一个自己熟悉的范围,在这个范围内,他知道自己怎么走,或者只知道一个大概的方向;这个事情就相当于是路由器中的一个核心的数据结构,路由表;
路由器的存储空间有限,不可能通过一个路由器的的路由表就知道整个互联网的环境的所有节点情况,路由表里面大致描述了啥样的IP从啥样的网络接口WAN/LAN传输;
【java-ee|网络编程(7)(网络层协议)-----------javaweb】

    推荐阅读