0. 네트워크 프로그래밍이란?
1. TCP / IP 프로토콜
1.1. 인터넷 구성 요소
- 호스트 : 최종 사용자의 프로그램을 수행하는 주체
- 라우터: 호스트에서 생성된 데이터를 여러 네트워크를 거쳐 전송, 다른 네트워크에 속한 호스트 간 데이터를 교환할 수 있게 하는 장비
- 통신 프로토콜: 호스트와 라우터, 라우터와 라우터, 호스트와 호스트가 통신하기 위한 정해진 절차와 방법

1.2. 프로토콜?
약속, 규약
- OSI 7계층 모델 : 네트워크 통신의 복잡성 관리 및 표준화 -> 국제 표준화 기구 (ISO)에서 만들어짐
- 각 계층은 특정 통신 기능을 담당하도록 표준화

1.3. TCP/IP 프로토콜
- 인터넷의 핵심 프로토콜인 TCP와 IP를 비롯한 각종 프로토콜 집합
- 다양한 네트워크 간의 통신 문제 해결 위해 개발
- 운영체제의 일부로 구현, 응용 프로그램은 일반적으로 운영체제가 제공하는 TCP/IP 프로토콜의 서비스를 사용해 통신 수행

OSI 모델과 TCP/IP 간의 관계
- OSI 모델은 이론적 프레임워크, 명확한 정의
- TCP/IP는 실제 사용되는 프로토콜 스택, 인터넷의 기본 통신을 위한 네 가지 계층
1.3.1. TCP/IP 프로토콜 구조
- 계층적 구조

- 네트워크 접근 계층
- 역할: 물리적 네트워크를 통한 데이터 송수신
- 구성요소: 네트워크 하드웨어 + 장치 드라이버
- 주소 지정 방식: 물리 주소
- 인터넷 계층
- 역할: 네트워크 접근 계층의 도움을 받아 데이터를 목적지 호스트까지 전달
- 구성 요소: IP 주소 + 라우팅(라우터)
- 주소 지정 방식: IP 주소 (소프트웨어적으로 정의된 논리 주소, 전 세계적인 유일성, 하드웨어 독립성을 가짐) ex) 147.46.114.70
- 라우팅: 데이터를 목적지까지 전달하는 일련의 작업 (라우팅에 필요한 정보 수집 및 라우팅 정보를 기초로 데이터 전달)
- 전송 계층
- 역할: 최종 통신 목적지(응용 프로그램)를 지정, 오류 없이 데이터 전송 (데이터 손실 또는 손상을 검출해 잘못된 데이터가 목적지에 전달되는 걸 방지)
- 주소 지정 방식: 포트 번호
- 대표 프로토콜: TCP(Transmission Control Protocol), UDP(User Datagram Protocol)

- 응용 계층
- 역할: 전송 계층을 기반으로 한 다수의 프로토콜, 이 프로토콜을 사용하는 응용 프로그램을 포괄
- 대표 프로토콜: Telnet, FTP, HTTP, SMTP
1.4. 데이터 전송 원리
1.4.1. 패킷
- 각 프로토콜에서 정의한 제어 정보 (IP 주소, 포트 번호, 오류 체크 코드 등) + 데이터
- 제어 정보의 위치에 따라 앞쪽에 붙는 헤더와 뒤쪽에 붙는 트레일러로 구분
- 패킷 = 택배
패킷 전송 형태
- 응용 계층, 전송 계층: 하부 계층이 제공하는 가상적인 연결을 사용해 동작
- 인터넷 계층: IP 주소와 라우팅 기능을 이용해 패킷 전송 경로 설정
- 네트워크 접근 계층: 물리 주소를 사용해 실제 패킷 전송

