Computer Science/네트워크

[네트워크]1. 인터넷 네트워크

leedaramji 2023. 5. 6. 15:35

[ 🌐 2023/05/06 ]
 

개발자는 평생 HTTP 기반 위에서 개발해야 한다.

 

1. 인터넷 네트워크

  • 1. 인터넷 통신
  • 2. IP(인터넷 프로토콜)
  • 3. TCP/UDP
  • 4. PORT 
  • 5. DNS


 인터넷 네트워크 


 
HTTP도 결국에는 TCP/IP나 UDP 기반 위에서 동작하기 때문에 아주 기본적인 인터넷 네트워크를 이해해야 한다.


 

1. 인터넷 통신 - 인터넷에서 컴퓨터 둘은 어떻게 통신할까?

 

가까이 연결되어 있는 컴퓨터는 클라이언트에서 메시지를 보내면 서버에서 바로 응답을 한다. 하지만 클라이언트와 서버 사이의 거리가 멀 경우 복잡한 인터넷 망을 거쳐야 한다. 



2. IP (인터넷 프로토콜)

 

 
[IP 인터넷 프로토콜]
복잡한 인터넷 망에서 메시지를 보내려면 최소한의 규칙이 필요하다. IP 주소를 통해서 가능해진다. 
 
[IP 인터넷 프로토콜 역할]

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

 
[ IP 패킷 정보]
출발지 IP + 목적지 IP + 전송 데이터
 
[클라이언트 패킷 전달]

  • 패킷
출발 100.100.100.1목적 200.200.200.2Hello World

 

  • IP 패킷을 인터넷 망으로 던진다.
  • IP 프로토콜에 의해서 서버들이 규약을 따르는데 서로 노드끼리 던지다가 최종적으로 목적지까지 전달된다.

 
[서버 패킷 전달]

  • 패킷
출발 200.200.200.2목적 100.100.100.1Hello World

 

  • 메시지를 받은 목적지 IP가 OK라고 전달하고 싶다면, IP 패킷을 만들어서 다시 클라이언트로 던진다.
  • 100.100.100.1. 을 받을 수 있는 노드를 서로 물어가며 목적지까지 전달한다.

 
=> 🏠 요청할 때랑 응답할 때 인터넷 망이 복잡하기 때문에 서로 다른 곳으로 전달될 수 있다.

 
[IP 프로토콜의 한계]
 
1) 비연결성
클라이언트는 패킷을 받을 대상이 없거나 서비스 불능 상태여도 서버의 상태를 모르기 때문에 패킷을 전송한다.
 
2) 비신뢰성

  • 패킷 소실: 노드가 꺼지거나 중간 서버에 문제가 생겨서 소실되어도 모른다.
  • 패킷 전달 순서 문제 발생: 패킷의 용량이 클 때 (1500Byte 이상) 메시지를 끊어서 보낸다. 끊어서 보낸 패킷이 중간에 다른 노드를 탈 수 있기 때문에 최종적으로 의도와 다르게 전달될 수 있다.

 
3) 프로그램 구분
같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면?


 

🎈 이를 해결하기 위한 방법?
TCP / UDP
 


3. TCP/UDP - IP 위에 올려서 보완하는 역할 ⭐⭐⭐

 
[인터넷 프로토콜 스택의 4 계층]

인터넷 프로토콜 스택의 4계층
애플리케이션 계층 - HTTP, FTP
전송 계층 - TCP, UDP
인터넷 계층 - IP
네트워크 인터페이스 계층 - LAN 카드

 
[프로토콜 계층]

 프로토콜 계층
애플리케이션웹 브라우저/ 네트워크 게임/ 채팅 프로그램
SOCKET 라이브러리
OS(운영체제)TCP/ UDP
IP(Internet Protocol)
네트워크 인터페이스LAN 드라이버
LAN 장비

 

  1. 프로그램 메시지 작성
  2. SOCKET 라이브러리를 통해 전달
  3. TCP 정보생성, 메시지 데이터 포함
  4. IP 패킷 생성, TCP 데이터 포함
  5. 랜카드를 통해서 나갈 때, 이더넷 프레임 포함되어서 나간다.

 

=> ⭐️ 웹을 공부하는 데는 IP 프로토콜까지만 깊이 있게 이해하면 된다.⭐
 


TCP/IP 패킷 정보

 
[IP 패킷 정보]
출발지 IP + 목적지 IP + 전송 데이터
 
[TCP 세그먼트]

  • 출발지 PORT, 목적지 PORT, 전송 제어 정보, 순서 정보, 검증 정보...
  • IP만으로 해결되지 못했던 순서 제어 문제가 해결이 된다.!

 


 TCP 특징 - 전송 제어 프로토콜

 

  • 연결지향 -  TCP 3 way handshake (가상 연결)
  • 데이터 전달 보증
  • 순서 보장
  • 신뢰할 수 있는 프로토콜
  • 현재는 대부분 TCP 사용

 

 

