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 はバイナリを扱うのが非常に難しいことも付け加えたいと思います。以前ほど関連性がないことはわかっていますが、いくつかの場合には便利です。私がこれを言う理由は 2 つあります。

1) 変数のバイナリを保持できないようです。常に整数または別の型に戻ります。

2)テスト時に、バイナリからバイトへの変換を行い、これをサイズとして取得しました:

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

3 に答える 3

3

sys.getsizeofC の int ではなく、Python の int の内部サイズを返します。struct.packCバイトを取得するために使用できます:

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

2 つの明示的なバイトを送信するには:

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

バイトは文字列で表されることに注意してください。 'd'は 100 の ASCII 文字で\xc8、200 の 16 進表記です。

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

で作成されたパケットの結果のサイズを取得できます.pack。たとえば、ショート パンツ 2 枚とロング パンツ 1 枚のサイズ:

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

構造体モジュールのドキュメントを参照してください。

于 2012-09-07T00:48:19.893 に答える
0

質問の2番目の部分に対処する:

「バイナリ」は整数の表現であり、型ではありません。を使用bin()して、バイナリ表現を文字列として取得できます。intバイナリ文字列表現をusing....に変換できます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」に 1 バイトを送信すると、次のパケット フローが発生します。

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

したがって、1 バイトのペイロードを送信するには合計 437 バイトになります。UDP はもう少し寛容で、1 バイトのペイロードに対して 29 バイトしか送信されません。raw ソケットを使用すると、ペイロードを 21 バイトまで圧縮できます。

いずれにせよ、ペイロードのバイト数を 1 に減らし、最小限のプロトコル (ほとんどの場合 UDP など) を使用することは、得られるものとほぼ同じです。キーのサイズは次のとおりです。

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

さまざまなネットワーク プロトコルはすべて、ペイロード バイト数を完全なバイト数に制限しています。

覚えておくべきもう 1 つのことは、IP ヘッダーの下に、基礎となる物理層が何であれあるということです。標準のイーサネットの場合、すべてが 1500 バイトのパケットにまとめられることになります。1 バイトを送信するか 1000 バイトを送信するかに関係なく、ネットワーク上で 1500 バイトを送信することになります。もちろん、これは大幅に単純化したものですが、このアイデアは浸透しているはずです。標準のイーサネットで動作している場合は、数バイトの送信についてあまり心配する必要はありません。承認が必要ない場合は、使用を UDP に限定してください。

本当に興味があるなら、神聖なTCP/IP Illustratedシリーズのコピーを手に取ってください。

于 2012-09-08T02:27:33.100 に答える