CS/HTTP

실무에 꼭 필요한 HTTP - 1 (인터넷 네트워크)

Lea Hwang 2023. 6. 2. 13:01

개발자는 평생 HTTP기반 위에서 개발해야 한다. 

백엔드 개발자의 경우 웹 기술이 모두 HTTP기반으로 구현되어 있기에, HTTP를 제대로 이해하지 못하고 웹 개발부터 시작하면 깊이 있게 이해할 수 없습니다. 저도 알고 있었지만 취업을 위해 백엔드와 프론트엔드 기술을 익히고 기능개발에만 몰두했다면, 한 템포 쉬어가며 실무에서 꼭 필요한 HTTP 지식을 쌓는 시간을 가져보고자 합니다.

 

사실.. 예전에 오며가며 공부했던 내용이지만 역시 메모를 안 하면 다 휘발되나 봅니다. 이번에는 저를 위해 핵심 내용만 메모를 하면서 뇌에 새기는 작업을 해야겠습니다. 항상 이렇게 간단하게 적는다면서 구구절절 적게 되더라구요.... 

 

 

 

 

총 5편에 걸쳐서 진행할 예정입니다. 간단하게 목차를 살펴보자면,

목차

인터넷 네트워크

URI와 웹 브라우저 요청 흐름

HTTP 기본(특징, 메서드, 상태코드)

HTTP 헤더

HTTP 캐시

 

 

인터넷 네트워크

  • 인터넷 통신
  • IP(Internet Protocol)
  • TCP, UDP
  • PORT
  • DNS

 

인터넷에서 컴퓨터 둘은 어떻게 통신할까요? 바로 앞에 있다면 랜선을 꽂고 하면 되겠지만 외국에 있는 친구와는 어떤 방식으로 통신하고 어떤 규칙으로 목적지까지 안전하게 넘어갈까요?

 

이때 알아야 하는 개념이 IP입니다. 

클라이언트 IP주소와 서버 IP주소를 알면 찾아갈 수 있습니다.

 

 

IP는 지정한 IP주소에 데이터를 전달할 수 있게 해 주고 패킷(Packet) 통신 단위로 데이터를 전달하는데요.

IP패킷은 출발지와 목적지 IP가 전송 데이터를 감싸는 구조로 되어 있습니다.  

 

 

 

하지만 이런 방법엔 한계가 존재합니다. 

 

IP 프로토콜의 한계

1. 비연결성

패킷을 받을 대상이 없거나 서비스 불능 상태여도, 패킷을 전송

 

2. 비 신뢰성

중간에 패킷이 사라질 수도 있고, 패킷이 순서대로 도착하지 않을 가능성 존재

 

3. 프로그램(애플리케이션) 구분

한 PC는 하나의 IP를 가지고 있는데, 여러 프로그램을 사용시 어떻게 구분할지에 대한 문제 존재

 

 

 

그럼 이런 문제를 해결하는 방법은 없을까요? 이럴 때 필요한 개념이 TCP입니다.

 

네트워크를 공부하며 한 번쯤 들어봤을 인터넷 프로토콜 스택의 4 계층에 대해 살펴보겠습니다. 

애플리케이션 계층 - HTTP, FTP
전송 계층 - TCP, UDP
인터넷 계층 - IP
네트워크 인터페이스 계층

 

....... 네.... 그렇군요.😂  그런데 이렇게 슥 보고 끝나면 이해하기 어렵습니다.

위 표에서는 "TCP가 IP를 감싸는 형태고, IP를 보완해 주는 역할을 하는구나" 정도로 이해하시고 넘어가시면 되겠습니다.

 

TCP/IP 패킷 모습

 

 

TCP는 신뢰할 수 있는 프로토콜로 대부분 애플리케이션에선 TCP를 사용합니다. 

TCP(Transmission Control Protocol, 전송 제어 프로토콜) 특징

클라이언트에서 서버측으로 데이터를 보낸다고 가정했을 때, 

1. 연결 지향 : TCP 3 way handshake