1. TCP 3 way handshake
[connect, 연결과정]

  1. SYN
  2. SYN + ACK
  3. ACK
  4. 데이터 전송

 

=> 논리적으로만 연결, 중간의 수많은 서버를 거치는데 노드들 연결되었는지 모른다.
 

  • SYN: 접속 요청
  • ACK: 요청 수락
  • 참고: 3. ACK와 함께 데이터 전송 가능

 

2. 데이터 전달 보증
클라이언트에서 데이터 전송을 하면 서버에서 데이터 잘 받았다고 응답해 준다.
 
3. 순서 보장

  1. 1. 데이터가 커서 끊어서 보낼 때 패킷 1, 패킷 2, 패킷 3 순서로 보낸다.
  2. 패킷 1, 패킷 3, 패킷 2 순서로 도착
  3. 서버가 클라이언트에게 패킷 2부터 다시 보내라고 요청한다. 그러면 클라이언트가 잘못되었구나 하고 패킷 2로부터 다시 보낸다.

 


UDP 특징 - 사용자 데이터그램 프로토콜

 

  • 하얀 도화지에 비유(기능이 거의 없음  ❌)
  • 연결지향 - TCP 3 way handshake  ❌
  • 데이터 전달 보증 ❌
  • 순서 보장  ❌
  • 데이터 전달 순서가 보장되지 않지만 단순하고 빠르다.

 
[정리]

  • IP와 거의 같다. +PORT +체크섬 정도만 추가 (IP 하나가 할당된 내 PC에서 네트워크 게임도 하고, 음악도 스트리밍으로 듣고 있다. 내 IP에 여러 패킷이 들어온다. 이때 게임용 패킷인지? 음악용 패킷인지? 구분하는 것이 PORT이다. 체크섬은 이 메시지에 대해서 검증해 주는 데이터가 간단하게 추가되어 있다.)
  • 애플리케이션에서 추가 작업 필요

 
=> TCP는 3 way handshake를 하려면 시간이 걸리고, 데이터 전달 보증, 순서 보장 등이 되어서 데이터 양도 크고 전송 속도도 빠르게 만들기 어렵다. 이미 많이 구축이 되어 있기 때문이다. 더 최적화하고 싶어도 할 수가 없다. 이미 인터넷은 TCP 기반으로 쓰고 있기 때문에 이 프로토콜에 손을 델 수 없다.

그런데 더 최적화 하고 싶다면? TCP는 그대로 쓰고, UDP로 손을 데면 된다. UDP는 아무것도 되어있지 않기 때문에 그 위에 내가 원하는 애플리케이션 레벨에서 만들어 내면 된다. 

* 최근에는 UDP가 각광 받고 있다. 웹 브라우저에서 HTTP 통신을 할 때 HTTP3 스펙이 나왔는데 3 way handshake의 SYN, SYN+ANC, SYN 과정을 다 줄이고자 더 최적화를 하면서  HTTP3 경우에는 UDP 프로토콜을 사용한다. 
 


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

 

한번에 둘 이상 연결해야 한다면? PORT!

 
[TCP/ IP 패킷]

  • [출발지 IP, PORT/ 목적지 IP, PORT/ 전송 데이터]
  • IP - 아파트 / PORT - 몇 동 몇 호

 


  • 0 - 65535 할당 가능
  • 0 - 1023: 잘 알려진 포트, 사용하지 않는 것이 좋다.

  • FTP - 20, 21
  • TELNET - 23
  • HTTP - 80
  • HTTPS - 443 (HTTP에 +보안이 추가된 것)

 

5. DNS - 도메인 네임 시스템

 

 
IP 기억하기 어렵다🤯, IP 변경될 수 있다😵‍💫 => DNS 서버 사용!

 

  • 전화번호부 (도메인을 사서 DNS 서버에 등록할 수 있다...!)
  • 도메인 명을 IP 주소로 변환

 

  1. DNS 서버에 도메인명 google.com IP 요청 (먼저 도메인으로 찾는다.)
  2. DNS 서버가 응답을 준다. (200.200.200.2)
  3. 200.200.200.2로 접속하면 된다.

 
 
[정리]

  1. 복잡한 인터넷 망에서 메시지를 보내려면 IP 프로토콜이 있어야 한다.
  2. IP 프로토콜만 가지고 메시지가 잘 도착했는지 신뢰하기 어렵고, 메시지 순서에 문제가 발생할 수도 있다. 그리고 PORT라는 개념도 없다.
  3. 이러한 문제를 TCP 프로토콜이 해결해준다. UDP 프로토콜은 IP랑 거의 같은데 PORT가 추가된 백지 상태다. 필요하다면 UDP 프로토콜 위에 애플리케이션에서 기능을 확장할 수 있다.
  4. PORT는 같은 IP 안에서 통신하는 애플리케이션을 구분하기 위해 사용.
  5. DNS는 IP는 변하기 쉽고 외우기 어려운데 도메인 명을 등록해서 사용할 수 있도록 도와준다.