这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记
网络交互部分阐述了请求如何从客户端一步一步传输到达服务器并将结果返回并确保不会造成请求丢失
网络的交互方式可以分为两个部分:网络接入 和 网络传输
网络接入
网络通过路由器跟运营商网络接通,运营商一般会跟企业的服务器接通,如果涉及到海外业务,企业的服务器还会跟海外的网通过光缆接通。这样就完成了客户端和服务端的网络接入,双方就可以在网络中传输信息
关于路由,网络的传输可以分为同网段和不同网段传输
同网段
同网段下的通信相对简单,通过交换机可以使多台服务器在同一个网段下面,这个时候所有的传输信息只需要经过交换机将目标IP的MAC地址修改为查询到的目标MAC地址即可完成传输。由于技术的需求,即使不是同一个交换机连接着所有的服务器,也可以通过SDN技术将多个交换机连在同一个虚拟的同网段下,SDN的本质就是将网络软件化,以此来提升网络的可编程能力,是对网络架构的重构并简化网络。
跨网段
当发送接收方的IP不在同一网段下时就需要路由来实现,在这里需要注意的是路由的路径并不是双向对称的,发包和回包是两个相对独立的过程。路由工作在我们常说的网络五层架构下的IP层,通过ARP协议可以解析到网络中信息传递的下一站的MAC地址,但实际情况并不是如此简单,由于需求的扩展,比如BGP/OSPF协议(动态路由协议)就是基于传输层TCP/UDP协议。
除此之外,IP仅限定了发送方和接收方,在传输过程中起主要作用的是MAC地址,通过ARP的解析获得到MAC地址,并且修改下一跳的目标MAC以及自身的源MAC,使得信息在不同的MAC点之间传输
ARP协议
arp的工作原理相对简单,需要在同网段/局域网下通过ARP广播的形式发送一个请求目标IP的广播,网段下的其他服务器就可以根据请求来进行响应MAC,如此往复抵达目标IP,事实上在每次给局域网中加入一个服务器之后,由于其他的服务器并没有做这个服务器的IP和MAC的缓存,通常为了刷新数据或者防止IP冲突,会发送一个广播来让其他服务器刷新缓存,这个称为免费ARP
ARP代理
所谓的代理就是劫持一个ARP请求,并发送到另一个地方,这也是虚拟网的建立方式,使得一个局域网下的ARP广播可以广播到另外一个局域网/网段下,以此实现多个交换机在一个虚拟网的网段下。
网络传输
说到网络传输,最原始的网络传输架构是七层架构模型,虽然这套架构比较全面,但由于实际使用比较困难,所以在实际使用中简化为了五层架构,自上而下分别为:应用层、传输层、网络层、数据链路层、物理层。不同的层会有不同的协议,比如最常见的:应用层的http、ftp、smtp、dns,传输层的tcp、udp,网络层的IP、arp等
前文提到的网络接入基本是在网络架构的下三层,但在设计到网络传输之后就需要考虑到应用层和传输层,这就涉及到一次请求的全过程:
通常在客户端发送一个请求之后,会通过dns解析域名获得目标真实IP,这个dns解析是独立的服务,优先在本地缓存和hosts中获取,如果找不到就会先后访问根域服务器、顶级域服务器、权威服务器直到解析出目标的IP,DNS本身是基于UDP协议,所以比较简单方便,随之而来的也要考虑到udp丢包的处理方式
在解析出了IP地址之后就会进行网络接入,如果是tcp协议,会先经历tcp的三次握手,如果是https,中间还会有tls的握手过程,在握手成功之后双方之间就正式建立了连接,可以进行后续大批量数据的传输。
HTTP
超文本传输协议工作在应用层,之所以将http和tcp区分开来,也是从应用层的开发角度来说,tcp协议需要考虑到连接方面的事情,抽象出来一个http之后就能够在确保tcp成功建连的基础上进行应用的开发,http层只是加了一些规矩来让用户使用更加清晰。
http自身经过了几个版本的迭代,最常见的应该是http/1.1,这个版本下支持了双方的长连接,在一个连接里进行多次请求,但为了提高网络的质量和传输的效率,后续衍生出了http/2.0和http/3.0,2.0中最主要的变化就是加入了二进制分帧技术实现了多路复用,以此来实现一个连接中并行传输多个请求,充分利用网络带宽提高效率,其次,为了缩减数据包的大小,双方会维护一个请求头的映射集合,通过映射来传输请求头信息,即使如此,在网络质量好的情况下,请求的传输无阻,我们很难感知出请求传输的是否串行,而在网络条件差的情况下就会产生一些问题,比如在请求丢包的时候,http2.0是基于tcp构建的,在tcp中规定如果丢包,就会引起队头阻塞,丢包之后后续所有的请求都会阻塞住直到这个请求重新传输完毕,这个时候的多路复用就不能奏效了,为了解决这个问题,可以在tcp的报文中的options加入一个ack序列号,通过序列号辨别丢失的包并只需要重传相应的包即可,即使如此,队头阻塞的本质问题,只要是基于tcp协议就不能进行根绝,所以在3.0中就进行了udp方向的尝试,基于udp的3.0实现了很多方面的优化,比如天然支持tls握手加密,通过第一次建连的session就可以在0RRT下完成建连,并且对于移动端更加友好。
以上就是网络交互中比较最主要的两个方向涉及到的方面,如果需要更近一步了解,比如握手建连的过程等,还需要查阅相关的资料才行,当涉及到网络的交互,必不可少的就需要考虑到网络的安全、网络的稳定、丢包的处理、网络的效率,这些方向也是在不断优化的过程中进行处理,也希望后续会有更加高效更加完美的网络架构和协议的诞生