파이톨치

[socket programming] Computer 네트워크 기초 본문

대학수업/socket programming

[socket programming] Computer 네트워크 기초

파이톨치 2024. 4. 20. 19:27
728x90

Computer Network 기초


기본 배경

컴퓨터 네트워크는 호스트, 라우터, 통신 채널로 구성되어 있습니다. 호스트는 응용프로그램을 실행하는 장치이고, 라우터는 네트워크 전체에 걸쳐 정보를 전달하는 역할을 합니다.

네트워크에서 정보는 패킷이라는 바이트 시퀀스 형태로 전송됩니다. 패킷에는 목적지 호스트 주소와 같은 제어 정보가 포함되어 있습니다. 프로토콜은 패킷의 의미, 구조, 크기 등을 정의하는 규약입니다. 

host A에서 host B로의 패킷 전달

전송할 데이터를 패킷들로 나누어 전송한다. 패킷은 헤더와 데이터로 구성된다. 패킷 헤더에는 네트워크에서 사용하는 주소 정보가 들어간다. 네트워크에서 사용하는 주소에는 IP 주소, port 주소, MAC 주소가 있음.

 

IP 주소 – 인터넷 상에서 unique한 주소, IPv4 – 32비트(4바이트) 표현, 예: 203.253.1.1, IPV6 – 128비트(16바이트) 표현
Port 주소 – 각 호스트 안에서만 unique한 주소, 16비트(2바이트)로 표현, 예: 80 
MAC 주소 – link 네트워크 상에서 unique한 주소


예를 들면, IP 주소는 203.253.15.1 (32비트), port 주소는 80 (16비트), MAC 주소는 00:12:34:56:78:90 (48비트)
패킷이 네트워크 상위 계층에서 하위 계층으로 내려올 때마다 패킷에 헤더가 추가되며(패킷 캡슐화) 반대로 하위 계층에서 상위 계층으로 올라갈 때마다 패킷 내 헤더가 삭제(패킷 캡슐 해제)된다. host A에 출발한 패킷은 네트워크 application 층에서 하위층(transpor층, network층, linker층)으로 전달, physicial층으로 전달된 뒤 외부로 전송, 인터넷을 통해 host B로 전달된 패킷은 physical층에서 application 층으로 전달한다. 페이지 18에 그림 나옴.

 

 Internet protocol stack(5 layers)

네트워크 – 다계층 구성임. application – transport – network – link - physical

application: 네트워크 애플리케이션 지원, FTP, SMTP, HTTP
transport: 프로세스 간 데이터 전송. TCP, UDP
network: 출발지에서 목적지까지 패킷 라우팅. IP, 라우팅 프로토콜
link: 인접한 네트워크 요소 간 데이터 전송 이더넷. 802.11.1 (WiFi), PPP
physical: 물리적 전송 매체에서의 비트 전송

 

network(L3) 계층의 전송 데이터를 packet이라 부른다. link(L2) 계층의 전송 데이터를 frame이라 부른다. transport(L4) 계층의 전송 데이터를 segment (TCP 경우) 또는 datagram(UDP 경우)이라 부른다. 


IP

인터넷 구성 요소: 호스트(서버 또는 클라이언트), Ethernet 스위치 및 무선 공유기(보통 L2 스위치라 부름), 라우터(L3 스위치라 부름)

주소 배정:
- 호스트는 최소 1개 IP 주소, 최소 1개 MAC 주소를 가짐
- Ethernet 스위치는 MAC 주소를 가짐  
- 라우터는 최소 1개 IP 주소, 최소 1개 MAC 주소를 가짐

IPv4 32비트 주소는 network ID + host ID로 구성됨
서브넷(같은 네트워크 대역)은 파란색으로 표기한 네트워크임
서브넷 안에서는 MAC 주소로 데이터 전송. 223.1.1.x 서브넷의 network ID는 223.1.1

 

200.23.16.0/24 표기에서 /24는 서브넷 마스크를 나타냅니다. 동일한 서브넷 상의 호스트들의 IP 주소 중 상위 24비트(네트워크 ID)는 동일하고, 하위 8비트(=32-24)는 서로 다른 호스트 ID를 나타냅니다. 223.1.1.1 호스트와 223.1.1.4 라우터는 각각 대응되는 MAC 주소를 갖고 있고, 스위치 안에 그 MAC 주소가 등록되어 있게 됨
223.1.1.1 패킷이 스위치에 도달하면 그 패킷의 목적지 MAC 주소를 확인하여 그 목적지 포트로 전달(링크 계층 동작)
링크 계층 동작에서는 MAC 주소, 네트워크 계층 동작에서는 IP 주소, 전송 계층에서는 포트 주소가 사용됨

 

