[HTTP] IP/TCP/UDP
백엔드 개발자뿐만 아니라 대부분의 개발자는 HTTP 아래에서 개발을 하게 돼 있다.
때문에 기본적인 HTTP와 IP, TCP/IP, UDP, DNS, PORT에 대한 기본적인 이해가 필요할 것 같아 정리해 본다.
IP(Internet Protocol)
인터넷 프로토콜이라 하며, 인터넷 망에서 데이터를 주고받을 때의 최소한의 규칙을 말한다.
클라이언트와 서버는 각각 IP를 부여받고, 지정한 IP주소에 패킷(Packet)이라는 통신 단위로 데이터 전달을 하게 된다. IP패킷은 출발지IP(현재 나의 IP), 목적지IP, 전송할 데이터 등으로 구성된 IP패킷을 인터넷 망에 던지고, IT 프로토콜에 의해서 노드가 출발지, 목적지 등을 해석하여 서버에 전송 데이터가 도달하게 되는 것이다. 서버에서 다시 클라이언트로 응답을 보낼 때도 마찬가지이다.
이러한 IP방식은 아래와 같은 한계를 가진다.
-
비연결성 : 패킷을 받을 대상이 없거나 서비스 불능상태(ex.PC가 꺼진 상태)여도 패킷이 전송된다.
-
비신뢰성 : 중간에 패킷이 사라지거나, 패킷이 순서대로 오지 않는 경우 (패킷의 용량이 큰 경우 한 번에 보내기 부담스럽기 때문에 끊어서 보내기도 함)
-
프로그램 구분 : 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 여러 개일 경우
즉, 음악도 듣는 동시에 게임도 한다고 할 때 ‘IP 프로토콜 구분은 어떻게 하는가?’에 대한 문제
이러한 문제를 해결해 주는 것들이 TCP, UDP이다.
인터넷 프로토콜 스택의 4계층
-
애플리케이션 계층 - HTTP, FTP
-
전송 계층 - TCP, UDP
-
인터넷 계층 - IP
-
네트워크 인터페이스 계층
TCP/IP
TCP/IP는 기존의 IP에 TCP에 대한 정보인 TCP 세그먼트가 들어간다. TCP 세그먼트는 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등이며 IP만으로 해결이 안 됐던 문제들이 TCP 세그먼트로 인해 해결될 수 있다.
TCP/IP 프로토콜 스택을 통한 데이터 전송 과정은 아래와 같다.
프로그램이 Hello, World! 메시지 생성
=> SOCKET 라이브러리를 통해 메시지 전달 : 소켓 라이브러리를 사용하여 프로그램은 생성한 메시지를 다른 시스템이나 프로세스에 전달할 수 있는 소켓을 열고 데이터를 전송한다.
=> OS계층에서 TCP가 전달할 데이터에 TCP정보를 씌움 : TCP는 프로그램이 생성한 데이터를 세그먼트로 나누고, 각 세그먼트에 TCP 헤더를 추가한다. 이 헤더에는 출발지 및 목적지 포트, 전송 제어 정보 등이 포함된다.
=> TCP 밑에 IP 정보를 씌움 : 그 후 TCP는 이 세그먼트를 IP로 감싸 IP 헤더를 추가한다. IP 헤더에는 출발지 및 목적지 IP 주소가 포함된다.
=> 네트워크 인터페이스인 LAN 드라이버, LAN 장비를 통해서 나갈 때 Ethernet frame이라는 것을 포함시켜서 인터넷망으로 나가게 됨.
TCP/IP의 특징
-
연결 지향 : 연결을 우선 하고, 연결이 됐다는 메시지를 보냄. TCP 3way handShake(가상연결)
-
데이터 전달 보증 : 전달이 잘 됐는지에 대한 여부를 알 수 있음.
- 데이터 전송하면
- 데이터 잘 받았다고 서버에서 응답을 보냄
-
순서 보장
- 패킷1, 패킷2, 패킷3 순서로 전송
- 패킷1, 패킷3, 패킷2 순서로 도착할 경우 다 버리고 패킷 2번부터 다시 보내라 함 > 패킷1은 그대로 있고 패킷2, 패킷3만 다시 옴
-
신뢰할 수 있는 프로토콜
-
현재는 대부분 TCP 사용
TCP 3way handShake
- 클라이언트가 TCP/IP 프로토콜로 먼저 SYN이라는 메시지를 보냄. (Connect, 연결과정)
- 서버에서 SYN+ACK 메시지를 다시 클라이언트에 보냄.
- 클라이언트가 ACK를 보냄.
- 데이터 전송
(SYN : 서버요청 / ACK : 요청 수락)
위의 3way handShake 과정을 통해서 서버와 클라이언트는 서로를 믿을 수 있게 됨. 즉, 1번에서 서버가 꺼져있었다면 ACK를 응답으로 안보내게 되며, 결국 메시지도 안보내게 된다.
주의해야할 점은 TCP 3way handShake는 실제적이며 물리적인 연결이 아닌, 개념적이고 논리적인 연결만 된 상태이다.
UDP
IP계층 바로 위에 있으면서, TCP와는 같은 계층에 있음.
TCP의 기능들인 순서보장, 데이터 전달 보증, 연결 지향같은 기능은 없으나 기존의 IP에 PORT가 추가된다는 점이 특징이다.
이 PORT는 하나의 IP에서 여러 애플리케이션이 패킷을 보낼 때 어떤 패킷인지 구분하기 위해 필요한 것이다.
UDP는 이렇다할 기능은 없지만 TCP를 그대로 쓰고, UDP를 조작해주면 TCP의 3way handShake의 시간이 걸린다는 점, TCP는 데이터 양도 많고, 전송 속도도 빠르게 하기 어렵다는 점을 보완할 수 있다.
PORT
게임, 화상통화, 웹브라우저 요청 등을 동시에 하고 있다면 한번에 이 클라이언트 PC는 여러 개의 서버랑 통신해야 한다.
이 때, 어디에서 필요한 패킷인지 알 수 없기 때문에 PORT가 필요하며 TCP/IP패킷, UDP에는 출발지 PORT와 목적지 PORT가 있다.
즉, IP는 목적지 서버를 찾는 것 / 서버 안에서 돌아가는 애플리케이션들을 구분하는 것은 PORT인 셈이다.
아파트 단지의 이름은 IP, 아파트 동 호수는 PORT
DNS(Domain Name System)
도메인 이름과 IP 주소 간의 매핑을 담당하는 서비스이며, 도메인 이름을 통해 특정 IP주소를 찾아주는 역할을 한다.
즉, DNS는 전화번호부 같은 서버를 제공하는 셈이다.
도메인을 등록 > IP 부여 > DNS 서버가 IP에 대한 응답을 줌 > 도메인으로 찾으면 DNS에 도메인의 IP에 대한 요청이 감 > IP 반환 > 받은 IP를 가지고 접근 > IP가 변경될 경우 새로운 IP주소를 DNS 레코드에 업데이트를 하게 되면 도메인 만으로 변경된 IP에 접근할 수 있다.