해당 포스트는 인프런 김영한 님의
모든 개발자를 위한 HTTP 웹 기본 지식
강의를 기반으로 작성되었습니다. 👍
요청을 보내는 쪽인 클라이언트
, 요청에 응답하는 쪽인 서버
이 둘은 인터넷을 사이에 두고 어떻게 통신할까?
철수야 옆 동네 미영 아주머니 집에 이거 주고 와-!
당신이 미영 아주머니가 누군지도, 미영 아주머니 집이 어디인지도 모른다면, 심부름을 다녀올 수 있을까요? 🙄
당연히 갈 수 없습니다. 어딘지도 모르는걸요!
그럼 당신은 아마 되물을 것입니다. 거기 주소가 어떻게 되는데요???
특정 위치에서 다른 위치로 무언가를 보낼 때 우리는 주소
가 필수적으로 필요합니다.
때문에 컴퓨터 간 통신에도 주소
가 필요합니다.
모든 컴퓨터는 각각 고유한 IP 주소
를 갖습니다.
이 IP 주소로 서로 데이터를 주고 받는 것 입니다.
한 컴퓨터에서 다른 컴퓨터로 데이터를 보낼 때,
컴퓨터는 보낼 데이터를 IP 패킷(Packet)
이라는 상자에 넣어 보냅니다.
마치 택배 상자에 보내는 이 주소와 받는 이 주소를 작성하는 것처럼,
IP 패킷에는 출발지 IP
, 목적지 IP
등의 정보가 포함되어 있습니다.
클라이언트가 서버에 보내는 패킷은 클라이언트 패킷
, 서버가 클라이언트에게 보내느 패킷은 서버 패킷
이라고 합니다.
하지만, 복잡한 인터넷을 거쳐 통신하는데 IP 프로토콜만으로는 한계가 있습니다.
IP 프로토콜은 다음 3가지 한계를 가지고 있습니다.
: IP 프로토콜은 패킷을 받을 대상이 없거나, 서비스 불능 상태에서도 이를 확인하지 못하고 패킷을 전송합니다.
그리고 그 패킷이 도착했는지, 도착하지 못했는지도 알 수 없습니다.
친구가 이사를 갔거나, 집을 비웠는데도 이를 알지 못하고 택배를 보내는 것과 유사합니다.
: 복잡한 인터넷을 거치다보면 패킷이 중간에 사라질수도, 순차적으로 보낸 패킷이 어그러진 순서로 도착할 수도 있습니다.
이는 패킷이 전송될 때 인터넷의 여러 노드를 거치게 되는 과정에서 발생합니다.
그런데 IP 프로토콜만으로는 이 문제를 해결할 수 없습니다.
: 하나의 컴퓨터로 여러 개의 어플리케이션을 구동하면,
동일한 IP로 여러 서버와 통신해야하는 상황이 발생합니다.
이 경우 IP 프로토콜은 어떤 패킷이 어떤 어플리케이션을 위한 패킷인지 구분하지 못합니다.
TCP와 UDP는 IP 프로토콜을 한 꺼풀 감싸, IP 프로토콜의 한계를 해결합니다.
아래는 인터넷 프로토콜 스택의 4계층과,
인터넷을 통해 서버로 데이터를 전송시 캡슐화된 패킷 형태를 나타낸 이미지입니다.
애플리케이션 단에서 생성된 데이터
는
SOCKET 라이브러리를 통해 운영체제 단으로 전달되고,
운영체제 단에서 TCP
정보가 생성되어 데이터를 감싸고,
IP 패킷
을 생성하여 IP 정보와 함께 TCP 데이터를 감쌉니다.
마지막으로 네트워크 인터페이스 단에 도달하면 LAN
설정으로 마지막 겹을 감싼 뒤,
인터넷을 통해 서버에 전달됩니다.
이 과정에서 TCP는 IP의 한계를 해결합니다.
기존 IP 패킷에는 출발지 IP
, 목적지 IP
, 전송 데이터
가 포함되어있었습니다.
그런데 내부에 전송 정보를 가진 TCP 정보를 포함하면 출발지 PORT
, 목적지 PORT
, 전송 제어
, 순서
, 검증 정보
등이 추가적으로 포함됩니다.
[
출발지 IP
,목적지 IP
,전송 데이터
, ... [출발지 PORT
,목적지 PORT
,전송 제어
,순서
,검증 정보
, ...]]
: TCP는 데이터를 전송해야할 대상과 연결이 되어있는지 우선 확인하고,
연결이 되어있을 경우에만 데이터를 전송합니다.
이를 통해 IP 프로토콜의 한계 중 비연결성을 해결할 수 있습니다.
TCP는 TCP 3 way handshake
를 통해 연결 여부를 확인합니다.
TCP 3 way handshake
의 과정은 다음과 같습니다.
SYN
을 서버로 전송합니다.ACK
와 함께 접속 요청을 의미하는 SYN
을 보냅니다.SYN
을 보냅니다.: TCP를 포함하여 데이터를 전달하면
클라이언트가 전달한 데이터가 서버에게 잘 도착했을 시, 서버가 데이터를 잘 받았다는 내용을 클라이언트에게 다시 보냅니다.
때문에 데이터가 전송 중 누락/손실 되었을 경우, 이를 파악할 수 있습니다.
이를 통해 IP 프로토콜의 한계 중 비신뢰성을 해결할 수 있습니다.
: TCP는 전송 정보에 순서를 포함하기 때문에, 설령 인터넷을 통해 전송한 데이터가 순서에 맞지 않게 서버에 도착하더라도
서버가 이를 파악하고, 순서가 어그러진 부분부터 데이터를 재발송할 것을 요청할 수 있습니다.
이를 통해 데이터 전송 순서가 보장되어,
IP 프로토콜의 한계 중 비신뢰성을 해결할 수 있습니다.
: 이에 대해서는 아래 3. PORT
에서 자세히 다루겠습니다.
UDP는 TCP에 비해 기능이 적습니다.
하얀 도화지에 비유하기도 할 만큼, 기능이 거의없어 IP 프로토콜과 크게 다르지 않습니다.
UDP는 IP 프로토콜에 PORT와 체크섬 정도만 추가된 상태의 프로토콜입니다.
기능이 적은 만큼 단순하고 빠른 전송이 가능하기 때문에,
필요한 기능은 어플리케이션 단에서 추가 구현, 최적화하여 사용할 때 UDP를 사용합니다.
위의 TCP와 UDP는 모두 PORT
정보를 포함하고 있습니다.
IP 프로토콜에서는 없던 PORT를 통해 어플리케이션별 패킷 구분 불가
라는 IP 프로토콜 한계를 극복할 수 있습니다.
지금까지 우리는
IP 프로토콜에 담긴 IP 주소를 통한 통신만을 생각했습니다.
그런데 하나의 IP를 가진 한 대의 컴퓨터로
음악 감상 어플리케이션, 게임 어플리케이션, 메신저 어플리케이션을 동시 실행한다면...
하나의 IP로 여러 개의 패킷이 전송되어 오게 됩니다.
이 경우 IP 프로토콜만으로는
어떤 패킷이 어떤 어플리케이션을 위한 것인지 구분할 수 없습니다.
김영한 님께서 수업 중에 IP와 PORT를 들어,
IP가 아파트라면, PORT는 몇 호인지를 말한다.
라는 비유를 말씀해주셨습니다.
IP 주소는
우리는 특정 IP에 접근할 때,
IP 주소 대신 도메인명을 사용하기도 합니다.
도메인 명을 사서 등록을 하고나면
길고 복잡한 IP 주소대신 해당 도메인명으로 IP에 접근할 수 있습니다.
네이버, 구글이 IP 주소대신 naver.com
, google.com
을 사용하는 것이 그 예입니다.
그럼 오늘의 TIL 끄읏-
다음 내용은 다음 포스팅에서!