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

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

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

1、tcp-ip  7层网络通信

一个客户端请求到后台的流程: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包头长这样:

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

(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的数据长度=TCP/UDP包头长度+数据长度

TCP/UDP数据长度=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

 

1.2 传输层

传输层操作tcp/udp包头,udp包头是具体收寄件机器上的端口号,用来找到具体收寄件进程。 因为每个机器有很多个程序同时在跑,所以操作系统虚拟了很多个网络端口供他们分配(理解成机器内部的更细的地址),各个程序会占一个或多个端口。

  • udp包头长这样:

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

 

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

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

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

 

1.3 应用层

应用层操作具体收寄件机器真正要发的数据, 应用层协议规定了 这种数据的格式,最常见的应用层协议是http协议。

(1)http协议的method有不同形式的,如Get, Post等。最大区别就是get没有包体,post有包体。再听听语音,图中的URL再了解了解   请求行  函数调用

 

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

 

2、load balancer 负载均衡

2.1 什么是负载均衡

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

 

2.2 负载均衡的作用

(1)网关代理:有正向代理和反向代理两种方式。

(2)内网服务器的选取:在包裹转发的时候,挑出合适的服务器处理请求包裹,从而均摊负载 (payload balance)。这里面最常见又是对 http协议做转发,其中具体以 http路径(path)做转发最常见。

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

 

2.3 正向代理和反向代理

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

(2)正向代理的作用:

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

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

(4)正向代理的作用:

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

 

2.4 负载均衡(2.2中的第(2)条)实现策略

均匀派发、加权派发、 粘滞会话、 均匀任务队列派发、 单一队列等。

 

2.5 负载均衡(2.2中的第(2)条)的目的

  • 将任务的处理负载均摊到不同的进程,以减少单一进程的负载,以达到处理能力水平扩容的目的。
  • 提高容错能力。

 

2.6 常见负载均衡方案

loadbalancer = haproxy, web server=nginx:

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

再细讲下这个图

 

3、API层

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

3.1 CDN 

3.2 Memory cache

3.3 queue, worker service

 

4、数据库

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

数据库也是一些服务器,是对内的,对应用层的,其他的是对客户端。

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

4.2 

再细讲下这个图

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