计算机网络技术理解回顾
为何网络是当前这种结构
计算机网络的本质,是将人类社会所有计算机设备连接起来,目的是相互通信,实现信息交换与共享。要想与其他设备进行信息交换,首先要知道交换对象是谁,这是通过每个设备分配的id来决定的,互联网分配此id的统一规则,包括ip、mac地址。在原来,当通信网络还没有这么复杂的时候,只需要唯一标识符mac地址,即可通信。mac地址本身的长度是48位,可以表征万亿台。若在一个网络中,同时包括如此多的设备,想找到目标设备的时间复杂度,都是非常高的,信息通信的实时性将会大大降低。同时,要让无数设备两两直接通信,要么建立相当多的通信线路,那样,任意新增一台设备,将与其他所有设备都建立线路,这是相当复杂的事情。通信的数据技术发展,使得通信一条线路当中,可以让很多路信号同时发射,主要是要承载到不同频道中。这样,一条线路,也可以供相当多设备进行通信。实际的通信频率,不是无限的,也就不能划分位无数频段。我们的常见网卡设备,有千兆网卡、万兆网卡,指的是,支持的传输速率,这也取决于采样最小单位。万兆网卡,也就是1s能传输万兆比特字节,那么不考虑容错和误差,最小采样单位是1/万兆。这样,最高频率也就是万兆,这是可供传输划分的最大频带宽度。另外,基于企业团体都网络信息,区分为内外不同程度可见,也使得计算机设备,无法任意两两直接互联。因此,也就诞生了基于子网的网络结构。
关键点:通信时间复杂度、通信信道最大并行容纳通信对象数、设备团体的内外权限级别。
如何表达子网
为了构成子网网络结构,将众多不同种类设备的MAC地址划分为子网团体,也就诞生了IP地址、子网掩码。IPv4地址为32位,本质上,可表达的设备数量为42亿,但是,为来表达更多的子网,将ip网段划分到尽可能小,比如一个ip地址划分为一个子网,就可以表达42亿个子网。一般而言,ipv4分为4类,分别如下:
- A类:1.0.0.1 ~ 126.255.255.254(排除虚拟ip:10.0.0.0~10.255.255.255) —— 8位网络位(默认子网掩码:255.0.0.0) + 24位主机位,可表达的主机数为1677万,可表达的子网数为127个。适用于大型企业。主机位全为0的,表示网络结构,例如:8.0.0.0;全为1的,表示广播地址,例如:8.255.255.255
- B类:128.1.0.1 ~ 191.255.255.254(排除虚拟ip:172.16.0.0~172.31.255.255) —— 16位网络位(默认子网掩码:255.255.0.0) + 16位主机位,可表达的主机数为6万。主机位全为0的,表示网络结构,例如:128.1.0.0;全为1的,表示广播地址,例如:128.1.255.255
- C类:192.0.0.1 ~ 223.255.255.254(排除虚拟ip:192.168.0.0~192.168.255.255) —— 24位网络位 + 8位主机位,可表达的设备数为254
- D类:224.0.0.0 ~ 239.255.255.254 —— 多播用,前面4位固定,后面28位为组播id,未被用于子网
- E类:240.0.0.0 ~ 255.255.255.254 —— 保留,实验室使用等
若想要把子网内的信息暴露给外面,则可使用外网IP,一般而言,对外连接的设备数很大的情况下需要使用A类和B类,例如腾讯云上的。而虚拟ip所能表达的网络是私有的,按规则,私有内网需要使用如下ip:
- 10.0.0.1~10.255.255.254,最大可表达主机数为1677万(1个子网)
- 172.16.0.2~172.31.255.254,最大可表达主机数为6万(16个子网)
- 192.168.0.1~192.168.255.254,最大可表达主机数254(255个子网)
这也就是说,为啥大型企业子网使用10开头,docker虚拟机网络使用172开头,而家庭网络使用192.168开头。
为何子网内可以两两通信
网络通信的设计,是默认跨网络无法直接通信,子网内可以任意两两通信。为何子网内计算机设备可以任意两两通信呢?将任意两台计算机设备互联,只要设定双方的ip和子网掩码在一个子网网段内,双方就可以相互通信,因为网卡直接相连。为何需要设定到同一个子网呢?因为我们一般是通过ip通信,需要工作在至少ip层,而ip层的通信基本规则,是通过广播arp包,找到目标的mac地址,然后转到链路层进行数据发送,而arp协议只对当前网段的设备进行广播,不会无限制广播。一旦有设备回应,则填充mac地址,转包出去。而每台设备本身,随时响应arp请求。arp协议本质上,限制了通信必须在同一网段内。而如果直接发送链路数据,则可以无视网段,当然前提是两个网卡直连。因此,本质上,将两台计算机设备连接,不配置相同网段,提前获取网卡mac地址,直接模拟链路层发包,或者在arp缓存中打入对方mac地址到ip的映射,也是可以通信的。路由器中的双网卡,本质也是如此通信的,保留映射关系。
那为何子网内两个设备可以两两通信呢?首先是上述情况,计算机设备直连,也就是两张网卡必须通过物理线路直连,连接方式,肯定是一张网卡的输出IO口,连接作为另一张网卡的输入IO口,双通道的情况下,两两互为输入输出,这样,只需要对输出设置高低电平信号,对方网卡就能感知到输入高低电平信号,转换到后置的处理流程中去。而我们要想实现多设备互相通信,就需要多设备能够互联,交换机就是实现此作用的,让两两机器达到物理连接效果,将电平信号传导到下一个接入。这样,交换机本质也可以理解为有很多张网卡(有几个网口,就可以理解为有几个网卡),同时,交换机本身要让arp信号能够通过,也就是说,当一台设备发送arp广播信号给直连的交换机,交换机需要将arp信号,传导到多个输出网口上去,当选定了哪个网口中的设备时,则数字电路建立连接关系,准备一个数据包的发送,当发送结束后,解除连接关系。若同时有多个请求,则交换机必须通过轮询连接,负载均衡(参考https://blog.51cto.com/yangrong/1330594)。
关键词:网卡物理直连、链路层可以无视网段进行通信、网络层需要在同一个局域网通信、交换机负载均衡来选择连接不同设备
上述是交换机的逻辑工作原理,内部物理连接原理,实际上是由以太网卡的连接和特定协议,构建的总线型网络结构,任意数据包发送给交换机,都由交换机内网卡实现数据转发,转发的根据,是目标mac地址和对应的端口映射关系。当不存在映射时,就将当前数据帧广播到其他所有端口,由满足条件的端口,来接收数据包和建立缓存(不满足的则丢弃数据包)。也就是说,丢弃数据包这种操作,是每个网卡所必备的,交换机可以动态识别mac地址的根源,也是由于这个机制实现的。
关键词:总线型网络结构
arp协议是用于查询mac地址,实际是介于网络层和数据链路层中间。任意一个数据包,理论上只能发往下一跳,arp是辅助链路层的,也就是一个arp包只负责一个局域网内的mac地址寻址(链路层一次传输,只是局域网内交换机互联的计算机设备之间传输,或者相邻路由传输)。通过目标ip和网段信息,可以判定,目标ip是否存在于同一网段,如果是,则直接广播arp包,局域网内的机器接收到数据包,判定是否是自己,即可正常返回mac地址。如果不是同一网段,则arp获取到路由器网关mac地址,将数据包直接发往路由器网关。路由器网关收到数据包,也会根据目标ip地址是否所属当前子网,来判断是否继续发往更上层到路由器网关,还是广播arp查询当前同网段到目标mac地址。依次逐步往上查询。也就是说,数据包是一层一层转发,逐步找到最终目标地址的。
关键词:arp用于局域网寻址
两两通信的另一个问题,是处理速度匹配问题。一个数据帧传输到对方,对方进行处理,主机方继续传输,这里就存在速率不匹配问题,也会导致通信不正常。链路层设计上,支持对这种速率进行动态匹配,也就是常说的流量控制,基本做法是:基于发送缓存和接收缓存空间的滑动窗口控制。每一个数据帧,都会有一个确认帧,滑动窗口的基本做法,就是不一一等待所有确认帧,而是连续发送一个窗口空间的数据帧,当窗口到达最大时,暂停发送,而当确认帧收到时,继续发送直到窗口再次爆满。
关键词:链路层速率匹配、流量控制、数据帧和确认帧、滑动窗口
子网间如何通信
要让不同子网间的计算机设备能相互通信,由于无法直连,所以链路层无法通信,又由于不在同一个网段,网络层也无法通信。这个时候,就需要又一台智能设备,能将一个子网的数据请求,转发到另一个子网。这种设备,被称为路由器。路由器的作用,本质而言,就是将两个不同子网相连,将数据进行传导。那么路由器本身至少有两个不同网段的网卡,分别连接到两个不同的子网,而路由器本身的不同网段的网卡,由于物理连接,链路层本身相连,所以数据可以进行传导。但是与交换机不同,路由器不是进行线路连接的作用,实际上,两台不同子网的设备如果想要通信,并非直接通信,而是通过中间的路由器节点转发消息,实际的操作,只是发送方设备,只负责将数据打包,发送给路由器,也就是出口网关,路由器自身,会通过解析数据包,判定数据包是否到达,未到达,则进行数据包转发。路由器的另外一个作用,就是需要缓存连接设备的ip和mac地址,当一个子网网段的数据包请求到达,则通过路由器本身内部缓存的mac地址,查询到目标设备,进而通过链路层传送过去。如果一个网段的arp数据包请求,找不到目标mac地址,则路由器会将arp数据包广播给所有网口连接的设备进行查询。多网口连接的路由器,还充当来交换机的作用,让端口之间,能互相通信,组成子网。这也就是为何称为路由器的原因,它的主要功能,就是建立路由表(缓存的ip和mac地址,以及对应的出口),将不同网段的子网数据请求,转发到另一网段。
经过路由器的数据转发,其基本处理方式,是存储——>转发。每一个路由器充当存储设备,路由器入口网卡负责数据的接收存储,出口网卡负责数据的输出和传输速率控制。当不同子网间当机器主机A和主机B想要通信,首先主机A的数据包目标地址与本机不在同一网段,主机A底层则默认将数据包送往网关。当发现网关的mac地址不在自己的arp缓存表中,首先存储下来当前数据包,然后发送arp广播请求,获取网关mac地址。网关收到arp请求,则发送单播arp回包给主机A,此时主机A再将数据包发往网关。当网关收到数据包,发现目标地址不是自己,而继续查询对应目标ip地址的mac地址,当在网关arp缓存表中查询到主机B的mac地址,则转发给对应端口,如果没有发现,则网关会存储数据包,然后发送arp广播包,查找主机B的mac地址,如果找到,则填充mac地址,将数据包转发给主机B,如果没有找到,则继续将数据包转发给本路由器的上层网关……依次进行,直到mac地址找到,将包转发给对方,或者ttl生命周期到达,丢弃数据包。
关键词:非同一网段请求发往默认网关、网关存储转发
互联网中的路由器众多,为了数据的正常发送,路由与路由形成了网络结构,这样,为了使得数据包能够正常传达,路由必须负责选择一条路由路径,将数据包通过上述网关存储转发的形式,逐层发往目标主机。路由器通过各种算法,与邻居路由交换路径、带宽等信息,通过最终有效的算法,来实现路径选择。
跨网的主机的不同应用进程如何两两通信
前面从数据包的角度,说明如何将数据包信息从一台主机送往另一台主机、如何找到对方的地址、如何存储转发、数据包如何在网络中一层层传递等。而实际上,在主机与主机间通信的,并非主机本身,而是运行在各个主机中的应用进程。通信的本质,实际是一台主机的进程,如何与另一台主机的进程,交换信息数据。
浏览器上网过程
当我们使用浏览器上网时,我们需要通过浏览器输入目标网址http://www.baidu.com:80/index.html,冒号后面80端口,以及index.html,默认通常省略。浏览器所做的事情,就是要去找到目标,把请求数据信息发出去,然后把目标的网页信息传输回来。我们现有的互联网,是通过ip定位目标的,例如:114.111.56.38。首先要做的,是要找到对应的ip。url可以分为协议部分,例如上述的http协议,域名部分,例如上述的www.baidu.com,端口部分,例如80,目标文件信息,例如/index.html,也就是要找到目标计算机设备(www.baidu.com)中运行的端口监听程序(80端口所在程序)中,http超文本信息(绑定到程序的http标准协议根目录下的index.html文件)。域名是用来标识目标ip的,通过DNS协议请求,可以将域名对应的ip查询到,本质也是向计算机中配置的DNS服务器列表,依次发送域名查询请求,找到ip,然后将请求包中的目标ip填充。那么DNS请求,为何能顺利的找到目标,并且通过预先设定的程序,返回正确的ip信息呢?首先,计算机中都配置有默认的DNS服务器信息,数据包发送出去,要能顺利找到路由路径,首先,每一台中间路由设备,都保存有临近的路由设备信息,去往DNS服务器所在计算机设备的路径,一开始是不明确的,需要通过路径搜索算法,一个路由器节点一个路由器节点去尝试,首先是最近的路由器,然后逐步将请求转发到临近的路由器上去,通过广度优先搜索即可逐步查询互联网中的所有路由器中间节点。顺利的话,经过几跳,就可以查询到目标设备。一旦建立连接,路由器是否会保存路径信息?如何保存?
问题:路由路径信息如何保存?是否每帧数据包,都需要寻址?
对于网卡而言,每次发送的,都是一帧一帧数据,由数据链路层封装发送,保障数据正确到达,做字节流的安全传输控制,至于发送多长字节,由于网卡肯定每次只能发送固定长度的,所以会将一帧数据拆分发送,增加一些容错功能,而数据包的协议头,则表征了一个数据帧有多长。
问题:数据链路层协议怎样的?一帧数据如何定义?最大长度多少?
当目标机器收到数据块,网卡将数据块组装成数据帧,通过中断,触发上层安装的协议,逐层解析数据包。当解析到端口80时,则去寻找当前协议(tcp)下监听了80端口的套接字结构,以及进程上下文信息,将wait线程激活,触发线程干活,线程通过回调,进一步调用进程中的某个接口函数层层回调,到达上层,并将额外参数get /index.html,传递给上层,上层解析到此路径,从之前设置的相对的根路径下,去寻找此文件,通过文件io读取出来,进一步通过http回包结构,传递数据包,发送回去。既然要发送回去,就需要先前保存下来的发送方的位置信息,依旧通过路径,回放回去。那这里有一个问题,长连接和短链接,怎么体现?
问题:长连接和短连接,在协议底层如何保证?数据通过http请求的response传递回去,数据包的路由路径如何走的?