본문 바로가기
네트워크&웹 기술(Network&Web)

IP, TCP/UDP, DNS

by codeyaki 2022. 4. 11.
반응형

패킷 교환(IP - Internet Protocol, 인터넷 프로토콜)

독립적인 다양한 형태의 네트워크를 엮어내겠다는 아이디어에서 시작했다.

따라서 기존의 전화망 이외에 위성을 사용한 통신망, 지상의 무선 네트워크도 모두 포괄해야 했기 때문에 선을 연결해서 하는 전화망 타입인 회선교환이 아닌 데이터를 패킷으로 쪼개 교환하는 방법을 택해였다.

이에 따라 다양한 네트워크에서 사용하는 통신 규칙이 (패킷의 틀과 같은) 필요했다.

이렇게 만들어진 것이 바로 IP(Internet Protocol)이다.

다양한 네트워크를 노드라고 부르기로 하였고 모든 노드들을 유기적으로 연결했다.

이러한 노드들을 통해서 나의 메시지(패킷)를 전달하기 위해서는 주소가 필요하다.

(마치 우체국을 통해서 우편을 보낼때 상대방의 주소를 꼭 적어야 하는 것처럼 말이다!)

 

IP의 특징!

1. 비연결성

패킷에는 규칙이 있는데  [출발지 IP, 목적지 IP, 기타 옵션, 메시지] 이러한 모양으로 묶어서 보내야 한다.

이렇게 만든 패킷을 가까운 노드에 전달하면 IP규칙에 따라서 목적지 IP의 컴퓨터에게 전달해준다.

또한 상대방의 의사와는 상관없이 패킷을 전달할 수 있다.

(우편을 보내는 것은 상대편의 상황과 무관하게 보내는 사람의 마음!!)

 

2. 비신뢰성

패킷은 주소가 같다고 항상 같은 노드들을 거친다는 보장은 없다. 인터넷망은 실시간으로 변경되며 문제가 발생한 경우 받지 못할 수도 있다. (마치 우체국 배달부가 매번 같은 분이 아닐 수도 있고 다른 길로 우편을 배송하기도 한다! 또한 우편을 보낸 뒤 상대방이 부재중이라 받지 못하거나 중간에 우편이 분실되기도 하는 것과 같다.)

패킷은 메시지의 크기가 너무 크다면 한 개의 패킷에 메시지를 전부 보낼 수 없어 패킷을 나눠서 보내야 하는데(패킷 단편화) 가장 먼저 보낸 패킷이 가장 먼저 도착한다는 보장이 없다! 왜냐하면 패킷단위로 길을 찾기 때문에 더 빠른 길이 생길 수도, 길이 아예 없어질 수도 있는 것이다.  (같은 사람에게 우편을 여러개 보낸다고 했을 때 먼저 보낸 우편이 제일 먼저 도착한다는 보장이 없는 것처럼 말이다).

 

3. 프로그램 구분 불가능

과거에는 패킷에 단순 IP주소만 담겨 있어 어떤 프로그램이 사용하지는 구분해주지 않는다.

(우편으로 따지면 받는사람 주소만 쓰고 누구에게 보낼 것인지 이름은 적지 않고 보내는 것과 같다.)

때문에 하나의 PC에서 여러가지 프로그램이 동시에 네트워크를 사용하는 것이 불가능했다.

이러한 점들을 해결하기 위해서 IP를 중심으로 계층을 나누어 만들게 되었다.

인터넷 프로토콜 스택의 4 계층

TCP/UDP을 이해하기 위해서는 인터넷 프로토콜 스택 계층이 어떠한 구조를 가지고 있는지 먼저 이해할 필요가 있다.

