用于套接字聊天的python最小数据类型

时间:2012-09-06 23:59:12

标签: python sockets types byte

可以通过套接字模块发送的最小“数据包”是什么?我只需要发送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

3 个答案:

答案 0 :(得分: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

请参阅struct module documentation

答案 1 :(得分:0)

解决问题的第二部分:

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

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

对于第二部分,我认为你一定是错的:

>>> bytes(0b0001001001001001001001001)
'2396745'
>>> sys.getsizeof(bytes(0b0001001001001001001001001))
44

答案 2 :(得分: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 Illustrated系列的副本。