为什么Http协议要用文本做协议,用二进制不更节约带宽吗?

bandaoyu 2020-04-08 10:36:43

为什么Http协议要用文本做协议,用二进制不更节约带宽吗?

比如下面的协议:


POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...


比如消息结构体,这样传输数据不是体积更小,更节约带宽吗?为什么用文本做消息协议呢?

typedef struct tgHEAD
{
int8 headId;
int8 headValue;
}HEAD;

typedef struct tgHTTP
{
int8 method;
char* path;
int8 version;
int8 headNum;
HEAD* head;
int16 dataLen;
char* data;
}HTTP;


有谁能指教一下
...全文
2071 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivan__M 2021-01-01
  • 打赏
  • 举报
回复
因为一个是翻译,一个是执行。完全不同的作用
bandaoyu 2020-04-21
  • 打赏
  • 举报
回复
引用 51 楼 luyuanm 的回复:
理解清楚我们讨论的问题再说话
Ivan__M 2020-04-18
  • 打赏
  • 举报
回复
二进制的1010101你给我编写一点代码我就服气了,那是计算机转码后用二进制计算的,因为计算机的处理器是晶体开关,所谓开关就是两个状态,这样0和1对应方便计算呀。具体的你可以百度学习
Chen_jiajie1234 2020-04-18
  • 打赏
  • 举报
回复
在ISO七层协议的概念里,HTTP属于应用层协议,是面向用户的,用文本比较好理解。HTTP协议是基于TCP协议的,TCP协议在网络中传输数据用的就是二进制代码。
冰清-小魔鱼 2020-04-17
  • 打赏
  • 举报
回复 1
就跟你为啥使用高级编程语言,而不使用二进制码流编码一样,易读性,易用性,可靠性与技术博弈的结果。
bandaoyu 2020-04-14
  • 打赏
  • 举报
回复
引用 1 楼 akari10032 的回复:
引用 3 楼 yiyefangzhou24 的回复:
引用 45 楼 sunny7862632 的回复:
引用 42 楼 千梦一生 的回复:
[quote=引用 41 楼 bandaoyu 的回复:] [quote=引用 40 楼 千梦一生 的回复:]
引用 38 楼 丁劲犇 的回复:
引用 33 楼 truexf 的回复:
引用 26 楼 这不是鸭头 的回复:
引用 23 楼 真相重于对错 的回复:
把大家的回复总结起来了,文章:https://blog.csdn.net/bandaoyu/article/details/105484262 感谢大家的回复
bandaoyu 2020-04-14
  • 打赏
  • 举报
回复
引用 45 楼 sunny7862632 的回复:
你估计没看玩后面的帖子,我们前年就换成protocolbuff协议了。
嗯 我看了,我的意思是HTML 为什么不用protocolbuff做协议,不过可能是那时候protocolbuff还没发明+文本更容易调试
sunny7862632 2020-04-14
  • 打赏
  • 举报
回复
引用 44 楼 bandaoyu 的回复:
[quote=引用 21 楼 sunny7862632 的回复:]
兼容性差太远了,用文本最大好处就是协议加了新的字段,不管旧的客户端或者新的客户端都可以正常解析,只是旧的客户端新的字段无用罢了。用二进制这种兼容性就很难保证了,多次迭代之后,市场上可能并存着几十个不同版本的协议客户端。


突然想到了protocolbuff,protocolbuff的兼容性很好,不是吗?[/quote]

你估计没看玩后面的帖子,我们前年就换成protocolbuff协议了。
sunny7862632 2020-04-14
  • 打赏
  • 举报
回复
引用 46 楼 bandaoyu 的回复:
[quote=引用 45 楼 sunny7862632 的回复:]

你估计没看玩后面的帖子,我们前年就换成protocolbuff协议了。

嗯 我看了,我的意思是HTML 为什么不用protocolbuff做协议,不过可能是那时候protocolbuff还没发明+文本更容易调试[/quote]

没发明确实是一个问题,我理解主要还是明文的协议更好适配解析。json,HTML这类的协议,就算没有协议说明文档,看着内容都能半猜测的解析出来。二进制的就无法这样使用了。
bandaoyu 2020-04-13
  • 打赏
  • 举报
回复
引用 21 楼 sunny7862632 的回复:
兼容性差太远了,用文本最大好处就是协议加了新的字段,不管旧的客户端或者新的客户端都可以正常解析,只是旧的客户端新的字段无用罢了。用二进制这种兼容性就很难保证了,多次迭代之后,市场上可能并存着几十个不同版本的协议客户端。
突然想到了protocolbuff,protocolbuff的兼容性很好,不是吗?
bandaoyu 2020-04-13
  • 打赏
  • 举报