총 4가지로 나뉘어 있다. 가장 높은 계층부터 설명해 보자면

  1. 애플리케이션 계층 (HTTP, SMTP, FTP, Telnet)
    : 메일, 게임, 채팅 프로그램 와 같은 실질적으로 사용자들이 접하게 되는 TCP/UDP 기반 응용 프로그램들을 만들 때 사용하는 표준 인터페이스를 제공한다. 실질적인 데이터를 담고 있다. 해당 인터페이스를 토대로 프로그램들을 제작하게 된다.
  2. 전송 계층 (TCP, UDP)
    : IP주소에 포트를 더해 전달되는 패킷의 오류와 재전송 등 '신뢰성'을 갖게 만들게 해 주거나(TCP), 비신뢰성이지만 좀 더 빠른 속도로 전달하게 만들어준다.(UDP)
    해당 계층에서의 데이터 단위는 세그먼트(Segment)라고 한다.
  3. 인터넷 계층 (IP)
    : 패킷을 목적지까지 효율적으로 '전달'하는 것만 고려한다. IP주소(논리 주소)를 판독해 목적지까지 최선의 길을 찾는 역할. 최선의 길을 찾는 것을 라우팅이라고 함.
    해당 계층에서의 데이터 단위는 데이터그램(Datagram) 혹은 패킷(paket)이라고 한다.
  4. 네트워크 인터페이스 계층
    : 비트단위의 물리적인 TCP/IP 패킷의 전달과 수신 과정에 대한 부분을 담당하는 계층 (랜카드, 네트워크 드라이버와 같은 하드웨어와 관련된 요소들을 지원한다.)
    물리적인 주소인 MAC 주소를 사용하며 해당 계층에서의 데이터 단위는 프레임(Frame)이라고 칭한다.

전체적인 구조를 볼수있는 그림

 

간단하게 동작 방식을 설명하자면

전송할 때에는 애플리케이션 -> 전송 -> 인터넷 -> 네트워크 인터페이스 -> 인터넷망 -> 상대방 PC 순으로 데이터가 이동하며 각 계층을 지날 때 알약을 만드는 것처럼 자기 계층의 정보로 전달받은 것을 감싸게 된다. 이를 캡슐화라고 한다.

 

애플리케이션 계층에서 데이터를 전송계층으로 보내면 전송계층에서는 TCP헤더라는 것으로 데이터를 감싸서 세그먼트를 만든다. 이 세그먼트를 인터넷 계층으로 전달을 하면

인터넷 계층에서는 IP 헤더를 붙여 데이터그램(패킷)으로 만든다. 마찬가지로 이 데이터그램을 네트워크 인터페이스 계층으로 전달하면 MAC 주소 등 관련 정보를 붙여 프레임으로 만든 뒤 인터넷망으로 전송한다. 이 정보를 토대로 각 노드를 거쳐 목적지로 전달되며 

수신할 때에는 해당 과정을 반대로 거쳐 데이터를 받을 수 있게 된다.

 

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

특징

  • 연결 지향(TCP 3 way handshake 가상연결)
    : 상대방이 받을 수 있다는 응답이 있어야만 데이터를 전송한다.
  • 데이터 전달 보증
  • 순서 보장
  • 신뢰성 보장
  • 포트 추가

TCP 3 way handshake

TCP에서는 데이터 전송을 하기 전에 상대방의 PC가 받을 수 있는 상태인지 확인 후 전송하게 되는데 이를 확인하는 과정을 TCP 3 way handshake라고 한다. 

3개의 과정으로 이루어져 있다.

  1. 클라이언트가 서버에게 SYN를 전송한다. (접속 요청)
  2. 서버가 응답이 가능한 상태면 SYN + ACK를 클라이언트에게 전달한다. ( 접속 요청, 접속 수락)
  3. 클라이언트가 서버에게 ACK를 전송한다. (접속 수락) 

이후 패킷을 전송하게 된다. 해당 과정이 마치 악수를 하는 과정과 같다고 하여 붙여진 이름이다.

주의할 점은 서버와 클라이언트가 실질적으로 연결된 것이 아닌 가상으로 연결이 된 것이다. 즉 그 사이에 수많은 노드들이 존재한다. (나를 위한 전용 회선이 아니다!)

하지만 만약 1단계에서 SYN를 보냈는데 서버에서 응답이 없다면 데이터를 전송하지 않는다.

 

해당 과정을 애니메이션으로 나타내면 이러하다. 

이후에 패킷을 전송할 때도 항상 잘 받았다는 응답을 받고 이에 따라 패킷 순서를 정렬하거나 못 받은 패킷에 대해 재전송을 요청하게 된다. (TCP에는 이를 위해 헤더에 각종 정보들이 있다.)

 

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

  • 기능이 거의 없음
  • 데이터 전달을 보증해주지 않음
  • 순서를 보장해주지 않음
  • 따라서 TCP에서 사용하던 3 way handshake를 사용하지 않음
  • 이러한 과정이 없기 때문에 간단하고 빠름.
  • 즉 IP와 거의 같으나 오류제어(체크섬), 포트(Port)만 추가된다.

TCP는 정형화되어있어 그대로 사용해야 하는 반면 아무런 기능이 없기 때문에 내가 원하는 방법으로 구현할 수 있다!

