일러두기
본 글은 김영한님의 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의에 대한 복습노트입니다.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC#
본문
인터넷 통신
인터넷에서 두 대의 컴퓨터가 서로 데이터를 주고 받을 때, 데이터를 요청하는 쪽을 클라이언트, 데이터를 제공하는 쪽을 서버라고 한다. 인터넷 통신은 서버와 클라이언트가 서버 내의 데이터를 올바르게 주고 받기 위해 서로 어떤 과정을 취하는지와 관련이 있다.
만약 서버 컴퓨터와 클라이언트 컴퓨터가 양 옆에 나란히 붙어 있다면, 양 컴퓨터에 케이블을 연결해서 데이터를 서로 주고받을 수 있을 것이다. 그러나 만약 클라이언트 컴퓨터와 서버 컴퓨터 사이의 거리가 엄청나게 멀다면 어떻게 할까? 가령, 한국과 브라질 정도의 거리라면?
그렇다면 인터넷이라고 칭해지는 네트워크 망을 사용해야 할 것이다. 인터넷은 수 많은 컴퓨터들이 물리적으로 연결되어 있는 가상의 망을 의미한다. 브라질에 있는 목적지 서버에 도달하기 위해, 한국에 있는 클라이언트에서 전송된 정보는 전세계에 흩어져 있는 컴퓨터들을 경유하여 이동할 것이다. 결국 모든 통신망은 전세계적으로 연결되어 있으니(물리적인 전신 케이블이 실제로 깔려 있을 것이다. 인간은 참 대단하다..) 결국에는 서버에 도착할 것이다.
잠깐, 생각해보니 도착하지 않을 수도 있겠다. 인터넷 안의 중계 서버들도 서버들인데 내가 정보를 요청하고 싶은 브라질에 있는 '특정 서버'가 그것들 중 무엇인지 어떻게 판별할 수 있는가. 이를 위해서 IP, 즉 Internet Protocol이 필요하다.
IP(Internet Protocol)
IP는 Internet Protocol의 약자로 개별 컴퓨터를 식별할 수 있는 주소이다. 위의 사례와는 달리 한국에 있는 클라이언트 컴퓨터는 서버에 정보를 요청할 때, 내가 찾는 서버 컴퓨터는 200.200.200.2번 IP를 쓰는 컴퓨터라는 것을 명시할 수 있다. 그럼 정보가 중간에 원치 않는 장소에 가 도착하거나 하는 상황을 방지할 수 있을 것이다.
자, 지금 클라이언트 컴퓨터가 200.200.200.2를 IP로 사용하는 서버 컴퓨터에 데이터를 요청한다고 가정해보자. 클라이언트 컴퓨터는 어떤 식으로 데이터를 요청할까? 그냥 "데이터 좀 보내주시오"라고 편지를 써서?
현실세계에서도 편지를 보낼 때 편지지를 딸랑 보내지 않고 편지봉투에 봉해서 보내지 않는가? 인터넷에서도 마찬가지다. 이 때 사용되는 편지봉투가 바로 패킷(Packet)이다.
패킷은 Package와 bucket의 합성어로 데이터를 포장하는 일종의 편지봉투이다. IP를 포장하는 IP 패킷에는 다음과 같은 정보가 포함된다.
그러나 IP만을 사용해 데이터를 전송하는 부분에는 캐핏이 도중에 유실될 수 있다는 점, 서버가 존재하지 않아도 알 수 없다는 점 등 여러가지 한계점을 지닌다. 이와 관련된 한계점은 다음과 같다.
- 비연결성 : 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송됨. (클라이언트는 뭐가 문제인지 알 수 없음)
- 비신뢰성 : 고려하지 못한 (너무도 많은) 변수로 인해 패킷이 중간에 유실되어도 알 수 없고 많은 패킷을 동시에 보낼 때 의도한 순서대로 패킷이 도착한다는 것을 장담할 수 없음.
- 프로그램 구분 : 내가 클라이언트일 때, 한번에 2개 이상의 서버에게 패킷을 보낸 경우 그 패킷들에 대한 회신이 어디에서 온 패킷인지 정확히 알 수 없음.
이를 위해 고려된 개념이 TCP, UDP, Port와 같은 개념들이다. 하나씩 알아보자.
TCP, UDP
TCP는 Transmission Control Protocol의 약자로, 한국어로는 전송 제어 프로토콜을 의미한다. IP 패킷만을 사용하는 것에서 발생하는 문제점을 보완할 수 있는데, 이와 같은 이유에서 TCP는 신뢰할 수 있는 프로토콜로 여겨지며 현재 대부분의 웹서비스는 TCP를 사용한다. TCP와 관련된 하부 개념들은 다음과 같다.
- 연결지향 - TCP Three-ways handshake
- 데이터 전달 보증
- 순서 보장
TCP Three-ways handshake
TCP Three-ways handshake는 클라이언트와 서버가 서로의 컴퓨터가 정상적으로 동작하는지 확인하는 확인작업으로 한 번 데이터를 전송할 때, 클라이언트와 서버 통틀어 총 3번의 확인을 거치기 때문에 위와 같은 이름이 불린다. 순서는 다음과 같다.
- 클라이언트가 서버에게 SYN 신호를 보내 서버가 정상 동작하는지 확인한다.
- 서버가 클라이언트에게 ACK 신호를 보내 자신이 정삭적으로 동작한다는 것을 알리는 동시에 클라이언트가 잘 있는지(?) SYN 신호를 보내 확인한다.
- 클라이언트가 서버에게 ACK를 보내 자신이 정상적으로 동작함을 알린다. 이후 클라이언트는 서버에게 데이터를 전송한다.
데이터 전달 보증
TCP는 데이터 전송 시 데이터를 받았는지 여부를 확인할 수 있는 기능이 있다.
순서 보장
세 번째로 TCP는 한 번에 패킷이 여러 개 오는 경우, 패킷의 순서가 올바른지 점검할 수 있는 기능이 존재한다. 가령 클라이언트 측에서 패킷1, 2, 3 순으로 데이터를 전송했는데 서버 측에는 패킷1, 3, 2 순서로 도착한다면, TCP을 통해 3번과 2번의 순서가 바뀌었다는 것을 알고 후속 조치를 취할 수 있다. 이 때 일반적으로는 패킷 3과 2를 지운 후, 클라이언트에 패킷 2와 3을 다시 보내라고 요청하지만 최적화를 통해 서버에서 내부적으로 처리하도록 할 수 있다.
TCP도 IP와 마찬가지로 TCP 패킷이 존재하며, 일반적으로 TCP와 IP 패킷이 함께 전송이 되기 때문에 TCP/IP 패킷이라고 이야기한다.
UDP
UDP는 User Datagram Protocol 즉, 사용자 데이터그램 프로토콜의 약자로 TCP보다 훨씬 간결화된 형태의 프로토콜을 말한다. IP와 거의 같지만 Port에 대한 정보, 체크섬에 대한 정보만이 추가되어 있다. 일반적으로 하얀 도화지에 비유되며 과거에는 TCP에 비해 주목받지 못했지만 HTTP3이 도입되면서 TCP보다 라이트한 UDP가 조금씩 주목받고 있는 상황이다.
Port
한국어로 항구로 번역될 수 있는 포트는 한 번에 둘 이상의 연결이 필요한 상황에서 발생할 수 있는 혼란을 피할 수 있는 장치이다. 0번부터 65535번까지 할당이 가능하며 일반적으로 0번부터 1023번까지는 잘 알려진 포트들이 사용되기 때문에, 별도의 목적이 없다면 사용하지 않는 것이 좋다(충돌 가능성).
- FTP - 20, 21번 포트
- TELNET - 23번 포트
- HTTP - 80번 포트
- HTTPS - 443번 포트
DNS
DNS는 Domain Name System의 약자로 기억하기 어려운 ip 주소를 (또, 고정 ip가 아닌 경우에는 수시로 바뀔 수 있는 ip 주소를) 대신하여 접근할 수 있는 새로운 주소를 만드는 시스템을 의미한다. 이를테면 예명이랄까. 도메인을 사용하기 위해서는 도메인을 돈 주고 사야한다고 한다. 네이버에 접속할 때 naver라고 주소창에 적는 것, 구글에 접속할 때 google이라고 적는 것, 그것들이 도메인에 해당한다. 원래였다면 네이버 및 구글 검색 엔진 서버의 ip 주소를 입력해야 했을 부분을 도메인으로 접속할 수 있게 한 것이다.
도메인이 작동하는 방식은 인터넷 상에 존재하는 DNS 서버에 접근하여 도메인을 ip 주소로 변환하여 그 ip 주소로 접근하는 것이다.
'네트워크' 카테고리의 다른 글
[외워서 끝내는 네트워크 핵심이론 - 기초] L3 수준에서 외울 것들 정리 (0) | 2023.03.23 |
---|---|
[외워서 끝내는 네트워크 핵심이론 - 기초] L2 수준에서 외울 것들 정리 (0) | 2023.03.20 |
[외워서 끝내는 네트워크 핵심이론 - 기초] Internet 기반 네트워크 입문 정리 (0) | 2023.03.17 |
HTTP 비연결성 (feat. 지속 연결) (0) | 2023.02.07 |
[네트워크] TCP/IP 통신의 흐름 (TCP/IP 4계층) (0) | 2023.02.04 |