-
IP / TCP / UDP / PORT / DNS인터넷 2021. 10. 19. 19:22
김영한님의 '모든 개발자를 위한 HTTP 기본 지식' 을 보고 개인적으로 작성한 내용입니다.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
통신 방법
컴퓨터 두 대가 있고 이 컴퓨터 사이에 데이터를 전송하려면 어떻게 해야할까? 모르긴 몰라도 둘 사이에 데이터를 전송해야하니 컴퓨터 사이에 회선을 연결하고 그 회선을 통해서 데이터를 보내면 될 것이다.
이제 이 과정을 스케일을 크게 해서 보자. 세상엔 정말 많은 단말들(컴퓨터들)이 있고, 이 단말들은 광 회선이라던지를 통해 '인터넷'에 연결되어 있다. 그렇다면 이 인터넷에서 통신하려면 어떻게 해야할까? 회선으로 데이터를 보내서 통신을 하면 되는걸까? 어떻게 하면 될까?
단순히 회선으로 통신하는게 맞냐고 물어본다면 맞다! 하지만 인터넷에는 굉장히 많은 단말들이 연결되어 있는데 이 많은 단말들 사이에서 자신이 원하는 단말에 데이터를 보내려면 어떠한 모종의 방법이 필요할 것이다.
이 모종의 방법을 제공하는 것이 인터넷에서 쓰이는 프로토콜(약속)들이다. (IP, TCP, UDP 등등) 어떻게 하면 네트워크상에서 데이터를 전달할지 사람들 사이에서 '약속' 한 것이라고 볼 수 있다. 이 중에서 IP부터 어떤 방식으로 동작하는지 알아보자.
IP(Internet Protocol)
단어 그대로 '인터넷'에서 사용하는 프로토콜이다. IP는 집 주소라고도 볼 수 있다. 친구네 집에 우편을 보내려고 할 때 'ㅇㅇ 아파트'로 보내달라고 하는 것을 인터넷 버전으로 바꾸면 IP: ㅇㅇㅇ.ㅇㅇㅇ.ㅇㅇㅇ.ㅇㅇㅇ 위치로 데이터를 보내주세요! 라고 말하는 것과 같다.
인터넷에 연결되있는 단말 각각엔 IP가 부여되어 있고, 이 IP를 통해 송신자는 원하는 수신자에게 데이터를 보낼 수 있게 되고, 이 원하는 데이터를 '패킷(packet)'이라는 통신 단위로 데이터를 전달하게 된다.
IP만 있다고 가정 할 때 송신자가 원하는 데이터를 보내려고 하는 과정은 다음과 같다.
- 원하고자 하는 데이터를 적는다.
- OS의 소켓(socket) 라이브러리를 call 한다.
- OS는 IP에 필요한 정보들을 추가해서 수신자에게 보낸다.
이렇게 데이터를 계층에서 얻어온 정보를 추가하는 과정을 '캡슐화'라고 하며 과정이 완료된 이후 보낸 수신자가 송신자에게 잘 받았다는 OK 메시지를 보냄으로써 데이터 전송이 완료되게 된다.
IP 프로토콜의 한계
- 비연결성 : 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송된다.
- 비신뢰성 : 중간에 패킷이 사라지거나 패킷이 순서대로 안 올 수 있다.
- 또한 수신자가 프로그램을 여러개 켜뒀을 경우 대체 어떤 프로그램으로 데이터를 보내야 하는지도 알 수가 없다는 문제가 있다. 이를 해결하는 것이 IP 프로토콜의 상위 계층인 TCP 프로토콜이다.
TCP 프로토콜
IP프로토콜에서 주소지까지 데이터를 보내는 것까지는 알겠지만 요즘 컴퓨터에는 수많은 애플리케이션이 작동되고 있는데 대체 이 애플리케이션중 어떤 프로그램에 데이터를 보내는 건지 알 수 있을까?
이 문제를 해결하는 것이 TCP 프로토콜이다. TCP 프로토콜은 포트(PORT)라는걸로 프로그램을 구분하여 데이터를 어떤 프로그램에 적용할지 알 수 있게 해준다.
인터넷에서 사용하는 TCP/IP 네트워크 프로토콜 계층은 다음과 같이 구성되어 있다.
이 계층은 상위 계층에서 하위 계층으로 데이터를 전달하여 네트워크/인터페이스 계층이 인터넷에 데이터를 쏴주는 과정으로 진행되는데 각각의 계층마다 필요한 데이터를 추가한다. TCP 계층에서는 포트에 관한 정보를 붙이고, IP 계층에서는 IP를 붙이는 방식이다.
인터넷에서 데이터를 전송하는 과정은 다음과 같다.
- 애플리케이션 계층(유저가 상호작용하는 계층)에서 데이터를 보낸다
- 전송 계층에서 상위 계층에서 받아온 데이터에 TCP/UDP에 해당하는 데이터를 추가한다
- 인터넷 계층에서 상위 계층에서 받아온 데이터에 IP에 해당하는 데이터를 추가한다.
- 네트워크 인터페이스 계층이 데이터를 전송한다.
좀 더 친숙한 프로그램으로 예제를 보자면 다음과 같다.
웹 브라우저등의 애플리케이션의 코드를 보면 데이터를 OS가 제공하는 Socket 라이브러리를 사용한다. 이 Socket 라이브러리를 사용하면 OS가 TCP 프로토콜, UDP 프로토콜에 해당하는 정보를 붙이고, IP에 해당하는 정보를 붙인다음에 LAN카드를 통해 인터넷에 데이터를 쏴주는 방식이다. 즉, OS가 PORT를 붙이는 전송계층 계층의 역할과, IP를 붙이는 IP계층의 역할을 한 뒤 네트워크 인터페이스 계층을 통해 데이터를 보내주는 방식이다.
위에 해당하는 일련의 과정을 거치고나면 위와 같이 데이터가 변하게 된다. 사용하는 앱에서 생성된 전송 데이터에 OS에서 붙인 IP에 해당하는 정보(IP 패킷)와 TCP에 해당하는 PORT 정보를 제공하는 데이터(TCP 세그먼트)등이 붙은 형태로 데이터가 수신자에게 제공되게 된다.
TCP(Transmission Control Protocol)의 특징
- 연결 지향 - TCP 3 way handshake(가상 연결)
- 데이터 전달 보증
- 순서 보증
- 신뢰할 수 있는 프로토콜
- 현재는 대부분 TCP를 사용한다.
TCP 3 way handshake
보내려고 하는 수신자가 죽지않고 데이터를 잘 받을 수 있는지 확인하는 절차로 총 3번의 메시지를 보낸다 하여 3 way handshake라고 한다. 만약 수신자의 입장에서 데이터의 순서가 맞지 않거나, 데이터가 오지 않는다면 NAK 메세지를 보내 정상적으로 수신되지 않았음을 알린다.
UDP
기능이 거의 없는 전송 계층의 프로토콜로 먼저 수신자가 죽었는지 확인하고 가상 회선을 만든 뒤 데이터를 전송하는 TCP와는 달리 단순히 PORT, 체크섬정도만 추가하는 프로토콜이다. 데이터 전달 및 순서가 보장되지 않지만, 그만큼 단순하고 빠르다는 장점을 가지고 있다.
DNS(Domain Name System)
IP주소는 외우기도 힘들고, 자주 바뀌기 때문에 매번 기억해서 어떤 웹사이트에 들어가거나 개발을 하기에는 무리가 있다. 이를 위해 나온게 DNS로, IP주소와 도메인 주소(www.naver.com 과 같은 시스템)를 테이블 형식으로 매핑해 IP를 제공하는 방식의 시스템이다.