HTTP

HTTP 인터넷 통신 (김영한 http)

ho코딩 2024. 1. 6. 20:47
*공부한 내용을 복습하기 위해 작성한 내용이며, 중간에 옳지 않은 내용이 포함될 수 있음.*

 

인터넷에서 컴퓨터 둘은 어떻게 통신을 할까? 

 

클라이언트와 서버간의 상호작용을 통해서,

클라이언트가 원하는 내용을 서버에서 받아오기도 하고

반대로 클라이언트가 작성한 내용을 서버에 저장하기도 한다. 

 

우리는 흔히 인터넷이라는 용어를 사용하며, 클라이언트와 서버간의 통신을 이야기한다. 

클라이언트 - 서버

하지만

이 인터넷이라고 하는 중간 단계는 눈에 보이지 않는 수많은 노드들로 이루어져있고, 단순히 서버까지 가는 경로에도 우리가 알지 못하는 많은 노드들을 거쳐서 정보들이 이동된다.  (물론, 그 노드들이 어떻게 흐르는지는 알 필요 없다...) 

 

IP 인터넷 프로토콜 

 

그 중에서도 먼저 많이 들어봤을 법한 "IP"를 이용한 통신 방법이 있다. 

 

우리가 사용하는 컴퓨터 네트워크에는 IP라는 주소가 부여되어있다.

IP의 역할은 "지정한 IP 주소에 패킷(Packet)이라는 통신 단위로 데이터를 전달" 이다.

 

IP 패킷의 정보에는 출발지 IP, 목적지 IP 등의 내용을 포함하고 있고 

패킷 안에 전송 데이터를 감싸 목적지 IP를 향해 전송된다. 

 

그럼 이 패킷은 정해진 규약에 따라 노드를 타고 움직이며 목적지 IP(서버)에 도착하게 된다. 

 

그럼 목적지 IP에서는 패킷을 받아, 패킷을 까고 안에 있는 '전송 데이터'를 읽고 처리하는 과정을 거친다. 

 

그러나, IP 프로토콜에는 3가지 문제점이 있다. 

1. 비연결성

2. 비신뢰성

3. 프로그램 구분

 

먼저 "비연결성"

비연결성

 

만약 클라이언트가 서버에 데이터를 요청하거나 보내는 경우, 서버의 전원이 꺼져있거나 장애가 발생했을 때 

그 상태에 관계없이 패킷을 전송하는 문제이다. 

 

(뭐가 문제죠..?)

 

쉽게 얘기하면, 내가 A집에 우편물을 보내는데 A가 주소를 이전했는지 안 이전했는지 관계 없이 우편물을 보내는 것이다. 

그렇다면 나는 A가 우편을 제대로 받았는지 못받았는지 확인도 못하고, 중간에 유실되어도 알 방법이 없다. 

 

2번째로 "비신뢰성 문제" 

 

이는 둘로 나눌 수 있는데 

   1.중간에 패킷이 사라지면? 

    -> 이 경우는 말 그대로 위에서 보았던, 복잡한 인터넷 망 속에서 어떠한 오류로 패킷이 유실된다면,

        이를 확인 할 방법이 없는 문제이다. 

 

    2.패킷이 순서대로 오지 않으면?

      ->패킷은 우리가 보내려는 데이터를 감싸는 껍데기 같은 것이고, 통신의 단위가 되는 것이다. 

      근데 만약, 보내려는 데이터의 크기가 커져 패킷이 너무 커지게 된다면?

      패킷을 몇 개로 쪼개서 목적지 IP로 전송하게 된다. 그런데 쪼개서 전송한 데이터가 순서대로 도착하지 못해서 

      우리가 원래 보내려고 했던 데이터와 달라질 수 있다. 

패킷 순서 문제

위 이미지의 예시를 보면 "HELLO, WORLD!"의 데이터가 너무 크다고 인식되어 

"HELLO"와 "WORLD!"로 쪼갠 상황이다. 이렇게 쪼갠 데이터를 각각 패킷으로 감싸고 서버로 전송했는데 

순서가 "WORLD!"가 먼저 도착하고 "HELLO"가 도착하여 서버에서는 "WORLD!, HELLO"로 인식하게 되는 것이다.

 

마지막으로 프로그램 구분

나중에 더 자세히 설명하겠지만,
"같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이라면?" 의 경우에서 나타나는 문제이다.

이는 "DNS"를 공부하는 파트에서 더 자세하게 다루게 될 예정이다. 

 

 

TDP / UDP

 

 

 

    다음으로는 IP프로토콜의 계층을 살펴보면 

위와 같은 4계층을 이루고 있다. 

 

방금까지는 인터넷 계층의 IP를 살펴본 것이고, 이번에는 TCP와 UDP에 대해서 알아보자. 

 

그 전에, 프로토콜 계층이 각각 어떤 일을 하는지 나타내는 그림을 보자면 

이런 형식을 띄고 있다. 

 

 

 

 

 

 

그렇다면 TCP란 ?  전송 제어 프로토콜이다. 

 

 

 

 

IP 패킷안에 TCP 세그먼트를 생성하는데 이 TCP 세그먼트에는 

출발지 PORT / 목적지 PORT / 전송 제어, 순서 , 검증 정보가 있다. 

 

TCP는 3가지 특징을 가지고 있는데

  • 연결지향 - 3 way handshake 
  • 데이터 전달 보증 
  • 순서 보장

아까 IP프로토콜의 문제점을 다시 상기시켜 보면

데이터 전달 보증순서 보장이라는 특징이 IP 프로토콜의 문제점을 보완한다는 것을 알 수 있다.

