OS가 Tcp Connection을 어떻게 적절한 Socket으로 넘기는지 탐구한다.
1. 문제 인식
이전까지, TCP 패킷들은 포트번호를 통해 프로세스로 통한다고 이해하고 있었다. 이에 따라, ServerSocket이 TCP Connection을 받을때 새로 생성되는 소켓은 항상 새로운 포트를 점유하고, 클라이언트는 이 소켓과 통신한다고 이해했었다.
결론부터 말하자면, 틀렸다. OS는 TCP 패킷을 수신하면 이를 Socket Pair를 확인하여 적절한 Socket으로 매핑한다.
2. 이론
출처 1: 컴퓨터 네트워킹 하향식 접근 55p
출처 2: UNIX Network Programming : The Sockets Networking API https://books.google.co.kr/books?id=ptSC4LpwGA0C&lpg=PA52&dq=socket+pair+tuple&pg=PA52&redir_esc=y#v=onepage&q=socket%20pair%20tuple&f=true
2-1. Socket Pair
OS는 TCP Connection을 Demultiplex하기 위해 Socket Pair를 이용한다.
Socket Pair는 아래의 네가지 튜플로 구성된다.
[ ClientAddr, ClientPort, ServerAddr, ServerPort ]
서버 프로그램을 임의의 호스트 12.142.17.24:24에 실행한다고 하자. 네트워크를 위해 분명 TCP 소켓 하나를 생성해 24 번 포트에 바인딩 했을 것이다. 살구색 박스를 소켓이라고 하자.
서버가 정상적으로 구동됐다면, OS는 아래의 중괄호 내에 있는 데이터와 같은 Socket Pair를 만든다. Socket Pair의 좌측은 Local(내부), 우측은 Foreign(외부)을 의미한다. 현재 Socket Pair은 해당 Socket이 호스트의 80번 포트로 오는 모든 요청을 수신하도록 한다는것을 의미한다.
OS는 모든 TCP Connnection을 Socket Pair를 이용해 소켓으로 demultiplex한다. 이제, 하나의 클라이언트가 서버에 접속을 시도한다고 하자. 클라이언트 호스트 또한 네트워크에 접속하기 위해 무작위 포트를 바인딩해 소켓을 생성한다. 서버 호스트와 마찬가지로, 클라이언트 OS에 Socket Pair가 생성된다.
서버가 Client의 TCP Connection Request를 받으면, 서버 호스트의 OS는 요청의 Socket Pair, OS의 Socket Pair를 대조하여 가장 부합하는 소켓으로 demultiplex한다.
서버는 이제 클라이언트의 TCP Connection을 받았다. 해당 소켓은 자신에게로 TCP Connection이 오면 새로운 소켓을 생성하여 해당 Connection을 담당하도록 한다.
이때, 새로 만들어지는 Socket은 이전 소켓과 같은 포트번호를 공유한다
새로 만들어진 Socket은 클라이언트의 TCP Connection을 담당하게 된다. 이전과 마찬가지로, OS는 Socket Pair를 생성한다. 이전과 다른점은, 해당 소켓은 해당 클라이언트의 요청만을 처리하도록 만들어졌다. OS는 소켓에 해당 클라이언트의 TCP Connection만을 demultiex하기 위해 이전보다 더 구체적인 Socket Pair를 생성한다.
이렇게 함으로써, 새로 만들어진 소켓에는 다른 클라이언트의 TCP Connection이 demultiplex되지 않는다.
이제, 클라이언트가 다시 TCP Connection을 시작한다고 하자. 이전에도 말했다 싶이, 서버 호스트 OS는 모든 TCP Connection들의 Socket Pair를 확인하고, 현재 OS내의 Socket Pair와 대조하여 가장 부합하는 소켓으로 이를 demultiplex한다.
즉, 같은 클라이언트의 요청이 이전에 만들어진 소켓으로 demultiplex하게 된다.
3. 정리
네트워크 프로그래밍을 위해 소켓 프로그래밍은 필수적이다. 소켓 프로그래밍시 바인딩 되는 포트를 해당 Socket이 온전히 점유한다고 생각했었다.
OS는 TCP Connection들을 Socket Pair를 이용해 demultiplex 한다.
즉, 개념을 잘못알고 있었다.
이 개념을 바탕으로 Spring Boot 내장 WAS, Embeded Apache Tomcat에 다시 도전해 봐야겠다.
감사합니다 :)
출처 1: 컴퓨터 네트워킹 하향식 접근 55p
출처 2: UNIX Network Programming : The Sockets Networking API https://books.google.co.kr/books?id=ptSC4LpwGA0C&lpg=PA52&dq=socket+pair+tuple&pg=PA52&redir_esc=y#v=onepage&q=socket%20pair%20tuple&f=true