TCP接続はこのタプル(local address, local port #, foreign address, foreign port #)
によって一意に識別されます。 local address
とforeign address
という要件はなく、ポート番号が異なることもあります(ただし、それは非常に奇妙です)。しかし、与えられたタプルに対して同じ値を持つTCP接続は最大でも1つしかありません。
コンピュータが接続するとき、ローカルアドレスと外部アドレスはほとんど同じです。結局のところ、「ローカル」側と「外国側」は実際は同じコンピュータです。実際には、これが起こるときあなたのコンピュータは同じ「ローカル」および「外国人」のアドレスを有するが、ポート番号を逆にした2つの接続を示しているはずである。たとえば:
$ ssh localhost
は次のようになり、2つの接続になります:
$ netstat -nA inet | fgrep :22
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:56039 127.0.0.1:22 ESTABLISHED
tcp 0 0 127.0.0.1:22 127.0.0.1:56039 ESTABLISHED
あなたが見ることができるように、ローカルアドレスと外部のアドレスは同じですが、ポート番号が逆になっています。このTCP接続の一意のタプルは(127.0.0.1, 56039, 127.0.0.1, 22)
です。これらの同じ4つのフィールドを持つ他のTCP接続はありません。
あなたのコンピュータが接続の両端であることが原因で2つが表示されます。それぞれの終わりには、どちらかが「外国人」であり、「ローカル」であるという独自の見解があります。
同じポート上で自分自身に接続することもできますが、これは一般的な現象ではありませんが、仕様では禁止されていません。ここでこれを行いますPythonでのサンプル・プログラムは次のとおりです。
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 56443))
s.connect(('127.0.0.1', 56443))
time.sleep(30)
それがTCP接続を開くことができます1つの方法は、接続の反対側が同時にあなたと1を開こうとすることですので、このコードは動作します。これはsimultaneous SYN exchangeとして知られており、StackOverflowの回答にリンクされていると、その内容が説明されています。
私はまた、using simultaneous SYN exchange to get through NATについての論文を持っていますが、その場合、ソースと外国語は全く異なるでしょう。
症状は、ローカルで実行されているサーバーのポートXポートへのリンクのリンクで説明されているのと同じです。しばらくしてnetstatは、クライアントが127.0.0.1:Xから127.0.0.1:X – dimba