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