안녕하세요.
다름이 아니라 아이피/포트를 이용해서 통신을 하는 상황에 대해서 궁금증이 있어서 질문을 올리게 되었습니다.
IP주소는 각자에게 유니크하게 할당이 되고, 이를 통해 host간에 연결이 된다고 볼 수 있잖아요.
그리고 포트 넘버를 통해서 (IP주소에 의해 연결된 host들의) 프로세스 간에 연결이 된다고 볼 수 있고요.
궁금한 점은 각 프로세스가 만들어질때 일반적으로 well-known 포트가 아니며, 현재 사용중이 아닌 포트 넘버를 지정하잖아요.
예를 들어서, Alice는 Alimail 프로그램을 사용하고, Bob은 Bomail 프로그램을 사용해서 서로 데이터를 주고 받는다고 가정을 하고 Alice 입장에서 볼게요.
일단 Alice.jpg 파일을 만들고, Alimail 프로그램을 킵니다. 포트넘버 8881로 만들어졌다고 가정을 할게요.
Alice는 Bob에게 데이터 (Alice.jpg)를 보내기 위해서 Bob의 IP주소와 Bob이 데이터를 수신할 때 사용하는 프로그램 (Bomail)의 포트넘버를 알아야합니다.
이를 어떻게 알고 보내는거죠??
교과서 등의 소스들을 보면 일반적으로 상대 IP 주소와 Port 넘버를 입력함으로써 데이터를 보내는데,
실제로는 모르잖아요. (에를 들어, 카카오톡은 포트넘버 무조건 9999를 사용한다고 하면 카카오톡 간에 데이터 전송시 포트넘버는 바로 알 수 있겠지만)
실제로 데이터를 보내기 전에, 상대방의 메일주소 (abc@def.ghi)와 같은 주어진 정보를 이용해서, IP주소를 알아낼것 같은데요.
Port 넘버는 어떻게 알죠???
카카오톡처럼 어떤 포트를 사용하겠다고 정하고 통신을 하는 것입니다.
현재 사용중인 포트넘버는 사용할 수 없는걸로 알고 있는데요. 책에도 사용중이지 않으면서 well-known 포트 넘버가 아닌 포트 넘버를 골라 쓴다고 되어 있는데요. 사실 프로그램의 수는 매우 많을 수 있는 반면에, 포트 넘버는 16비트로 개수가 고정적이잖아요. 카톡은 몇번 포트 쓰고, 무슨 프로그램은 몇번 포트 쓰고, 이런식으로 계속 반복하다가 포트번호가 꽉 차면 어떻게 하죠? 그래서 well-known 포트 부분만 미리 정해져 있는거 아닌가요??
16비트면 포트 갯수가 65535개입니다. 통신서버에서 통신하는 프로그램을 6만개씩이나 쓸 일이 없기 때문에 충돌할 확률이 적습니다.
그래도 충돌할 수는 있는데 별다른 방법없어요.
어차피 이쪽은 서버쪽에서 관리를 해야하는 부분이라서 포트가 충돌하면 충돌하는 프로그램 둘 중의 하나를 제거하겠죠...
아마도 카톡이 1000번 포트 쓰고, 프로그램A가 1000번 포트를 쓰고, 프로그램B가 1000번 포트를 쓸 때, 포트 충돌이 날거라고 생각하시는 것 같은데... 서버가 아닌 PC(클라이언트)라면 전혀 문제 없습니다.
카톡에 접속할 때 소스포트는 10000번, 프로그램A에 접속할 때 소스포트는 10001번, 프로그램B에 접속할 때 프로그램B는 10002번, ... 이런식으로 클라이언트 포트가 할당되기 때문에 충돌할 일이 거의 없습니다.
아 감사합니다. 어느정도 감이 오는거 같습니다. 물론 직접 시뮬레이션을 돌려보거나 만들어보면 확실하게 와닿을것 같지만 ㅎㅎㅎ 학생주제에 전문가들이 쓴 교과서를 좀 믿고 봐야하는데 매번 볼떄마다 이러면? 저러면? 하면서 약점을 찾는 습관이 있네요 ㅠ_ㅜ