인터넷에서 컴퓨터 둘은 어떻게 통신할까?
바로 IP(인터넷 프로토콜)를 이용하는 것이다.
IP(인터넷 )의 역할은 크게 두 가지가 있다.
- 지정한 IP 주소(IP Address)에 데이터 전달
- 패킷(Packet)이라는 통신 단위로 데이터 전달
여기서 패킷이란?
- 출발지 IP, 목적지 IP, 전송데이터, 기타 등등을 포함한 통신 단위이며 이것을 통해 IP끼리 데이터를 전달한다.
클라이언트가 패킷을 전달하면
서버는 클라이언트의 패킷을 받고 다시 클라이언트에게 응답값으로 패킷을 전달한다.
그러나 위의 과정에서 IP 프로토콜의 한계가 있다.
- 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송, 즉 패킷을 받을 서버가 꺼져있어도 클라이언트는 그것을 모르고 패킷을 전달한다. 왜? 클라이언트는 대상 서버가 패킷을 받을 수 있는 상태인지 모르기 때문이다.
- 비신뢰성
- 중간에 패킷이 사라지면?
- 패킷이 순서대로 안오면?
- 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?
- 예를 들어 하나의 IP에서 뮤직 애플리케이션, 웹 어플리케이션 등 애플리케이션이 둘 이상인 경우 IP는 어떤 애플리케이션에 패킷을 전달해야하는지 구분하지 못한다.
이러한 문제점들을 해결하기 위해 등장한게 TCP(전송 제어 프로토콜), UDP(사용자 데이터그램 프로토콜)이다.
인터넷 프로토콜의 스택은 4계층으로 나뉜다, 밑의 그림을 통해 동작원리를 살펴보자
위의 그림을 보면 위에서 배운 IP 패킷 안에 TCP, HTTP 패킷이 포함되어 있다.
IP 패킷 안에 있는 TCP 세그먼트를 보면 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등 다양한 데이터가 들어있다. 이를 통해 IP 프로토콜의 문제점을 해결할 수 있다. 이 패킷을 이제 TCP/IP 패킷이라고 합쳐서 말할거다. 더 자세히 살펴보자.
TCP(전송 제어 프로토콜)에는 크게 3가지 특징이 있다.
- 연결지향 - TCP 3 way handshake(가상 연결)
- 데이터 전달 보증
- 순서 보장
TCP 3 way handshake
1. 클라이언트가 SYN(접속 요청)을 서버에게 보낸다.
2. 서버는 ACK(요청 수락)을 하며 동시에 클라이언트에게 SYN(접속 요청)을 보낸다.
3. 클라이언트는 ACK(요청 수락)와 함께 데이터를 전송한다.
데이터 전달 보증
- 클라이언트가 서버에게 데이터를 전송하면 서버는 데이터를 잘 받았다고 응답한다.
순서 보장
- 예를 들어 클라이언트가 패킷1, 패킷2, 패킷3 순서로 서버에게 전송했는데 서버에는 패킷1, 패킷3, 패킷2 순서로 도착했다면 서버는 클라이언트에게 패킷2부터 다시 보내라고 요청한다.
UDP(사용자 데이터그램 프로토콜) 특징
- 하얀 도화지에 비유(기능이 거의 없음)
- 연결지향, 데이터 전달 보증, 순서 보장 이 3가지 기능이 안됨.
- 그렇지만 단순하고 빠르다
- IP와 거의 같아서 애플리케이션에서 추가 작업이 필요하다.
- 이러한 이유로 HTTP/3 에선 TCP 대신에 UDP를 사용해 애플리케이션에 필요한 추가 작업만을 통해 성능을 개선하고 있다. 그렇지만 TCP를 사용하는 HTTP/1.1을 우리는 가장 많이 사용하고 있다.
이제 IP 프로토콜의 문제점도 해결할 수 있는 TCP와 UDP에 대해서도 알게 되었다.
그렇지만 IP에서 한번에 둘 이상 연결해야 하면 어떡해야 할까?
여기서 알아야 할 게 PORT이다.
위의 그림을 보자. 예를 들어 게임 서버 연결을 하려고 한다면 클라이언트는 서버의 IP 200.200.200.2의 11220 PORT로 패킷을 보낸다. 그러면 서버는 클라이언트의 IP 100.100.100.1의 8090 PORT로 패킷을 보낸다. 서로 PORT 값을 어떻게 알고 있을까? 위에서 언급했던 TCP/IP 패킷을 떠올려보자.
TCP/IP 패킷을 보면 출발지, 목적지 PORT가 포함되어 있다. 이를 통해 서로 PORT 값을 주고 받을 수 있는 것이다. 이처럼 PORT는 같은 IP 내에서 프로세스를 구분한다. 쉽게 비유하자면 서버의 IP를 아파트라고 생각하고 그 안에 있는 수많은 호를 PORT라고 생각하면 되겠다.
그렇다면 IP가 변경되면 어떻게 될까?\
이때 알아야 할 게 DNS이다.
DNS(Domain Name System)
- 전화번호부
- 도메인 명을 IP 주소로 변환
1. 구글의 기존의 IP가 200.200.200.1에서 200.200.200.2로 변경되면 DNS 서버에 기존에 있던 IP값을 변경한다.
2. 클라이언트는 도메인 명(구글)로 DNS서버에 요청하면 DNS서버는 해당 도메인의 IP를 응답값으로 준다.
3. 받은 IP로 클라이언트는 서버에 접속한다.
이로써 인터넷 네트워크에 대한 정리를 마무리하겠다.
느낀점☞
개발 공부를 시작하면서 여지껏 인터넷 네트워크에 대해 제대로 공부를 해본적이 없었다. 단순히 코드 작성하고 그런 공부만 하다가 인터넷 네트워크에 대해 배우고 어떻게 클라이언트와 서버가 통신을 하는지 알게 되었다. 프로젝트를 하다보면 프론트엔드와 협업은 필수적이다. 이때 어떻게 프론트엔드와 통신해야 하는지 궁금한 점이 많았었다. 인터넷 네트워크 뿐만 아니라 앞으로 API 통신에 대해서도 공부를 많이 해야겠다고 생각이 들었다.
출처 / 참고 : 모든 개발자를 위한 HTTP 웹 기본 지식(인프런) - 김영한 강사님
'HTTP' 카테고리의 다른 글
HTTP 메서드와 속성 - 안전, 멱등, 캐시가능 (0) | 2023.08.13 |
---|---|
HTTP 특징 - 무상태 프로트콜(Stateless) (0) | 2023.08.13 |