인프런 강민철님의 강의를 듣고 정리한 내용입니다.
강의에서 나오는 많은 언어는 https://csnote.net/ 에서 확인할 수 있습니다.

하드웨어

인코딩

EUC-KR은 완성형 인코딩이다. 표현하지 못하는 한글이 있어 유니코드가 등장했으며, 유니코드도 UTF-8, UTF-16 등 다양한 인코딩 방식이 있다.

CPU

레지스터는 CPU 내부에 있는 메모리로, 가장 작은 단위의 메모리이다. CPU는 레지스터에서 계산을 수행하고 결과를 다시 레지스터에 저장한다.

CPU는 의존성이 없는 명령어를 병렬 실행할 수 있다. 비순차적 명령어 실행(Out-of-Order Execution)을 지원하는 CPU는 의존성이 없는 명령어의 순서를 조정해 사이클을 최적화한다.

RISC vs CISC

구분RISCCISC
명령어단순, 고정 길이복잡, 가변 길이
구조단순복잡
전력 소비낮음높음
대표 예시ARMx86

ARM은 RISC 아키텍처로, 전력 소비가 낮아 ARM 기반 VM에 “탄소 절감”이라는 표현이 붙기도 한다.

메모리

참조 지역성의 원리

컴퓨터의 프로그램은 다음과 같은 경향이 있다. 캐시 메모리는 이 원리를 활용해 성능을 높이도록 설계되었다.1

  • 시간적 지역성(Temporal Locality): 최근 접근한 메모리 주소를 다시 접근하는 경향 (ex. 같은 변수나 함수를 여러 번 접근)
  • 공간적 지역성(Spatial Locality): 접근한 메모리 주소 근처를 접근하는 경향 (예: 배열 순회)

RAM 종류

  • DRAM (Dynamic RAM): 일반적으로 사용하는 RAM. DDR 세대가 올라갈 때마다(DDR2 → DDR3 → DDR4 → DDR5) 대역폭이 약 2배씩 증가한다.
  • SRAM (Static RAM): 데이터 상태를 유지할 수 있어 성능이 좋지만, 대용량에는 비효율적이다. 주로 캐시 메모리에 사용된다.

메모리는 주소의 시작점과 크기를 저장하고, 범위를 벗어난 요청을 거부한다.

저장장치

플래시 메모리

셀당 비트 수가 적을수록 입출력이 빠르고 수명이 길다. 대신 용량 대비 비용이 비싸다.

SSD

SSD는 삭제 단위가 쓰기 단위보다 크다. 따라서 Invalid 상태의 데이터가 존재하며, 유효한 데이터만 다른 블록에 새로 쓰고 원래 블록을 지우는 Garbage Collection이 수행된다.

RAID

여러 개의 하드디스크를 하나의 논리적인 디스크처럼 사용하여 안정성과 성능을 높이는 기술이다.

  • RAID 1: 단순 미러링(이중화)
  • RAID 4, 5, 6: 패리티 비트를 사용한 복구 지원

운영체제 (OS)

커널

커널이란 OS 내부에서 격리되어 적재된 영역으로, 하드웨어를 직접 제어하는 핵심 영역이다.

프로세스 스케줄링

I/O bound 작업은 CPU 소비가 적다. 일부 스케줄링 알고리즘에서는 I/O bound 작업의 우선순위를 높여 빠르게 처리하고, 남는 CPU 자원을 CPU bound 작업에 할당한다. (단, 이는 스케줄러 정책에 따라 다르다.)

자원별로 스케줄링 큐가 있으며, 우선순위가 적용되므로 단순 FIFO는 아니다.

메모리 관리

Swapping: 사용하지 않는 프로그램을 보조 기억 장치에 저장하는 기술이다.

외부 단편화: 연속 메모리 할당 시 빈 공간이 흩어져 총 잔여 메모리가 충분해도 할당이 실패하는 현상.

가상 메모리: 프로그램의 일부만 메모리에 로드하여 실제 메모리보다 큰 프로그램을 실행할 수 있게 하는 기술.

