본문 바로가기

Infrastructure/Network

[Protocol] 인터넷 통신

HTTP를 알아보기전에 인터넷 통신에 대해서 알아본다.

목차는 아래와 같다.

  • IP(Internet Protocol)
  • TCP, UDP
  • PORT
  • DNS

IP (인터넷 프로토콜 역할)

인터넷 통신을 하기 위한 모든 노드(클라이언트, 서버...)들은 자신만의 고유한 IP 주소를 가지고 있다.
이러한 IP의 역할을 아래와 같다

  • 지정한 IP 주소(IP Address)에 데이터를 전달한다.
  • 패킷(Packet)이라는 통신 단위로 데이터를 전달한다.

IP 패킷에는 대표적으로 출발지 IP, 목적지 IP, 전송 데이터로 이루어져 데이터를 전달할 때 패킷에 명시되어 있는
목적지 IP 주소로 데이터가 전달된다.

하지만 이러한 IP 프로토콜에도 아래와 같은 한계점이 있다.

  • 비연결성
  • 비신뢰성
  • 프로그램 구분 불가

하나씩 무엇을 뜻하는지 알아본다.

  • 비연결성:

    목적지 IP가 존재하지 않는 IP 이거나 목적지의 노드가 서비스 상태가 아니더라도 패킷을 전송한다.
    한마디로 상대방의 상태는 전혀 생각하지 않고 일방적으로 패킷을 전송한다.

  • 비신뢰성:

    여러개의 패킷을 보낼때 중간의 패킷이 누락되더라도 클라이언트, 서버 그 누구도 알지 못한다.
    여러개의 패킷을 보낼때 패킷들의 순서가 뒤섞이더라도 받는쪽에서는 알지못한다.
    예를들어 안녕하세요라고 채팅서버에서 클라이언트에게 전달했다고 가정해보자. 이때 하세요가 누락되었다고 가정해보자
    뜻하지 않게 클라이언트는 사용자에게 '안녕' 이라고 반말을 표시할 것이다.

  • 프로그램 구분 불가

    같은 IP를 사용하는 노드에서 사용하는 IP를 사용하는 프로그램이 여러개라면 구분할 수 없다.
    여러분이 게임하면서 스트리밍으로 노래를 듣는다고 가정해보자.
    여러분의 PC가 IP만 사용한다면 지금 받은 패킷이 게임을 위한 패킷인지 노래를 듣기위한 패킷인지 PC는 알지못한다.

이러한 IP 프로토콜의 한계점을 개선하기 위해 우리는 TCP와 함께 사용한다.
TCP를 알아보기 전에 인터넷 프로토콜 스택 4계층에 대해서 알아본다.

아래는 한번쯤은 들어봤을 인터넷 프로토콜 스택의 4계층이다.

internet_protocol_stack

여러분이 카카오톡 PC 버전을 통해서 친구에게 '안녕'이라고 메시지를 보낸다고 가정해보자.

kakaotalk_message_transfer

애플리케이션 계층의 카카오톡이 '안녕'이라는 메시지를 생성하고 SOCKET 라이브러리를 통해 전달할 것이다.
이후에 OS 계층에서 TCP 정보를 생성하고, '안녕' 메시지가 담긴 데이터를 포함시킬 것이다.
TCP 정보가 생성된 이후 목적지IP, 도착지IP까지 포함되게 될 것이다.
이후 여러분의 PC에 설치된 LAN 드라이버와 LAN 장비에 의해 카카오톡 채팅 서버에 데이터가 전송되게 될 것이다.

자세하게 TCP에는 어떤 특성이 있고 어떻게 IP의 한계점을 극복하는지 알아보도록 한다.

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

TCP의 특성은 아래와 같다

  • 연결지향(3 way handshake)

  • 데이터 전달 보증

  • 순서 보장

연결지향부터 어떤 특성인지 알아본다.

  • 연결지향(3 way handshake)

3_way_handshake
아래에서 사용되는 SYN는 synchronize sequence numbers를 뜻하며 ACK는 acknowledgements를 뜻한다.

