3

可以通过套接字模块发送的最小“数据包”是多少?我只需要发送 16 位数据,2 个字节,这是我必须快速发送的东西,所以我希望它尽可能小。我做了一些“实验”来找到最小的大小,我得到的东西都不小于 28 字节。

试验结果:

sys.getsizeof(2) = 28

sys.getsizeof(0b0001) = 28

sys.getsizeof(bytes(0b0001)) = 34

sys.getsizeof('0001') = 66

sys.getsizeof('a') = 60

sys.getsizeof(0b0001000100010001000100010001) = 28

sys.getsizeof(0b000100010001000100010001000100010001) = 32

我只是想知道这是否确实是我可以发送的最小的。


我还想补充一点,python 很难使用二进制文件。我知道它不像以前那样相关,但对于某些事情来说它很方便。我这么说有两个原因:

1)我似乎无法保留变量二进制,它总是恢复为整数或其他类型。

2)经过测试,我进行了二进制到字节的转换,并将其作为大小:

sys.getsizeof(bytes(0b0001001001001001001001001)) = 2396778
4

3 回答 3

3

sys.getsizeof返回 Python int 的内部大小,而不是 C int。您可以使用struct.pack获取 C 字节:

>>> import struct
>>> struct.pack('H',32768)  # default endian-ness
'\x00\x80'
>>> struct.pack('>H',32768)  # force big-endian
'\x80\x00'

要发送两个显式字节:

>>> struct.pack('BB',100,200)
'd\xc8'

请注意,字节以字符串表示。 'd'是 100 的 ASCII 字符,\xc8是 200 的十六进制表示法:

>>> ord('d')
100
>>> 0xc8
200

您可以获得使用 创建的数据包的结果大小.pack。比如两条短裤和一条长的尺寸:

>>> struct.calcsize('>HHL')
8

请参阅结构模块文档

于 2012-09-07T00:48:19.893 回答
0

解决您问题的第二部分:

“二进制”是整数的表示,而不是类型。您可以使用bin()将二进制表示形式作为字符串。您可以将二进制字符串表示形式转换为using int.... int()例如

>>> x = 1234
>>> bin(x)
'0b10011010010'     # note, this is a string
>>> print int(bin(x), 2)
1234

对于第二部分,我认为您一定弄错了:

>>> bytes(0b0001001001001001001001001)
'2396745'
>>> sys.getsizeof(bytes(0b0001001001001001001001001))
44
于 2012-09-07T02:10:14.267 回答
0

通过套接字发送的字节数取决于编程语言中数据值的大小。例如,通过新的 TCP 连接向“www.google.com:80”发送单个字节会导致以下数据包流:

A->B: 64 byte TCP SYN
B->A: 60 byte TCP SYN+ACK
A->B: 52 byte TCP ACK
A->B: 53 byte TCP packet containing a single byte payload
B->A: 52 byte TCP ACK
A->B: 52 byte TCP FIN
B->A: 52 byte TCP FIN+ACK
A->B: 52 byte TCP FIN

因此,发送单字节有效负载总共需要 437 个字节。UDP 更宽容一点,导致单个字节有效负载仅发送 29 个字节。如果使用原始套接字,则可以将有效负载压缩到 21 个字节。

在任何情况下,将有效负载中的字节数减少到 1 并使用最小的协议(例如,在大多数情况下为 UDP)都与您将获得的一样好。关键尺寸是:

IP Header = 20 bytes
IP Header + UDP Header = 20 + 8 = 28 bytes
IP Header + TCP Header = 20 + 20 = 40 bytes

所有各种网络协议都将有效负载字节数限制为整个字节。

要记住的另一件事是,在 IP 标头下方,您拥有任何底层物理层。在标准以太网的情况下,您最终会将所有内容分成 1500 字节的数据包。不管您发送 1 个字节还是 1000 个字节,最终都会在线上发送 1500 个字节。当然,这是一个巨大的过度简化,但这个想法应该已经深入人心——如果你在标准以太网上运行,那么我不会太担心发送几个字节。如果您不需要确认,请将您的使用限制为 UDP。

如果您真的有兴趣,请阅读神圣的TCP/IP 插图系列。

于 2012-09-08T02:27:33.100 回答