远程通讯协议概念

​ 以图镇压 (引用极客时间)

img

1、DNS域名解析

  • CDN
    • Context Delivery Network 表示内容分发网络 ,很多大型望着那,都会引入CDN来加速静态内容的访问。
    • CDN就是一种网络缓存技术,能够把一些相对"稳定"的资源放到距离最终用户较近的地方,一般会把一些静态文件(图片、脚本、静态页面)放入到CDN中。
    • 优点:解决广域网的带宽的消耗;提升用户的访问速度
2、HTTP协议通讯

应用层的协议,除了HTTP还有FTP/DNS/SMTP/Telnet等

  • HTTP头

在这里插入图片描述

  • HTTP正文

    常见的

  • 状态码说明

    状态码类型原因短语
    1XXInformational(信息性状态码)接受的请求正在处理
    2XXSuccess(成功状态码)请求正常处理完毕
    3XXRedirection(重定向状态码)需要进行附加操作以完成求情
    4XXClient Error(可以短错误状态码)服务器无法处理请求
    5XXServer Error(服务器错误状态码)服务器处理请求出错
3、TCP/UDP
  • 三次握手

在这里插入图片描述

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

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

  • 第 三 次 握 手 (ACK=1 , ACKnum=y+1) 客户端再次发送确 认包(ACK),SYN标 志位为 0,ACK 标 志位为1,并且把服 务器发来 ACK 的 序号字段+1,放在 确定字段中发送给 对方,并且在数据 段放写 ISN 发完毕 后,客户端进入 ESTABLISHED 状 态,当服务器端接
    收到这个包时,也 进入
    ESTABLISHED 状 态,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状态。(2MSL具体的时间不固定。这个有了解的伙伴可以说说)
4、分层模型
  • 三种:OSI七层、TCP五层、TCP/IP四层

    img

  • 分层协议

这里写图片描述

5、分层负载

负载都是对服务端的负载,从外到内,也就是物理层到应用层

  • 二层负载

    通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址

    针对MAC,负载均衡服务器对外依然提供一个VIP(虚IP),集群中不同的机器采用相同的IP地址,但是机器的MAC地址不一样。当负载均衡服务器接收到请求之后,通过改写报文的目标MAC地址的方式转发到目标机器实现负载均衡

  • 三层负载

    通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址

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

  • 四层负载

    通过虚拟IP + 端口 接收请求,然后再分配到真实的服务器

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

  • 七层负载

    通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器

    工作中OSI模型的应用层,应用层协议较多,常用的http、radius、dns等。七层负载就是基于这些协议来负载,这些应用层协议中会包含很多有意义的内容。比如同一个WEB服务器的负载均衡,除了根据IP加端口进行负载外,还可以根据七层的URL、浏览器类别来决定是否进行负载均衡。

6、Socket 通信过原理

Socket接口是TCP/IP网络的API(Application Programming Interface,应用程序编程接口),Socket接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP网络上的应用程序

手动使用JavaApi实现Socket聊天通讯

  • 服务端
public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket socket = serverSocket.accept();

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

            //初次被动等待客户端请求
            System.out.println("client:" + in.readLine());
            String buf = sin.readLine();

            while (!"bye".equals(buf)) {
                out.println(buf);

                System.out.println("client:" + in.readLine());
                buf = sin.readLine();
            }
            sin.close();
            in.close();
            out.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 客户端
public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8080);

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
            BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));

            String buf = sin.readLine();

            while (!"bye".equals(buf)) {
                out.println(buf);

                System.out.println("server:" + in.readLine());
                buf = sin.readLine();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值