回复
引用 42 楼 千梦一生 的回复:
你的下面的数据:
POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
  
body data goes here...
其实就是一块二进制block, 然后这块block发出 就经过TCP协议再封装一层形成block_tcp,---------(中间封装,忽略)-------->对方服务器,拿到block_tcp,剥掉TCP协议的封装-->block 交给对方程序,对方程序再按照HTML 解析block得到
POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
  
body data goes here...
千梦一生 2020-04-13
  • 打赏
  • 举报
回复
引用 41 楼 bandaoyu 的回复:
引用 40 楼 千梦一生 的回复:

我的意思是像说
比如发送的数据。程序员给send的参数是长这样

POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...


send或其更底层的函数把,
Header1: Value1
Header2: Value2
Header3: Value3
给取出来,然后以类似

typedef struct tgHEAD
{
int8 headId;
int8 headValue;
}HEAD;

这样进行重装。

到对面,交给程序员之前,这样的数据结构的内容转回文本形式,再交付给应用
bandaoyu 2020-04-13
  • 打赏
  • 举报
回复
引用 40 楼 千梦一生 的回复:
发送和接收 都是二进制。 数据在所有地方都是二进制,你看到的文本只是你当前的浏览器(文本,world,IDE 把它当作文本,然后根据二进制值按assic码表,显示成对应的文本和控制字符,比如65显示成a ,37显示成A)
千梦一生 2020-04-13
  • 打赏
  • 举报
回复
阅读完各位的说法,颇有收获
不过,我又在想一个问题、可能性:

,比如:
我的socket send(data)//这里的data 是文本形式

会不会在send函数下面,将data的信息更替为了二进制形式进行传输呢?也就是在其它层协议中有干过这个事情。
//没好好学习过几层协议都有干哪些事情

然后在另外一遍的socket 接收API下面又将data信息里的二进制形式更换为了文本格式。

猜测、猜测。不过应用层面上来开,其表现形式是一样的。
bandaoyu 2020-04-12
  • 打赏
  • 举报
回复
引用 38 楼 丁劲犇 的回复:
因为不是文本就没法用记事本敲网页。以前http出现时,很多情况都是字符界面呢,连设计器也木有。最初的网页很多都是在unix下用vi之类的东西敲的。
所噶!
  • 打赏
  • 举报
回复
因为不是文本就没法用记事本敲网页。以前http出现时,很多情况都是字符界面呢,连设计器也木有。最初的网页很多都是在unix下用vi之类的东西敲的。
bandaoyu 2020-04-10
  • 打赏
  • 举报
回复
引用 33 楼 truexf 的回复:
1. 文本是二进制字节流,不能认为文本就不是二进制。 我们当然知道文本也是二进制流,但是因为文本中不能存在 控制符 所以我们才把文本和二进制区分开来讲
bandaoyu 2020-04-09
  • 打赏
  • 举报
回复
引用 29 楼 sunny7862632 的回复:
protobuf是数据交互协议,数据交换协议肯定用成熟的协议,以前我们也是二进制,效率真低,最后推荐protobuf,但是那些人不熟悉,权衡了一下 就JSON吧 反正数据量也不是特别多
sunny7862632 2020-04-09
  • 打赏
  • 举报
回复
引用 28 楼 bandaoyu 的回复:
[quote=引用 26 楼 这不是鸭头 的回复:]


前面的人说的得不错,我概括一下几个观点:
1、文本协议好调试
2、兼容性差太远了,用文本最大好处就是协议加了新的字段,不管旧的客户端或者新的客户端都可以正常解析,只是旧的客户端新的字段无用罢了。用二进制这种兼容性就很难保证了,多次迭代之后,市场上可能并存着几十个不同版本的协议客户端。
3、历史包袱[/quote]

现在主流都在使用兼容性好的协议,我们做蓝牙传输的,以前都是用二进制,现在全改protobuf协议了。实际使用场景兼容性非常重要,时间长了协议肯定会被,市场上大量不同时期版本的终端,系统必须保证兼容。
bandaoyu 2020-04-09
  • 打赏
  • 举报
回复
引用 26 楼 这不是鸭头 的回复:
前面的人说的得不错,我概括一下几个观点: 1、文本协议好调试 2、兼容性差太远了,用文本最大好处就是协议加了新的字段,不管旧的客户端或者新的客户端都可以正常解析,只是旧的客户端新的字段无用罢了。用二进制这种兼容性就很难保证了,多次迭代之后,市场上可能并存着几十个不同版本的协议客户端。 3、历史包袱
加载更多回复(30)

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