Tcp 协议定制

TCP 面向字节流

Tcp 三次握手 四次挥手

connet 发起建立连接

accept 最后用来接收连接 三次握手四次挥手发生在传输测 其余的部分 都是由操作系统自主完成

我们决定什么时候发生 在 close 的时候结束

建立连接 通过三次握手的手段

操作系统将建立的所有连接管理起来

tcp vs udp

  • 可靠 vs 不可靠

  • 有连接 无连接

  • 字节流 数据报

TCP协议

报文边界

  • TCP是面向字节流的协议,需要明确报文的边界。

  • 确定报文边界的方法

    • 定长:每个报文固定长度。

    • 特殊符号:使用特殊字符标识报文结束。

    • 自描述:报文包含描述其长度或结构的信息。

TCP缓冲区

  • 发送缓冲区:数据从应用层拷贝到TCP发送缓冲区。

  • 接收缓冲区:数据从TCP接收缓冲区拷贝到应用层。

全双工通信

  • TCP支持全双工通信,即数据可以同时双向传输。

定义

  • 协议:一种约定,用于规定数据的格式和传输规则。

协议定制

  • 在读写数据时,数据以字符串形式发送和接收。

  • 结构化数据传输需要定制协议。

数据序列化

序列化

  • 定义:将结构化数据打包成字符串(字节流)的过程。

  • 反序列化:将收到的字节流还原为原始数据结构的过程。

数据发送接收

  • 发送函数的本质是将数据从发送缓冲区拷贝到接收方的接收缓冲区。

结构化数据协议

自定协议 是好用 可实现一样的效果 但是做的都是重复的工作 减轻代码量使用json/protobuf 协议

JSON协议

  • 一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。

cc=g++
all: Calserver Calclient
​
Calclient:Calclient.cc
    $(cc) -o $@ $^ -std=c++11 -ljsoncpp
Calserver:Calserver.cc
    $(cc) -o $@ $^ -std=c++11 -ljsoncpp
​
.PHONY:clean
clean:
    rm -rf Calserver Calclient

别忘记带 -ljsoncpp

序列化

Json::Value root;
root["exitcode"] = exitcode;
root["result"] = result;    
​
Json::FastWriter write;
*outString = write.write(root);

反序列化

Json::Value root;
Json::Reader reader;
reader.parse(in,root);
​
exitcode = root["exitcode"].asInt();;
result = root["result"].asInt();

Protobuf协议

  • Google开发的协议缓冲区,用于序列化结构化数据,具有高效和跨语言的特性。【其他文章写啦】