페이징: 메모리 주소를 페이지 단위로 나누어 불연속적으로 할당하는 기술. 페이지 테이블이 필요하다.

내부 단편화: 페이지보다 작은 프로세스가 있을 때 발생하는 메모리 낭비. 외부 단편화보다는 낭비가 적다.

페이지 테이블은 주로 메모리에 저장되지만, 자주 참조하는 부분은 TLB(캐시)에 저장된다.

파일 시스템

대부분의 OS에서 디렉토리는 특별한 형태의 파일이다. (Unix 계열 기준)


네트워크

패킷

패킷은 쪼개져서 전송되며, IP 계층에서는 기본적으로 순서가 보장되지 않는다. (TCP에서 순서 보장)

물리 계층

구리 선은 노이즈에 민감하여 일반적으로 Shield(차폐)가 필요하다.

국제 통신의 95% 이상을 해저 케이블이 담당한다. 위성 등 대안이 있지만 대역폭과 지연 시간에서 해저 케이블을 대체하지 못한다. 케이블이 손상되면 GPS 좌표를 파악하여 전용 수리 선박(Cable Ship)이 인양 후 수리한다.

물리 계층에는 주소 개념이 없다. 순수하게 전송/수신만 담당하며, 데이터 링크 계층부터 주소(MAC 주소)를 사용한다.

데이터 링크 계층

스위치의 MAC 주소 학습

스위치는 송신지 MAC 주소를 기준으로 주소 테이블에 등록하는 식으로 학습한다. 수신지의 경우, 먼저 모든 포트로 데이터를 전송(Flooding)하고, 올바른 주소의 장치가 응답 프레임을 보내면 해당 주소를 학습한다. 이후에는 등록된 주소로만 데이터를 전송한다.

에이징(Aging)

일정 시간 이상 데이터를 받지 못한 포트의 MAC 주소 정보를 테이블에서 삭제하는 과정이다.

ARP (Address Resolution Protocol)

IP 주소를 통해 MAC 주소를 알아내기 위한 프로토콜이다. 네트워크 계층(IP)과 데이터 링크 계층(MAC) 사이의 주소 변환을 담당한다.

네트워크 계층

IP Fragmentation

MTU(Maximum Transmission Unit)보다 큰 데이터를 전송할 때, 패킷을 여러 조각으로 분할하여 전송하는 기술이다. 단편화는 CPU/메모리 오버헤드를 유발하고, 하나의 조각이 유실되면 전체 패킷을 재전송해야 하므로 성능에 부정적이다. 이를 방지하기 위해 패킷 크기를 MTU에 맞추어 보내거나, DF(Don’t Fragment) 플래그를 설정한다. DF가 설정된 패킷이 MTU를 초과하면 라우터가 해당 패킷을 폐기하고 ICMP 오류 메시지를 송신자에게 반환한다.

IP 주소 체계

IP 주소에는 클래스(A, B, C 등)가 있고, 클래스에 따라 네트워크 주소와 호스트 주소에 사용되는 octet 수가 달라진다. 현재는 클래스 구분 없이 유동적으로 할당하는 CIDR(Classless Inter-Domain Routing)를 사용한다. 네트워크 부분은 1, 호스트 부분은 0으로 표기한 것이 서브넷 마스크이며, 1의 개수만으로 표기하는 것이 CIDR 표기법이다(예: /24). 호스트 주소가 모두 0인 주소는 네트워크 자체를, 모두 1인 주소는 브로드캐스트용으로 예약되어 있다.

IPv6

IPv4의 주소 고갈 문제를 해결하기 위해 등장했다. 128비트 주소 체계로 더 많은 주소를 지원하며, 확장 헤더를 통해 유연한 기능 확장이 가능하다.

