客户端A向服务器B通过Socket代码发送数据。
一般会选择TCP或者UDP。
因为TCP是安全可靠的连接服务。
Socket本身是一个代码库。内有socket_stream方法,支持字节流。
bind()方法绑定ID端口,connect()创建连接,send()发送数据,recv()接收数据
一说字节流就不得不提到二进制。因为二进制无边界就会产生粘包问题。如果将无边界转变成有边界呢?那就是消息头和消息体。消息头内存放的协议就是http协议和RPC。
HTTP是超文本传输协议。访问多家服务器。多用于浏览器
RPC是远程服务调用。多用于C端访问自家服务器。目的是像调用本地方法一样调用远端方法。公司内部微服务调用
两者不同
服务发现
建立连接的前提是知道ip和端口号
RPC有专门的 中间服务 保存服务名和ip信息。比如consul、etcd、redis coreDNS
底层连接原理
以http1.1为例。建立连接之后会一直保持keep alive。
RPC是在基础上有一个连接池,在请求量大的时候,建立多条连接放入连接池,在发数据的时候,从池里拿取一条连接,用完放回去下次再使用。说连接池想到的就是提升网络性能
传输内容
结构体传输——JSON——序列化
http文本传输,以网页为主,一般传输的是字符串传输。在body当中,使用Json来序列化结构体数据
rpc,可以采用体积更小的protobuf或者其他序列化协议去保存结构体数据
HTTP现在主流的是1.1
gRPC底层基于http2.0。http2.0是2015年出来的
时间线:tcp——http——rpc——http2.0——grpc是2015年出来的