web-dev-qa-db-ja.com

同じ送信元ポートと宛先ポートを使用してローカルホスト上のサーバーに接続する

localhostのポート80をリッスンする単純なサーバーは次のとおりです。

nc -4 --listen 127.0.0.1 80

サーバーの宛先ポートと同じ送信元ポートを使用して、localhost上のサーバーに接続するクライアントは次のとおりです。

nc -4 --source-port 80 --source 127.0.0.1 127.0.0.1 80

エラーが発生します:

libnsock mksock_bind_addr(): Bind to 127.0.0.1:80 failed (IOD #1): Address already in use (98)

{ SRC-IP, SRC-PORT, DST-IP, DST-PORT, PROTO }は一意である必要があるという規則に従って、この接続の作成を許可する必要があります。初めて接続を作成しようとする前は、そのようなタプルはありませんでした。なぜこれが許可されないのですか?カーネル4.4.6でFedora23を実行しています。

2
Majid Azimi

あなたがやろうとしていることは意味がありません。同じ5タプル{ SRC-IP, SRC-PORT, DST-IP, DST-PORT, PROTO }で2つのTCPソケットを作成しようとしているため、2つのソケットは互いに区別できません。

このように考えてください。これが許可されている場合、TCPパケットが127.0.0.1:80から送信され、127.0.0.1:80宛てに到着すると、どちらのソケットがそれを受信しますか?両方?

3
Celada