分布式架构基础

TCP/IP协议


当应用程序用 T C P 传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其

中每一层对收到的数据都要增加一些首部信息

目的主机解析过程

 

 IP 协议和 TCP/UDP 协议

什么 是 协议?协议相当于两个需要通过网络通信的程序达成的一种约定,它规定了报文的交换方式和包含的意义。

什么 是 IP 协议?网络层协议   可能会发生报文丢失、报文顺序打乱,重复发送的情况

TCP /IP  面向连接    UDP/IP  无了解

TCP 是如何做到可靠传输的?

三次握手

四次挥手

数据 传输 过程 的 流量 控制 和 确认 机制

滑动窗口协议

通信的性能问题?

正常的通信过程如下(BIO)

TCP 协议的通信过程

如何使用非阻塞提高性能?

NIO

缓存区

通道

多路复用

 

组播协议 Multicast

广播:网络中的所有主机都会接收到一份数据副本

多播:消息只发送给一个多播地址,网络只是将数据分发给哪些想要接收发送到该多播地址的数据的主机。

HTTP协议基础 

Http 协议的组成

request 

response

87fbbff64503b7cb674f7d904179433c.png

URLUniform Resource Locator ) 

URI(Uniform Resource Identifier) 

总的来说:URI 是用一个字符串来表示互联网上的某一个资源。而 URL表示资源的地点(互联网所在的位置)

方法

GET:一般是用于客户端发送一个 URI 地址去获取服务端的资源(一般用于查询操作)

POST:一般用户客户端传输一个实体给到服务端,让服务端去保存(一般用于创建操作)

PUT:向服务器发送数据,一般用于更新数据的操作

HEAD:用于向服务端发起一个查询请求获取 head 信息,比如获取index.html 的有效性、最近更新时间等。

DELETE:客户端发起一个 Delete 请求要求服务端把某个数据删除(一般用于删除操作)

OPTIONS:查询指定 URI 支持的方法类型(get/post)http1.1 还支持 trace(追踪路径)和 connect 方法类型

HTTP 协议的特点

HTTP 协议是无状态的,什么是无状态呢?就是说 HTTP 协议本身不会

对请求和响应之间的通信状态做保存。

如何实现有状态的协议

HP TTP 协议的 缺陷

1. 通信过程中是使用明文,内容可能会被窃听

2. 不验证通信双方的身份

3. 无法验证报文的完整性,报文可能被篡改

HTTPS 简介

https 是一种加密的超文本传输协议,它与 HTTP 在协议差异在于对数

据传输的过程中,https 对数据做了完全加密。

HTTPS 的实现原理

1. 客户端发起请求(Client Hello 包)

a) 三次握手,建立 TCP 连接

b) 支持的协议版本(TLS/SSL)

c) 客户端生成的随机数 client.random,后续用于生成“对话密钥”

d) 客户端支持的加密算法

e) sessionid,用于保持同一个会话(如果客户端与服务器费尽周折

建立了一个 HTTPS 链接,刚建完就断了,也太可惜)

2. 服务端收到请求,然后响应(Server Hello)

a) 确认加密通道协议版本

b) 服务端生成的随机数 server.random,后续用于生成“对话密钥”

c) 确认使用的加密算法(用于后续的握手消息进行签名防止篡改)

d) 服务器证书(CA 机构颁发给服务端的证书

3. 客户端收到证书进行验证

a) 验证证书是否是上级 CA 签发的, 在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信

b) 服务端返回的证书中会包含证书的有效期,可以通过失效日期来验证 证书是否过期

c) 验证证书是否被吊销了

d) 前面我们知道 CA 机构在签发证书的时候,都会使用自己的私钥

对证书进行签名

证书里的签名算法字段 sha256RSA 表示 CA 机构使用 sha256对证书进行摘要,然后使用 RSA 算法对摘要进行私钥签名,而我们也知道 RSA 算法中,使用私钥签名之后,只有公钥才能进行验签。

