본문 바로가기

문돌이 존버/프로그래밍 스터디

인터넷 네트워크 및 URL 개념 간단 정리

반응형
본 글은 인프런의 "모든 개발자를 위한 HTTP 웹 기본 지식" 강의를 듣고 정리한 일지입니다.

IP: 인터넷 프로토콜 역할

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

전송 계층은 자신이 만들어낸 작은 조각들을 메시지 목적에서 재구성할 수 있도록 각 조각에 순서번호들을 추가한다. 이 조각이 패킷이라 불리는데, 네트워크 계층에 넘겨지는 것이다. 패킷들은 최종 목적지 전송 계층에 도착할 때까지 서로 무관한 개별 메시지로 취급된다. 인터넷상의 패킷 경로를 따라 각 단계에서 패킷을 어느 방향으로 전송할지 결정하는 것은 네트워크 계층의 일이다.

IP 프로토콜의 한계

1. 비연결성
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송됨
2. 비신뢰성
- 중간에 패킷이 사라질 경우가 발생
- 패킷이 순서대로 전송되지 않는 경우 발생(전송하려는 메시지가 약 1500 Byte가 넘을 경우 끊어서 보내기 때문)
3. 프로그램 구분
- 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상일 경우 구분 문제 발생

IP 프로토콜의 한계를 극복하기 위해 TCP 및 UDP를 함께 사용한다. TCP/UDP 설명에 앞서 인터넷 프로토콜 스택의 4계층을 살펴보자.

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

좀 더 깔끔하게 계층을 파악하려면 아래 그림을 참고하자.

<출처: networkencyclopedia>

프로토콜 계층의 전체적은 흐름을 정리하면 아래와 같다.

1) 프로그램이 Hello, world! 메시지 생성, 2) SOCKET 라이브러리를 통해 전달, 3) TCP 정보 생성, 메시지 데이터 포함, 4) IP 패킷 생성, TCP 데이터 포함

네트워크 인터페이스에 해당하는 LAN 드라이버(장비)에 Ethernet frame을 씌우는데, 참고로 Ethernet이란 가정이나 건물과 같은 로컬 환경(LAN, Local Area Network)의 컴퓨터 및 기타 장치를 네트워크에 연결하기 위해 개발된 통신 표준이다. 여러 장치를 연결하여 다른 사람들과 정보를 작성, 저장 및 공유하는 것으로 대표적인 구성 방식은 버스형과 스타형이 있다. 다만 버스형은 잦은 충돌이 있어 현재는 스타형 구조로 변경되고 있다고 한다. Ethernet frame에 대한 정보는 여기서 확인할 수 있다.

TCP(Transmission Control Protocol)

전송 계층에선 출발지 및 목적지 PORT, 전송 제어, 순서, 검증 정보 등이 포함되어 있어 IP 프로토콜의 한계를 보완한다. 

1. 연결지향: TCP 3 way handshake(논리적 연결)
- 클라이언트에서 서버에게 SYN(접속 요청)을 보냄 -> 서버에서 SYN + ACK(요청 수락)을 보냄 -> 다시 클라이언트에서 서버에게 ACK을 보냄 -> 데이터 전송
(참고로 ACK와 함께 데이터 전송도 가능)
2. 데이터 전달 보증
- 클라이언트에서 데이터를 전송하면 서버에서 받았다는 응답 전달
3. 순서 보장
- 패킷1, 2, 3 순서로 전송했을 때 서버에서 패킷1, 3, 2 순서로 도착했다면 다시 클라이언트에게 패킷 2부터 다시 보내라는 요청
(참고로 서버 단에서 드라이버를 통해 패킷3, 2 순서만 바꿔주면 되겠다는 최적화를 진행할 수도 있음)

TCP는 신뢰성이 높은 프로토콜이며 현재는 대부분 TCP를 사용한다. 하지만 연결지향, 데이터 전달 보증이란 특성 때문에 효율성이 떨어지는 단점이 있다.

UDP(User Datagram Protocol)

