Spring架构篇--2 远程通信基础--分层传输

前言:通过对业务的拆分,形成了多个微服务,每个微服务都是一个独立的项目,如果不与其它服务进行信息交流,那么它们每个都存在信息孤岛;本文以http为例探讨客户端与服务端远程通信的过程;

1 网络的分层通信:

我们知道计算机在底层是以0,1进行数据的传递解析最终渲染出不同的页面;那么数据的传输过程:都要经过哪些层呢:
在这里插入图片描述
客户端请求发送及服务端接收请求过程:

在这里插入图片描述
在完成tcp 连接后:
客户端发起请求:

  • 客户端发起请求后,将数据从用户空间拷贝到系统空间的buff 缓冲区;
  • DMA 将系统空间buff 缓冲区的数据拷贝到网卡中;
  • 在传输层添加传输的协议(tcp/udp);
  • 在ip 层添加本机的网卡ip,以及目标的ip;
  • 在数据链路层添加目标网卡的唯一Mac地址;
  • 在物理层将数据报文转换为0,1 高低电位;

服务端接收请求:

  • 服务端匹配mac 地址,匹配相同,则改数据为本电脑的数据,然后进行数据的解析;
  • 网卡发现有数据进入,将数据放到系统内核空间中,并向cpu 发送中断信号;
  • cpu 接到中断信号,将系统空间的数据拷贝到对应进程下的用户空间中;
  • 通过请求端发送过来的端口号,进入到对应的进程中;
  • 进程中的线程访问用户空间的请求数据,完成业务处理,并将返回的数据写回系统空间;
  • 系统空间将数据拷贝到网卡;
  • 添加服务器相应信息及发送的客户端信息,通过网线进行数据写回;

客户端接收请求结果:

  • 客户端网卡获取到数据,将数据从网卡拷贝到系统空间,向cpu发送中断信号;
  • cpu 将数据从系统空间拷贝到用户空间;
  • 请求进程从用户空间得到请求结果;

2 TCP/IP 分层:
直接通过传输层进行管道的建立维护以及数据的发送接收
在这里插入图片描述
2.1 TCP:可靠的数据传输:

2.1 .1 连接的建立:3次握手:
因为网络的不可靠,两个接点服务器要确保自己发送和接收的保证;通过发送3次数据包来确保两个节点的接收和发送都是正常的,以此确保两个结点的网络连接是可靠的;
在这里插入图片描述
过程:

  • 客户端发送请求到达服务端,服务端接收请求成功,此时服务端可以知道自己接收信息的功能是没有问题的;
  • 服务端回复客户端信息,客户端接收信息成功,此时客户端可以知道自己发送请求和接收请求都是没有问题的;
  • 客户端再次向服务端发送请求,服务端接收请求,此时服务端知道自己发送的功能也是没有问题的,至此稳定的通道建立;

2.2.2 客户端连接的端口:4次挥手,保证双向断开;
在这里插入图片描述
过程:

  • 客户端在消息发送完毕之后,发送数据包告诉服务端,客户端已经完成消息发送,要关闭了;
  • 服务端有可能还有消息要发送给客户端,所以第一次回复客户端消息,告诉客户端服务端已经知晓;
  • 客户端需要等待后续服务端在将消息全部发送给客户端后 发送 客户端数据包,表明此时服务端也没有数据了,服务端也结束了;
  • 客户端接收到服务端数据处理完毕的回复后,给服务端发送自己确认关闭连接消息后,等待两个报文时间后关闭连接;

为什么客户端要等待两个报文:客户端只是发送了服务端自己要关闭连接的确认,但是并不知道服务端是否真的已经关闭了连接,所以等待两个报文时间,依然没有得到服务端发送的消息后,客户端就默认服务端已经关闭了连接,此时自己也关闭连接;

2.2 UDP:
不可靠的数据传输: 不维护链接,不关心是否真的发送成功,也不关系服务端是否真的接收信息成功;
UDP无连接,时间上不存在建立连接需要的时延。空间上,TCP需要在端系统中维护连接状态,需要一定的开销。UDP装入包括接收和发送缓存,拥塞控制参数和序号与确认号的参数。UCP不维护连接状态,也不跟踪这些参数,开销小。空间和时间上都具有优势;

UDP没有拥塞控制,应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率。某些实时应用要求以稳定的速度发送,能容 忍一些数据的丢失,但是不能允许有较大的时延(比如实时视频,直播等);

UDP提供尽最大努力的交付,不保证可靠交付。所有维护传输可靠性的工作需要用户在应用层来完成。没有TCP的确认机制、重传机制。如果因为网络原因没有传送到对端,UDP也不会给应用层返回错误信息;

UDP是面向报文的,对应用层交下来的报文,添加首部后直接乡下交付为IP层,既不合并,也不拆分,保留这些报文的边界。对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程,报文不可分割,是UDP数据报处理的最小单位。
正是因为这样,UDP显得不够灵活,不能控制读写数据的次数和数量。比如我们要发送100个字节的报文,我们调用一次sendto函数就会发送100字节,对端也需要用recvfrom函数一次性接收100字节,不能使用循环每次获取10个字节,获取十次这样的做法。

UDP常用一次性传输比较少量数据的网络应用,如DNS,SNMP等,因为对于这些应用,若是采用TCP,为连接的创建,维护和拆除带来不小的开销。UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)数据的可靠传输对他们而言并不重要,TCP的拥塞控制会使他们有较大的延迟,也是不可容忍的。

3 不同分层可以做的负载均衡:

2层可以通过Mac地址进行负载;3层通过ip 进行负载;4层通过ip,端口负载;7层通过url进行负载;
在这里插入图片描述

4 扩展:

网卡和Mac地址的关系:
网卡:
(1)计算机与外界局域网的连接是通过主机箱内插入的一块网络接口板,又称为通信适配器或网络适配器或网络接口卡NIC,简称“网卡”。
(2)网卡是工作在数据链路层和物理层的网络组件,是局域网中连接计算机和传输介质的接口。
在这里插入图片描述

MAC地址:
在广播信道实现点到点通信,这就需要网络中的每个网卡有一个地址。这个地址称为物理地址或MAC地址(因为这种地址用在MAC帧中)。IEEE802标准为局域网规定了一种48位的全球地址。一块网卡的MAC地址是具有全球唯一性的。
笔记本有两个网卡,一个无线网卡,一个有线网卡;台式电脑只有一个有线网卡;

参考:
网卡和MAC地址

猜你喜欢

转载自blog.csdn.net/l123lgx/article/details/128977138