一个客户端请求到后台的流程:tcp-ip 7层网络通信、负载均衡、API层、数据库

图中的箭头表示数据的流向,数据传输是通过TCP-IP七层网络通信协议来实现:

1、tcp-ip  7层网络通信

实际应用中,一般都是5层:网络层(IP层)、传输层、应用层,链路层和物理层。链路层和物理层很偏硬件,不怎么用到。会话层什么的,大家一般都不这么用,都嫌麻烦。

1.1 网络层(IP层)

  • 网络数据都是以一个个包裹形式传输的。网络包裹格式(char []): | IP包头 | TCP/UDP包头 | 应用层包头/数据
  • 网络层主要操作包裹的ip包头。ip包头就像信封上的收寄件人的地址 ,通信前,包裹上打好ip包头,即收寄件ip地址。
  • 包裹经过internet(外网)路由器,每个路由器都进行ip报文转发 ,转发细节:打开ip包头,找到收件ip,再查自己内存的ip路由表,决定投递给哪一个路由器/交换机(每一个Windows系统中都具有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息),包裹最终送达目标ip的路由器乃至具体机器。路由器也是分层级的,每个国家有一个大的路由器,每个省有一个大的路由器,很像寄快递。
  • ip包头长这样:

(1)版本(Version)
4bit的版本字段表示IP的版本号。如果为0100表示IPv4,如果为0110表示IPv6。

(2)首部长度(header length)
4比特的首部长度字段表示IP首部的总长度,其中包括选项字段(如果有)。该字段的表示的长度单位为32bit(4 bytes),因此首部长度最大为15(1111)*32bit=60bytes。在没有选项时,该字段的值为5,表示普通的IP包头长度20bytes。如图所示,一共占了5行,每行4个字节。

(3)服务类型(Differentiated Service Field)
8bit的服务器类型(TOS)字段,其中前3个bit表示优先权(现在已经忽略该字段),随后的4个bit表示服务类型,按顺序分别表示为最小时延、最大吞吐量、最高可靠性、最小费用四种。这个4个bit中最多只能有1个bit置位,如果全是0则表示一般服务。最后1个bit为未用位,必须置0。

(4)总长度(Total Length)
16个bit的总长度字段表示整个IP数据包的长度,以字节为单位。所以IP数据包的最大长度为16个1=65535bytes。

IP包头里面的总长度=ip包头长度+IP数据长度

IP数据长度(TCP/UDP包头里面的总长度)=TCP/UDP包头长度+TCP/UDP数据长度

TCP/UDP数据长度(HTTP包头里面的总长度)=HTTP包头长度+HTTP数据长度

层层校验

(5)生成时间(Time To Live)
8bit的生成时间字段表示该IP数据包可以经过的路由器的最大数量。最大为256表示可以穿越256台路由,该字段采用减法的方式赋值,比如在开始时8个bit全部置位1,每经过一台路由器该字段的值减1。如果该字段的值减到了0还没有送达目的地,那么该IP数据包将被丢弃。最初设计这个字段是为了防止IP报文在网络中循环无限传输,占用带宽等问题。

(6)协议(Protocol)
8bit的协议字段表示在IP上层承载的是什么协议。比如:0x01表示ICMP协议、0x06表示TCP协议、0x11表示UDP协议等。

(7)首部校验和(Header Checksum)
16bit的首部校验和字段用来使接收端检验收到的报文是否正确。该字段只对IP首部计算校验和,不包含后面的数据字段。原因是IP的上层协议比如ICMP、IGMP、TCP、UDP协议的各自首部中均含有同时覆盖首部和数据的校验和。

 

  • 内网ip & 外网ip

(1)内网ip就是局域网里的ip地址,从内网ip发出的包只能在内网里投递,就像“1号楼1单元” 这种门牌号,是国际/地区间等外网路由器不识别的地址,不同于“北京市海淀区xxx ”这种外网地址。

(2)各个内网里的ip地址可以重复。

(3)IPv4地址协议中预留了3个IP地址段,作为私有地址,供组织机构内部使用。这三个地址段分别位于A、B、C三类地址内:

A类地址:10.0.0.0--10.255.255.255
B类地址:172.16.0.0--172.31.255.255 

