远程通信协议

在分布式架构中,涉及到一个重要的环节,就是分布式网络中的计算机节点彼此之间需要通信,这就涉及到远程通信协议

HTTP协议通信原理

涉及到网络协议,需要先了解一下OSI七层网络模型和TCP/IP四层概念模型

请求发起过程中,在TCP/IP四层网络模型,当应用程序用TCP传输数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络,其中每一层对收到的数据要增加一些信息。

 

客户端如何找到目标服务

 在客户端发起请求的时候,我们会在数据链路层组装目标机器的MAC地址,目标机器的mac地址又是如何得到的呢?ARP协议,这个协议简单的说就是已知目标机器的ip,需要获得目标机器的mac地址,发送一个广播消息,这个ip是谁的,请认领。认领ip的机器会发送一个mac地址的响应。有了这个目标mac地址,数据包在链路上广播,mac的网卡才能发现,这个包是给它的,的网卡把包收进来,然后打开 IP 包,发现 IP 地址也是自己的,再打开 TCP 包,发现端口是自己,也就是 80 端口,而这个时候这台机器上有一个 nginx 是监听 80 端口。于是将请求提交给 nginx,nginx 返回一个网页。然后将网页需要发回请求的机器。然后层层封装,最后到 MAC 层。因为来的时候有源 MAC 地址,返回的时候,源 MAC 就变成了目标 MAC,再返给请求的机器。

为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。

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

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部,每层协议都要去检查报文首部中的协议标识,以确定接受数据的上层协议

TCP/IP的分层管理

TCP/IP协议按照层次分为4层:应用层,传输层,网络层,数据链路层。有了分层概念再去了解所谓的二层负载均衡,三层负载均衡,四层负载均衡,七层负载均衡

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

三层负载均衡:针对ip,负载混哼服务器对外依然提供一个VIP,但是集群中不同机器采用不同的ip地址,当负载均衡服务器接受到请求之后,转到至不同的真实服务器

四层负载均衡:工作在传输层,只有TCP/UDP协议,这俩种协议除了包含源ip,目标ip外,还包含源端口号以及目的端口号,四层负载均衡服务器接受到客户端请求后,通过修改数据包的地址信息(ip+端口号)转发到对应的服务器

七层负载均衡:工作在应用层,茶馆用http,dns等,七层负载可以基于这些协议来负载,这些应用层协议中包含很多有意义的内容,比如同一个web服务器的负载均衡,除了根据ip加端口进行负载外,还可以根据七层的URL,浏览器类别来决定是否负载均衡。

TCP/IP协议三次握手

TCP消息的可靠性首先来自于有效的连接建立,所以在数据进行传输前,需要通过三次握手建立一个连接,也就是所谓的三次握手,在建立TCP连接的时候,需要客户端和服务端总共发送3个包来确认连接的建立

第一次握手(SYN=1,seq=x)客户端发送一个TCP的SYN标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号x,保存在包头的序列号字段里面,发送完毕后,客户端进行SYN_SEND状态

第二次握手(SYN=1,ACK=1,seq=y,ack=x+1)服务器发送确认包(ACK)应答,即SYN标志位和ACK标志位均为1,服务端选择自己ISN序列号,放大seq域里,同时将确认序号设置为客户端ISN+1即x+1,发送完毕后,服务端进入SYN_RCVD状态

第三次握手(ACK=1,ack=y+1)客户端再次发送确认包ACK,SYN标志为0,ACK标志为1,并且把服务器发来的ACK序号字段加1,放在确定字段中发送给对方,客户端进入ESTABLISHED状态,当服务器端接受到这个包时候,也进入ESTABLSHED状态,TCP握手结束。

SYN攻击

在三次握手过程中,Server 发送 SYN-ACK 之后,收到 Client 的 ACK 之前的 TCP 连接称为半连接(half-open connect),此时 Server 处于 SYN_RCVD 状态,当收到 ACK 后,Server转入 ESTABLISHED 状态。SYN 攻击就是 Client 在短时间内伪造大量不存在的 IP 地址,并向Server 不断地发送 SYN 包,Server 回复确认包,并等待 Client 的确认,由于源地址是不存在的,因此,Server 需要不断重发直至超时,这些伪造的 SYN 包将产时间占用未连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN 攻击时一种典型的 DDOS 攻击,检测 SYN 攻击的方式非常简单,即当 Server 上有大量半连接状态且源 IP 地址是随机的,则可以断定遭到 SYN 攻击了

TCP四次挥手

 四次挥手表示TCP断开连接的时候,需要客户端和服务端总共发送4个包以确认连接的断开,客户端或服务器均可主动发起挥手动作,因为TCP是一个全双工协议。

单工:数据传输只支持数据在一个方向上传输
半双工:数据传输允许数据在两个方向上传输,但是在某一时刻,只允许在一个方向上传输,实际上有点像切换方向的单工通信
全双工:数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力

第一次挥手(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为 1 的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。发送完毕后,客户端进入 FIN_WAIT_1 状态。
第二次挥手(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但没有准备好关闭连接。发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。
第三次挥手(FIN=1,seq=w)
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为 1。发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK。
第四次挥手(ACK=1,ACKnum=w+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待可能出现的要求重传的 ACK 包。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。
客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

假设 Client 端发起中断连接请求,也就是发送 FIN 报文。Server 端接到 FIN 报文后,意思是说"我 Client 端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送 ACK,"告诉 Client 端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候 Client 端就进入 FIN_WAIT 状态,继续等待Server 端的 FIN 报文。当 Server 端确定数据已发送完成,则向 Client 端发送 FIN 报文,"告诉 Client 端,好了,我这边数据发完了,准备好关闭连接了"。Client 端收到 FIN 报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕 Server 端不知道要关闭,所以发送 ACK 后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK 则可以重传。“,Server 端收到 ACK 后,"就知道可以断开连接了"。Client 端等待了 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,我 Client 端也可以关闭连接了。Ok,TCP 连接就这样关闭了!

相关问题:

1、为什么连接是三次握手,关闭的时候却是四次挥手

三次握手是因为当Server端接受到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文,其中ACK报文是用来应答的,SYN报文是用来同步的,但是关闭连接的时候,当Server端收到FIN报文,很可能不会立即关闭Socket,因为可能还有消息没有处理完,所以先回复一个ACK报文,表示我服务端接受到你客户端发送关闭连接的请求,当我这边把消息处理完之后,我会再发送给你一个FIN报文。

2、为什么TIME_WAIT状态需要经过2MSL,才能返回到CLOSE状态

①、为了保证A发送的最后一个ACK报文段能够到达B。即最后这个确认报文段很有可能丢失,那么B会超时重传,然后A再一次确认,同时启动2MSL计时器,如此下去。如果没有等待时间,发送完确认报文段就立即释放连接的话,B就无法重传了(连接已被释放,任何数据都不能出传了),因而也就收不到确认,就无法按照步骤进入CLOSE状态,即必须收到确认才能close。
②、防止“已失效的连接请求报文段”出现在连接中。经过2MSL,那些在这个连接持续的时间内,产生的所有报文段就可以都从网络中消失。即在这个连接释放的过程中会有一些无效的报文段滞留在楼阁结点,但是呢,经过2MSL这些无效报文段就肯定可以发送到目的地,不会滞留在网络中。这样的话,在下一个连接中就不会出现上一个连接遗留下来的请求报文段了。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值