常用的应用层传输协议

ooowl
  • 代码之外
About 5 min

常用的应用层传输协议

延迟

程序员必须了解的系统延迟📌_哔哩哔哩_bilibiliopen in new window

JSON

文档在这里open in new window json标准东西不多
json的类型支持 字符串(string)、数值(number)、truefalsenull、字典(object)或者数组(array)。这些结构可以嵌套。
在 JSON 传输过程中,列表是有序的,但字典(对象)不是有序的。JSON本身没有明确的长度限制,但是也不会写的巨长,序列化的时候一般会放内存容易崩

XML

该入土的老东西早该爆金币了(
凑活看mozilla的文档open in new window吧,下面有其他文档的引用。 XML 树结构 | 菜鸟教程open in new window XML是保证严格有序的

<?xml version="1.0" encoding="UTF-8"?>
<message>
    <warning>
         Hello World
    </warning>
</message>

Protobuf

中文open in new window翻译文档和英文原版open in new window文档。
这个博客open in new window不错,给出了最佳实践和必要的编码原理 google开发的,和json相比体积小速度快,适合IM这种延迟敏感型应用,proto文件是跨语言的,定义好之后可以用(谷歌提供的)工具反向生成各种语言的代码,再结合proto的包去使用,所以说一开始格式就已经被确定了。

📝Note

proto有2和3两个版本是不兼容的,现在绝大部分用的是proto3,如果碰到奇怪的文件请注意proto版本的可能性
注意文档中的协议特性和不适用的地方!!!!!
1 ~ 15:单字节编码,16 ~ 2047:双字节编码,使用频率高的变量最好设置为1~15,编号一旦指定不能修改,所以为了扩展保留一些 1~15 的 编号

Protobuf在消息大小上没有明确限制,但通常建议保持小于2MB(就是不要太大,并不一定非得2MB)。Protobuf的字段顺序在定义时是固定的,但在序列化时不保证顺序
C#代码中可以使用protogen,是针对C#的实现,大致看一眼,用到细节再去查。mac上brew install protobuf 安装,使用protoc --version查看版本,一般是3.

特性protocprotogen
生成的代码标准的 Protocol Buffers C# 类生成的 C# 类更符合 .NET 的风格和最佳实践
gRPC 支持支持 gRPC(通过 grpc_csharp_plugin)提供更丰富的 gRPC 支持,优化了与 .NET 集成的方式
定制化能力基本的 C# 类生成,较少定制化提供更多的扩展点,允许开发者对代码进行自定义
.NET 特性提供基础的 C# 支持更好支持 .NET 特性,如依赖注入、日志系统等
集成工具与原生 Protobuf 代码生成集成与 .NET 工具链更深度集成,比如 MSBuild 插件
使用场景适用于跨平台和多语言项目更适合 .NET 核心或大型 C# 项目,尤其是 gRPC 服务
一个基本的protobuf文件的定义如下
syntax = "proto3";

package example; //  包可以划分不同的命名空间

// import "user.proto"; //  可以引入其他的包
// 定义一个用户类型的枚举
enum UserType {
  UNKNOWN = 0;
  ADMIN = 1;
  MEMBER = 2;
}

// 地址信息消息
message Address {
  string street = 1;
  string city = 2;
  string state = 3;
  string zip_code = 4;
}

// 用户信息消息,嵌套Address
message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
  repeated Address addresses = 4; // 嵌套的Address消息类型
  UserType type = 5;          // 使用枚举类型UserType
}

protobuf中定义了基本的数据类型

proto文件消息类型C++ 类型说明
doubledouble双精度浮点型
floatfloat单精度浮点型
int32int32使用可变长编码方式,负数时不够高效,应该使用sint32
int64int64使用可变长编码方式,负数时不够高效,应该使用sint32
uint32uint32使用可变长编码方式
uint64uint64使用可变长编码方式
sint32int32使用可变长编码方式,有符号的整型值,负数编码时比通常的int32高效
sint64sint64使用可变长编码方式,有符号的整型值,负数编码时比通常的int64高效
fixed32uint32总是4个字节,如果数值总是比2^28大的话,这个类型会比uint32高效
fixed64uint64总是8个字节,如果数值总是比2^56大的话,这个类型会比uint64高效
sfixed32int32总是4个字节
sfixed64int64总是8个字节
boolbool布尔类型
stringstring一个字符串必须是utf-8编码或者7-bit的ascii编码的文本
bytesstring可能包含任意顺序的字节数据

在 Protocol Buffers (Protobuf) 中,生成的代码会根据目标语言的命名约定来调整字段名。在 C# 中,protoc会将消息和字段名转换为首字母大写,以符合 C# 的命名约定。

  1. 消息名
    • message hello_world_request 会变为 HelloWorldRequest
  2. 字段名
    • helloworld 会变为 Helloworld
    • 如果字段是用下划线(_)分隔的,例如 hello_world,会变成 HelloWorld

这是 Protobuf 的 protoc 编译器针对 C# 的正常行为,不会影响字段实际存储或序列化的键值,只是对代码接口做了语言风格适配。



Last Edit: 2025-04-13 22:01:52
Loading...