TCP에 비해 연결지향, 데이터 전달 보증, 순서 보장 등 기능의 거의 없다고 보면 된다. 다만 방식이 단순하고 빠르다는 장점을 가지고 있다. 정리하면 IP와 거의 같으며, PORT 및 체크섬(Checksum) 정도만 추가되어 있다고 보면 된다.

애플리케이션 계층의 각 프로그램에는 고유한 PORT 번호가 있다. 내 PC로 게임도 하고, 음악도 듣는다면 각각 패킷이 전송될텐데, 이를 구분하는 역할을 한다. 체크섬이란, 송신된 데이터의 무결성을 보호하는 방법이라고 생각하고 넘어간다.

PORT

IP만 사용한다면 클라이언트 입장에선 동일한 IP를 가진 서버에서 보내는 여러 정보를 구분하기 어렵다. 이를 해결하기 위해 전송계층에 출발지, 목적지 PORT가 추가적으로 포함이 된다. 

예를 들어, 웹 브라우저의 경우 보통 80번 PORT를 사용하는데 이는 서버 단의 PORT를 가리킨다. 클라이언트에서 웹 브라우저에 접속하고 로그인 혹은 게시글을 작성하면 80번 PORT의 서버에서 이를 받아들이고, 적절한 결과값을 클라이언트 PORT에 전달한다. 어떻게 클라이언트의 PORT까지 알 수 있느냐라고 한다면, 애초에 요청 패킷을 보낼 때 출발지 PORT가 담겨있기 때문이다.

0~65535: 할당 가능
0~1023: 잘 알려진 포트로 사용하지 않는 것이 좋음
대표적인 예시:
1. FTP - 20, 21
2. TELNET - 23
3. HTTP - 80
4. HTTPS - 443

DNS(Domain Name System)

IP는 변경될 수 있고, 기억하기도 어렵다. DNS 서버에서 도메인 명과 IP를 매핑하면 클라이언트 입장에선 IP가 아닌 도메인 명을 검색해서 원하는 정보를 찾으면 된다.


URI(Uniform Resource Identifier)

"URI는 로케이터(locator), 이름(name) 또는 둘 다 추가로 분류될 수 있다"

Uniform: 리소스를 식별하는 통일된 방식
Resource: URI로 식별할 수 있는 모든 것(제한 없음)
Identifier: 다른 항목과 구분하는데 필요한 정보

자원 자체를 식별하는 방식에는 URL(Resource Locator) 및 URN(Resource Name)이 있다. 아래에서 위의 주소가 우리가 흔히 보던 형식의 URL이고, 밑의 주소가 URN이다. 

<출처: https://www.ietf.org/rfc/rfc3986.txt>

URL - Locator: 리소스가 있는 위치를 지정
URN - Name: 리소스에 이름을 부여

URL 형식 분석

shceme://[userinfo@]host[:port][/path][?query][#fragment]

https://www.google.com:443/search?q=python

1. 스키마(scheme)

주로 프로토콜을 사용한다. 여기서 프로토콜이란, 어떤 방식으로 자원에 접근할 것인가 하는 약속 및 규칙을 의미하는데, http, https, ftp 등이 있다. http나 https의 경우 포트 입력은 생략 가능하다.

2. 사용자 정보(userinfo)

URL에 사용자 정보를 포함해서 인증하는 것이지만, 거의 사용하지 않는다.

3. 호스트(host)

도메인명 또는 IP 주소를 직접 사용 가능하다. 

4. 포트(port)

접속 포트를 가리키며, 보통 생략하는 경우가 대다수다.

5. 경로(path)

리소스 경로를 가리키며 계층적인 구조를 가진다. 반드시 계층적 구조를 설계해야 한다는 것은 아니지만 이해하기 쉽기에 사용한다.

6. 쿼리(query)

key=value 형태이며, ?로 시작하고 &로 추가가 가능하다. 이를 쿼리 파라미터 혹은 쿼리 스트링(string)이라고도 불린다.

7. 프래그먼트(fragment)

html 내부 북마크(목차 하이퍼링크) 등에 사용되며 서버에 전송되는 정보는 아니다. 가끔 긴 내용의 문서를 볼 때 URL 마지막에 #가 붙어있는 것을 확인할 수 있다.

 

728x90
반응형