C类地址:192.168.0.0--192.168.255.255

(4)在公司内部连外网,有可能是直接给分配了一个外网地址,也有可能是分配了一个内网地址,然后把它转成了外网地址。内网地址转外网地址的过程:会记录一下当前的门牌号分配到哪个外网地址,如果一直在接收数据的话,那么就会一直把这个外网地址给这个内网地址用,如果中间断掉了的话,那么这个外网地址就会回收回来,给别人用。

1.2 传输层

  • IP层的作用是把这些包裹寄到目标地址,但是收到包裹之后,该怎么处理呢?接下来就是传输层干的事儿,找到具体收寄件进程,把收到的包裹拼起来,相当于家里有很多个快递柜,一个快递柜放不下所有东西。传输层操作tcp/udp包头,udp包头是具体收寄件机器上的端口号,用来找到具体收寄件进程。 因为每个机器有很多个程序同时在跑,所以操作系统虚拟了很多个网络端口供他们分配(理解成机器内部的更细的地址),各个程序会占一个或多个端口。
  • udp包头长这样:

  • 16位UDP校验和。TCP发现校验和不对,就重传。UDP发现不对,就把包裹丢了。
  • tcp包头相比udp包头,多了包的编号,有重传机制。如果一个包裹传不完,需要分拆成连续多个包裹的话,对每个包裹编上号,基于编号去确认或重传,就可以保证有顺序的、可靠的传完 。TCP三次对话、三次握手过程、断开连接要进行4次,复杂、准确。

(1)TCP:连接、复杂、准确(保证顺序,不丢包)、占用资源多、效率低。需要数据完好无损时使用。

(2)UDP:无连接、简单、有可能丢包或者乱序、占用资源少、效率高。需要低延迟,相对于数据丢失更糟的是数据延迟时使用。UDP认为在应用层有自己的编号、重传机制,对于有些场景来讲,某些数据并不是那么的必要,丢了就丢了,比如说,我们看一个视频,希望低延迟,丢一两帧无所谓的时候,就可以使用UDP协议。发现影响到使用,直接让发送方重传就可以了。

1.3 应用层

  • IP层和传输层对于每台机器的网络通信都是一样的,是网络通信的基础。应用层操作具体收寄件机器真正要发的数据, 应用层协议规定了这种数据的格式,最常见的应用层协议是http协议。可以类比为,这个快递柜里面可以放收纳箱,另外一个快递柜里面可以放收纳箱和袋子,这些东西具体怎么摆设。具体落实到对这些数据的规定:什么地方写标题,什么地方写正文,问候语怎么写等等。
  • http协议的method有不同形式的,如Get, Post等。最大区别就是get没有包体,post有包体。一开始在设计的时候,我们上网大体分两种形式:

(1)一种形式:比如说我们想听一首音乐,就是HTTP报文结构里面的key value,只需要一个包头就够了。

(2)另一种形式是我们还想上传一些数据,比如说传上去一个PDF文档,这个时候光有包头就不够了,还需要包体,也就是这个图中的实体主体。

写前端的人来决定通过采用get还是post去请求后台。比如说设置一个上传按钮,就要采用post请求,将用户上传的内容传给后台。

  • HTTP设计原理:

请求行类似于函数调用,包括get、post方法和URL。URL的目的是为了通过用户名、密码、IP地址、端口、Path、参数、查询等信息,定位到要调用哪个函数。通过调用不同的函数,得到不同的东西。

首部字段很重要的作用是扩展HTTP协议,相当于一篇文章的开篇文,上来几个首部字段名,换行符,就规定好我接下来要做的几个事情,比如:作者XXX,目的XXX,到最下面一个换行符之后才切换到正文。

2、load balancer 负载均衡

2.1 什么是负载均衡

数据从客户端出来,先到负载均衡这一步。大公司的后台服务器很多,外网ip地址有限,需要进行外网ip收敛。因此,有些有外网ip的好机器,会被用来做 “包裹转发” ,收到外网客户端的请求包裹后,转给真正的服务器。这个转发请求包裹的过程,就是负载均衡 load balance。

2.2 四层负载均衡与七层负载均衡

