一)网络层协议:
一)IP协议报头介绍:
咱们的IP协议能够在两点之间规划处一条合适的路径,什么叫做合适?那就得看咱们的TOS是怎么进行选的,比如说选择最大吞吐量,咱们就需要进行选择一个最大的带宽路径;
16位总长度:IP数据报整体占多少个字节,16位对应的最大长度,64K,也就是说咱们的IP数据包的最大长度并不能超过64K,这和咱们的UDP的最大长度是一样的
1)虽然IP数据看起来也有一个最大64K的限制,但是IP内部设置了分包组包功能 ,传输多大的数据都没关系了,如果说UDP进行传输比较大的数据包,进行拆包组包,咱们的应用层就需要进行手动分包组包;
2)如果一个数据太长了,IP协议就会自动的拆出多个数据包,然后再进行传输,然后接收方就会重新进行组包功能;
3)为什么IP都有这个功能,UDP却没有内置呢? 因为TCP/IP网络协议栈,这里面会涉及到很多的协议,其实这些网络协议其实上大多数是被分别独立设计实现的;
16位标识,3位标志位,13位片偏移(内核实现好了),这三个字段就是用于分包组包的;
IP数据包=IP报头+IP数据载荷;
如果整个IP数据包太长了,IP协议就会把这个大的IP数据包拆成多个小包,保证每一个包的长度都不会超过64K,下面被拆分成了两个小的IP数据包,于是就有两个IP报头;
1)没有第二个TCP数据报头,对于我们的IP数据包来说,根本就不会关心在载荷里面是啥,只是单纯的对数据进行切分了,IP数据包也不知道这里面有没有TCP报头;
2)假设第一份数据的片偏移是1,第二份数据的片偏移是2,咱们就可以知道谁是前,谁是后了,比如说上面的数据包的16位标识是1000,下面的IP数据包的16位标识也是1000,片偏移越小,那么他就是越靠前的包,为了防止网络上面出现后发先置的情况;
正常情况下是如何进行区分这多个IP数据包,是从同一个IP数据包拆分过来的呢?
1)这三个字段是主动实现分包组包的,16位标识相当于IP数据报的身份标识,当一个IP数据报被拆成多个IP数据报时,这多个IP数据包的16位标识是相同的;如果多个IP数据包的16位身份标识是相同的,组包的时候就会把它们放在一起;
2)通过13位片偏移,这里面就描述了这个包的位置与顺序,片偏移小的在前面,大的在后面;当时怎么拆开的,谁在前面,谁在后面,如今就怎么进行组装处理后发现到的情况,保证数据顺序不会混乱,
3)三位标志位,第一位没啥用,第二位表示禁止分片,第三位表示更多分片,如果这一位表示为1,表明当前这个分片就是最后一个分片了,如果表示是0,就表明当前这个分片不是最后一个分片,后面还有,它类似于链表中的null一样,如果这一位是0,那么就说明这时最后一个IP数据包了,如果不是最后一位,那么这一位就是1,这是一个结束标记;
1)接受方根据16位标识来进行重组,根据片偏移进行重新排序,根据结束标记判定当前是否IP数据包组装完成;
2)咱们的片偏移准确来说也并不是一个单纯的1,2,3,4,而是可以基于片偏移来进行算出中间有多少空间;
如果有一天,真的要在应用层的UDP协议实现拆包组包功能,如何进行实现?
可以对网络层的IP协议的形式,16位标识,13位片偏移,3位标志位,分包的时候把这些字段填充到UDP报头里面,接收方根据这些信息来进行组包;
实现一个负载均衡模块,期望这个新的版本可以支持容灾功能,根据下游服务器的处理能力,来动态的切换流量;
1)这是当大量的请求进入到入口服务器中,咱们的入口服务器会把这些数据平均的分散到后面的主机上面
2)为了防止大量的数据把服务器搞崩(如果用一台服务器来进行处理这里面的请求,大部分是搞不定的),这是就增加机器的数量让系统变得更加高效,让他可以处理更多的服务器
3)咱们的入口服务器称为上游的机器,咱们的后续服务器称之为下游的服务器,让不同的机器处理更多的请求,下游的机器可能会处于宕机状态或其他异常的状态(这是把他的流量分走);
4)还可能出现响应时间太长,系统资源不足,这是就给他分配一些更少的流量(给他少分配一些任务,给这台机器分配更少的任务),类似于拥塞控制(先发送小范围的数据,再发送多的数据)
5)比如说给我们的下游服务器每一个分配10个任务,假设有一个机器宕机的,就给他分配5个任务
8位生存时间
主要是描述一个IP数据报在网络上面最多还可以存活多久,不是一个时间概念,这里的单位不是s或者是ms这样的时间单位来衡量的,存活时间是以转发次数来描述的,IP数据包每经历过了一个设备转发次数就会减少1,如果说这个TTL最后减为0了,那么收到这个包的路由器或者转发设备就会把这个数据报给丢弃;
1)当我们的IP数据包进行被发送的时候,会有一个初始的TTL,常见的取值有,128或者64;
2)例如A给B发送一个IP数据报,这个时候假设TTL的初始值是64,每经过一个路由器转发,TTL的值就减少1,要是减到0,数据还没有送到怎么办?此时收到这个包的路由器就会直接把这个IP数据包直接丢弃;
3)为啥要有TTL,就是为了防止环路转发的情况,A->B->C->A,例如A本来是想给D发的,这样就节省了资源;
4)你在报文里面构造了一个目的IP就一定可以找到吗,这是不一定的,主要是有些包里面的IP地址,是永远也无法到达的,这样的IP包,不可能在网络上面进行无休止的转发,这样就会占用硬件资源太多了,正常的IP数据包都会在既定的TTL内来进行到达;
1.7)八位协议:指定传输层使用的是哪一种协议,TCP和UDP都有不同的取值;
指当前的数据被接收方收到后,分用的时候要把载荷内容要交给传输层是交给TCP协议还是UDP协议的哪个协议,分用的时候就要保证载荷数据内容的和接下来交给的协议相配,例如:
如果在传输层马上进行分用的时候,接收方收到这个数据的时候,肯定要进行解析如果把这个IP载荷部分(里面是一个完整的UDP数据,交给TCP协议来解析,那就肯定凉凉了;
这时的IP报头中的8位协议就会进行约定,传输层来使用那个协议来解析数据;
那么类似的,在传输层的报头中,是否应该指定应用层来使用那个协议呢?
其实在端口号目的端口关联到具体的应用程序就有所体现了,应用程序知道了就行;
1)16位首部校验和:
也是来进行校验机制是否正确,在这个部分,只需要检验首部即可,载荷部分,其实就是一个完整的TCP/UDP数据报,其实已经被TCP/UDP自己校验了,是用来校验数据是否正确
2)32位源IP就表示发件人地址,32位目的IP就表示收件人地址
在咱们的IP协议报文中有一个字段叫做4为版本号,只能为4和6;
1)对于咱们的IPV4来说,一个IP地址本质上是32位的整数,我们通常会使用点分十进制来进行表示这个IP地址;
2)我们使用三个点,把32位整数分成四个部分,每一个部分1个字节,每一个部分的取值就是0-255,IPConfig;
3)给人看的IP地址就是用点分十进制来进行表示的,我们给机器存储的IP地址在底层仍然是按照用4个字节整数来进行表示;
4)由于咱们的IP地址是一个点分十进制表示的数据,咱们把IP地址分成了两个部分,网络号+主机号
但是一个路由器所控制的局域网的一台机器不可以访问另一个路由器所控制的局域网的一台机器(除非是在同一个局域网里面),怎么办呢?
除非通过内网穿透(只是穿透某个窗口,不是把整个IP传过去了)
1)地址管理:通过一系列的规则,可以把网络上设备的地址给描述出来
2)路由地址:根据当下的源IP和目的地址,规划成一条合适的路径,啥叫合适?关键是看咱们的TOS是怎么选的?是选择最大吞吐量,还是最小延时??
二)IP协议功能介绍,地址管理:
1)网络号是描述当前的网段信息,表示局域网的标识,主机号就描述了区分局域网内部的主机,就是为了描述咱们局域网内部的主机的位置,比如说192.168.0.5,咱们的192.168.0表示网络号,这里面的5就表示主机号;
2)在同一个局域网里面,不同主机之间的网络号是相同的,保证相互连接的两个网段具有不同的标识,主机号是不可以相同的
3)两个相邻的局域网里面,同一个路由器进行连接的,网络号也是不相同的,但是主机号可以相同,咱们进行无线连接的信号质量稳定性和速度,都是无法和有线连接进行相提并论的;
内网穿透,本质上就是说穿透端口号;
那么咱们的一个IP地址的到底前多少位是网络号呢?是固定的三个字节吗?
1)其实本质上来说咱们的子网掩码,本质上就是说是一个点分十进制表示的整数,咱们的子网掩码的左侧全部是1,右侧全部是0,不会出现0和1进行混合排列的情况;
2)咱们左侧的1就表示哪些位是网络号,剩下的那些0就表示哪些位是主机号
1111 1111 1111 1111 1111 1111 0000 0000
上面这种子网掩码就表示IP地址的前24位是表示网络号,后8个比特位就是表示主机号
3)在咱们家用的场景里面,一个局域网里面的设备是很少的,一般是不会超过255的,那么常见的子网掩码的值就是255.255.255.0,如果说一个局域网里面的设备多了,那么子网掩码就会出现一些其他的值,比如说255.255.0.0;
4)所以说可以根据实际需要来进行确定网段之间是如何进行划分,每一个设备的IP地址都是可以进行配置的,子网掩码啥的,都是可以进行修改的负责配置网络的人就叫做网管;
5)网管主要是干啥的?主要是针对网络来进行维护,日常工作主要是配置交换机和路由器,主要掌握的技术就是深入了解交换机和路由器有哪些功能,以及如何进行操作,而我们的程序员主要是为了开发路由器和交换机里面的程序;
1)IP地址全为1的时候,也就是说全部表示主机号,此IP地址表示广播地址,代表的是整个网段中的所有主机,即可以向该网段中所有的主机发送数据包,向这个广播上面发送的地址,整个局域网中都可以收到;
2)如果一个IP的主机号全为0,那么该IP就代表网络号,局域网里面一个正常的设备,主机号不能设置成0;
3)如果IP地址是以127开头的,那就代表环回IP,代表主机自己;
4)如果IP地址是以10开头的,或者以192.168开头的,或者以172.16-172.31开头的,表明该IP地址是一个局域网内部的IP,内网IP,除此之外剩下的IP表示外网IP,直接在广域网上面使用的IP;
5)在这里就要求外网IP一定是唯一的,每一个外网IP都对应着唯一的一个设备,内网IP只是在当前局域网里面是唯一的,不同的局域网里面,可以有相同的内网IP的设备;
如果主机号是255,就表示这个IP是广播IP,如果你搞一个UDP数据报,把目的IP写成主机号为255的IP,此时这个数据包就会发给每个局域网中的设备;假设手机里面装遥控器APP,也是可以操作电视的,但是前提是手机和电视必须在同一个局域网中,手机APP发送一个UDP数据报,把目的IP改成主机号是255的IP,此时电视就会返回响应;
网段划分,在组建局域网中非常重要的要点;
1)例如在同一个局域网里面的主机,网络号要相同,主机号不可以相同;
2)两个相邻的局域网,通过同一个路由器连接的局域网,网络号必须不相同,主机号可以相同
咱们IP地址的网段划分是以子网掩码的方式来进行划分的,但是在历史上面,也就是说在有子网掩码之前,是以简单粗暴的方式来进行划分的,咱们把IP地址分成A,B,C,D,E,这五类,每一类都会有几位是网络号,几位是主机号
3)子网掩码非常有特点:左面全是1,右面全是0,将子网掩码和IP地址进行按位与操作,得到的就是网络号;
三)IP协议的核心功能:能够在两点之间规划出来一条合适的路径
此处的路由,表示的是IP地址的数据规划功能,在两个设备之间要找出一个通道,能够完成传输的过程,但是 IP路由选择会涉及到TTL,经过一个设备,就减1,减为0,就丢包
1)此处的路由规划指的就是IP协议中的路径规划功能,路由选择的过程,其实就是在A和B之间选择一条合适的路径,这个选择其实不要是一个容易衡量的事情,环境比较复杂,要综合考虑路径的长短,通信的速度,设备开销的大小;
2)IP协议中选择具体的过程,和地图中的路径规划还有一定的区别;地图这里是知道整体的路况,综合进行会考虑
3)事实上在数据到达某个路由器后,这个路由器并不知道网络整体的环境(这个太复杂了),这个路由器只是知道它附近的情况(它了解他邻近的设备的情况),IP协议寻路过程,其实就是一个探索式启发式的过程;
4)路由器的存储空间有限,不可能通过一个路由器的的路由表就知道整个互联网的环境的所有节点情况,路由表里面大致描述了啥样的IP从啥样的网络接口WAN/LAN传输;
例如我想要去内蒙古工业大学,假设没有地图,但是我可以去问路,整个网络那么复杂,我不可能对每一条路都是很熟悉的,但是我肯定知道的是我附近的路是什么样子的,我也知道大概的方位;
1)一出门,我就抓住一个路人去问路,我怎么去内蒙古工业大学,如果他知道,就直接告诉我具体路线了,如果不知道,就会告诉我,你先去公交站牌上面问问路,但是唯一确定的是你必须先去坐公交,先去公交站上去问问;
2)如果到达公路牌,在抓到一个路人,继续问内蒙古工业大学怎么走;如果他知道怎么走,他就直接告诉我的具体路线,如果她不知道,他就会说,虽然我不知道工业大学怎么走,但是你得先坐车,到下一个公交站到了小吃街问问;
3)到了小吃街之后,我继续问人,在抓住一个人,他说,你再继续向东走走,应该就到了;
在这个过程的推移当中,我就逐渐靠近了内蒙古工业大学,当我逐渐靠近之后,此时我抓住一个路人,就直接知道学校在哪里,一旦他知道了路线,我就可以按照他说的路线,直接找到学校;
上面是一个最简单的情况,但是事实上,远比这更复杂,也许你问的路人啥也不知道,告诉你的方向也不是正确的方向;他有可能知道目标在哪里,但是他知道好几条路线,你必须做权衡;
这里我们举例的每一个路人,都相当于是一个路由器,每个路人都有一个自己熟悉的范围,在这个范围内,他知道自己怎么走,或者只知道一个大概的方向;这个事情就相当于是路由器中的一个核心的数据结构,路由表;
1)咱们IP数据包的目的地址,就表示了这个包要发送到哪里去了,如果路由器认识,就直接告诉你路了,如果说当前路由器不认识,那么就会告诉你一个大致的方向,让你走到下一个路由器的时候再来问问;
2)依次往后走,其实本质上也是和目标越来越近,在此过程中,我们总会遇到一个认识这个目标地址的路由器,就可以具体的转发过去了;
3)有的时候,你甚至不光遇到了一个认识这个地址的路由器,而且还认识多个路,多种走法,这个时候就可以选择一个更合适的路了;
啥叫路由器认识这个IP地址?
1)在路由器内部我们维护了一个数据结构叫做路由表,路由表里面就记录了一些网段信息,网络号,目的IP就是在这些网络号中进行匹配,以及每一个网络号对应的网络接口,网络接口其实本质上就是对应着路由器里面具体的端口,是接下来走LAN口还是WAN口?
2)思路上就是某一个路由器上线之后(接入网络之后),就会和相邻的设备进行通信,认识一下,路由器就来构造一下路由表了,把这个LAN口对应一个网段,那个LAN口对应哪一个网段),路由器是可以更多的设备的设备,就可以更快的找的路了
3)咱们的路由表中的一个默认表项起到的效果就是当前咱们的IP地址在所有的表项都匹配不上的时候,此时就会告诉IP数据包,你问问别的路由器;
那么咱们的路由表是如何进行生成的呢?
1)生成路由表是存在着一些路由表生成算法的,可以自动生成一波;
2)咱们的网关还可以进行手动配置;
3)总而言之就是类似于说某一个路由器上线之后,也就是说接入网络之后,就会和其他的相邻的设备进行通信认识一下,在这个认识的过程中,路由器就开始构建这个路由表,网段和路由表也就开始构建出来的,路由器还会认识更多的朋友,这样在进行寻址的时候就会认识到更多的朋友了;
4)下一跳就是指大概的方位,如果我去问路,这个路由器就说我也不知道这个路怎么走,但是可以给出大概的方位,就是一个默认表项;