때문에 TCP 프로토콜은 "신뢰할 수 있는 프로토콜"이고 현재 대부분 TCP를 사용한다.

 

 

 

TCP 프로토콜의 가장 중요한 특징은 

  • 연결지향 - 3 way handshake 

 

IP프로토콜비연결성 문제와 비교하여 보면 쉽다.

클라이언트와 서버가 서로 연결된것을 확인하고 데이터를 전송하기 위해 (SYN -> SYN+ ACK -> ACK)의 과정을 거친다.

 

간단하게 표현하면 

 

클라이언트(SYN) : 나 너(서버)한테 연결해도 돼? 지금 연결가능해?  

서버 (SYN+ACK): 응, 지금 연결해도 돼 ! (ACK) 나도 너한테 연결해도 되니? (SYN)

클라이언트 (ACK): 응 연결해도 돼 ! 

 

이런 과정이 말끔하게 이루어지면 데이터의 전송과 수락이 이루어지는 것이다 . 

 

 

 

 

2번째 특징데이터 전달 보증으로 

클라이언트가 '데이터를 전송' 하면

서버에서 클라이언트가 전송한 데이터를 잘 받았을 경우 이에 대한 '응답'을 해줌으로 

데이터 전달 보증이 된다는 내용이다.

 

마지막으로 3번째는 순서보장이다. 

아까 IP프로토콜의 순서 오류를 보완한 내용으로, 데이터를 잘라서 패킷으로 각각 감싸 전송하였을 때, 

TCP 세그먼트 내에 순서 제어 부분을 보고 순서가 맞지 않게 도착한 경우

서버에서 클라이언트로 순서가 잘못된 부분부터 다시 보내라고 요청을 한다.  

 

 

 

 

마지막 UDP란 ? 사용자 데이터그램 프로토콜으로 

 

    -기본적으로 IP랑 거의 비슷한 형태로 기능이 거의 없다.

    -다만 IP프로토콜과 비교했을 때, PORT가 추가되고 , 체크섬이 추가된 형태이다. 

       (PORT는 아래에서 내용을 다룰 것이다. )

       (체크섬이란, 메시지가 제대로 왔는지 검증하는 기능을 가지고 있는 것)

 

TCP처럼 3-WAY-HAND SHAKE도 하지 않아 비연결적이며, 전달 보증순서 보장되지 않는다.

그저,  "빠르고, 단순하다"는 장점을 가지고 있다.

 

 

 

PORT

 

 

PORT란 항구라는 뜻을 가진 용어로 클라이언트가 한번에 2개 이상의 서버와 연결해야할 경우를 이야기한다. 

패킷을 구분하기 위한 방법이다. 

만약 클라이언트가 이미지처럼 게임/화상통화/웹 브라우저 요청을 동시에 진행할 경우 

클라이언트에서 각각의 서버에 요청 데이터 패킷을 보내게 된다 . 

그리고 서버에서 클라이언트에게 요청한 데이터에 대해 응답 패킷이 도착할 것인데

클라이언트에서는 도착한 패킷이 게임/화상통화/웹브라우저 3개 중 누구에 해당하는 패킷인지 알 방법이 없다. 

 

이를 구분하기 위해서 TCP/IP 패킷에 

IP와 PORT를 작성하게 된다. 출발지의 IP는 이렇고 만약 응답 패킷을 보낸다면 몇 번 PORT로 보내달라 명시하고 

데이터를 보낼 목적지 IP와 PORT도 패킷에 작성한다.

 

 

이를 비유하면

IP는 A아파트 101동 정도의 주소이고, PORT는 몇호 인지를 나타낸다. 

이렇게 데이터를 주고 받을 PORT를 정하게 되면, 한 번에 많은 양의 데이터 패킷이 들어와도 헷갈리지 않을 수 있다. 

 

PORT 번호도 지정되어 있는 것이 있는데 

이미지 처럼 0~1023은 이미 용도가 거의 지정되어 있는 PORT이기 때문에 사용하지 않는 것이 좋고 

그 외의 65535번까지는 할당하여 쓸 수 있는 PORT이다. 

 

 

 

 

DNS

마지막으로 DNS이다. (Domain Name System)

DNS는 우리가 숫자로된 IP주소를 외우기 어렵기 때문에 (ex. 192.168.xxx.~~)

숫자로 된 IP주소에 이름을 부여해준 것이다. (ex. naver.com / google.com)

 

또한 IP는 변경될 수 있기 때문에 내가 외운다고 하더라도 변경되었을 경우

다시 외우거나 바뀐 주소를 일일이 찾아보기 번거롭다는 점을 보완할 수 있다.

 

예를 들어 클라이언트가 구글에 접속하려고 하는데 도메인 명은 알고 IP주소를 모르는 경우

도메인 명 google.com을 입력한다면, DNS서버에 접속하여 도메인과 일치하는 ip주소가 있는지 확인하고

있다면, DNS서버에서 클라이언트에게 IP주소를 답해주고, 클라이언트는 답 받은 IP주소를 이용하여 서버에 접속한다.

 

이처럼 DNS서버는 전화번호부이고 , IP주소는 일종의 전화번호라고 할 수 있다. 

'HTTP' 카테고리의 다른 글

HTTP 헤더 (http 김영한)  (1) 2024.01.07
HTTP 상태코드 (http 김영한)  (0) 2024.01.07
HTTP API 설계 (GET/POST/PUT/PATCH/DELETE) (김영한 HTTP)  (0) 2024.01.06
HTTP 서버 (김영한 HTTP)  (0) 2024.01.06
HTTP URI/URL/URN (김영한 http)  (1) 2024.01.06