注意:为了防止每一次都会发起ARP寻址,本地机器会有缓存策略,一般来说当我们的IP信息进行变更以后,缓存信息就会失效,这个时候才会重新进行ARP寻址
分层负载
分布式开发的过程中,经常听到一个专业名词即--二层负载/四层负载/七层负载,其实这里的xxx层负载就是指的是负载均衡方案所在的网络协议的层级(针对与服务端解析的层级--逆向层级)
二层负载
二层负载协议,一般来说是针对MAC首部信息做的负载均衡,例如当前有一个集群,我们希望外部访问的时候IP地址是一样的,但是机器的MAC不一致,保证请求分发到每一台机器上,这时候可以提供一个虚拟的MAC首部信息,解析请求中的MAC信息的时候,将MAC信息修改为集群中需要被分发的机器的真实MAC首部信息,从而达到负载均衡的效果
三层负载
三层负载指的是针对IP层级的负载,和MAC负载(二层负载)很相似,负载均衡服务器对外提供一个虚拟IP首部信息,当解析请求的时候,修改虚拟IP为真实的被分发的机器的IP,达到负载均衡的效果
四层负载
四层负载针对在OSI模型的传输层中,这一层中一般都是TCP/UDP这类的协议,而这一层一般都是封装了当前客户端的请求报文信息(包含源IP,目标IP,当前端口号以及目标端口号等),所以四层负载的实现方案一般都是接受到请求信息以后,修改请求数据中的IP/端口号的信息,来分发到不同的应用程序中(此类负载均衡例如:Nginx)
七层负载
除了上面常见的几种负载均衡以外,还有一种特殊的负载,叫七层负载,这种负载一般是在应用层做的操作,而应用层一般都是客户端请求交互层,这一层中一般只有HTTP/DNS等协议,所以在当前层,我们可以做到的负载条件很多,比如根据不同的URL,不同的请求类型等都可以实现分发到不同的服务器上
TCP/IP的握手协议与挥手协议三次握手
tcp的连接是通过三次握手协议完成有效连接建立的,所谓的三次握手就是客户端和服务端在连接过程中,总共发送三个包来相互之间确认并建立联系,而在sokect编程中,握手的过程由connect来触发
文章插图
上图我们可以看出来三次握手的过程为:
第一次握手:客户端发送了一个SYN为1标志包,指明客户端将要连接的服务器端口,并且初始化序号X保存在序列号(Sequence Number)字段中,发送完毕以后,客户端的状态变更为SYN-SENT
第二次握手:服务器收到了客户端的请求,发送回确认包标志ACK以及客户端发送来的SYN应答为1,并且服务端选择ISN序列号Y,存放到Seq中,将确认的序列号(Acknowledgement Number)设置为客户端发来sql+1,当发送完毕后,服务端状态变更为SYN-RCVD
第三次握手:客户端再次确认ACK,Ack为1,并且把服务端的ACK+1放在序列seq中,将服务端的序列+1放入确认字段ack中,在发送完毕以后,客户端俄日ESTAB-LISHED状态,当服务端也收到这个确认包以后,也会进入ESTAB-LISHED状态,此时握手结束
四次挥手
与连接的时候三次握手不同,断开连接的时候需要四次挥手的过程才能保证一定是关闭连接:
文章插图
第一次挥手:客户端需要断开连接的时候,发送一个FIN为1的包,表示我已经没有数据需要发送了,可以准备断开连接,但是这个时候我还可以接受你的数据,当发送完毕后,状态为FIN-WAIT-1
第二次挥手:服务端拿到了客户端发来的FIN标志位,发送一个确认包,表示当前已经收到了你的关闭连接的请求,ACK为1,生成seq序列,并且将客户端发来的seq+1作为ack确认字段进行应答,发送完毕后服务端状态为CLOSE-WIAT状态,当客户端受到应答以后,状态变更为FIN-WAIT-2,但是这个时候服务端还没关闭,可能还存在需要发送的数据
第三次挥手:当服务端没有数据需要发送的时候,会再次发送一个包,FIN为1,ACK为1,生成序列seq,并且将上一次的ack确认字段继续发送过来,发送完毕后,服务端处于LAST-ACK状态
第四次挥手:客户端收到了来自服务端的将要关闭的包,并发出一个确认包,将服务端的ack作为seq,并且将服务端的seq+1作为ack确认字段再次发送过去,这个时候客户端会进入TIME-WAIT状态,并等待2MSL时间,这个时候服务端收到了响应,就会关闭连接,或者等待了2MSL以后,客户端没有收到响应,也会认为服务端已经关闭,也会进行关闭操作
推荐阅读
- 2种远程控制电脑开机方法,最后一个只需5秒
- IPv6学习笔记
- Spring Boot项目如何同时支持HTTP和HTTPS协议
- 「漏洞预警」PHP 远程代码执行漏洞
- 一图读懂 | 志翔科技“远程易”助力企业远程办公
- 淘宝网服务协议对免费责任(责任限制 淘宝网服务协议对免责事由是如何规定的?是如何规定的?)
- HTTP协议通信原理
- 远程桌面安全设置
- Mysql通讯协议分析
- 如何通过 SSH 在远程 Linux 系统上运行命令