특수 IP 주소

  • 0.0.0.0/8: IP 주소가 없거나 지칭할 IP가 없을 때 사용한다.
  • 0.0.0.0/0: 모든 임의의 IP 주소를 의미한다. 라우트할 주소가 명확하지 않을 때 기본 라우트(default route)로 사용된다.
  • 127.0.0.1: 루프백(loopback) 주소로, 자기 자신을 가리킨다.

NAT (Network Address Translation)

Private IP와 Public IP를 변환하는 기술이다.

  • Static NAT: Private IP와 Public IP를 1:1로 영구 매핑한다. 외부에서 먼저 접속해도 매핑이 고정되어 있으므로 Inbound가 가능하다.
  • Stateful NAT (Dynamic NAT): 연결이 시작될 때 동적으로 매핑을 생성하고 연결 상태를 추적한다. “누가 먼저 연결을 시작했는가”를 기준으로 동작하므로, Outbound 연결과 그 응답만 자동 처리할 수 있다.

NAT 기술 자체는 방향성이 없지만, CSP는 비용 효율성을 위해 1:N 매핑이 가능한 Stateful NAT를 선택했다. Stateful NAT는 연결 시작점을 추적하므로 Outbound만 자동 처리된다. 따라서 클라우드의 NAT Gateway는 Outbound 전용이며, Inbound가 필요하면 Static NAT나 Port Forwarding을 별도로 구성해야 한다.

ICMP (Internet Control Message Protocol)

패킷 전송 과정에서의 문제와 네트워크 진단 결과를 알려주는 프로토콜이다. ping, traceroute 등에 사용되며, 신뢰성을 보장하는 프로토콜은 아니다.

전송 계층

TCP vs UDP

IP 통신은 빠른 성능을 위해 수신 확인이나 사전 연결 확인 없이 패킷을 보내기만 한다. TCP는 이러한 확인 과정을 모두 거쳐 신뢰성을 보장하고, UDP는 확인 과정 없이 빠르게 전송한다.

TCP 재전송

TCP는 타임아웃(RTO 만료) 또는 중복 ACK 수신으로 데이터 유실을 감지하고 재전송한다. 중복 ACK를 3번 받으면 RTO 만료를 기다리지 않고 즉시 재전송하는 Fast Retransmit(RFC 5681)이 정의되어 있으며, 오늘날 대부분의 TCP 구현에서 기본 활성화되어 있다.

흐름 제어 (Sliding Window)

확인 응답을 받지 않고도 보낼 수 있는 데이터 양(윈도우)을 미리 정해 두고, ACK를 받을 때마다 그만큼 윈도우를 전진시켜 추가 전송하는 방식이다. 윈도우는 송신/수신 양쪽에 존재하지만, 전송 허용량은 수신 측이 광고하는 **rwnd(Receive Window)**로 결정된다.

혼잡 제어 (Congestion Control)

네트워크 트래픽 상태를 감지해 전송량을 조절하는 메커니즘이다. 송신 측이 관리하는 **cwnd(Congestion Window)**를 기반으로 동작하며, 실제 전송 가능량은 min(cwnd, rwnd)로 결정된다. Slow Start, Congestion Avoidance, Fast Recovery 등의 알고리즘이 있다.

ECN (Explicit Congestion Notification)

RFC 3168에 정의된 혼잡 제어 보조 기법으로, 라우터 등 중간 네트워크 장치가 패킷 헤더에 혼잡 발생을 표시(마킹)해 송신자에게 알린다. 패킷을 폐기하지 않고도 혼잡을 전달할 수 있어 재전송 비용을 줄인다.

포트(Port)

포트는 하나의 IP 주소에서 여러 프로세스나 서비스를 구분하기 위한 개념이다. 브라우저와 같은 클라이언트는 주로 동적 포트(49152-65535)를 사용하고, 서버는 잘 알려진 포트(0-1023)를 사용한다.

응용 계층

DNS 질의 방식

  • 재귀적 질의(Recursive Query): 클라이언트가 리졸버에게 최종 답을 요구하고, 리졸버가 대신 여러 서버를 돌며 결과를 알아낸다.
  • 반복적 질의(Iterative Query): 서버가 답을 모르면 “다음으로 물어볼 서버”를 알려주고, 질의자가 직접 그 서버에 다시 질의한다. 루트 → TLD → 권한 서버 순으로 진행된다.

