2017-09-19 15 views
0

私は、さまざまなPythonのドキュメント、フォーラム、およびその他の人々の質問を通してオンラインで調べてみましたが、私はこの同じ質問を誰も見つけられませんでした。なぜLinux上のPythonソケットでのポートスキャンがWindows上で遅くなるのですか?

私のスクリプトは、通常、ポート1〜9999に接続しようとするソケット接続を作成し、ポートが開いているときにのみ通知します。 Windowsでこれを実行すると、次のポートに移動する前にポートをスキャンするのに1秒かかります(1000ポートの場合は60ポート/ m〜16.5m)。私はLinux上で同じスクリプトを実行すると、9999のすべてのポートを非常に迅速に循環させ、同じ結果を返すでしょう。

私はクロスコンパチブルツールを構築できることを望んでいましたが、Linuxのように見えます は、ネットワーキングの必要性に関しては、より良いオペレーティングシステムですか?私は私の処分で両方を持っているので、私はもう一方を使っても構いません。私は両方のオペレーティングシステムでほぼ同じ速度でポートスキャンを行うために行うことができることがあるかどうかを知りたいだけです。それ以外の場合は、Windows上/ Windows用に多くの時間を費やすことはありません。

速度の違いは、現在のネットワークに関係なく同じです。

私の質問は次のとおりです:
•同じ機能が与えられていると、なぜLinuxと比較してパフォーマンスが異なるのですか?
•linux上のように、ポートのスキャンを高速にするためにできることはありますか?ここ

--edit--

は、私は、ポート

をチェックするために使用する作品だ
def whole_scan(Host_): 
    service = '' 
    host = Host_ 
    max_port = 9999 
    min_port = 1 
    def scan_host(host, port, r_code = 1): 
     try: 
      s = socket(AF_INET, SOCK_STREAM) 
      code = s.connect_ex((host, port)) 
      if code == 0: 
       r_code = code 
       s.close() 
     except Exception, e: 
      pass 
     return r_code 
     hostip = gethostbyname(host) 
    for port in range(min_port, max_port): 
     try: 
      response = scan_host(host,port) 
      if response == 0: 
       try: 
        service = getservbyport(port) 
       except Exception, e: 
        service = 'n/a' 
      print(" |--port: %d\t%s" % (port,service.upper())) 
     except Exception, e: 
      pass 

私も自分のファイアウォールが無効になっていると、私のレジストリに値を追加すると、接続の制限を無効にするには確認しましたパフォーマンスに変化はありませんでした。私は窓口にいます。

+0

unixのために建てられた選択する際に、Linuxベースのシステムを含むUNIXのいずれかのブランドが、間違いなくエッジを持っている:あなたは、ホスト名の代わりにIPアドレスを使用していることを排除することができますネットワーキングプラットフォーム。それは言われている、それは他の何かがここで働いている可能性が高いです。あなたの窓にファイアウォールを有効にしていますか? RST、(フィルタリングされていない)閉じたポートを通知するACKパケットをブロックする可能性があります。 – spectras

+0

@spectras私のラップトップのAVは無効になっており、netsh advfirewall show allprofilesはすべてのファイアウォールがオフであることを示しています。私は何かが必要だと思っていますが、私はそれを見つけるのが苦労しています – saniboy

+0

あなたは両方のOSのための数字で簡素化された自己完結型のベンチマークを提供できますか?ポートスキャン(ブロッキング対ノンブロッキング、パラレル対シーケンシャル、接続対シン)をブロックする方法は数多くありますので、具体的な例と実際の数を組み合わせると良いでしょう。 –

答えて

0

Windowsは、一度に多数の接続要求を開く場合、半開き接続の同時接続数を制限しています。例えば、0にこのキーの値を設定するWindows 7のトライ(それを無効にする)\ TCPIP \パラメータ\ EnableConnectionRateLimitingが

+0

私はそれを調べましたが、エントリーは勝利Xには存在しませんが、私は同じことがすでに8になければ作成できると言った記事を見ました。だから私はそれを試しましたが、残念ながら違いはありませんでした。 – saniboy

0

ます。HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Servicesの上で私は、これはパフォーマンス上の問題を引き起こしていることを疑う、しかし、そこにありますあなたのscan_host()のバグです。

この関数はr_codeを返しますが、が0の場合にのみr_codeが設定されます。 connect_ex()が0以外の値を返すか、同じコードブロックで例外が発生すると、r_codeは設定されず、returnステートメントはNameError例外を発生させます。この例外は呼び出し元のコードに伝播し、呼び出し元のコードをキャッチして無視します。

例外を無視することはお勧めできません。おそらくあなたは問題に関連する何かを学ぶかもしれませんが、そうではないかもしれませんが、発生している例外を記録することをお勧めします。

また、コードにデバッグプリントステートメントを追加すると便利です。これは、大部分の時間が費やされているコード部分を見つけるのに役立ちます。

ラインもあります:

hostip = gethostbyname(host) 

実行しているように見えることはありません - おそらくあなたのポストにくぼみが非常に適切ではないので、私はわかりませんが。

もう1つ考慮すべきことはDNSです。おそらく、Windowsで使用されているDNSサーバーの速度が遅いか、そこに問題があります。 UNIXは、ネットワーキングおよびネットワーキングのために建てられたので

response = scan_host(gethostbyname(host), port) 
+0

これは問題ではないと私は肯定的です。私はsocket.connect(host、port)を使用してポートの範囲に接続しようとしたtcpクライアントで同様のことをしていましたが、古いものでした。私はそれを指摘していただきありがとうございます!私は家に帰るときに私のコードでそれを変更します – saniboy

+1

例外をチェックすることによって、手がかりを得ることができます。同様に、タイムスタンプ付きのデバッグステートメントを追加することも役に立ちます。私はまた、いくつかの他の提案で私の答えを更新しました。 – mhawke

+0

また、ホステッドはコードのこのセクションの目的を果たしませんが、DNSは面白そうに聞こえて、私が考えていたものではありません。私はWindowsと仮定していましたが、Linuxは同じDNSサーバを使用していました。 – saniboy

関連する問題