e) 浏览器使用内置在操作系统上的CA机构的公钥对服务器的证书进行验签。确定这个证书是不是由正规的机构颁发。验签之后得知 CA 机构使用 sha256 进行证书摘要,然后客户端再使用sha256 对证书内容进行一次摘要,如果得到的值和服务端返回的证书验签之后的摘要相同,表示证书没有被修改过

f) 验证通过后,就会显示绿色的安全字样

g) 客户端生成随机数,验证通过之后,客户端会生成一个随机数pre-master secret,客户端根据之前的:Client.random +sever.random + pre-master 生成对称密钥然后使用证书中的公钥进行加密,同时利用前面协商好的加密算法,将握手消息取HASH 值,然后用“随机数加密“握手消息+握手消息 HASH 值(签名)”然后传递给服务器端;( 在这里之所以要取握手消息的 HASH值,主要是把握手消息做一个签名,用于验证握手消息在传输过

程中没有被篡改过。 

4. 服务端接收随机数

a) 服务端收到客户端的加密数据以后,用自己的私钥对密文进行解密。然后得到client.random/server.random/pre-master secret. ,再用随机数密码 解密 握手消息与 HASH 值,并与传过来的HASH 值做对比确认是否一致。

b) 然后用随机密码加密一段握手消息(握手消息+握手消息的HASH 值 )给客户端

5. 客户端接收消息

a) 客户端用随机数解密并计算握手消息的 HASH,如果与服务端发来的 HASH 一致,此时握手过程结束,

b) 之后所有的通信数据将由之前交互过程中生成的 pre master secret / client.random/server.random 通过算法得出 sessionKey,作为后续交互过程中的对称密钥

序列化与反序列化


如何实现一个序列化操作?

只要一个类实现了 java.io.Serializable 接口

序列化的高阶认识

serialVersionUID 的作用

Java的序列化机制是通过判断类的 serialVersionUID 来验证版本一致性的

静态变量序列化

序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量

父类的序列化

1. 当一个父类没有实现序列化时,子类继承该父类并且实现了序列化。在反序列化该子类后,是没办法获取到父类的属性值的

2. 当一个父类实现序列化,子类自动实现序列化,不需要再显示实现Serializable 接口

3. 当一个对象的实例变量引用了其他对象,序列化该对象时也会把引用对象进行序列化,但是前提是该引用对象必须实现序列化接口

Transient 关键字

Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient变量的值被设为初始值,如 int 型的是 0,对象型的是 null

绕开 t transient 机制的办法

Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用,上面增加的 5 字节的存储空间就是新增引用和一些控制信息的空间。反序列化时,恢复引用关系.该存储规则极大的节省了存储空间。

序列化实现深克隆

浅克隆

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。

深克隆

被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍

常见的序列化技术

XL ML 序列化框架

JSON 序列化框架

Hessian 序列化框架

Protobuf 序列化框架

序列化技术的选型

1. 序列化空间开销,也就是序列化产生的结果大小,这个影响到传输的性能

2. 序列化过程中消耗的时长,序列化消耗时间过长影响到业务的响应时间

3. 序列化协议是否支持跨平台,跨语言。因为现在的架构更加灵活,如果存在异构系统通信需求,那么这个是必须要考虑的

4. 可扩展性/兼容性,在实际业务开发中,系统往往需要随着需求的快速迭代来实现快速更新,这就要求我们采用的序列化协议基于良好的可扩展性/兼容性,比如在现有的序列化数据结构中新增一个业务字段,不会影响到现有的服务

5. 技术的流行程度,越流行的技术意味着使用的公司多,那么很多坑都已经淌过并且得到了解决,技术解决方案也相对成熟

6. 学习难度和易用性

选型建议

  1. 对性能要求不高的场景,可以采用基于 XML 的 SOAP 协议
  2. 对性能和间接性有比较高要求的场景,那么Hessian、Protobuf、Thrift、
    Avro 都可以。
  3. 基于前后端分离,或者独立的对外的 api 服务,选用 JSON 是比较好
    的,对于调试、可读性都很不错
  4. Avro 设计理念偏于动态类型语言,那么这类的场景使用 Avro 是可
    以的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值