TCP-соединение однозначно идентифицируется этим кортежем (local address, local port #, foreign address, foreign port #)
. Не требуется, чтобы local address
и foreign address
или даже номера портов были разными (хотя это было бы чрезвычайно странно). Но самое большее 1 TCP-соединение имеет одинаковые значения для данного кортежа.
Когда компьютер подключается к себе, его локальный адрес и внешний адрес почти всегда совпадают. В конце концов, «локальная» и «внешняя» стороны - это на самом деле один и тот же компьютер. Фактически, когда это происходит, ваш компьютер должен показывать два соединения, которые имеют одинаковые «локальные» и «чужие» адреса, но поменялись местами номера портов. Например:
$ ssh localhost
приведет к двум соединениям, которые будут выглядеть примерно так:
$ 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)
. Не будет другого TCP-соединения с такими же четырьмя полями.
Тот факт, что вы видите два, связан с тем, что ваш компьютер подключен к обоим концам. У каждого конца есть свой взгляд на то, какой из них «чужой», а какой «местный».
Вы даже можете подключиться к себе через тот же порт, и хотя это не является обычным явлением, оно не запрещено спецификацией. Вот пример программы на 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-соединение состоит в том, чтобы другая сторона соединения пыталась открыть его одновременно с вами. Это известно как одновременный обмен SYN , а связанный с StackOverflow ответ описывает, о чем идет речь.
У меня также есть статья о , использующая одновременный обмен SYN для прохождения через NAT , хотя в этом случае источник и внешний источник будут совершенно разными.