최근에는 UDP를 이용해 TCP의 과정을 단축하여 사용하는 방법이 점점 늘어나는 추세라고 한다.

 

Port(포트)

TCP와 UDP에서 Port, 포트란 말이 자꾸 등장한다. 포트에 대해서 간략하게 설명해보자면

요즘에는 하나의 PC에서는 여러 가지 작업을 할 수 있다. (게임을 하면서 화상통화를 하면서 웹브라우저를 할 수 있는 것처럼 말이다!) 이 작업들을 각각 하나의 메시지로 생각을 해보자.

옛날 TCP/UDP가 없을 땐 IP에서 IP주소로만 전송을 해서 수신 측에서 해당 메시지가 어떤 작업인지 분류도 해야 했어서 동시에 여러 작업의 메시지를 주고받기가 매우 어려워서 한 번에 하나의 작업밖에 못했다.

이를 해결하기 위해서 포트가 나오게 되었다. (마치 우편에서 보낼 사람, 받는 사람의 이름을 적어주는 것과 같다!)

포트를 IP주소와 같이 적어 보내주게 됨으로써 어떤 애플리케이션에서 사용할지 알게 되는 것이다. 따라서 수신 측과 송신 측에서 포트번호만 적어주면 분류 작업을 할 필요가 없어져 동시에 여러 메시지(작업)의 데이터를 보내도 자연스럽게 작업별로 각각 통신하는 것처럼 작동하게 되어 동시에 여러 작업이 가능토록 한다.

 

포트번호는 기본적으로 자유롭게 부여할 수 있으며 수신 측과 송신 측의 번호가 다를 수도 있다.

포트 번호는 0번부터 65535번 까지 존재하는데 이 중 0~1023번은 잘 알려진 포트로 가급적 사용하지 않는 것이 좋다.

잘 알려진 포트(well-known port)

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

그 외에 더 많은 잘 알려진 포트들은 아래 사이트에서 확인할 수 있다.

https://ko.wikipedia.org/wiki/TCP/UDP%EC%9D%98_%ED%8F%AC%ED%8A%B8_%EB%AA%A9%EB%A1%9D

 

TCP/UDP의 포트 목록 - 위키백과, 우리 모두의 백과사전

잘 알려진 포트(well-known port)는 특정한 쓰임새를 위해서 IANA에서 할당한 TCP 및 UDP 포트 번호의 일부이다. 일반적으로 포트 번호는 다음과 같이 세 가지로 나눌 수 있다. 0번 ~ 1023번: 잘 알려진 포

ko.wikipedia.org

 

++++ IP, TCP, UDP 헤더 ++++

 

더보기

IP(IPv4) header

아래 TCP/UDP에서 받은 세그먼트를 해당 구조로 만들어져 있는 헤더로 감싸서 패킷을 만든 후 아래 계층(네트워크 인터페이스 계층)으로 전달해준다.

TCP 헤더

UDP 헤더

애플리케이션 계층에서 받은 데이터를 받아서 해당 구조의 TCP/UDP헤더로 감싸서 세그먼트로 만든 후에 IP계층에 전달해준다!

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

IP는 유동적인 주소이기도 하고 기억하기도 쉽지 않기 때문에 홈페이지 접속을 IP주소로만 한다면 계속 IP주소를 확인해야 한다.

따라서 DNS( 도메인 네임 시스템, Domain Name System)를 사용하게 되었는데 이는 마치 중간에서 이름과 IP주소를 매칭 시켜주는 역할을 한다. (마치 전화번호 부와 같은 역할이다.)

예를 들어 구글의 IP주소는 200.200.200.2라고 할 때 우리는 google.com로 접속을 한다. 

이는 구글이 미리 DNS에 자기 서버의 IP를 등록해 놓았고 

클라이언트(사용자)들이 google.com으로 접속을 하면 먼저 DNS에 접속을 하게 된다. DNS에서 google.com에 매칭 되는 IP주소인 200.200.200.2를 응답해주고 클라이언트는 자연스럽게 구글의 서버인 200.200.200.2로 접속하게 되는 것이다.

반응형

'네트워크&웹 기술(Network&Web)' 카테고리의 다른 글

HTTP 알아보기 4 - 헤더  (0) 2022.04.15
HTTP 알아보기 3 - 상태 코드  (0) 2022.04.14
HTTP 알아보기 2 - 메서드, API  (0) 2022.04.13
HTTP 알아보기 1 - 특징, 메시지  (0) 2022.04.13
URI, URL, URN  (0) 2022.04.12