1) 클라이언트는 서버에 접속을 요청하는 SYN 패킷을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
2) SYN 요청을 받은 서버는 클라이언트에게 SYN + ACK 패킷을 보내고 SYN_RECEIVED 상태가 된다.
3) 클라이언트는 서버에 ACK를 보내고 서버가 ACK 패킷을 받게되면 연결이 이루어지고 데이터를 송수신 할 수 있는 상태가 된다. 이러한 상태를 Established라고 한다.

아래는 TCP 3 way handshake 상태를 정리한 표이다.

상태 설명
Closed 닫힌 상태
Listen 포트가 열린 상태로 연결 요청을 대기중인 상태
SYN-sent SYN 요청을 완료하고 SYN/ACK 패킷을 기다리는 상태
SYN-received SYN 요청을 받고 SYN/ACK 패킷을 보낸 이후 ACK 응답을 기다리는 상태
Established 연결이 완료되어 데이터 송수신이 가능한 상태
  • 데이터 전달 보증

TCP 통신의 경우 패킷을 수신한 쪽에서 패킷을 정상적으로 받았다는 ACK 패킷을 전달한다.
송신하는 쪽에서 패킷을 정상적으로 받았다는 ACK 패킷을 전달받기 전까지 패킷을 재전송하기때문에 데이터의 전달이 보증된다.

  • 순서 보장

송신하는 쪽에서 보낸 패킷들의 순서가 지켜지지 않은 상태로 수신하더라도
L4: Transport Layer에서 송신하는 쪽에서 보낸 순서대로 재조립하여 Application Layer로 전달한다.

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

TCP와 많이 비교되는 UDP는 어떠한 속성들을 가졌는지 TCP와 비교하여 간략하게 알아본다.

  • 연결지향(X)
  • 데이터 전달 보증(X)
  • 순서 보장(X)

한마디로 정리하면 IP + PORT + CheckSum 정도의 기능만 있다고 볼 수있다.
UDP를 사용한다면 Application Layer에서 직접 개발자들이 미지원 항목들에 대한 처리 로직이 필요하다.

PORT

동일한 IP에서 여러 Application이 동작하고 있는 경우 이를 구분하기 위해 각자 다른 PORT를 사용하고
동일한 IP로 수신된 패킷들을 해당 패킷이 필요한 Application에 전달한다.

포트는 총 0 ~ 65535 범위에 할당이 가능하다.
단, 0 ~ 1023은 잘 알려진 포트이므로 사용하지 않는 것이 좋다.

아래는 대표적으로 알려져있는 포트들이다.

  • FTP - 20, 21
  • TELNET - 23
  • HTTP - 80
  • HTTPS - 443

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

사람이 읽을 수 있는 도메인을 머신이 읽을 수 있는 IP주소로 변환하는 시스템이다.

google.com은 누구나 쉽게 기억하고 필요할 때 쉽게 입력하고 구글에 접속할 수 있다.
하지만 구글에 접속할 때 마다 921.214.291(예시)를 입력해야한다고 가정해보자.
아무도 구글에 접속하고 싶지 않을 것이다.
심지어 IP주소는 필요에 따라 자주 변경되는데 과연 구글에 접속하는 사용자들이 이 변경내용에 영향을 받아야하는가

이러한 문제점을 해결해주는 것이 DNS다.

1) 클라이언트가 브라우저에 google.com이라는 도메인을 입력한다.
2) 브라우저는 Domain Name Server에 google.com 도메인에 맞는 IP가 있는지 검색한다.
3) 검색된 IP주소가 있다면 해당 IP로 접속한다.

이러한 과정을 거치기 때문에 사용자는 구체적인 IP를 기억하지 않아도되고
IP 주소의 변경 유무 또한 신경쓰지 않아도 된다.

'Infrastructure > Network' 카테고리의 다른 글

[HTTP] 메서드 - 2 (종류)  (0) 2021.06.23
[HTTP] 메서드 - 1 (API URI 설계)  (0) 2021.06.23
[HTTP] 메시지 구조  (0) 2021.06.23
[HTTP] 기본  (0) 2021.06.22
[URI] URI와 WebBrowser  (0) 2021.06.22