ch01. 네트워크와 소켓 프로그래밍

해담·2024년 10월 13일

TCP/IP 프로토콜 개요

TCP/IP 프로토콜 구조

호스트는 최종 사용자의 응용 프로그램을 수행하는 주체로, PC, 노트북, 스마트폰 등입니다.
라우터는 호스트에서 생성된 데이터를 여러 네트워크를 거쳐 전송함으로써 서로 다른 네트워크에 속한 호스트 간에 데이터를 교환할 수 있게 하는 장비입니다.
통신 프로토콜은 호스트와 라우터, 라우터와 라우터, 호스트와 호스트가 통신하기 위한 정해진 절차와 방법입니다.

인터넷에서 사용하는 핵심 프로토콜은 TCP와 IP로, 이를 비롯한 각종 프로토콜을 총칭하여 TCP/IP 프로토콜이라고 부릅니다. 이는 운영체제의 일부로 구현되어 제공됩니다. 또한 통신을 수행하는 주체이자 통신의 최종 목적지는 호스트 자체가 아닌 호스트에서 수행하는 응용 프로그램입니다.

TCP/IP 프로토콜의 계층에는 응용 계층, 전송 계층, 인터넷 계층, 네트워크 접근 계층이 있으며, 이 중 TCP는 전송 계층, IP는 인터넷 계층입니다.

네트워크 접근 계층

물리적 네트워크를 통한 데이터 송수신을 담당합니다. 구성 요소는 네트워크 하드웨어 + 장치 드라이버입니다. 네트워크 접근 계층에서는 하드웨어적으로 정의된 물리적 주소를 사용하여 통신합니다. 예를 들어 48비트 물리적 주소인 이더넷이 있으며, 48비트 물리적 주소가 16진수로 표시됩니다. 윈도우에서는 ipconfig /all, 리눅스에서는 ifconfig 명령어를 사용합니다.

인터넷 계층

네트워크 접근 계층의 도움을 받아 데이터를 목적지 호스트까지 전달하는 역할입니다. 구성 요소는 IP 주소 + 라우팅(or 라우터)입니다. 인터넷 계층에서는 IP 주소를 사용하여 통신합니다. IP 주소는 소프트웨어적으로 정의된 논리 주소이며, 전 세계적인 유일성과 하드웨어 독립성을 가집니다. 여기서 실제 통신을 하려면 전송 경로를 결정하고 그에 따라 데이터를 전달하는 작업인 라우팅이 필요합니다. 라우팅은 데이터를 목적지까지 전달하는 일련의 작업을 뜻하고, 라우팅에 필요한 정보를 수집하고 라우팅 정보를 기초로 실제 데이터를 전달하는 작업을 포함합니다.

전송 계층

최종 통신 목적지(응용 프로그램)를 지정하고, 오류 없이 데이터를 전송하는 역할입니다. 즉, 데이터 손실 또는 손상을 검출해 잘못된 데이터가 목적지에 전달되는 일을 방지합니다. 앞서 언급한 인터넷 계층의 역할은 IP 주소와 라우팅을 이용하여 목적지 호스트에 데이터가 도달할 수 있게 하는 것입니다. 그러나 통신의 최종 목적지는 호스트가 아닌 해당 호스트에서 실행되는 프로세스(응용 프로그램)입니다. 따라서 프로세스를 지정하는 16비트 주소인 포트 번호를 이용합니다. 대표 프로토콜로는 TCP와 UDP가 존재합니다.

TCP UDP
연결형 프로토콜: 연결 설정 후 통신 가능 비연결형 프로토콜: 연결 설정 없이 통신 가능
신뢰성 있는 데이터 전송: 필요시 데이터 재전송 신뢰성 없는 데이터 전송: 데이터 재전송하지 않음
일대일 통신 일대일 통신, 일대다 통신
데이터 경계 구분 안 함: 바이트 스트림 서비스 데이터 경계 구분함: 데이터그램 서비스

응용 계층

전송 계층을 기반으로 한 다수의 프로토콜과 이 프로토콜을 사용하는 응용 프로그램을 포괄합니다. Telnet, FTP, HTTP, SMTP 등이 포함되며, 소켓으로 구현한 네트워크 프로그램도 여기에 속합니다.

데이터 전송 원리

패킷이란?

각 프로토콜에서 정의한 제어 정보(IP 주소, 포트 번호, 오류 체크 코드 등) + 데이터로 정의할 수 있습니다. 제어 정보의 위치에 따라 앞쪽에 붙는 헤더(header)와 뒤쪽에 붙는 트레일러(trailer)로 구분됩니다.

아래는 패킷 전송 형태입니다. 송신 측은 응용 프로그램에서부터 아래로, 수신 측은 이더넷부터 위로 올라옵니다. 또한 각 계층은 동일 위치의 상대 계층과 통신하는 것으로 간주합니다.
응용 프로그램: 데이터
TCP: TCP 헤더 + 데이터
IP: IP 헤더 + TCP 헤더 + 데이터
이더넷: 이더넷 헤더 + IP 헤더 + TCP 헤더 + 데이터 + 이더넷 트레일러

IP 주소, 포트 번호

