2014-12-24 5 views
3

ServerSocket이 있고 accept()를 실행한다고 가정 해 보겠습니다. 클라이언트가 연결되고 ServerSocket과 동일한 로컬 포트로 새로운 소켓이 생성됩니다. 클라이언트가이 소켓에 데이터를 보낸다고 가정 해보십시오. 포트에 도달하여 Java 응용 프로그램에 도달합니다. 여기서 얻은 데이터는 올바른 소켓에 어떻게 도달합니까?이 시나리오에서 ServerSocket은 정확히 어떻게 동작합니까?

두 대의 컴퓨터가 NAT를 통해 동일한 공용 IP 뒤에 숨어 있다고 가정 해보십시오. 결국 문제가 발생합니까? 같은 컴퓨터가 연결 (동일한 공용 IP 및 동일한 포트)을 만들려고하는 것처럼 보일까요? 마치 내가 여기에 뭔가 빠져있는 것처럼 느껴집니다.

+1

네트워크 주소 변환이 어떻게 작동하는지 묻고 있습니까? 아니면 라우팅이 전혀 작동합니까? –

+3

나는이 질문이 상당히 광범위하다고 생각한다. 하나의 질문에 문제가 있다고 물으면 더 좋을 것입니다. 이에 대한 가장 좋은 대답은 관련 RFC를 읽는 것입니다. TCP/IP, NAT 및 라우팅은 크고 복잡한 주제입니다. (나는 투표를하지 않을 것이다.) – markspace

+0

좋아, 나는 편집하고 한 가지 질문에 맡길 것이다. Im은 두 가지 질문을하지만, 관련이 있습니다. 만약 두 대의 컴퓨터가 같은 공인 IP 뒤에 숨겨져 있다면 그것이 문제가 될 것이라고 묻는 Im은 이것이 마치 같은 컴퓨터 인 것처럼 보입니까? Im은 또한 소켓이 어떻게 결정되는지를 묻습니다. 데이터가 포트에 도달하여 해당 포트에 소켓이 두 개 있다고 말하면 데이터를 보낼 포트를 어떻게 알 수 있습니까? 그리고이 일을 담당하고있는 사람. – nhooyr

답변

6

소켓은 로컬 주소와 포트을 원격 주소와 포트으로 연결합니다. 이것은 열쇠입니다. 포트이 다른 경우 동일한 IP에서 여러 연결을 허용 할 수 있습니다. 예를 들어 서로 다른 두 개의 클라이언트 탭에서 동일한 웹 페이지를 열 수 있습니다.

NAT는 두 대의 컴퓨터에서 두 개의 연결이 서로 다른 주소를 수신하도록합니다/포트 조합. 동일한 공용 IP에 매핑되는 경우 NAT는 해당 연결에 대해 다른 로컬 포트를 할당해야합니다. 서버로서, 당신은 이것에 대해 걱정할 필요가 없습니다. 서버의 주소/포트에 연결하는 두 개의 서로 다른 주소/포트 조합을 볼 수 있기 때문에 소켓이 다릅니다.

Java에서 ServerSocket은 진입 점으로 작동합니다. 서버의 주소와 포트에 바인딩되므로 "소켓의 절반"에 대한 템플릿의 일종입니다. 클라이언트가 자신의 주소와 포트에 연결하면 "full"Socket이 만들어지고 반은 채워지고 이제 서버와 클라이언트는 대화를 시작할 수 있습니다. TCP/UDP 연결이 아직 명확하지 않은 경우 어떻게 연결되는지 살펴보십시오.

-1

동일한 쌍 (IP, 포트)을 가진 두 대의 서버를 가질 수 없습니다. NAT 뒤에 있으면 NAT가 각 공용 서버에 다른 공용 포트를 할당해야하며 둘 다 할당 할 수 없습니다.

+0

두 가지 모두 * 할 수는 없으므로 NAT 장치가이 문제를 처음부터 가질 수 없습니다. 그건 상관 없어요. – EJP