一)网络层协议:
一)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)现在咱们有一个内网IP,叫做192.168.0.10,咱们还有一个云服务器使用有外网IP的,内网IP访问不到,但是外网IP咱们是可以访问到的
2)咱们可以在80端口搞一个服务器,咱们把内网IP的主机和云服务器通过TCP建立连接
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)下一跳就是指大概的方位,如果我去问路,这个路由器就说我也不知道这个路怎么走,但是可以给出大概的方位,就是一个默认表项;
四)IPV4和IPV6
这一个IP地址并不是给我一个人来进行使用的,而是所有说接入到这个运营商设备的局域网,都是在共用这同一个IP地址,可能不只是我自己,而是说我们小区的成百上千万人都是在使用者同一个IP地址;
1)此时直接连接到广域网(外网)的路由器设备,就叫做外网IP,实际上这些局域网里面的设备有很多,网络结构也有可能很复杂;
2)一个局域网里面的若干设备都在使用着同一个外网IP,先通过路由器的外网IP来确定把这个数据交给哪一个局域网,再通过局域网中的内网IP来确定把这个数据交给局域网中的哪一台主机
3)一个外网IP可能就包含着,几百,几千,甚至几万个网络设备;
4)如果局域网内部的数据尝试往广域网上发送的时候,此时的路由器就会悄悄地把其中的源IP给换了;例如上面的192.168.0.10向外面发送数据,通过路由器转发,就被替换成了外网IP;
5)一个局域网中的所有设备,共同使用一个外网IP;当我们在电脑端输入IP地址的时候,所展现出来的IP地址就是我这个电脑对应的接外网的路由器设备的外网IP,这个设备具体管理多少个内网设备,不从得知;
6)不在意局域网里面的IP是否重复,那么只要外网IP不重复即可;
7)下面三种IP都表示局域网IP 10.*,172.16.*-172.31.*, 192.168.*;
8)NAT机制虽然解决了IP地址不够用的问题,但是也引入了新的问题,比如说想要在自己的机器上面搭建一个服务器,此时想要让其他用户通过外网来访问你的服务器这个时候是做不到的,我们自己的机器,只是一个局域网IP,内网IP是可以进行重复的;其他主机是无法通过一个内网IP来查询到你的服务器,除非是在同一个局域网里面
NAT机制:
一个路由器的所管辖的一片局域网中的一台主机访问广域网的流程是怎么样的?
答:路由器本身是有自己固定的内网地址和外网地址,这个设备的源IP地址经过路由器后会转变成路由器的外网地址,因为这个局域网的所有设备经过路由器后都会转变成相同的路由器外网地址,所以为了区分,就用端口号进行区分;
当数据发送回来的时候,曾经路由器的外网地址会转变成具体的路由器的内网地址,此时再通过端口号来区分具体是哪台主机维护一个转换机制
1)实际在NAT路由器内部,有一张自动生成的,用于地址转换的表。
2)该转换表中维护的就是局域网中主机的私有IP,与其对应访问的外网当中的某个公网IP之间的映射关系。
3)局域网中的主机第一次向外网发起数据请求时,就会生成表中的映射关系。
4)比如在TCP建立连接时,会建立对应的映射关系,在TCP断开连接后,就会删除对应的映射关系,网络连接是一个五元组,即使IP地址是相同的,那么也没啥事
咱们的CCTALK现在有两个连接:
NAT不能从根本上解决问题端口号成为了限制
IPV6机制
1)这是用16个字节来表示端口号的问题,他从本质上解决了IP地址不够用的问题,但由于们之前使用过的是IPV4,大部分的路由器都是不支持IPV6,所以要把所有路由器改成IPV6,所以要花钱(IPV4和IPV6都是不兼容的);
2)IPV6在报头里面使用了一个更长的字段来进行表示IP地址,IPV4是4个字节 32 位(2的32次方)但是IPV6是16个字节,128位(2的128次方),1byte=8bit;
3)咱们的运营商设备支持IPV6地址,要保证你的路由器和光猫也要支持IPV6地址,需要改设备,硬件支持+软件配置,咱们的IPV4和IPV6是不兼容的,升级IPV6成本太高;
上面的这一个IP地址其实本质上来说就IPV6表示的地址,每一个部分咱们用:来进行分割,每一个冒号分割成了两个字节,每一个数字都是一个16进制的数字,IPV6都是一个唯一的IP
NAT机制:把IP地址分成了内网和外网
1)对于一个外网IP,在互联网上面的任何位置都是可以访问到的
2)对于一个内网IP,只能在当前的局域网内部进行访问,局域网1的设备,不能使用内网IP访问局域网2的设备,因为局域网1的IP和局域网2的IP都是一样的怎么办?内网IP是可以重复的,内网IP只有在当前局域网里面才是唯一的;
3)NAT的设备也是存在极限的,那就是端口号的个数是65535,如果一个局域网里面的连接数超过了65535,这个时候NAT就不一定好使了,端口号就不够用了,我们之前是用端口号保证是哪一台主机,况且在我们使用端口号的时候,保证不同的端口号不是通过我们自己手动指定的,而是我们的NAT设备来去自行保证的;
那么路由器自己在进行指定端口号的时候,可以保证不会和别的端口号的局域网里面设备重复吗?这也是由我们的NAT设备来进行自己保证的;
咱们的NAT设备不光会对咱们的IP地址进行替换,还会对咱们的端口号进行调整
4)自己家里面的电脑IP,这个IP只能在我自己家里面的局域网才可以进行访问,别的地区的人想要跨越局域网想要访问我的这个IP是做不到的;
5)咱们要想进行通信怎么办?我们就需要共同使用一个带有外网IP的机器,我这边的机器访问了抖音,抖音是具有外网IP的,把我自己直播的画面推送到抖音服务器上面(因为我知道抖音服务器的外网IP地址),你们也可以访问抖音(IP),从抖音服务器上面拿到我的直播画面,大家就可以进行跨越网络,来进行访问我自己电脑上面的一个画面了,这是以CCTALK为中介进行做到的;
6)假设没有NAT机制,所有的IP都是唯一的,那么我就可以在自己的电脑上面搭建一个直播服务器,别人直接访问我的电脑IP就可以了;
7)咱们的运营商的路由器就会进行分用到网络上面的网络层,就会修改IP数据包,这样我们从内网发送出去的原IP地址就被改成了外网IP地址,这样的带有这样子的功能的路由器设备也被称之为是NAT设备:
IPV4的外网IP的分配权限就是掌握在美国人手里面的,不给你分配新的IP地址,或者说把你原有的IP地址给干掉,势必会影响咱们的互联网发展;
NAPT技术
这就是网络地址端口转换:
1)如果局域网中的多台主机同时访问同一个外网服务,当路由器收到外网发来的响应数据时,路由器无法判断该响应数据应该转发给局域网中的哪台主机,因为该局域网中所有主机的数据包都由路由器代替发送了,因此发来的响应数据包的目的IP地址都是路由器的WAN口IP地址;
2)于是NAPT在建立转换表的映射关系时,除了建立局域网中私有IP与其对应访问的公网IP之间的映射关系外,还会加上一个由NAT路由器选定的端口号。
3)此时当局域网中的多台主机同时访问同一个外网服务时,虽然外网发来的响应数据的目的IP地址都是路由器的WAN口IP,但发给局域网中不同主机的响应数据对应的目的端口号是不同的,此时路由器就能通过IP+Port的方式来区分发给不同主机的数据包;
比如局域网中的主机A和主机B都在访问同一个服务器,并且它们访问服务器时采用的端口号都是1025。4)假设主机A发送的数据包先到达路由器,此时路由器将数据包的源IP地址替换成自己的WAN口IP地址,由于路由器用于访问该服务器的1025号端口没有被使用,因此该数据包的源端口号可以不变。
5)当主机B发来的数据包到达路由器时,路由器同样将数据包的源IP地址替换成自己的WAN口IP地址,但此时路由器用于访问该服务器的1025号端口已经被主机A使用了,因此路由器会重新选定一个端口号对数据包的源端口号进行替换;
6)此时转换表中就会建立如下两队映射关系:此时这张转换表既能保证从左到右的唯一性,也能保证从右到左的唯一性。
7)当服务器发来的响应数据到达路由器时,虽然服务器发给主机A和主机B的数据包对应的目的IP地址是一样的。
8)但路由器是用自己的1025号端口代替主机A进行数据请求的,而用的是1026号端口代替主机B进行数据请求的。
9)因此现在路由器可以继续根据数据包的源端口号,来判断应该将该数据包转发给主机A还是主机B进行对数据包中的目的IP地址和目的端口号进行替换,然后转发给局域网内对应的主机
1)路由器是工作在网络层的一个设备,负载将数据包从一个网络转发到另一个网络,但不能狭义的认为路由器只能工作在网络层。
2)NAT路由器在进行数据转发时,不仅有能力替换数据包的源和目的IP地址,而且在必要的情况下还可能会替换数据包的源和目的端口号,而端口号实际是传输层的概念
3)转换表的生成和销毁都需要额外开销。
4)通信过程中一旦NAT设备异常,即使存在设备,所有的TCP连接也都会断开
二)数据链路层协议:
所负责的工作:负责两个相邻节点之间数据的传输;
核心的协议:以太网(涉及到数据链路层和物理层的协议)平时用的网线,其实也是以太网线
数据链路层报头解析:
1)源地址:通常用6个字节来进行表示,这个要比IPV4更长,长6W多倍
1.1)通常使用6个字节来进行表示,这里面的地址称之为mac地址,mac地址做到了每一个地址设备都是唯一的,每一个设备都有唯一的mac地址,每一个网卡都是有唯一的mac地址,这个mac地址在网卡出场的时候就被写死了,当然也是可以通过配置来进行修改,我们就可以通过mac地址来进行区分出唯一的主机了;
1.2)因为咱们当前的网络层协议和数据链路层协议是单独被开发出来的,mac地址和IP地址本质上来说是重复的;
1.3)咱们目前的现状,就是说我们的IP地址和mac地址同时进行使用来进行表示不同的功能,咱们的IP地址表示一次传输过程中的起点和终点,但是咱们的mac地址表示传输过程中两个相邻结点的地址,在不进行考虑NAT机制的情况下,一个IP数据包中的原IP地址和目的IP地址都是固定不变的,但是在一个以太网数据帧中,在我们每一次的转发过程中,原mac地址和目的mac地址都会发生改变;
2)目的地址:
3)类型:
3.1)在以太网数据帧格式类型中,如果是0800,表示的是完整的IP数据包(一般情况),因为以太网数据帧的数据长度规定最小是46字节,最大是1500字节称之为MTU也就是以太网的最大传输单元,不同的网络类型有不同的MTU,ARP数据包的长度不够46字节,所以要在后面填充空位;
3.2)如果是0806,就表示ARP请求报,最大值1500称之为以太网的最大传输单元,不同的网络类型有着不同的MTU,PAD用于填充;
3.3)如果是8035,就表示RARP数据包;
咱们既然要建立起来IP地址和mac地址之间的一个映射关系,它是类似于一个哈希表的键值对结构,但是这个哈希表有可能不是存在内存里面,而是存在于硬件里面
1)mac地址,他是数据链路层的地址,他所表示的范围要比IPV4地址要大的很多
这是以太网的封装,其中的目的地址和源地址表示的是mac地址,他和IP地址还是有很大区别的,一个mac地址占六个字节(通常用16进制)来表示;mac地址,是数据链路层所用的地址,他表示的范围就要比IPv4的地址要大得多,当前来看,mac是可以保证每台主机都有唯一的地址的;
2)但是IP地址是动态分配的,因为在他连接上网络之后,对应的这个路由器/其他设备会给这个主机自动分配一个IP,但是mac地址是写死的,在网卡出场的时候就被写死了;
3)这个桢尾就是基于CRC算法的校验和
但是这时我们发现,IP存在的意义是为了描述主机在互联网上的位置,mac也可以描述主机在互联网上的位置呀?
1)数据链路层协议和网络层协议,在发明之初也是各自独立的;这时的IP地址和mac地址就被单独发明出来;
2)本质上,这两个地址的作用还是有本质区别的,下面来举个例子,主机A想要给主机B发消息,上面是IP地址,下面是mac地址;
3)咱们的IP地址用来表示一次传输过程中的起点和终点,不考虑NAT的情况,一个IP数据包中的源IP的目的IP都是固定的;
4)mac地址用来表示在传输过程中,任意两个相邻结点的位置,在一个以太网数据帧中,每一次进行转发过程中,我们的源mac的目的mac都会发生改变;
1)IP地址是目标主机的地址,但是mac是相邻设备的地址(路由器),源mac地址与目的mac地址是在动态变化的,但是源IP与目的IP是不会发生变化的,mac地址是针对两个相邻结点的设备传输;
2)每次数据运输到两个相邻节点,以太网数据帧的源mac与目的mac都会发生改变,但是源IP与目的IP都是在数据传输的时候都不会发生改变;
MTU(在数据报文里面我们可以看见46-1500):
物理层其实是存在对于以太网数据帧的长度限制,对应数据链路层的数据帧,是具有一定的大小范围,这个范围指标就被称为MTU;
1)MTU是一个以太网数据帧能够承载的数据范围,这个范围取决于硬件设备,以太网数据帧是和硬件紧密联系在一起的,不同的硬件设备,对应的数据链路层协议有可能不同,MTU也有可能不相同;
2)本质上IP数据包分包,往往不是因为触发了IP长度上限而分的包,是触发了MTU才分的包;那么什么是MTU呢?本质上来说,对于数据链路层的数据帧,往往是有一定的大小限制,这个范围指标就是MTU,不同的硬件介值对应的MTU是不同的;
3)也就是说由于数据链路层MTU的限制,要针对较大的IP数据包进行分包,它会将较大的IP数据包分成多个小包,并将每个小包打上标签每个小包的16位标识都是相同的,每个小包的协议头的三位字段中,第二位置成0,表示允许分片;第三位来表示结束标记,是最后一个小包就置成1,否则置成0;
4)当到达对端时,这些小包会按照顺序重组,拼装在一起返回给传输层;但是一旦这些小包中的任何一个丢失,接收端的重组就会失效,但是IP层不会负责重新传输数据;
5)MTU对UDP的影响:一旦UDP携带的数据长度超过1472,就会在网络层分为多个IP数据包,但是如果这多个IP数据包有任意一个丢失,都会引起接收端网络层重组失败,那么这就意味着如果多个UDP数据包在网络层被分片,那么数据丢失的情况的概率就会大大增加了,UDP还没有可靠性的机制;
6)MTU对于TCP协议的影响:
6.1)TCP的一个数据包的长度也不可以无限大,还是会受限于MTU
6.2)TCP单个数据包的最大长度也就是最多搭载多少载荷,称为MSS,MSS也就是说在的IP数据包不进行分包的情况下,咱们的TCP数据包最多可以搭载多少数据数据载荷;
6.3)咱们的这个MSS的值是取决于MTU和TCP和IP的报头,因为他们的报头都是可变长的
6.4)咱们的MSS主要是对TCP起到一定的提示效果,当我们的TCP的数据长度不超过MSS的时候,是属于最高效的状态;
6.5)也就是说TCP数据包最大的长度,被网络层封装成IP数据包,这个IP数据包又被封装成以太网数据帧,这个以太网数据帧的最大报文长度不可以超过MTU,是取决于MTU硬件设备的
7)TCP建立连接的过程中,通信双方会进行MSS协商,最理想的情况下,MSS正好是IP数据包不会超过分片的最大长度,但是这个长度仍然会受限于数据链路层的MTU,双方在发送SYN时会在TCP头部具体写入自己可以支持的MSS值,然后双方在知道对方的MSS值的时候,然后双方会进行权衡,会选择一个最小的值作为最终的MSS;
8)咱们的TCP的MSS的值就是存在于TCP首部的40字节变长选项里面;
ARP协议:
1)ARP是一个辅助性的协议,这个协议严格来说不仅仅是属于数据链路层的,而是横跨数据链路层和网络层,这个协议的功能就是根据IP来查对应的mac地址;
2)也就是说路由器这样的设备在进行转发数据的时候,首先拿到的是一个IP地址(目的IP),通过这个IP地址来进行决定接下来这个数据是怎么走的,从哪一个端口出去,发送到哪一个设备上面;
3)通过这个IP地址来决定接下来封装的以太网数据帧,目的mac是啥?需要ARP协议,能够建立起IP到mac地址的一个映射关系,在路由器内部构建出一个哈希表,可能在数据中储存,本质上这个协议是建立了主机IP和MAC地址的映射关系;
4)本质上就是说在咱们的路由器或者交换机内部构建出一个转发表,构建出IP地址和mac地址之间的一个映射关系,类似于哈希表这样子的,这个表不一定是在内存里面,还有可能是在硬件里面存储的;
3.1)源主机发出ARP请求,在想更新以太网数据帧头的下一个设备的mac地址的时候,在知道目的IP的情况之下,以广播的形式询问目的IP硬件地址是多少?以太网数据帧的首部的硬件地址填上FF:FF:FF:FF(6个)表示广播;
3.1.1)因为当此时这个路由器收到数据包之后,先进行层层的分用到网络层IP数据包,进行地址规划,得到目标IP地址,也就是知道了下一个要进行转发的设备的目标IP地址;
3.1.2)然后再将这个数据包在向下进行层层的封装,因为我们之前在网络层里面要进行规划路径,已经知道了要进行转发的下一个设备的IP地址,因为还是要在新封装的以太网数据帧头里面更换mac地址,把此时的源IP地址替换成自己的mac地址,刚刚经过ARP报文之后,再根据这个内部的硬表根据下一个设备的IP地址查询对应的下一个转发设备的目的mac地址,然后再进行更新;
3.2)目的主机收到广播的ARP请求之后,发现其中的目的IP和本机相符,那么会直接发送一个ARP响应数据包给源主机,将自己的硬件地址写入到应答包中
1)在网络传输的具体过程中,A先要把数据传输给路由器1,就要先查A本身的路由表,路由表查到的是一个网络接口,进一步会对应这路由器1的IP,但是知道了IP还不够,还要把它对应的mac地址放到数据链路层的报头中;才可以具体的完成封装过程;
2)主机A在最初的联网阶段,就会进行一个操作,mac学习会把它相邻设备的IP和mac的关系进行维护起来,很有可能会组建成一个hash表,也有可能是一个硬表;(Key就是IP,Value就是Mac)
3)如果想要构建出这张表,就要通过ARP协议来进行;
在路由器和交换机里面,有一个关键性的硬件设备,叫做转发芯片,转发芯片和路由器,内存是并列的关系;在转发芯片上有一些寄存器,因此这个表就在这里存储呢,访问这些寄存器的速度要比访问内存的速度要快得多,如果说20min之内还没有再次使用某一个表项,那么就会直接失效,在下一次还要发送ARP请求来获取该主机的硬件地址;
4)ARP协议的工作过程:简单来说,在设备接入网络的时候,也就是说刚启动的时候,会先向局域网里面广播一个ARP请求报文,收到这个请求的设备会返回ARP响应,包含了每个设备的IP和mac,新接入网络的设备也就是说发起广播的那一方就可以根据这些回应,就把这些关系给保存起来就可以了,建立起一个哈希表,这样的过程会发生周期性的进行,因为网络环境可能会发生变化,以便后续进行转发的过程中进行使用;
三)DNS协议:
www.baidu.com,域名,DNS(域名解析系统),既是一个应用层协议,也是一个系统;
2.1)域名:域名就是IP地址的马甲,虽然IP地址可以用点分十进制的方式来表示,仍然对人来说不太友好,但是为了更方便用户来查看,就用域名来表示,本质上就是使用一串英文单词代表IP地址的替换,这一串英文单词就叫做域名,这就可以更好的来表示一个网站的位置,它通常来使用.来表示;
2.2)但是真正进行网络传输的过程中,通常是先根据域名来对应转化成IP地址,再经过IP地址进行传输;
2.3)最初的DNS系统其实就是一个文本文件,叫做hosts文件,文件里保存的就是键值对,IP和域名的对应关系,C:\Windows\System32\drivers\etc,无论是windows系统还是linux系统,都有对应的一个hosts文件,它是最早的域名解析系统;
这一行,就描述了IP和域名之间的关系,后续有其他程序浏览器中再次使用这个域名,就会被自动的转化成IP地址
2.4)hosts是保存在每一所主机上的,一旦域名和IP的映射关系发生改变了,此时就麻烦了;因此hosts文件现在已经淘汰了,虽然仍然是好使,现在不用这个文件,但是文件本身还是存在的。因为太麻烦了;
咱们世界上的域名有很多,总不能整天在这个hosts文件上面改来改去吧,每一天都有新的域名出现,每一天都有新的域名消亡;
2.5)使用hosts的场景,一般是进行测试程序的时候,在某个程序里面依赖另一个服务器,测试该程序的时候就可以修改hosts,把这个域名映射到对应测试的服务器上,保证不修改源码就可以进行测试,也不影响正常的线上环境;
2.6)到了后来,咱们干脆就成立了一组机构,专门负责维护这里面的域名和IP之间的映射关系,假设你要申请一个域名,直接就去这个机构报备即可,这个机构专门维护一组服务器,把这个hosts文件存到这个服务器里面,这个服务器就叫做叫做域名解析服务器,你自己的电脑上想要进行域名解析,直接访问这个服务器就可以了;
2.7)现在的DNS就是一组专门的服务器,通过这个服务器就可以完成域名解析,所有的域名和所有的IP都是在这个服务器里面;
在浏览器上面输入www.sougou.com是不可以直接访问搜狗的服务器的,要先进行访问DNS的服务器,请求中就带有域名,DNS服务器就会返回一个IP地址进行响应,这时浏览器再通过IP地址去访问服务器;
咱们的上面的机构维护的这一组服务器,叫做根域名服务器
全世界这么多电脑,每一个设备想要上网,都想要访问DNS服务器,这可怎么办?
1)浏览器和客户端会对域名解析结果进行缓存,域名和IP的对应关系,是可能会改变,但是并不频繁,避免重复的访问DNS服务器的压力;当我们第一次访问搜狗的时候,本地上面就已经储存了搜狗的IP地址,第二次再去输入域名的时候,就不用访问DNS服务器;
2)全世界各个地方的国家,城市,地区都有各自的网络运营商(移动电信进行提供),这些网络运营商就会就近建设域名解析镜像服务器(把这个根服务器直接复刻了一份,这样就保证了咱们的根域名解析服务器压力没有那么大,我们可以让这些镜像服务器定期同步根域名解析服务器里面的数据
1)DNS服务器,并不是只有一台,而是有多台,这些最初的DNS服务器,都是有专门的组织机构来维护,根域名服务器,就包含了域名的所有信息,如果你想要申请一个域名,就需要人家进行批准,把这个结果放到根域名服务器中;
2)为了更进一步地减少压力,各种网络运行商,也会构建自己的域名服务器镜像,就会在国内构建出自己的域名服务器镜像,它就相当于在国内就近的构造出一些DNS服务器,定期从根域名服务器这边同步数据过来,国内用户使用DNS的时侯就只要查国内的DNS服务器即可,每个地区每座城市甚至都有自己的DNS服务器;
3)针对DNS做镜像的时候,可以根据不同的后缀来进行进一步的划分,例如.com,org,vip搞一个专门的服务器,这样就保证了每个服务器的数据量和访问量都不是太大;
咱们上网络上一搜,就可以得到很多的域名解析服务器
四)在浏览器上面输入url会发生什么?
1)根据域名解析成对应的IP地址:
在网络中定位是依据是依据IP来进行身份定位的,所以URL访问的第一步就是先得到服务期端的IP地址
1.0)浏览器首先会根据域名,来查询对应的IP地址
1.1)先查浏览器自身的缓存,如果有相应的记录存在会直接进行使用,并进行解析
1.2)再去查找hosts(曾经的DNS文件),windows系统
1.3)最后再查找本地的DNS服务器,IP和域名虽然会改变,但是并不频繁,先访问缓存,缓存的访问不了,在访问DNS服务器,DNS服务器挂了就无法访问,来根据域名来查询服务器的IP地址,查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,本地DNS服务器还要向DNS根服务器进行查询
1.4)本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问
2)层层进行封装和分用
2)此时浏览器就会构造出一个HTTP请求,这个HTTP请求就包含了刚才的这个域名信息;
3)此时浏览器就会调用操作系统提供的SocketAPI,把这个HTTP数据交给TCP来处理,TCP协议就会创建出一个TCP数据包,但是在创建出这个数据包之前,还需要进行三次握手(尝试建立连接),验证客户端和服务器的发送数据和接收数据的能力,以及网络链路是否通畅
注意:此处三次握手涉及到的SYN,ACK也是同样经过网络层,数据链路层,物理层依次封装,到达对端服务器在进行层层分用的;
4)具体进行数据传输的时候,发送方就会把这个TCP数据包进一步的交给网络层的IP协议再一进行封装,此时就封装成了一个IP数据包(也可能是多个IP数据包,受限于MTU),这可能是多个IP数据包,IP协议自动进行分包(取决于MTU)
5)网络层(IP)把数据交给数据链路层,数据链路层会把数据封装成以太网数据帧的格式,构造帧头桢尾,构造帧头的时候,需要根据下一个设备的IP地址映射到mac地址,此处依赖了ARP协议;
6)再把这个数据交给物理层,把物理层把数据转换成电信号/光信号,继续传输;
3.在物理层上面传输数据
7)电信号沿着网线到达另一个设备,例如路由器,路由器就会针对收到的数据进行分用,物理层会把数据交给数据链路层,数据链路层把数据交给网络层,路由器拿到了网络层的IP数据包,取出其中的目的IP,查询路由表,找到下一个要传输的目标,进一步再找到下一个要传输目标的mac地址,重新进行封装(把数据交给数据链路层和物理层),以太网数据帧的源mac和目的mac就都会发生改变了;
4)到达接收方这里面,然后进行层层分用
8)数据到达了接收方,也就是搜狗服务器,数据仍然要进行分用,层层解析,物理层首先会把光电信号转化成以太网数据帧,交给数据链路层,数据链路层解析出IP数据包,交给网络层,这里面都涉及到src校验和,如果发现校验和不对,说明数据是错的,直接丢弃;
9)IP协议在进行解析,解析成一个TCP数据报(IP报头里面有着协议类型),这个解析过程中还可能会涉及到组包的过程,IP报头,16位标识,3位标志位,13位片偏移(怎么进行组包的)
10)此时再根据TCP数据包中的端口号,找到对应的进程,就会把数据交给socket的接收缓冲区里面了;
5.处理数据,发送数据,和刚才一样
11)应用程序会调用到对应的socketAPI,从TCP的接收缓冲区里面来读取数据,应用程序把这个数据按照http协议来解析,会获取到其中的URL;根据URL中的路径,知道了是要获取到/这个根路径;
11)搜狗服务器就会对这个根路径进行配置,映射到一个具体的index.html文件,服务器就会读取这个文件把这个文件的内容构造成一个HTTP响应数据,然后再调用socketAPI进行发送;
11)重复上面的封装过程,服务器发送的响应数据也要重重进行封装,最终变成一个物理层的上传输的光电信号
12)这个光电信号到达下一个路由器,路由器重复刚才的分用过程,解析到IP这一层,然后取出其中的目的IP,查路由表,找到下一个设备在哪里;
13)重复这个过程,依次转发,最终到达用户的主机,用户主机进行刚才的层层分用过程,依次把数据取出来(调用SocketAPI),最终交给应用程序;
6.二次触发请求
14)浏览器得到了http响应报文,会进行解析这个报文,获取到其中的html内容,根据HTML再进行渲染;
14)由于html中包含着<img>,<script>,<link>等标签,浏览器很有可能会根据标签中的信息,在构造出其中的HTTP请求发送给服务器......预期得到响应,又要重复上面的过程;
15)可能直接有一个ajax请求,浏览器会通过自身执行引擎,渲染并展示最终结果给用户
7)站在后端开发工程师的角度来看,只是应用层
1)在网络上输入一个地址,会构造出一个HTTP请求,我们想要得到的是一个搜狗主页的静态页面;
2)CDN服务器可能会先把这个搜狗页面的HTML缓存好,所以会先去CDN服务器进行查找;CDN服务器在全国各地都有,为了防止跨越几百公里到达搜狗的机房物理的距离比较大,所以运营商就会在的小区门口搞了一个CDN服务器;
3)CDN没有怎么办,先到达反向代理服务器,里面也是包含一层缓存,它的存在主要是为了降低业务服务器的压力,这层缓存也没有
4)访问搜狗的业务应用服务器可能会有更多的应用服务器,找到index.html并进行返回;
那么我们在搜狗页面输入一个查询词:鲜花?会怎么样呢 1.在浏览器上面输入一个查询词,鲜花,这是会构造出一个HTTP请求,这个HTTP请求里面包含着查询词;首先会找CDN服务器,CDN服务器没有,再去查询反向代理服务器,反向代理服务器没有(因为这个查询词要经过重重的计算) 2.转发给应用服务器,可能是多台主机构成了负载均衡的大量的应用服务器 1)分词服务器,根据查询词来进行分词,再去分别查询搜索结果; 2)搜索服务器,根据分词结果,找到一些具有相关性的界面,往往找到的是页面的ID,可能还会链接模型服务器 3)物料服务器,根据页面的ID获取到一个一个具体的页面内容 4)数据库:物料服务器通过消息队列与数据库进行相连,数据库爬虫结构抓数据,以及清理程序整理数据 5)用户服务器:根据用户的身份信息,来对结果进行优化 6)广告服务器 上面这些服务器生成的数据还需要进行汇总,并做一些统计性的工作,最终会进行汇总到HDFS服务器上面(分布式的文件系统,会统计程序,跑数据,生成报表服务器,领导,程序员,都可以看到程序的具体应用执行情况
1)如果是前端工程师,前端工程师关注的是浏览器的工作过程,尤其是是请求如何进行构造,响应是如何进行解析的
2)当浏览器收到一个具体相应的HTML之后,浏览器是如何解析这个HTML文件的,如何构造DOM树,以及浏览器的引擎如何进行工作,如何执行这里面的一些JS内容
3)如果是通信工程师,看到的问题角度又不一样,看到的可能是物理层层面上面的东西(怎么把数据转化成光信号,电信号,数据遇到了干扰怎么办,遇到丢包怎么办,如何进行编码,什么样算高电平,什么样算低电平)