양방향 연결을 하고 난 뒤 메시지를 보냅니다. 

 

2. 데이터 전달 보증

패킷이 누락 되면 클라이언트에서 알 수 있습니다. 또한 데이터를 전송하면 서버에서 데이터를 잘 받았는지 응답해 줍니다.

 

3. 순서 보장

만약 순서대로 오지 않았을 경우, (최적화 로직에 따라 다르겠지만, 기본적으로) 서버 측에서 패킷을 다시 보내라는 응답을 해줍니다. 

 

TCP 3 way handshake

서로 연결되었다는 걸 확인할 수 있으므로 서로를 믿을 수 있습니다.

* 물리적으로 연결된 게 아닌 개념적(논리적) 연결입니다. 

 

논리적 연결이라니... 이게 어떻게 가능할까요?

TCP/IP패킷에 전송 제어, 순서, 검증 정보 등이 들어있기 때문입니다. 

 

 

 

다음으론 TCP와 같은 계층인 UDP에 대해 알아보겠습니다. 사실 UDP는 기능은 없습니다.(?!)

IP에 PORT정도만 추가되었다고 생각하면 되겠습니다.

* PORT는 하나의 IP에 여러 애플리케이션을 구분할 때 사용합니다.

 

UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)

1. 연결 지향 : TCP 3 way handshake X

2. 데이터 전달 보증 X

3. 순서 보장 X

 

 

그럼 아무 기능없는 UDP는 쓸까요?

그 이유는 TCP는 다 좋은 데 3 way handshake 하는데 시간이 많이 걸리고 , 주고받는 응답도 해야 하고, 전달할 데이터 양도 크다 보니 전송 속도가 느립니다. 문제는 여기서 더 최적화할 수 없다는 점인데요.

이럴 때 최적화를 할 때 UDP를사용합니다. 

 

 

PORT

지금 PC에서 게임도 하고 화상통화도 하면서 웹 브라우저 요청을 한다고 가정해 봅시다. 이렇게 클라이언트가 여러 서버와 통신할 때 내 IP로 패킷이 날아올 경우 이게 어느 애플리케이션에서 온 건지 어떻게 알 수 있을까요?

 

이땐 TCP만으로는 해결할 수 없는데, PORT를 통해 같은 IP 내 프로세스를 구분하게됩니다.

패킷을 보낼 때 출발지 IP, PORT와 도착지 IP, PORT를 함께 보내기 때문입니다.

[비유]
IP가 A아파트라면
PORT는 (A아파트) 000동 0000호

 

 

다 좋은데... 

위의 설명과 그림에서 보신 것 처럼 IP는 200.200.200.2 이런 형태라 기억하기 어렵습니다. 또한 IP는 변경될 수 있는데요. 그렇게 되면 접근을 못하게 되는데 이때 등장한 개념이 DNS입니다.

DNS(Domain Name System, 도메인 네임 시스템)

DNS를 사용하면 어떤 점이 편리할까요?

우리가 도메인 명 naver.com을 DNS서버에 등록하면 ➡

DNS서버 안에서 도메인 명과 IP가 매칭이 됩니다. ➡

그럼 클라이언트는 앞으로 IP가 아닌 도메인명으로 요청 시 ➡

DNS서버가 해당 IP를 찾아서 응답해 줍니다.

따라서 IP가 변경되더라도 DNS서버가 알아서 변경해 줌으로써 해결됩니다! 

 

 

[정리]
IP : 인터넷 망에서 메시지를 주고받기 위해 필요한 개념
* 한계: 메시지 비 신뢰성, 순서 보장 못 함, 프로그램 구분 못 함 ➡ TCP가 해결

UDP: IP + PORT로 기능을 확장해서 TCP최적화에 쓰일 수 있음
PORT: 같은 IP내 여러 프로그램을 구분하기 위해 사용
DNS: IP는 형태가 복잡하고 변경 가능하기 때문에 DNS서버에 등록해서 사용

 

 

 

 

 

 

 


 

출처: https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard