인터넷 통신

CHOI·2022년 5월 29일
0

HTTP

목록 보기
1/3
post-thumbnail

아래의 내용들은 인프런 김영한님의 강의를 정리한 내용들이다. 출처 : https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard

인터넷 통신

인터넷 상에서 컴퓨터는 어떻게 통신을 할까??

만약 바로 옆에 있으면 서로 연결해서 정보를 주고 받을 수 있지만 만약 둘이 너무 멀리 있다면 인터넷을 통해서 서로 통신을 해야한다.

인터넷은 단순하지 않다. 수많은 중간 노드라고 하는 서버들을 거쳐서 결국 메시지가 목적지 까지 안전하게 가야한다.

이때 어떤 규칙을 통해서 목적지 까지 갈까?

어떤 규칙을 사용해서 이 복잡한 인터넷 망을 통해서 목적지까지 메시지를 전달할까?

그걸 이해하려면 먼저 IP 에 대해서 학습해야 한다.

IP (인터넷 프로토콜)

한국에 있는 내가 미국에 있는 친구에게 “Hello World”라는 메시지를 보내려고 하면 인터넷 망을 통해 전달해야한다.

이 복잡한 인터넷 망을 통해서 메시지를 전달하려면 뭔가 최소한의 규칙이 필요할 것이다.

그것이 바로 IP 주소라는 것을 통해 가능해진다.

먼저 클라이언트인 내가 IP 주소를 부여 받아야 한다. 그 주소가 100.100.100.1 이라고 하자.

미국에 있는 친구 또한 IP 주소를 가지고 있어야 하는데 그 주소가 200.200.200.2 라고 하자.

IP 인터넷 프로토콜의 역할

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

IP 라고 하는 인터넷 프로토콜은 어떤 역할을 하냐면 IP 주소에 데이터를 전달할 수 있도록 정해놓은 규칙이다. 이떄 데이터를 전송할 때 패킷이라는 통신 단위로 데이터를 전송한다.

IP 패킷 정보

메시지를 그냥 보내는 것이 아닌 IP 패킷이라는 규칙이 있다.

패킷에는 전송 데이터와 함께 출발지 IP 인 나의 IP 와 목적지 IP 인 친구의 IP를 적어줘야 한다.

이렇게 패킷을 만들고 인터넷 망에 던져준다.

클라이언트 패킷 전달

그러면 IP 프로토콜 내에서 이 서버들이 규약을 다 따르고 있어 출발지가 뭐고 목적지가 뭐고 다 이해한다. 그래서 서로 노드끼리 던진다. 200.200.200.2 를 받을 수 있는 노드를 찾으면서 서로 던지면서 쭈욱 던지다 보면 목적지까지 정확하게 전달되게 된다.

서버 패킷 전달

이번엔 친구가 나에게 “OK” 라는 메시지를 전달하기 위해서 출발지 IP 와 목적지 IP 를 적은 패킷을 만들고 던져주면 노드끼리 100.100.100.1 을 받을 수 있는 곳은 어디에요 하면서 서로 던져주다 나에게 정확하게 도달하게 된다.

참고로 인터넷 망은 매우 복잡해서 내가 던질 때랑 친구가 나에게 던질 떄랑 서로 다른 경로를 통해 갈 수 있다.

IP 프로토콜의 한계점

  • 비연결성
    • 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송된다.
    • 내가 친구에게 메시지를 던졌는데 친구의 PC 가 꺼져 있을 수 있다. 그래도 패킷은 전동이 된다.
    • 마치 편지를 보내는데 그곳에 친구가 더 이상 안살아도 편지가 전송되는 것 같다.
  • 비신뢰성
    • 중간에 패킷이 사라지면?
      • 만약
    • 패킷이 순서대로 안오면?
  • 프로그램 구분
    • 같은 IP를 사용하는 서버에서 통신하는 어플리케이션이 둘 이상이면?
      • 한 PC 에서 게임도하고 음악도 듣고 있으면 어떤 방식으로 구분하지?

대상이 서비스 불능, 패킷 전송

  • 나는 상대가 메시지를 받았는지 알 수 없다.

패킷 유실

  • 만약 중간 노드가 꺼져버리면 답이 없다.
  • 예를 들어 멧돼지가 광케이블을 뜯어 먹어 서버가 다운되면..

패킷 전달 순서 문제 발생

  • 메시지가 대략 1500바이트가 넘으면 데이터를 끊어서 발송한다.
  • “Hello World!!” 라는 메시지를 끊어서 발송한다고 하면 나는 “Hello” 를 보내고 “World!!”를 보낼 것이다.
  • 그러면 노드를 타는데 패킷들이 서로 다른 경로로 갈 수 있다.
  • 그런데 도착하는건 “World!!” 가 먼저 도착해서 “World!! Hello” 가 된다.

이러한 문제들을 IP 만으로는 해결할 수 없다. 그래서 등장한 것이 TCP 와 UDP 이다.

TCP, UDP

먼저 인터넷 프로토콜 스택의 4계층을 보자

  • 네트워크 인터페이스 계층에는 렌카드 등등을 포함한다.
  • IP 라는 것 위에 TCP라는 것을 살짝 올려서 보완해주는 역할을 한다고 이해하면 된다.
  • 그런데 이렇게만 보면 잘 이해가 안된다

  • 우리가 컴퓨터를 보면 딱 3가지가 보인다.
  • 우리가 사용하는 어플리케이션 (게임, 웹 브라우져)
  • 그 밑에 운영체제 (윈도우, 맥os)
  • 그 밑에 렌 드라이버라 렌 카드

  • 그러면 내가 채팅 프로그램을 통해서 미국에 있는 친구에게 “Hello” 라는 메시지를 전송한다고 해보자
  1. 먼저 SOCKET 라이브러리 라는 것을 통해서 OS 계층에다가 “Hello” 메시지를 넘긴다.
  2. OS 계층에서 TCP가 메시지에 TCP 정보를 씌우고 한칸 밑(IP)으로 보낸다.
  3. IP에서 전달받은 것에 IP 정보를 씌워서 IP 패킷을 생성한다. 이 IP 패킷에는 메시지, TCP 데이터, IP 데이터를 가지고 있는 상태이다.
  4. 그리고 만들어진 것이 네트워크 인터페이스를 통해서 LAN 카드를 통해 인터넷으로 나갈 때 Ethernet frame 이라는 것이 포함되어서 나간다.
💡 Ethernet frame 에는 MAC 주소를 포함해서 실제 물리적인 정보가 포함되어 있는데 깊은 내용이여서 웹을 공부하는데에는 IP 프로토콜 까지만 공부하면 된다.

TCP/IP 패킷 정보

  • 패킷은 수화물을 뜻하는 패키지(Package) + 덩어리(Bucket) 의 합성어이다.
    • 그래서 실제로 박스에 데이터를 넣어서 보내는 것과 비슷한 것이다.
  • TCP 에는 출발지 PORT, 목적지 PORT, 정보 제어 순서, 검증 정보 등이 들어간다.
    • 그래서 IP 만으로는 해결이 안되었던 문제들을 해결할 수 있다.

TCP 특징

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

크게 3가지 특징이 있다. (실제로는 더 많은 특징이 있다)

  • 연결지향 - TCP 3 way handshake (가상 연결)
    • 목적지와 출발지가 서로 연결되었는지 먼저 확인하고 메시지를 보낸다.
  • 데이터 전달 보증
    • 데이터를 보내다가 누락이 되면 알려준다.
  • 순서 보장

TCP 는 그래서 신뢰할 수 있는 프로토콜이고 현재는 대부분 어플리케이션에서 TCP 를 사용한다.

TCP 3 way handshake

  • 먼저 TCP/IP로 뭔가 연결을 하면 클라이언트에서 서버로 SYN 이라는 메시지를 보내 연결 요청을 보낸다.

  • 그러면 서버에서 클라이언트에게 ACK 라고 하면서 요청을 수락하면서 SYN 을 보내 서버에서 클라이언트로의 연결을 요청한다.

  • 클라이언트가 서버에세 ACK 라고 보내면서 요청을 수락한다.

  • 그 다음에 데이터를 전송한다.

  • 이렇게 3 way handshack 를 하면 클라이언트도 서버를 믿을수 있고 서버도 클라이언트를 믿을 수 있게 된다.

  • 만약 SYN 을 보냈는데 ACK 라는 답이 없으면 연결이 안되었다고 생각하고 메시지를 안보내게 된다.

💡 참고로 요즘에는 최적화가 되어서 마지막에 `ACK` 를 보낼때 데이터도 같이 보내게 된다. 💡 이러한 방식으로 연결되었다고 확인을 하는데 진짜로 연결된 것이 아니라 논리적으로 연결 된 것이다. 서로 ACK 를 주고 받았으니까 서로 연결 되었다고 논리적으로 생각하는 것이고 중간에 수많은 서버(노드)들이 연결되었는지는 모른다.

데이터 전달 보증

  • 클라이언트에서 서버로 데이터를 전송하면 서버에서 클라이언트에게 데이터를 잘 받았다고 알려준다.
  • 그래서 데이터가 제대로 전달이 되었는지 알 수 있다.

순서 보장

  • 클라이언트가 패킷1, 패킷2, 패킷3 순서로 나눠서 보냈다.
  • 근데 서버에는 패킷1, 패킷3, 패킷2 순서로 도착했다.
  • 내부적으로 최적화 로직에 따라 다르겠지만 기본적으로는 다음과 같다
  • 패킷 2번부터 다시 보내라고 한다.

UDP

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

특징

  • 하얀 도화지의 비유(기능이 거의 없음)
  • 연결 지향 - TCP 3 way handshake X
  • 데이터 전달 보증 X
  • 순서 보장
  • 데이터 전달 및 순서는 보장하지 않지만, 단순하고 빠름
  • 정리
    • IP와 거의 같다 + PORT + 체크섬 정도 추가
    • 어플리케이션 추가 작업 필요

예를 들어서 내 PC 에서 스트리밍 음악도 듣고 네트워크 게임도 하고 있다고 하자. 그러면 내 IP 로 게임도하고 음악도 듣고 있는 것이다.

그러면 내 IP 로 여러 패킷이 오는데 이 패킷이 음악용 패킷인지 게임용 패킷인지 어떻게 구별할까??

이때 사용하는 것이 PORT 이다.

💡 최근에는 UDP 가 뜨고 있다. TCP 를 사용하면 추가적인 정보를 넣기 위해서 크기도 커지고 3 way handshake 로 시간도 더 걸린다. 이를 최적화하기 위해서 TCP 를 손대기에는 모든 인터넷이 지금 TCP 기반으로 쓰고 있기 때문에 손댈 수가 없다. 그래서 TCP 는 그대로 쓰고 UDP 를 손대는 것이다.

PORT

영어로 항구라는 뜻이다.

내가 친구랑 게임도하고 화상통화도 하고 있으면서 어떤 웹 사이트를 접속하기 위해서 웹 브라우저 까지 요청했다고 해보자.

그러면 내 PC 로 여러 패킷이 올텐데 이 패킷이 게임에서 필요한 패킷인지? 화상통화에서 필요한 패킷인지 웹 브라우저에 응답 결과로 오는 패킷인지 알 수 없다. 반대로 보낼때도 마찬가지 이다.

그래서 이걸 어떻게 구별할것인가? 이를 해결하기 위해서 PORT 를 사용한다.

TCP/IP 패킷을 보면(UDP도 마찬가지) 출발지 PORT, 목적지 PORT 가 있다.

앞으로는 이렇게 설명하겠다. TCP/IP 를 합쳐서 그 안에는 위와 같은 정보들이 있다.

PORT - 같은 IP 내에서 프로세스 구분

같은 IP 내에서 프로세스를 구분하는 것이 PORT 이다.

  • 내 PC 에서 게임은 8090 PORT, 화상통화는 21000 PORT 이렇게 포트를 열어서 연결을 해둔다.
  • 연결할 때 서버에서도 특정 포트를 열어서 서로 연결하는 것이다.

  • 서로 패킷을 주고 받을 때 목적지의 PORT 정보도 보내주어서 어디에서 사용할 패킷인지 알 수 있는 것이다.

쉽게 비유하자면 IP 가 아파트 일 때 PORT 는 호수 이다. 택배를 받을 때 정확히 호수를 알아서 어디로 보내야할지 알 수 있는 것이다.

PORT

  • 0 ~ 65536 까지 할당
  • 0 ~ 1023 : 잘 알려진 포트, 사용하지 않는게 좋음
    • FTP - 20, 21
    • TELNET - 23
    • HTTP - 80
    • HTTPS - 442

DNS

이전에는 IP 를 가지고 서로 통신을 했다. 그런데 이 IP 는 기억하기가 어렵다.

또한 IP 가 변경될 수 도 있다.

그래서 DNS 가 있다.

DNS

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

  • 전화번호부 같은 시스템
  • 도메인 명을 IP 주소로 변환

DNS 서버에 도메인을 등록할 수 있다.

  1. 내가 구글에 접속하고 싶어서 DNS 서버에 도메인 명인 google.com 의 IP 를 주세요 하고 요청한다.
  2. DNS 서버에서 도메인 명인 google.com 에 해당하는 IP 주소를 찾아서 반환해준다.
  3. 그러면 내가 해당 IP 주소로 접근하게 된다.

이러면 나중에 IP 가 바뀌면 구글에서 DNS 서버의 IP 주소를 바뀐 IP 주소로 바꿀 것이다. 이러면 IP 주소를 기억할 필요도 없고 IP 주소가 바뀌어도 문제가 없다.

마치 우리가 전화번호부를 통해 해당 IP 주소를 알아내는 것 같다.

profile
벨로그보단 티스토리를 사용합니다! https://flight-developer-stroy.tistory.com/

0개의 댓글