2-2. 리소스의 위치와 트래픽 라우팅: IPv4(3)

독수리박박·2024년 7월 15일
0

이 글은 go언어를 활용한 네트워크 프로그래밍을 기반으로 작성되었습니다


IPv4

포트와 소켓 주소

만약 컴퓨터가 한 번의 하나의 노드와만 통신할 수 있다면 굉장히 비효율 적일 것이다. 예를 들어 웹에서 링크를 한 번 클릭할 때 마다 스트리밍 중인 음악이 끊기는 등 불편한 점이 많을 것이다.

이런일을 방지하기 위해 TCP와 UDP는 포트(port)를 사용하여 다중화된 데이터 전송을 할 수 있게 해주어 그런 일을 방지해 준다. 운영체제는 포트를 사용하여 네트워크를 통해 발생하는 송수신 데이터를 다중화-역다중화하여 데이터 전송을 고유하게 식별한다. IP주소와 포트 번호의 조합을 소켓 주소라고 하며 , 일반적으로 주소:포트의 형식을 갖는다.

포트는 16비트의 양의 정수이다. 0~1023번까지의 포트는 잘 알려진 포트로써 우리가 일반적으로 사용하는 서비스에 할당되어 있다. 예를 들어, HTTP는 일반적으로 80번 포트를 사용하고 HTTPS는 443번, SSH 서버는 일반적으로 22번 포트를 사용한다.
그렇다고 해서 서비스를 구성할 때 꼭 해당 포트를 사용할 필요는 없고 서비스를 구성하는 사람이 임의로 정해서 사용할 수 있다.

그리고 1024번 포트부터 4915번 포트는 까지는 잘 알려지지 않은 서비스들을 위해 사용하도록 되어있다.

나머지 포트들은 임시포트로써 권장되고 클라이언트가 소켓 연결을 위해 일시적으로 사용하고 삭제한다.

포트 사용 예시

포트 사용의 예시로 웹 브라우저와 웹 서버의 통신을 들수 있다. 웹 브라우저는 운영체제의 소켓을 열고 소켓에 주소를 할당한다. 이후 웹 브라우저에서는 그 소켓을 통해 웹 서버의 80번 포트로 요청을 보낸다. 웹 브라우저는 서버로부터 응답이 오기를 기다리고 서버는 브라우저로부터 요청을 받은 소켓 주소로 응답을 보낸다. 운영체제는 응답을 받은 후 소켓을 통해 웹 브라우저에게 결과값을 넘겨준다.

이런 예시에서 브라우저와 서버간에 발생하는 트랜잭션은 웹 브라우저의 소켓 주소와 웹 서버의 소켓 주소, 한 쌍의 값으로 고유하게 식별된다. 운영체제에서는 고유하게 식별된 두 소켓 주소의 값을 이용하여 웹 서버에서 반환되어 온 응답을 적절하게 역다중화하여 웹 브라우저로 넘겨줄 수 있다.


네트워크 주소 변환

IPv4는 약 40억개의 주소를 지원하지만 이미 고갈 되어 2011년 즈음 부터 더 이상 IPv4주소를 새롭게 할당하지 않는다. 하지만 네트워크 주소 변환(NAT)을 사용하면 부족의 문제를 해결하는 한가지 방법이 될 수 있다. NAT를 사용하면 수많은 노드들이 동일한 공인 IPv4주소를 사용하여 네트워크를 사용하는 것이 가능해진다. 공유기와 같이 송수신 트래픽을 추적하고 수신 트래픽을 올바른 노드로 라우팅할 수 있는 장치가 필요하다.

아래의 그림은 사설 네트워크와 인터넷의 노드 간 NAT의 절차를 보여준다.

그림과 같이 NAT을 지원하는 장치는 인터넷을 연결하기 위한 특정 소켓 주소를 가진 클라이언트로부터 연결을 수신한다. NAT장치는 자신에게 할당된 공인 IP를 사용하여 클라이언트의 소켓 주소와 포트를 유지하여 목적지로 연결을 시도한다. 만약 클라이언트가 이미 NAT장치가 사용하는 포트를 사용 중이라면 임의의 포트를 선택한다. 이후 NAT장치는 요청을 보내고 요청할 때 사용했던 소켓 주소로 응답을 수신한다. NAT장치는 송신 시의 소켓 주소를 연결을 수립한 클라이언트의 소켓 주소로 변환하기 때문에 수신받은 응답이 어느 클라이언트에 전달되어야 하는지 알 수 있다. 마지막으로 클라이언트는 NAT장치로 부터 응답을 받는다.

NAT장치 뒤에 위치하고 있는 노드의 사설 IPv4 주소는 외부 네트워크에서 보이지도 않고 직접 접근할 수도 없다. 오로지 사설 네트워크 내에 위치한 클라이언트만 NAT장치 너머로 연결을 맺을 수 있다.

하지만 NAT장치에서 제공하는 포트 포워딩 기능을 활용하면 외부에 위치한 노드들도 NAT장치 자체가 갖는 공인 IP 주소를 사용하여 연결 시도를 할 수 있고, 포트 포워딩이 적절하게 설정되어 있다면 NAT장치 뒤에 위치한 서버에도 포트 포워딩을 통해 접근 할 수 있다.

브로드캐스트는 네트워크 내의 모든 IP주소들에게 동시에 메시지를 전달할 수 있는 기능이다. 만약 어떤 노드가 네트워크 내의 모든 노드에게 특정 메시지나 데이터를 전하고 싶다면 노드는 브로드캐스트 주소로 패킷을 전송하면 된다. 그러면 이후에 네트워크 스위치나 라우터에서는 서브넷 내의 모든 IPv4 주소들로 패킷을 전파 한다.

멀티캐스트와는 달리 서브넷 내의 노드는 브로드캐스트 메시지를 수신 받을지 말지를 정할 필요가 없다. 위의 그림처럼 서브넷의 브로드캐스트 주소로 패킷을 전송하면 네트워크 스위치는 동일한 서브넷에 속한 그 외의 다른 다섯 개의 노드들에게 패킷을 복사하여 전송한다.


물리적 네트워크 연결에 대한 MAC 주소 해석

  • 모든 네트워크 인터페이스는 노드마다 물리적 연결을 고유하게 식별하는 MAC 주소가 존재한다.
  • MAC 주소는 로컬 네트워크에만 관련되므로 네트워크의 경계가 되는 라우터는 MAC 주소를 사용하여 데이터를 전송할 수 없다.
  • 대신 라우터는 IPv4 주소를 사용하여 네트워크 경계를 통과하는 트래픽을 라우팅할 수 있다.
  • 패킷이 목적지 노드의 로컬 네트워크에에 다다르면 라우터는 목적지 노드의 맥 주소로 데이터를 전송한다.
  • 마지막으로 노드의 물리적인 네트워크 연결로 전송한다.

주소 결정 프로토콜은 주어진 IP 주소에 알맞은 MAC 주소(MAC 주소 해결 프로세스)를 찾는다. 노드 내의 ARP 테이블에는 IP주소의 매핑되는 MAC 주소를 관리한다. 만약 ARP 테이블 내의 찾고 있는 목적지 노드의 IP주소가 존재하지 않는다면 노드는 브로트캐스트 주소로 "제 MAC 주소 여기 있어요, 이 IPv4주소를 가지고 있는 노드는 본인의 MAC 주소를 보내주세요" 라고 요청을 보낸다. 목적지 노드는 ARP 요청을 수신한 뒤 원본 노드로 ARP 응답을 송신한다. 이후에 노드는 목적지 주소를 알게되어 데이터를 전송할 수 있게 된다.


0개의 댓글