URI / URL / URN

URI는 자원을 식별하는 문자열의 총칭이며, URL(위치 기반)과 URN(이름 기반)을 포함한다. URN은 위치와 무관하게 자원을 영구 식별하기 위한 체계지만, 실제로는 널리 채택되지 않았다.

HTTP Stateless와 쿠키

HTTP는 확장성과 견고성을 위해, 그리고 특정 클라이언트-서버 간 상태 의존성을 없애기 위해 Stateless로 설계되었다. 이를 보완하기 위한 개념이 쿠키로, 서버가 Set-Cookie 응답 헤더로 발급하고 클라이언트가 저장해 이후 요청의 Cookie 헤더로 전달한다. 쿠키는 보통 Domain/Path 속성으로 사용 범위가 제한된다.

콘텐츠 협상(Content Negotiation)

같은 URI에 대해 언어, 인코딩, 미디어 타입 등을 고려하여 가장 적합한 표현(representation)을 제공하는 메커니즘이다. Accept, Accept-Language, Accept-Encoding 등의 요청 헤더로 동작한다.

중간 서버: 프록시와 게이트웨이

RFC 9110 기준, 클라이언트와 오리진 서버 사이에는 여러 중개자가 존재할 수 있다.

  • 프록시(Proxy): 클라이언트가 선택한 메시지 전달 대리자. 주로 클라이언트 측에 위치한다.
  • 게이트웨이(Gateway): 아웃바운드 방향에서 오리진 서버 역할을 하는 중개자. **리버스 프록시(Reverse Proxy)**라고도 한다.

gRPC

gRPC는 Google이 만든 RPC 프레임워크로, HTTP/2 위에서 Protocol Buffers로 직렬화한 메시지를 주고받는다.

  • Protocol Buffers: 구조화된 데이터를 바이너리로 직렬화. JSON 대비 페이로드가 작고 파싱이 빠르다. .proto IDL로 스키마를 명시한다.
  • HTTP/2 기반: 단일 커넥션에서의 다중 요청 처리(Multiplexing), 양방향 스트리밍(Bidirectional Streaming), 헤더 압축(HPACK)을 활용한다.
  • 트레이드오프:
    • 디버깅이 REST/JSON보다 어렵다 (바이너리 페이로드, 브라우저 DevTools 한계).
    • 브라우저는 HTTP/2 trailer 등을 직접 다룰 수 없어 gRPC-Web + 프록시(envoy 등) 레이어가 필요하다.
    • 사내 마이크로서비스 간 통신처럼 양 끝 통제 가능한 환경에 적합하고, 외부 공개 API에는 부담이 크다.

보안: TLS와 인증서

CA와 인증서 발급

CA(Certificate Authority)는 서버의 공개 키와 식별 정보를 담은 인증서에 자신의 개인 키로 전자 서명한다(암호화가 아니라 서명). 수신자는 CA의 공개 키로 서명을 검증하여 “이 인증서를 실제로 해당 CA가 발급했음”을 확인할 수 있다. CA의 개인 키가 유출되지 않는 한, 서명 위조는 불가능하다.

인증서 검증 과정

  1. 인증서 본문을 해시한 값과, CA 공개 키로 서명을 복호화해 얻은 해시 값을 비교한다(서명 검증).
  2. 인증서의 유효 기간, 도메인 일치(SAN), 폐기 여부(CRL/OCSP), 체인을 따라 루트 CA까지 신뢰 가능한지 확인한다.

기타

128비트 CPU가 없는 주요 이유는 현재 64비트의 성능과 메모리 지원 용량이 대부분의 용도에서 충분하기 때문이다.

Footnotes

  1. https://www.geeksforgeeks.org/computer-organization-architecture/locality-of-reference-and-cache-operation-in-cache-memory/