负载均衡器转发包裹的时候,会拆开这个包裹,先看IP包头,知道转发给哪台机器。如果IP包头不够用,再看TCP/UDP包头,找到具体的端口号。比如小区网关,一般是根据IP包头,或者IP包头+TCP/UDP包头转发,最多工作到传输层就够了,这就是四层负载均衡。如果还不够用的话,那么就打开应用层,挑出合适的服务器处理请求包裹,从而均摊负载。这里面最常见又是对 http协议做转发,其中具体以 http路径(path)做转发最常见,也就是互联网公司干的事,这就是七层负载均衡

  • 比如 http请求 http://www.baidu.com/wangpan/xxxx ,路径 /wangpan/xxxx, 转发给网盘业务服务器集群。
  • http 请求http://www.baidu.com/music/xxxx 路径 /music/xxxx 转发给音乐业务服务器集群。

具体给集群的哪台机器,请参考2.4中负载均衡实现策略。

所以负载均衡主要干了两件事:(1)网关代理。(2)内网服务器的选取。

2.3 正向代理和反向代理

(1)正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。所以,正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器"进行交互。

(2)正向代理的作用:

  • 访问原来无法访问的资源,如google
  • 隐藏客户端真实IP
  •  可以做缓存,加速访问资源

(3)反向代理是指以代理服务器来接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就变为一个反向代理服务器。所以,反向代理,其实是"代理服务器"代理了"目标服务器",去和"客户端"进行交互。

(4)反向代理的作用:

  • 隐藏服务器真实IP
  • 负载均衡
  • 可以做缓存,加速访问资源

2.4 负载均衡实现策略、目的

  • 实现策略:均匀派发、加权派发、 粘滞会话、 均匀任务队列派发、 单一队列等。最简单的就是谁负载低给谁。
  • 目的:(1)将任务的处理负载均摊到不同的进程,以减少单一进程的负载,增强处理能力。(2)提高容错能力。

2.5 常见负载均衡方案

这个图的Load Balancer干的是IP层转发(四层负载均衡)的事,haproxy是最常见的四层负载均衡策略。

Web Server干的是应用层转发(七层负载均衡)的事,nginx是最常见的七层负载均衡策略。

此图把两个分开了,更灵活。Load Balancer性能比较好的对外大机器,Web Server小机器。

haproxy和nginx都是反向代理。因为它俩都是服务器的软件,肯定是从外(服务器)往里(客户端)。

3、API层

接下来数据经过负载均衡之后流到了下面的API层。

3.1 CDN 内容分发

可以理解为内容大缓存,CDN被放在这里的原因是:客户端一般是请求后台,但是有些内容会去CDN里面找,就不用请求后台了,速度快很多。CDN内部也有树状结构,分层级的。

3.2 Memory cache

Cache相对于读写,其实就是个缓存,缓存对于计算机来说无处不在。计算机的处理速度很快,但读写的速度很慢,为了应对计算机处理数据和读写数据之间的速度差距的问题,最开始是做硬件的人,发明了寄存器,从寄存器中读取数据速度比直接从内存中读取速度快。把这些读取速度更快的东西,用来做缓存,每次先从缓存中读取数据,如果没有的话再去内存中操作。

3.3 queue, worker service

队列这一块也可以看成缓存,Write API生产数据的速度非常的快,都放到队列里,再通过Worker Service(API内部的处理服务器)一点点写到NoSQL和Object Store里。

4、数据库

4.1 关系型数据库、非关系型数据库

关系型数据库能执行SQL语句,非关系型数据库不能执行SQL语句,看成一个大map,key value,典型代表redis。

4.2 数据库的服务

数据库也是一些服务器,数据库是给应用服务器服务的,应用服务器是给客户服务的。数据库服务器也是有请求和返回。请求就是传给它的SQL语句,返回就是查到的结果数据。数据库请求大致分为两类,一类是读数据,一类是写数据。

  • Master:处理写请求、读请求、与Slave同步数据。
  • Slave:处理读请求、与Slave同步数据。

4.3 数据库的分片

一个数据库是一个服务器,但是通过分片也可以把数据库拆成多个服务器。一方面是一个服务器有可能装不下,另一方面是应对请求量太大,一个服务器处理不过来的情况。

发布了312 篇原创文章 · 获赞 32 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Scarlett_Guan/article/details/103198434