2012-09-06 57 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系列副本。