如何通过网络发送编码数据?

问题描述 投票:0回答:3

我有点困惑人们如何表示二进制数据,以及它是如何通过网络发送的。我将通过维基百科的例子来解释。这里显示< - https://imgur.com/a/POELH - >所以我的二进制数据编码为base 64,我发送文本TWFU。所以我发送T然后W然后F和最后U.但是发送T,一个字符。我需要一个字节来发送它,就像我一直被告知的那样。通过网络发送的一个字符是一个字节。

因为现在我开始认为如果我编码24个字节,我将发送超过4个字符,但要发送超过4个字符,我需要与字符相同的字节数?

因此,当从上面的示例中通过网络"Man" (unencoded) (Requiring 3 bytes normally) vs "TWFu" (encoded) (requiring 4 bytes normally)发送时,通过网络发送的相同比特序列是相同的。因为上次我使用套接字发送数据时,他们只是要求输入字符串,而不是文本+编码输入。

networking base64 traffic
3个回答
2
投票

概要:“如何”是协议。 “原始”很常见。


数据以发送方和接收方同意的方式发送。有许多协议是标准协议。议定书在许多层面上运作。覆盖两个级别的非常常见的对是TCP / IP。许多更高级别的协议都在它们之上。 (更高级别的协议可能依赖于也可能不依赖于特定的底层协议。)HTTP和SMTP是非常常见的高级协议,通常将SSL夹在中间。

有时,层或实现它们的软件称为堆栈。还有参考(或概念)OSI Model。关键是它提供了一种语言来讨论不同的层。它定义的图层可能会也可能不会映射到任何特定的堆栈。

你的问题太模糊了,无法直接回答。使用HTTP,“原始”二进制数据始终传输。 HTTP标头可以以八位字节为单位给出正文的长度,并且正文跟随标题。作为发送方和接收方之间协议的一部分,标头可能会使用MIME标头提供有关二进制数据的元数据。例如:您的gravatar enter image description here与标题一起发送,包括:

content-length:871
content-type:image/png

这足以让接收方知道发送方声称它是871字节的PNG图形。接收器将读取标头,然后为主体读取871个字节,然后假设接下来是另一个HTTP标头。

某些协议使用除具有预先声明的大小的主体之外的同步方法。它们可能完全基于文本,并使用仅允许某些字符的语法。它们可以通过嵌套协议进行扩展,以使用类似Base64的东西将二进制数据表示为文本。

某些层可能提供足够密度的数据压缩,因此较高层(例如Base64)的扩展不是一个很大的问题。例如,请参阅HTTP Compression

如果要查看HTTP的运行情况,请按F12并转到“网络”选项卡。如果您想在计算机上看到其他协议处于活动状态,请尝试使用WireSharkMicrosoft Message AnalyzerFiddler或类似协议。


1
投票

Base64是一种在纯7位通道中编码任意8位数据的方法。尽管互联网基于8位字节的原则,但对于文本模式,除非另有说明,否则它被假定为7位ASCII。

如果您要发送Base64编码的数据,那么您将真正发送TWFU。许多基于文本的协议使用Base64是为了方便:它是一个既定标准,对大多数应用程序来说足够高效。

互联网的基础IP是一种基于8位字节的协议。发送二进制数据时,你可以充分利用所有8位,但如果你正在使用文本模式协议,其中有很多,你通常会使用7位ASCII,除非协议有办法指定您正在使用的字符集或编码。

如果您可以选择切换到“二进制”传输,那么您可以支持Base64。如果您使用的是7位ASCII协议,那么您可能需要使用Base64。

请注意,这不是编码任意二进制字符的唯一方法。还有用于电子邮件的quoted printable和用于URL的URI encoding。在转义异常的情况下,这些方法更有效,但如果每个字符都需要,则效率要低得多。


0
投票

如果您知道只处理7位文本,则不需要base-64编码。

但是,如果你需要发送

Man
Boy

在纯粹的7位通道上,您无法使用换行符将其作为文字发送。相反,您将发送基于64的编码

TWFuDQpCb3kNCg==

它编码换行符但不使用不兼容的字符。当然,接收方需要知道您正在发送编码文本 - 要么使用协议暗示,要么以某种方式明确标记。

© www.soinside.com 2019 - 2024. All rights reserved.