1.4.2. IP 주소, 포트 번호
IP 주소: 인터넷에 있는 호스트와 라우터의 식별자
- 전 세계적으로 값이 유일 (폐쇄된 네트워크, IP 공유는 예외)
- IPv4: 32비트(4바이트), 8비트 단위로 .으로 구분하여 10진수 4개로 표기 -> dotted-decimal notation
ex) 147.46.114.70
- IPv6: 128비트 (16 바이트) 사용, 16비트 단위로 :(colon)으로 구분하여 16진수 8개로 표기 -> colon- hexadecimal notation
ex) 2001:0230:abcd:ffab:0023:eb00:ffff:1111
포트 번호
- 인터넷 통신의 종착점(하나 혹은 여러 프로세스)을 나타내는 식별자
- TCP, UDP 는 포트 번호로 부호 없는 16비트 정수 사용 (0 ~65535 범위 가능)
- 영역별 포트 번호 (IANA 관리)

- 주요 포트 번호

프로세스와 IP 주소 & 포트 번호 간의 관계

도메인 이름
- IP 주소에 대한 (기억하기 쉬운) 별명
- 실제 통신할 때는 IP 주소로 변환
클라이언트- 서버 (Client/Server) 모델
- 두 프로그램이 상호 작용하는 방식
- 클라이언트: 서비스를 요청하는 쪽
서버: 클라이언트가 요청하는 서비스를 처리하는 쪽

2. 소켓의 개념
세가지 관점
2.1. 데이터 타입
- 파일 디스크립터 혹은 핸들과 유사한 개념
- 생성, 설정 과정이 끝나면 운영체제의 통신 관련 정보를 참조해 다양한 작업을 편리하게 할 수 있는 데이터 타입

2.2. 통신 종단점
- 응용 프로그램은 자신의 소켓이 상대편의 소켓과 연결된 것으로 생각하고 데이터 주고받음

2.3. 네트워크 프로그래밍 인터페이스
- 소켓은 TCP/IP 프로토콜에서 (일반적으로) 응용 계층과 전송 계층 사이에 위치하는 것으로 간주
- 통신 양단이 모두 소켓을 사용할 필요가 없다 (예시로 택배)

3. 소켓의 특징과 구조
3.1. 윈도우 소켓 (윈속)
- 버클리 유닉스에서 개발, 네트워크 프로그래밍 인터페이스를 윈도우 환경에서 사용 O
- 윈도우 95 버전부터 API에 정식 포함 제공
윈도우 소켓과 유닉스 소켓의 차이점
- 윈도우 소켓은 DLL 을 통해 대부분의 기능 제공
DLL(Dynamic Link Libarary): 윈도우 운영체제에서 프로그램들이 공통으로 사용하는 코드, 데이터, 리소스들을 모아놓은 라이브러리
-> 따라서, 윈도우 소켓 사용 위해 서는 DLL 초기화, 종료 작업을 위한 함수 사용
-
윈도우 프로그램은 대개 GUI를 갖추고 메세지 구동 방식으로 동작 -> 이를 위한 확장 함수가 존재

-
윈도우는 운영체제 차원에서 멀티 스레드를 지원하므로 멀티스레드 환경에서 안정적으로 동작하는 구조, 이를 위한 함수가 필요

3.2. 윈속의 장점
- 유닉스 소켓과 소스 코드 수준에서 호환성이 높음 (기존 코드를 이식하여 활용하기 쉬움)
- 여러 운영체제(윈도우, 리눅스)에서 사용 가능
- TCP/IP 외의 프로토콜도 지원 -> 최소 코드 수정으로 응용 프로그램이 사용할 프로토콜 변경 가능
- 비교적 저수준 프로그래밍 인터페이스 -> 세부 제어가 가능, 고성능 네트워크 프로그램 개발 가능
3.3. 윈속의 단점
- 응용 프로그램 수준의 프로토콜을 프로그래머가 직접 설계 : 주고받는 데이터 형식, 전송 절차 등을 고려, 설계 변경 시 코드 수정이 불가피함
- 서로 다른 바이트 정렬 방식 사용 또는 데이터 처리 단위가 서로 다른 호스트 끼리 통신시 -> 응용 프로그램 수준에서 데이터 변환을 처리
3.4. 윈속 구조
