TCP 연결은이 튜플 (local address, local port #, foreign address, foreign port #)
에 의해 고유하게 식별됩니다. local address
및 foreign address
이라는 요구 사항이 없으며 포트 번호가 다를 수도 있습니다 (상당히 이상 할지라도). 그러나 주어진 튜플에 대해 동일한 값을 갖는 최대 하나의 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)
입니다. 동일한 4 개의 필드가있는 다른 TCP 연결은 없습니다.
두 가지 사실은 컴퓨터가 연결의 양쪽 끝이기 때문입니다. 각각의 끝은 하나는 '외국'이고 다른 하나는 '지역'이라는 자체 견해를 가지고 있습니다.
동일한 포트에서 자신과 연결할 수도 있으며, 일반적인 경우는 아니지만 사양에 의해 금지되지는 않습니다. 다음은이 작업을 수행 할 것입니다 파이썬에서 샘플 프로그램은 다음과 같습니다
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 연결을 열 가능성이있는 한 가지 방법은 연결의 다른 측면이 동시에 당신과 함께 일을 열려고하는 것입니다 때문에이 코드는 작동 . 이것은 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