分布式之远程通信协议

HTTP协议通信原理

说到通信,就一定会提起tcp和upd这两种通信协议,以及建立连接的握手过程。而http协议的通信时基于tcp/ip协议之上的一个应用层协议,应用层协议除了http还是有FTP,DNS,SMTP,Telnet等。

涉及到网络协议,我们一定需要知道OSI七层网络模型和TCP/IP四层概念模型,OSI七层网络模型包含(应用层,表示层,会话层,传输层,网络层,数据链路层,物理层)。
TCP/IP四层概念模型包含(应用层,传输层,网络层,数据链路层)。

在这里插入图片描述

请求发起过程,在tcp/ip四层网络模型中所做的事情

当应用程序用TCP传输数据时,数据被送入协议栈中,然后追逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息,有时还要增加尾部信息。
在这里插入图片描述

客户端如何找到目标服务

在客户端发情请求的时候,我们会在数据链路层去组装目标机器的MAC地址,目标机器的MAC地址怎么得到呢?这里就涉及到一个ARP协议,这个协议简单来说就是已知目标机器的ip,需要获得目标机器的mac地址。比如,发送一个广播消息,这个IP是谁的,请来认领。认领的ip的机器会发送一个mac地址的响应。

有了这个目标的mac地址,数据包在链路上广播,MAC的网卡才能发现,这个包事给它的。MAC的网卡把包收起来,然后打开IP包,发现IP地址也是自己的,再打开TCP包,发现端口也是自己,比如就是80端口,而这个时候这台机器人上有一个nginx是监听80端口。
于是将请求提交到nginx,nginx返回一个网页。然后将网页需要发回给请求的机器,然后层层封装,最后到mac层。因为来的时候有源mac地址,返回的时候,源mac就变成了目标mac,再返回给请求的机器。
了避免每次都用ARP 请求,机器本地也会进行ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以ARP 的MAC 地址缓存过一段时间就会过期

接收端收到数据包以后的处理过程

当目标主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议都要去检查报文首部中的协议标识,以确定接收数据的上层协议。
在这里插入图片描述
为什么有了mac层还要走IP层呢?
之前提到,mac地址是唯一的,那理论上,在任何两个设备之间,我应该都可以通过mac地址发送数据,为什么还需要IP地址?
mac地址就好像个人的身份证号,人的身份证号和人户口所在的城市,出生日期有关,但是和人所在的位置没有关系,人是会移动的,知道一个人的身份证号,并不能找到它这个人,mac地址类似,它是和设备的生产者,批次,日期之类的关联起来,知道一个设备的mac,并不能在网络中将输出发送给它,除非两者是同一个局域网。
所以要实现机器之间的通信,我们还需要有IP地址的概念,IP地址表达的是当前机器在网络中的位置,类似于城市名+道路号+门牌号的概念。通过IP层的寻址,我们能知道按何种路径在全世界任意两台Internet上的机器间传输数据。

TCP/IP的分层管理

TCP/IP协议按照层次分为4层:应用层,传输层,网络层,数据链路层。对于分层这个概念,大家一定不陌生,比如我们的分布式架构体系中,会分为业务层,服务层,基础支撑层。比如docker,也是基于分层来实现。所以我们会发现,复杂的程序都需要分层,这个是软件设计的要求,每一层专注于当前领域的事情。如果某些地方需要修改,我们只需要把变动的层替换掉就行,一方面改动影响较少,另一方面整个架构的灵活性也更高。最后,分层之后整个架构的设计也变得相对简单了。

分层负载

了解了分层的概念以后,我们再去理解所谓的二层负载,三层负载,汽车负载就容易多了。
一次http请求过来,一定会从应用层到传输层,完成整个交互。只要是在网络上跑的数据包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

二层负载

二层负载时针对mac,负载均衡服务器对外依然提供一个虚拟ip,集群中不同的机器采用相同的IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标mac地址的方式将请求转发到目标机器实现负载均衡。
二层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的MAC 地址

三层负载均衡

三层负载时针对IP,和二层负载均衡类似,负载均衡服务器对外依然提供一个虚拟IP,但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接收到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器
三层负载均衡会通过一个虚拟IP 地址接收请求,然后再分配到真实的IP 地址

四层负载均衡

四层负载均衡工作在OSI模型的传输层,由于传输层,只有TCP/UDP协议,这两种协议除了包含源IP,目标IP以外,包含源端口号及目标端口号。四层负载均衡服务器在接收到客户端请求后,通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。
四层通过虚拟IP + 端口接收请求,然后再分配到真实的服务器

七层负载均衡

七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别来决定是否要进行负载均衡
七层通过虚拟的URL 或主机名接收请求,然后再分配到真实的服务器

TCP/IP协议的深入分析

我们如果需要深入学习网络协议,就要先把一些基本的协议的作用和工作过程搞清楚,网络设备还没智能到人脑的程度,它是由人类创造出来的,它的工作过程肯定是符合人类的交流习惯并按照人类的交流习惯来设计的,所以要以人类的思维方式去理解这些协议。

例如,你给别人打电话,不可能电话一接通你就啪啦啪啦地说一大通,万一对方接通电话后因为有事还没来得及倾听呢?这不太符合正常人类的交流习惯。一般是电话接通后,双方会有个交互的过程,会先说一声“你好”,然后对方也回复一声“你好”,双方通过各自一句“你好”明确对方的注意力都放在了电话沟通上,然后你们双方就可以开始交流了,这才是正常的人类交流方式,这个过程体现在计算机网络里就是网络协议!
我们通过TCP协议在两台电脑建立网络连接之前要先发数据包进行沟通,沟通后再建立连接,然后才是信息的传输。而UDP协议就类似于我们的校园广播,广播内容已经通过广播站播放出去了,你能不能听到,那就与广播站无关了,正常情况下,不可能你说没注意听然后再让广播站再播放一次广播内容。基于这些思路,我们先去了解下TCP里面关注比较多的握手协议

TCP三次握手协议

所有TCP消息的可靠性首先来自于有效的连接建立,所以在数据进行传输前,需要通过三次握手建立一个连接,所谓的三次握手,就是在建立TCP链接时,需要客户端和服务端总共发送3个包来确认连接的建立,在socket编程中,这个过程由客户端执行connect来触发。
在这里插入图片描述

三次握手的流程

  1. 起初两端都处于CLOSED关闭状态,由客户端发起连接并且将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给服务端,客户端进入SYN-SENT状态,等待服务端确认
  2. Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量
  3. Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据

起初A和B都处于CLOSED状态——B创建TCB,处于LISTEN状态,等待A请求——A创建TCB,发送连接请求(SYN=1,seq=x),进入SYN-SENT状态——B收到连接请求,向A发送确认(SYN=ACK=1,确认号ack=x+1,初始序号seq=y),进入SYN-RCVD状态——A收到B的确认后,给B发出确认(ACK=1,ack=y+1,seq=x+1),A进入ESTABLISHED状态——B收到A的确认后,进入ESTABLISHED状态

TCP四次挥手协议

四次挥手表示TCP断开连接的时候,需要客户端和服务端总共发送4个包以确认连接的断开。客户端或服务端均可主动发起挥手动作,因为TCP时一个全双工协议,也就是双向协议。在socket编程中,任意一方执行close()操作即可产生挥手操作
在这里插入图片描述

单工:数据传输只支持数据在一个方向上传输,例如UDP

半双工:数据传输允许数据在两个方向上传输,但是在某一时刻,只允许在一个方向上传输,实际上有点像切换方向的单工通信

全双工:数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力

四次挥手

  • A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接࿰
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值