2012-09-06 43 views
2

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

测试结果:

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 
+0

这些都是系统相关的值在我的系统上'sizeof('a')= 25'和'sizeof(2)= 12 –

+0

那么还有强制套接字只需要两位吗? – user1642826

回答

3

sys.getsizeof返回一个Python INT的INTERAL大小,不是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

+0

谢谢你,那正是我正在寻找的。 – user1642826

+0

太棒了!如果答案是可以接受的,点击左边的绿色检查。欢迎来到堆栈溢出! –

0

解决你问题的第二部分:

“二进制”是一个整数的表示,不是一个类型。您可以使用bin()以字符串形式获取二进制表示。您可以使用.... 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 
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系列副本。