Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

이상한 코딩 나라의 혜돌이

Socket API : L3 (네트워크 계층)에서 IP 주소를 어떻게 알아올까? 본문

Study/Network

Socket API : L3 (네트워크 계층)에서 IP 주소를 어떻게 알아올까?

혜돌이 2019. 1. 25. 14:38

호스트에서 호스트로 메시지를 전송하려고 할 때, 개발자는 어떻게 코드를 작성할까?

 

먼저 소켓을 생성(socket 함수)하고, 다른 호스트와 connect를 하면(connect 함수), 소켓 객체에는 예를 들어 아래와 같은 정보들이 담기게 된다. (python, TCP socket 기준. 다른 언어도 비슷하다)

 

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('x.x.x.x', xxx), raddr=('y.y.y.y', yy)>

 

송신자에서 이 소켓에 메시지를 작성하면, 수신자는 소켓에서 메시지를 읽어오고, 같이 담겨온 주소로 다시 메시지를 전송한다.

 

 

 

 

조금 더 직관적으로 보면, 위의 그림처럼 나타낼 수 있다.

따라서 개발자는 네트워크 프로그래밍을 할때, Socket API를 이용하며 그 아래 레이어는 전혀 신경쓰지 않고 개발하는 것이 가능하다.

 

그럼 Socket API는 어느 레이어에 존재할까?

대부분의 강의 자료에서 아래와 같이 설명했을것이다.

 

 

Application layer

(Socket API)

Transport layer

Network layer

Link Layer

Physical Layer

 

 

위 그림으로 보아, 개발자는 애플리케이션 구현만 생각하면 되고, 애플리케이션 계층 미만, 즉 트랜스포트 계층 이하는 고려할 필요도 없고, 고려할 수도 없다.

그런데 여기서 의문.

네트워크는 계층 구조를 가지고 있다.

이는 시스템의 다른 요소에 영향을 주지 않고 서비스 구현을 쉽게 변경하기 위함이다.

또한 아래 계층으로 갈 수록, 윗 레이어에서 받아온 데이터에 헤더를 붙여 아래 레이어로 내려보낸다.

 

그러면 네트워크 레이어에서는 목적지 IP 주소를 대체 어떻게 알아내는 걸까?

 

네트워크 계층의 바로 윗 계층은 트랜스포트 계층이다.

트랜스포트 계층의 헤더에는 출발지 포트 번호와 목적지 포트 번호밖에 없으며, IP 주소와 같은 경우에는 애플리케이션 계층에서 개발자가 지정하는 것이므로 트랜스포트 계층에서는 알 수가 없다.

출발지 IP 주소야 자기 장비에서 그냥 가져온다고 해도, 목적지 IP 주소는 어떻게 알아낼 수 있는지,

만약 계층 구조를 무시하고 그냥 메시지를 까서 알아오는거면 네트워크를 계층 구조로 만든 게 무슨 의미가 있는지....

 

동기들과 함께 고민하며 인터넷 서칭을 해 본 결과 정답을 얻었다.

 

 

 

Socket API가 트랜스포트 레이어 뿐만 아니라, 네트워크 레이어까지 정보를 전달해준다!!!!!!!!

이제껏 보았던 그림은 반쪽짜리 그림이었던 것... ㅠㅠ

 

Socket API에서 출발지 IP, 출발지 port, 목적지 IP, 목적지 port 정보를 가지고 있다. (개발자가 소켓을 통해 전송하려고 할 때 넣어준 정보)

트랜스포트 레이어에는 출발지 port/목적지 port를 전달해주고, 네트워크 레이어에는 출발지 IP(이건 그냥 컴에서 가져오려나?)/목적지 IP를 전달해주는 듯 하다.

 

휴 궁금증 해결..

 

 

 

 

 

- 참고자료

 

How sockets work, IBM Knowledge Center

Comments