der*_*sse 82 binary text protocols
有没有人对二进制协议有什么好的定义?实际上什么是文本协议?这些在线上发送的比特如何相互比较?
这是维基百科关于二进制协议的说法:
二进制协议是一种旨在或预期由机器而不是人类读取的协议(http://en.wikipedia.org/wiki/Binary_protocol)
哦加油!
更清楚的是,如果我有jpg文件将如何通过二进制协议发送,如何通过文本?当然,就线路上发送的比特/字节而言.
在一天结束时,如果你看一个字符串,它本身就是一个字节数组,所以2个协议之间的区别应该取决于在线上发送的实际数据.换句话说,关于如何在发送之前编码初始数据(jpg文件).
Tyl*_*nry 146
二进制协议与文本协议实际上并不是关于如何编码二进制blob.区别在于协议是围绕数据结构还是围绕文本字符串.让我举个例子:HTTP.HTTP是一种文本协议,即使它发送jpeg图像时,它只发送原始字节,而不是它们的文本编码.
但是什么使HTTP成为一个文本协议是获得 jpg 的交换看起来像这样:
请求:
GET /files/image.jpg HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.01 [en] (Win95; I)
Host: hal.etc.com.au
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 200 OK
Date: Mon, 19 Jan 1998 03:52:51 GMT
Server: Apache/1.2.4
Last-Modified: Wed, 08 Oct 1997 04:15:24 GMT
ETag: "61a85-17c3-343b08dc"
Content-Length: 60830
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/jpeg
<binary data goes here>
Run Code Online (Sandbox Code Playgroud)
请注意,这可以非常容易地打包到一个看起来像(在C中)的结构中
请求:
struct request {
int requestType;
int protocolVersion;
char path[1024];
char user_agent[1024];
char host[1024];
long int accept_bitmask;
long int language_bitmask;
long int charset_bitmask;
};
Run Code Online (Sandbox Code Playgroud)
响应:
struct response {
int responseType;
int protocolVersion;
time_t date;
char host[1024];
time_t modification_date;
char etag[1024];
size_t content_length;
int keepalive_timeout;
int keepalive_max;
int connection_type;
char content_type[1024];
char data[];
};
Run Code Online (Sandbox Code Playgroud)
在根本不必传输字段名称的情况下,例如,responseType
响应结构中的int是值为200而不是三个字符'2''''0'的int.这就是基于文本的协议:一种旨在作为(通常是人类可读的)文本行的平面流传递的协议,而不是许多不同类型的结构化数据.
Jör*_*tag 24
这是一种警察定义:
当你看到它时,你会知道它.
这是很难找到涵盖所有极端情况的简明定义的情况之一.但它也是角落案件完全不相关的案例之一,因为它们根本不会发生在现实生活中.
几乎所有在现实生活中遇到的协议都将如下所示:
> fg,m4wr76389b zhjsfg gsidf7t5e89wriuotu nbsdfgizs89567sfghlkf
> b9er t8ß03q+459tw4t3490ß´5´3w459t srt üßodfasdfäasefsadfaüdfzjhzuk78987342
< mvclkdsfu93q45324äö53q4lötüpq34tasä#etr0 awe+s byf eart
Run Code Online (Sandbox Code Playgroud)
[想象一下那里有大量其他不可打印的垃圾.传达文本和二进制之间差异的挑战之一是你必须在文本中传达:-)]
或者像这样:
< HELLO server.example.com
> HELLO client.example.com
< GO
> GETFILE /foo.jpg
< Length: 3726
< Type: image/jpeg
< READY?
> GO
< ... server sends 3726 bytes of binary data ...
> ACK
> BYE
Run Code Online (Sandbox Code Playgroud)
[我刚刚在现场做了这个.]
那里根本没有那么多含糊不清.
我有时听到的另一个定义是
文本协议是您可以使用的协议
telnet
也许我显示我nerdiness这里,但我已经实际写入和读通过SMTP和POP3电子邮件,读通过NNTP新闻组文章,并使用通过HTTP浏览过的网页telnet
,没有其他原因,而不是看它是否会实际工作.
实际上,在写这篇文章的时候,我又有点发烧了:
bash-4.0$ telnet smtp.googlemail.com 25
Trying 74.125.77.16...
Connected to googlemail-smtp.l.google.com.
Escape character is '^]'.
< 220 googlemail-smtp.l.google.com ESMTP Thu, 15 Apr 2010 19:19:39 +0200
> HELO
< 501 Syntactically invalid HELO argument(s)
> HELO client.example.com
< 250 googlemail-smtp.l.google.com Hello client.example.com [666.666.666.666]
> RCPT TO:Me <Me@Example.Com>
< 503 sender not yet given
> SENDER:Me <Me@Example.Com>
< 500 unrecognized command
> RCPT FROM:Me <Me@Example.Com>
< 500 unrecognized command
> FROM:Me <Me@Example.Com>
< 500-unrecognized command
> HELP
< 214-Commands supported:
< 214 AUTH HELO EHLO MAIL RCPT DATA NOOP QUIT RSET HELP ETRN
> MAIL FROM:Me <Me@Example.Com>
< 250 OK
> RCPT TO:You <You@SomewhereElse.Example.Com>
< 250 Accepted
> DATA
< 354 Enter message, ending with "." on a line by itself
> From: Me <Me@Example.Com>
> To: You <You@SomewhereElse.Example.Com>
> Subject: Testmail
>
> This is a test.
> .
< 250 OK id=1O2Sjq-0000c4-Qv
> QUIT
< 221 googlemail-smtp.l.google.com closing connection
Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)
该死的,自从我做完这件事已经有一段时间了.那里有很多错误:-)
小智 5
正如你们大多数人所建议的,我们仅通过查看网络上的内容就无法区分协议是二进制还是文本
AFIK
二进制协议-位是边界顺序非常关键
例如,RTP
前两位是版本,下一位是标记位
文本协议-特定于协议的分隔符字段顺序不重要
例如,SIP
还有一个是,在二进制协议中,我们可以拆分一个字节,即,单个位可能具有特定的个别含义;在文本协议中,最小有效单位是BYTE。您不能分割一个字节。