아래의 내용들은 인프런 김영한님의 강의를 정리한 내용들이다. 출처 : https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
인터넷 상에서 컴퓨터는 어떻게 통신을 할까??
만약 바로 옆에 있으면 서로 연결해서 정보를 주고 받을 수 있지만 만약 둘이 너무 멀리 있다면 인터넷을 통해서 서로 통신을 해야한다.
인터넷은 단순하지 않다. 수많은 중간 노드라고 하는 서버들을 거쳐서 결국 메시지가 목적지 까지 안전하게 가야한다.
이때 어떤 규칙을 통해서 목적지 까지 갈까?
어떤 규칙을 사용해서 이 복잡한 인터넷 망을 통해서 목적지까지 메시지를 전달할까?
그걸 이해하려면 먼저 IP 에 대해서 학습해야 한다.
한국에 있는 내가 미국에 있는 친구에게 “Hello World”라는 메시지를 보내려고 하면 인터넷 망을 통해 전달해야한다.
이 복잡한 인터넷 망을 통해서 메시지를 전달하려면 뭔가 최소한의 규칙이 필요할 것이다.
그것이 바로 IP 주소라는 것을 통해 가능해진다.
먼저 클라이언트인 내가 IP 주소를 부여 받아야 한다. 그 주소가 100.100.100.1 이라고 하자.
미국에 있는 친구 또한 IP 주소를 가지고 있어야 하는데 그 주소가 200.200.200.2 라고 하자.
IP 라고 하는 인터넷 프로토콜은 어떤 역할을 하냐면 IP 주소에 데이터를 전달할 수 있도록 정해놓은 규칙이다. 이떄 데이터를 전송할 때 패킷이라는 통신 단위로 데이터를 전송한다.
메시지를 그냥 보내는 것이 아닌 IP 패킷이라는 규칙이 있다.
패킷에는 전송 데이터와 함께 출발지 IP 인 나의 IP 와 목적지 IP 인 친구의 IP를 적어줘야 한다.
이렇게 패킷을 만들고 인터넷 망에 던져준다.
그러면 IP 프로토콜 내에서 이 서버들이 규약을 다 따르고 있어 출발지가 뭐고 목적지가 뭐고 다 이해한다. 그래서 서로 노드끼리 던진다. 200.200.200.2 를 받을 수 있는 노드를 찾으면서 서로 던지면서 쭈욱 던지다 보면 목적지까지 정확하게 전달되게 된다.
이번엔 친구가 나에게 “OK” 라는 메시지를 전달하기 위해서 출발지 IP 와 목적지 IP 를 적은 패킷을 만들고 던져주면 노드끼리 100.100.100.1 을 받을 수 있는 곳은 어디에요 하면서 서로 던져주다 나에게 정확하게 도달하게 된다.
참고로 인터넷 망은 매우 복잡해서 내가 던질 때랑 친구가 나에게 던질 떄랑 서로 다른 경로를 통해 갈 수 있다.
이러한 문제들을 IP 만으로는 해결할 수 없다. 그래서 등장한 것이 TCP 와 UDP 이다.
먼저 인터넷 프로토콜 스택의 4계층을 보자
전송 제어 프로토콜 (Transmission Control Protocol)
크게 3가지 특징이 있다. (실제로는 더 많은 특징이 있다)
TCP 는 그래서 신뢰할 수 있는 프로토콜이고 현재는 대부분 어플리케이션에서 TCP 를 사용한다.
먼저 TCP/IP로 뭔가 연결을 하면 클라이언트에서 서버로 SYN
이라는 메시지를 보내 연결 요청을 보낸다.
그러면 서버에서 클라이언트에게 ACK
라고 하면서 요청을 수락하면서 SYN
을 보내 서버에서 클라이언트로의 연결을 요청한다.
클라이언트가 서버에세 ACK
라고 보내면서 요청을 수락한다.
그 다음에 데이터를 전송한다.
이렇게 3 way handshack 를 하면 클라이언트도 서버를 믿을수 있고 서버도 클라이언트를 믿을 수 있게 된다.
만약 SYN
을 보냈는데 ACK
라는 답이 없으면 연결이 안되었다고 생각하고 메시지를 안보내게 된다.
사용자 데이터그램 프로토콜(User Datagram Protocol)
예를 들어서 내 PC 에서 스트리밍 음악도 듣고 네트워크 게임도 하고 있다고 하자. 그러면 내 IP 로 게임도하고 음악도 듣고 있는 것이다.
그러면 내 IP 로 여러 패킷이 오는데 이 패킷이 음악용 패킷인지 게임용 패킷인지 어떻게 구별할까??
이때 사용하는 것이 PORT 이다.
💡 최근에는 UDP 가 뜨고 있다. TCP 를 사용하면 추가적인 정보를 넣기 위해서 크기도 커지고 3 way handshake 로 시간도 더 걸린다. 이를 최적화하기 위해서 TCP 를 손대기에는 모든 인터넷이 지금 TCP 기반으로 쓰고 있기 때문에 손댈 수가 없다. 그래서 TCP 는 그대로 쓰고 UDP 를 손대는 것이다.영어로 항구라는 뜻이다.
내가 친구랑 게임도하고 화상통화도 하고 있으면서 어떤 웹 사이트를 접속하기 위해서 웹 브라우저 까지 요청했다고 해보자.
그러면 내 PC 로 여러 패킷이 올텐데 이 패킷이 게임에서 필요한 패킷인지? 화상통화에서 필요한 패킷인지 웹 브라우저에 응답 결과로 오는 패킷인지 알 수 없다. 반대로 보낼때도 마찬가지 이다.
그래서 이걸 어떻게 구별할것인가? 이를 해결하기 위해서 PORT 를 사용한다.
TCP/IP 패킷을 보면(UDP도 마찬가지) 출발지 PORT, 목적지 PORT 가 있다.
앞으로는 이렇게 설명하겠다. TCP/IP 를 합쳐서 그 안에는 위와 같은 정보들이 있다.
같은 IP 내에서 프로세스를 구분하는 것이 PORT 이다.
쉽게 비유하자면 IP 가 아파트 일 때 PORT 는 호수 이다. 택배를 받을 때 정확히 호수를 알아서 어디로 보내야할지 알 수 있는 것이다.
이전에는 IP 를 가지고 서로 통신을 했다. 그런데 이 IP 는 기억하기가 어렵다.
또한 IP 가 변경될 수 도 있다.
그래서 DNS 가 있다.
도메인 네임 시스템 (Domain Name System)
DNS 서버에 도메인을 등록할 수 있다.
이러면 나중에 IP 가 바뀌면 구글에서 DNS 서버의 IP 주소를 바뀐 IP 주소로 바꿀 것이다. 이러면 IP 주소를 기억할 필요도 없고 IP 주소가 바뀌어도 문제가 없다.
마치 우리가 전화번호부를 통해 해당 IP 주소를 알아내는 것 같다.