사설 IP는 내부 네트워크(예: 공유기 내부 네트워크)에서만 사용되는 주소이며, 인터넷 상에서는 사용할 수 없습니다. 반면 공인 IP는 인터넷 상에서 사용할 수 있는 IP 주소를 말합니다.

 

1. 패킷 서비스를 제공합니다. 패킷은 독립적으로 처리되고 전달됩니다.
2. 베스트 에포트(Best-Effort) 프로토콜입니다. 패킷이 손실, 재전송 또는 중복될 수 있습니다.
3. 각 패킷에는 목적지 IP 주소가 포함되어야 합니다.

IP 프로토콜은 비연결 지향형 데이터그램 전송 서비스를 제공하며, 패킷 전달을 최선을 다해 수행하지만 신뢰성은 보장하지 않습니다. 또한 각 패킷에는 목적지 주소 정보가 포함되어 있어야 합니다.

NAT: network address translation

1: 호스트 10.0.0.1에서 대상 IP 128.119.40.186, 포트 80으로 패킷을 전송합니다.
2: NAT 라우터가 데이터그램의 출발지 주소를 10.0.0.1, 3345에서 138.76.29.7, 5001로 변경하고 테이블에 업데이트합니다.
3: 응답 데이터그램이 목적지 주소 138.76.29.7, 5001로 도착합니다.
4: NAT 라우터가 데이터그램의 목적지 주소를 138.76.29.7, 5001에서 10.0.0.1, 3345로 변경합니다.

 

요약하자면, 내부 사설 IP를 사용하는 호스트에서 외부 공인 IP로 데이터를 전송할 때, NAT 라우터가 주소를 변환하여 통신이 가능하도록 해줍니다. 응답 시에도 주소를 다시 변환하여 내부 호스트로 전달합니다.


TCP vs UDP: Internet transport-layer protocols

전송 계층 (3계층)의 두 가지 주요 프로토콜인 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)의 특징을 설명하고 있습니다.

1. TCP와 UDP 모두 포트 번호를 사용합니다.
- 포트 번호는 응용 프로그램별 통신 엔드포인트로 사용되는 개념입니다.
16비트 부호 없는 정수로 0부터 65535까지의 범위를 가집니다.
엔드-투-엔드 전송을 제공합니다.

2. UDP(User Datagram Protocol)
- 확인 응답(Acknowledgement)이 없습니다.
재전송이 없습니다
패킷 순서가 바뀔 수 있고, 중복이 발생할 수 있습니다.
무연결 프로토콜이며, 각 패킷마다 목적지를 지정해야 합니다.

 

3. TCP(Transmission Control Protocol)
신뢰성 있는 바이트 스트림 채널을 제공합니다. (순서 보장, 모두 도착, 중복 없음)
- 파일 I/O와 유사합니다.
흐름 제어 기능이 있습니다.
연결 지향형 프로토콜입니다.
양방향 통신이 가능합니다.


HTTP

먼저 복습해 봅시다...

웹 페이지는 객체로 구성됩니다. 객체는 HTML 파일, JPEG 이미지, Java 애플릿, 오디오 파일 등일 수 있습니다. 웹 페이지는 기본 HTML 파일로 구성되며, 여러 참조된 객체를 포함합니다. 각 객체는 URL(예: http://www.someschool.edu/someDept/pic.gif)로 주소 지정될 수 있습니다.

HTTP(Hypertext Transfer Protocol)는 웹의 애플리케이션 계층 프로토콜입니다. 클라이언트/서버 모델을 사용합니다. 클라이언트는 웹 객체를 요청, 수신 및 (HTTP 프로토콜 사용) 표시하는 브라우저입니다. 서버는 요청에 응답하여 (HTTP 프로토콜 사용) 객체를 전송하는 웹 서버입니다.

TCP를 사용합니다: 클라이언트가 서버의 80번 포트로 TCP 연결(소켓 생성)을 시작합니다. 서버가 클라이언트로부터 TCP 연결을 수락합니다. HTTP 메시지(애플리케이션 계층 프로토콜 메시지)가 브라우저(HTTP 클라이언트)와 웹 서버(HTTP 서버) 간에 교환됩니다. TCP 연결이 종료됩니다.  

HTTP는 "상태 비저장(stateless)"입니다. 서버는 이전 클라이언트 요청에 대한 정보를 유지하지 않습니다.

"상태 유지(state)"를 하는 프로토콜은 복잡합니다! 과거 기록(상태)이 유지되어야 합니다. 서버/클라이언트가 다운되면 "상태"에 대한 서로의 견해가 일치하지 않을 수 있으므로 이를 조정해야 합니다.

 

HTTP connections

비지속 HTTP, 최대 하나의 객체가 TCP 연결을 통해 전송됨, 연결 후 종료, 다중 객체 다운로드 시 다중 연결 필요
지속 HTTP, 단일 TCP 연결을 통해 다중 객체가 클라이언트-서버 간 전송 가능

HTTP 요청 메시지
두 가지 유형의 HTTP 메시지: 요청, 응답
요청 라인(GET, POST, HEAD 명령어)  
개행문자(캐리지 리턴, 라인 피드)가 헤더 라인의 시작에 있으면 헤더 라인의 끝을 의미함

HTTP/1.1: GET, POST, HEAD
GET은 데이터 조회

POST는 데이터 전송/변경

HEAD는 메타데이터 조회, GET과 유사하지만, 서버가 요청받은 객체를 보내지 않음
PUT - URL 필드에 지정된 경로에 파일을 업로드
DELETE - URL 필드에 지정된 파일을 삭제함  


PUT과 POST 차이점
POST - 새 리소스 생성
PUT - 기존 리소스 교체 또는 없으면 생성


상태 코드는 서버에서 클라이언트로 보내는 응답 메시지의 첫 번째 줄에 나타남. 

200 OK - 요청 성공, 요청한 객체가 메시지 뒤에 옴
301 Moved Permanently - 요청한 객체가 이동, 새 위치가 뒤에 지정됨 (Location:)
400 Bad Request - 서버가 요청 메시지를 이해하지 못함
404 Not Found - 요청한 문서를 이 서버에서 찾을 수 없음
505 HTTP Version Not Supported


브라우저에 URL입력하면 어떤 일이 생기나요?

Step 1. 브라우저 주소창에 http://www.google.com을 입력.
Step 2. 브라우저는 캐시에서 DNS 기록 확인.
Step 3. 요청한 URL이 캐시에 없으면 ISP의 DNS 서버에 요청하여 해당 IP 주소를 받음.
Step 4. 브라우저는 그 IP 주소로 해당 서버와 TCP 연결을 시도.
Step 5. TCP 연결에 성공하면, 브라우저가 웹 서버에 HTTP 요청 보냄.
Step 6. 웹 서버는 처리한 HTTP 응답을 브라우저에게 보냄.
Step 7. 브라우저는 응답에 기반, HTML 컨텐츠를 렌더링해서 화면 보여줌.

DHCP, ARP, DNS, TCP/IP, HTTP

이 과정에서 관여하는 주요 프로토콜들은 DHCP, ARP, DNS, TCP/IP, HTTP입니다.
1) DHCP(Dynamic Host Configuration Protocol)
- 노트북이 네트워크에 연결되면 IP 주소가 필요합니다. DHCP 서버에 접속하여 동적으로 할당된 IP 주소를 받습니다. 


목표

호스트가 네트워크에 참여할 때 네트워크 서버로부터 동적으로 IP 주소를 얻을 수 있게 함. 사용 중인 주소에 대한 리스를 갱신할 수 있음, 주소 재사용 가능(연결된 동안만 주소 보유), 네트워크에 참여하려는 모바일 사용자 지원(짧은 시간 동안)

DHCP 개요 
호스트가 "DHCP discover" 메시지를 브로드캐스트 [선택사항]
DHCP 서버가 "DHCP offer" 메시지로 응답 [선택사항]
호스트가 IP 주소 요청: "DHCP request" 메시지
DHCP 서버가 주소 전송: "DHCP ack" 메시지

 

DHCP 예시
연결된 노트북이 IP 주소, 첫 홉 라우터 주소, DNS 서버 주소가 필요: DHCP 사용
라우터에 DHCP 서버 내장
DHCP 요청이 UDP에 캡슐화, IP에 캡슐화, 802.1 이더넷에 캡슐화
이더넷 프레임이 LAN에서 브로드캐스트(목적지: FFFFFFFFFFFF), DHCP 서버가 실행 중인 라우터에서 수신


이더넷 디멀티플렉싱 -> IP 디멀티플렉싱 -> UDP 디멀티플렉싱 -> DHCP

DHCP 서버는 클라이언트 IP 주소, 클라이언트의 첫 홉 라우터 IP 주소, DNS 서버 이름 및 IP 주소를 포함한 DHCP ACK를 생성, DHCP 서버의 캡슐화, 프레임이 클라이언트로 전달되고, DHCP까지 디멀티플렉싱, 라우터에 DHCP 서버 내장
클라이언트는 이제 자신의 IP 주소, DNS 서버 이름 및 IP 주소, 첫 홉 라우터 IP 주소를 알게 됨

 

1) 클라이언트가 DHCP Discover 메시지를 브로드캐스트합니다.
이더넷 프레임 구조: [FF:FF:FF:FF:FF:FF(목적지 MAC), 클라이언트 MAC(출발지 MAC), 이더넷 타입]
IP 패킷 구조: [0.0.0.0(출발지 IP), 255.255.255.255(브로드캐스트 목적지 IP), UDP 포트 67(서버 포트)]
UDP 세그먼트 구조: [68(클라이언트 포트), 67(서버 포트), 트랜잭션 ID 654, DHCP Discover 메시지]

2) DHCP 서버가 DHCP Offer 메시지로 응답합니다.
- 이더넷 프레임 구조: [클라이언트 MAC(목적지 MAC), 서버 MAC(출발지 MAC), 이더넷 타입] 
- IP 패킷 구조: [서버 IP(출발지 IP), 클라이언트 IP 0.0.0.0(목적지 IP), UDP 포트 68(클라이언트 포트)]
- UDP 세그먼트 구조: [67(서버 포트), 68(클라이언트 포트), 트랜잭션 ID 654, 제안 IP, 라우터 IP, 리스 시간 등]

3) 클라이언트가 DHCP Request 메시지를 브로드캐스트합니다.
- 프레임/패킷/세그먼트 구조는 1)과 유사하며 트랜잭션 ID 655, 요청하는 IP 등이 포함됩니다.

4) DHCP 서버가 DHCP ACK 메시지로 최종 확인합니다.
- 이더넷 프레임 구조: [클라이언트 MAC(목적지 MAC), 서버 MAC(출발지 MAC), 이더넷 타입]
- IP 패킷 구조: [서버 IP(출발지 IP), 할당된 클라이언트 IP(목적지 IP), UDP 포트 68(클라이언트 포트)]
- UDP 세그먼트 구조: [67(서버 포트), 68(클라이언트 포트), 트랜잭션 ID 655, 할당 IP, 라우터 IP, DNS 정보, 리스 시간 등]

이렇게 DHCP 메시지는 UDP 세그먼트 안에 실제 메시지 내용이 포함되고, 이는 IP 패킷에 캡슐화되며, 최종적으로 이더넷 프레임에 MAC 헤더가 추가되어 전송됩니다.


2) ARP(Address Resolution Protocol) 
- 노트북이 같은 서브넷 내 라우터로 패킷을 보내려면 라우터의 MAC 주소가 필요합니다.
- ARP를 이용해 IP 주소에 해당하는 MAC 주소를 찾습니다.


3) DNS(Domain Name System)
- 브라우저에 입력한 http://www.google.com의
 IP 주소를 알아야 합니다.
- 브라우저 캐시에 없으면 외부 DNS 서버에 조회하여 IP 주소를 얻습니다.

 

인터넷 호스트, 라우터: 
IP 주소 (32비트) - 패킷 주소 지정에 사용
"이름", 예: http://www.yahoo.com - 사람들이 사용

질문: IP 주소와 이름을 어떻게 상호 매핑할 수 있을까?


도메인 이름 시스템:
분산 데이터베이스
계층적인 많은 이름 서버로 구현됨
애플리케이션 계층 프로토콜: 호스트와 이름 서버가 통신하여 이름 확인(주소/이름 변환)

재귀적 질의
이름 확인 부담을 접촉한 이름 서버에 줌
계층 상위 수준에서 부하 증가 가능성


4) 이후 TCP/IP를 사용해 웹 서버와 연결을 수립하고, HTTP 프로토콜로 웹 페이지 데이터를 주고받게 됩니다.
요약하면 DHCP/ARP/DNS는 웹 서버 접속 준비 단계에서 사용되며, TCP/IP/HTTP는 웹 서버와 실제 데이터를 주고받는 단계에서 사용됩니다.

노트북이 학교 네트워크에 무선 접속하여 구글 웹서버에 접속하는 전체 과정

- 목표: 단순해 보이는 시나리오(웹 페이지 요청)에 관여하는 프로토콜(모든 계층)을 식별, 검토, 이해
시나리오: 학생이 노트북을 캠퍼스 네트워크에 연결하고 http://www.google.com을 요청/수신

하루 생활 시나리오
Comcast 네트워크 68.80.0.0/13 
Google 네트워크 64.233.160.0/19, 64.233.169.105 웹 서버
DNS 서버
학교 네트워크 68.80.2.0/24  

연결된 노트북은 자신의 IP 주소, 첫 홉 라우터 주소, DNS 서버 주소를 얻어야 함DHCP 사용

DHCP 요청이 UDP에 캡슐화, IP에 캡슐화, 802.3 이더넷에 캡슐화  

이더넷 프레임이 LAN에서 브로드캐스트(목적지: FFFFFFFFFFFF), DHCP 서버 실행 중인 라우터에서 수신
이더넷 디멀티플렉싱 -> IP 디멀티플렉싱 -> UDP 디멀티플렉싱 -> DHCP
DHCP 서버가 DHCP ACK를 생성(클라이언트 IP, 클라이언트 첫 홉 라우터 IP, DNS 서버 이름/IP 포함)  
DHCP 서버에서 캡슐화, 프레임이 LAN 스위치를 통해 전달(스위치 학습), 클라이언트에서 디멀티플렉싱


클라이언트는 이제 IP 주소, DNS 서버 이름/주소, 첫 홉 라우터 IP를 알게 됨
DHCP 클라이언트가 DHCP ACK 응답을 받음

하루 생활 계속...ARP
HTTP 요청을 보내기 전, http://www.google.com의 IP 주소 필요: DNS 사용

DNS 질의가 생성되어 UDP에 캡슐화, IP에 캡슐화, 이더넷에 캡슐화
라우터 인터페이스의 MAC 주소를 알아야 프레임 전송 가능: ARP 사용
ARP 질의를 브로드캐스트, 라우터가 수신하여 ARP 응답(라우터 인터페이스 MAC)으로 응답
클라이언트는 이제 첫 홉 라우터의 MAC 주소를 알게 되어 DNS 질의를 포함한 프레임 전송 가능
DNS 질의를 포함한 IP 데이터그램이 클라이언트에서 LAN 스위치를 통해 첫 홉 라우터로 전달

IP 데이터그램이 캠퍼스 네트워크에서 Comcast 네트워크로 전달되어 (RIP, OSPF, IS-IS, BGP 라우팅 프로토콜로 생성된 테이블에 의해) DNS 서버로 라우팅
DNS 서버에서 DNS로 디멀티플렉싱 
DNS 서버가 클라이언트에게 http://www.google.com의 IP 주소로 응답

TCP 연결을 통한 HTTP
HTTP 요청을 보내려면 클라이언트가 먼저 웹 서버로 TCP 소켓을 엽니다.
TCP SYN 세그먼트(3-웨이 핸드셰이크 1단계)가 도메인 간 라우팅되어 웹 서버로 전달
웹 서버가 TCP SYNACK(3-웨이 핸드셰이크 2단계)로 응답
TCP 연결 수립

HTTP 요청/응답
HTTP 요청이 TCP 소켓으로 전송
HTTP 요청을 포함한 IP 데이터그램이 http://www.google.com으로 라우팅
웹 서버가 HTTP 응답(웹 페이지 포함)으로 응답  
HTTP 응답을 포함한 IP 데이터그램이 클라이언트로 라우팅 되어 돌아옴

 

 

728x90