IP 주소는 인터넷에 있는 호스트와 라우터의 식별자입니다. 폐쇄된 네트워크이거나 IP를 공유하는 경우가 아니면 전 세계적으로 값이 유일하다는 특징이 있습니다. IPv4는 32비트, IPv6는 128비트 사용을 사용합니다. 또한 IPv4는 8비트 단위로 .(dot)로 구분하여 10진수 4개로 표기하며(dotted-decimal notation)(147.46.114.70), IPv6는 16비트 단위로 :(colon)으로 구분하여 16진수 8개로 표기합니다(colon-hexadecimal notation)(2001:0230:abcd:ffab:0023:eb00:ffff:1111).

포트 번호는 인터넷 통신의 종착점(하나 혹은 여러 프로세스)을 나타내는 식별자입니다. TCP와 UDP는 포트 번호로 부호 없는 16비트 정수를 사용하므로 0~65535 범위가 가능합니다.

다음은 영역별 포트 번호입니다. 0~1023은 용도가 정해져 있으므로, 보통 이를 제외한 범위에서 사용하는 것이 바람직합니다.
0 ~ 1023: 알려진 포트(well-known ports)
1024 ~ 49151: 등록된 포트(registered ports)
49152 ~ 65535: 동적/사설 포트(dynamic and/or private ports)

도메인 이름은 IP 주소에 대한 (기억하기 쉬운) 별명입니다. 실제 통신할 때는 IP 주소로 변환해야 합니다.

클라이언트-서버 모델

두 프로그램이 상호 작용하는 방식을 나타내는 용어로, 서비스를 요청하는 쪽은 클라이언트(Client), 클라이언트가 요청하는 서비스를 처리하는 쪽은 서버(Server)라고 합니다.
클라이언트가 서버에 접속하려면 서버의 IP 주소(혹은 도메인 이름)와 포트 번호를 알고 있어야 합니다. 반면, 서버는 클라이언트가 보낸 패킷에 주소 정보가 모두 들어 있으므로, 클라이언트의 주소를 미리 알 필요가 없습니다.

소켓의 개념

소켓 통신을 일반 전화 통신과 비교해보겠습니다. 사람은 응용 프로그램, 내선 번호는 포트 번호, 대표 전화는 IP 주소, 전화망은 인터넷에 대응합니다. 여기서 포트 번호와 IP 주소가 소켓입니다. 이런 소켓이라는 용어의 의미를 세 가지 관점에서 살펴보겠습니다.

데이터 타입

파일 디스크립터 혹은 핸들과 유사한 개념으로, 생성과 설정 과정이 끝나면(만들고 나면) 운영체제의 통신 관련 정보를 참조해 다양한 작업을 편리하게 할 수 있는 데이터 타입입니다.

통신 종단점

응용 프로그램은 자신의 소켓이 상대편의 소켓과 연결된 것으로 생각하고 데이터를 주고받습니다.

네트워크 프로그래밍 인터페이스

통신 양단이 모두 소켓을 사용할 필요는 없으며, 둘 다 같은 프로토콜을 사용하고 정해진 형식과 절차에 따라 데이터를 주고받으면 됩니다. 또한 TCP/IP 프로토콜에서 (일반적으로) 응용 계층과 전송 계층 사이에 위치하는 것으로 간주합니다.

소켓의 특징과 구조

소켓 특징

윈도우 소켓(윈속)은 버클리 유닉스에서 개발한 네트워크 프로그래밍 인터페이스를 윈도우 환경에서 사용할 수
있게 만든 것으로, 윈도우 95 버전부터 API에 정식으로 포함하여 제공합니다.

아래는 윈도우 소켓과 유닉스 소켓의 차이점입니다.
1. 윈도우 소켓은 DLL을 통해 대부분의 기능이 제공되므로 DLL 초기화와 종료 작업을 위한 함수가 필요
2. 윈도우 프로그램은 대개 GUI를 갖추고 메시지 구동 방식으로 동작하므로 이를 위한 확장 함수가 존재
3. 윈도우는 운영체제 차원에서 멀티스레드를 지원하므로 멀티스레드 환경에서 안정적으로 동작하는 구조와 이를 위한 함수가 필요

윈속의 장점으로는, 유닉스 소켓과 소스 코드 수준에서 호환성이 높으므로 기존 코드를 이식하여 활용하기 쉽고, 가장 널리 사용되는 네트워크 프로그래밍 인터페이스이므로 한번 배우면 여러 운영체제(윈도우, 리눅스 등)에서 사용 가능합니다. 또한 TCP/IP 외의 프로토콜도 지원하므로 최소 코드 수정으로 응용 프로그램이 사용할 프로토콜 변경이 가능하며, 비교적 저수준 프로그래밍 인터페이스이므로 세부 제어가 가능하며 고성능 네트워크 프로그 램 개발 가능합니다.

윈속의 단점으로는, 응용 프로그램 수준의 프로토콜을 프로그래머가 직접 설계해야 합니다, 즉, 주고받는 데이터 형식이나 전송 절차 등을 고려해 프로그래밍해야 하며, 설계 변경 시에는 코드를 수정해야 합니다. 또한 서로 다른 바이트 정렬 방식을 사용하거나 데이터 처리 단위가 서로 다른 호스트끼리 통신할 경우, 응용 프로그램 수준에서 데이터 변환을 처리해야 합니다.

윈속 구조 (교재 36쪽 참고)

profile
해담이를먹여살리기위한..

0개의 댓글