본문으로 건너뛰기
pkglog
블로그소개

주제별 글 모음

네트워크 프로그래밍과 프로토콜

TCP의 연결 상태와 혼잡 제어, UDP, HTTP 버전별 차이, TLS, SSH, WebSocket·SSE까지 프로토콜 동작을 실제 명령으로 확인하면서 정리합니다. TIME_WAIT·CLOSE_WAIT가 쌓이는 이유처럼 운영 중에 마주치는 문제도 포함합니다.

구현 쪽에서는 C++ 소켓 기초, 메시지 경계와 직렬화, TLS 연동, Boost.Asio의 io_context·strand·post/dispatch·핸들러 수명과 데드락 디버깅을 다룹니다.

처음 읽기 좋은 글

  • TCP 동작 원리: 3-way handshake, 흐름·혼잡 제어(CUBIC·BBR)와 소켓 디버깅TCP 3-way handshake와 연결 종료, rwnd·cwnd 기반 흐름·혼잡 제어, Reno·CUBIC·BBR 알고리즘 차이를 설명하고 C++·Python·Node.js 소켓 예제와 RST·느린 전송 문제를 분석하는 디버깅 방법을 다룹니다.
  • TCP 연결 상태 11가지: TIME_WAIT·CLOSE_WAIT가 쌓이는 이유와 netstat·ss 디버깅TCP 11가지 연결 상태(LISTEN, SYN_SENT, ESTABLISHED, FIN_WAIT, TIME_WAIT 등)의 동작 원리와 상태 전이, netstat·ss로 상태를 확인하고 TIME_WAIT·CLOSE_WAIT 문제를 디버깅하는 방법을 정리합니다.
  • Boost.Asio 입문: io_context, 비동기 타이머·읽기·쓰기, 핸들러 수명과 work_guardBoost.Asio로 비동기 I/O를 시작하는 방법. 블로킹과 논블로킹 비교, io_context와 run, 비동기 타이머, async_read/async_write, 비동기 TCP 클라이언트·서버, 핸들러 수명과 work_guard 실수를 다룹니다.

전체 글 39편

각 글에 표시된 난이도를 기준으로 초급, 중급, 고급 순으로 나눴습니다. 처음이라면 위쪽부터 읽고, 이미 아는 단계는 건너뛰어도 됩니다.

초급 (2편)

  • FTP 프로토콜 실전 활용 | Active·Passive·FTPS·SFTP와 파일 전송 운영FTP의 제어 채널과 데이터 채널이 따로 열리는 구조, Active와 Passive 모드에서 방화벽·NAT 때문에 전송이 실패하는 이유, lftp 클라이언트와 vsftpd chroot 설정, 평문 FTP 대신 FTPS나 SFTP로 옮길 때의 차이를 초급자 눈높이로 설명합니다.
  • HTTP vs FTP vs SSH 프로토콜 비교 | 용도·보안·파일 전송 선택 가이드HTTP(S), FTP/FTPS, SSH(SFTP·SCP)의 포트·인증·암호화 방식과 채널 구조 차이를 비교하고, 웹 API·대용량 파일 전송·원격 서버 관리 상황별로 어떤 프로토콜을 고를지와 FTP에서 SFTP나 객체 스토리지로 옮기는 절차를 curl·OpenSSH 예제로 다룹니다.

중급 (16편)

  • Asio 이벤트 루프 동작 원리: run·poll 차이, post vs dispatch, work_guard, strandBoost.Asio 이벤트 루프 정리. run/run_one/poll 차이, work_guard로 서버 유지하기, post와 dispatch, 멀티스레드 이벤트 루프와 strand, C++20 코루틴, 완료 핸들러 체이닝을 다룹니다.
  • Boost.Asio 입문: io_context, 비동기 타이머·읽기·쓰기, 핸들러 수명과 work_guardBoost.Asio로 비동기 I/O를 시작하는 방법. 블로킹과 논블로킹 비교, io_context와 run, 비동기 타이머, async_read/async_write, 비동기 TCP 클라이언트·서버, 핸들러 수명과 work_guard 실수를 다룹니다.
  • C++ 네트워크 에러 처리: errno 해석, 타임아웃, 지수 백오프 재시도, 서킷 브레이커, EINTR프로덕션에서 간헐적으로 연결이 끊길 때 errno를 어떻게 해석하고 어떤 에러만 재시도할지 판단하는 법을 다룹니다. SO_RCVTIMEO·select·논블로킹 connect 타임아웃 비교, 지터를 섞은 지수 백오프, 서킷 브레이커, EINTR과 부분 send·recv 처리도 설명합니다.
  • C++ 소켓 프로그래밍: TCP/UDP 구현, SO_REUSEADDR 같은 소켓 옵션, select·poll·epoll 비교TCP 서버와 클라이언트를 에러 처리와 EINTR 재시도까지 포함해 구현하고, SO_REUSEADDR·SO_KEEPALIVE·TCP_NODELAY를 언제 켜는지 설명합니다. 논블로킹 소켓과 select·poll 멀티플렉싱, EADDRINUSE·ECONNRESET·EPIPE 같은 에러 대처도 다룹니다.
  • C++ WebSocket 심화 | Boost.Beast·Ping/Pong·재연결·운영Boost.Beast WebSocket 연결이 주기적으로 끊기거나 핸드셰이크가 400으로 실패하는 원인을 짚고, RFC 6455 프레임 구조, Ping/Pong 하트비트, 지수 백오프 재연결, strand로 쓰기를 직렬화하는 방법을 클라이언트·서버 코드로 설명합니다.
  • C++로 HTTP 클라이언트·서버 구현하기: 파서, Beast, Keep-Alive, 청크 인코딩, 타임아웃TCP로 받은 바이트가 요청 단위로 끊겨 오지 않는 문제에서 출발해 HTTP 파서를 직접 구현하고 Boost.Beast로 클라이언트와 비동기 서버를 만듭니다. Keep-Alive 연결 풀, 청크 인코딩, 타임아웃, body limit 초과와 CRLF 인젝션도 다룹니다.
  • CORS 에러 해결: 'No Access-Control-Allow-Origin' 원인과 프리플라이트·credentials 설정브라우저 콘솔의 CORS 에러 메시지별 원인과 해결 방법을 정리합니다. 동일 출처 정책, 프리플라이트(OPTIONS), credentials와 쿠키, Vary: Origin, Express cors 설정과 흔한 보안 실수를 설명합니다.
  • HTTP 프로토콜: HTTP/1.1·HTTP/2·HTTP/3 차이, 연결 관리, 캐싱, 보안 실전HTTP 메서드의 안전성과 멱등성, 상태 코드와 주요 헤더, HTTP/1.1·2·3의 프레이밍과 HOL 블로킹 차이, Keep-Alive와 연결 풀, Cache-Control·ETag 기반 캐시 검증을 프로덕션 관점으로 설명합니다.
  • MQTT 프로토콜과 발행-구독 메시징 모델 이해하기MQTT의 Pub/Sub 구조와 Broker·Topic 개념, QoS 0/1/2 차이, Last Will·Retained Message 같은 실무 기능을 Python·Node.js 예제로 설명합니다.
  • Socket.IO 실시간 통신: Room과 Broadcasting, Namespace, 인증, React 연동, Redis AdapterSocket.IO로 실시간 통신을 구현하는 방법. 설치와 기본 사용, Room, Broadcasting, Namespace, 인증, React 통합, Redis Adapter로 여러 서버 확장을 예제로 정리합니다.
  • SSH 프로토콜 보안 원격 접속 | 공개키·ProxyJump·포트 포워딩·OpenSSH 실전SSH의 키 교환·호스트 검증·사용자 인증 흐름을 짚고, Ed25519 키와 ~/.ssh/config, ProxyJump와 에이전트 포워딩의 차이, 로컬·원격 포트 포워딩, SCP/SFTP, Permission denied·호스트 키 변경·ssh-rsa 거부 같은 오류 대응을 OpenSSH 기준으로 정리합니다.
  • TCP 연결 상태 11가지: TIME_WAIT·CLOSE_WAIT가 쌓이는 이유와 netstat·ss 디버깅TCP 11가지 연결 상태(LISTEN, SYN_SENT, ESTABLISHED, FIN_WAIT, TIME_WAIT 등)의 동작 원리와 상태 전이, netstat·ss로 상태를 확인하고 TIME_WAIT·CLOSE_WAIT 문제를 디버깅하는 방법을 정리합니다.
  • TCP 위에 프로토콜 설계하기: 메시지 경계, 길이 프리픽스, 바이너리 직렬화, 엔디안과 버전 관리C++ 네트워크 프로토콜 설계와 직렬화. TCP 메시지 경계 처리, 길이 프리픽스 프로토콜 구현, 바이너리 직렬화, JSON·Protobuf·MessagePack 비교, 엔디안 처리와 버전 호환성을 다룹니다.
  • TCP vs UDP 전송 프로토콜 비교 | 신뢰성·지연·QUIC까지 선택 가이드TCP와 UDP를 표로 외우는 대신 Wireshark 캡처에서 재전송·Dup ACK·손실이 어떻게 보이는지로 차이를 익히고, DNS·VoIP·게임·QUIC(HTTP/3)이 각각 어떤 이유로 전송 방식을 택했는지 실무 선택 기준으로 정리합니다.
  • WebSocket 실시간 통신: RFC 6455 업그레이드와 프레임, Socket.io 채팅, Redis 확장, 프로덕션 디버깅WebSocket으로 실시간 통신을 구현하는 방법. 프로토콜 업그레이드와 프레임, 하트비트, 기본 WebSocket API, Socket.io, 채팅 앱 예제, Redis로 여러 서버 확장, 프로덕션에서만 연결이 끊길 때의 점검 순서를 다룹니다.
  • WebSocket vs SSE vs 롱 폴링 | 실시간 통신 방식 비교WebSocket, SSE, 롱 폴링을 통신 방향과 구현 복잡도, 프록시·방화벽 환경 기준으로 비교하고 Node.js 서버·클라이언트 코드로 구현해 봅니다. AI 응답 스트리밍에 SSE를 쓰는 예시, RFC 6455 업그레이드 핸드셰이크와 프레임 구조, Ping/Pong 하트비트도 다룹니다.

고급 (14편)

  • C++ 네트워크 성능 최적화 | TCP 튜닝·제로카피·커널 바이패스 [#51-7]C++ 서버의 네트워크 처리량과 지연을 개선하는 방법을 다룹니다. 소켓 버퍼와 자동 튜닝, Nagle과 TCP_NODELAY, Keep-Alive, sendfile·splice 제로카피, io_uring과 DPDK의 차이, 측정 방법과 흔한 오류를 예제로 설명합니다.
  • C++ 멀티스레드 네트워크 서버: io_context 스레드 풀, strand로 순서 보장, 세션 수명과 data raceBoost.Asio로 멀티스레드 서버를 만드는 방법. 여러 스레드에서 io_context 실행, strand로 순서 보장, 세션 수명 관리, 공유 상태 동기화, 채팅·HTTP 스타일 서버 예제와 벤치마크를 다룹니다.
  • C++ 앱의 DB 쿼리 최적화: 인덱스 선택, 실행 계획, 통계 기반 비용 모델API 응답이 수 초씩 걸리거나 인덱스가 있는데도 풀 스캔이 나는 문제를 인덱스 설계와 실행 계획 분석으로 풉니다. 복합 인덱스 컬럼 순서, 커버링·부분 인덱스, PostgreSQL·SQLite 실행 계획 읽기, 통계 갱신과 N+1 쿼리 개선을 다룹니다.
  • C++ Asio 데드락 디버깅 | 비동기 콜백 실전Asio 서버가 가끔 멈출 때 흔한 원인인 핸들러 안에서 비동기 완료를 동기로 기다리는 패턴, 락을 쥔 채 블로킹하는 코드, 락 순서 불일치를 시퀀스 다이어그램으로 설명합니다. strand로 락을 줄이는 설계, std::scoped_lock, 멈춘 프로세스의 스레드 덤프로 원인을 좁히는 방법을 다룹니다.
  • C++ Boost.Asio 고급 패턴 | 커스텀 서비스·타이머·시그널 [#52-1]Boost.Asio에서 연결마다 타이머를 두는 서버, 시그널로 종료하는 서버를 만들 때 필요한 커스텀 서비스(타이머 휠), steady_timer 재사용, signal_set, strand, work_guard와 stop()의 차이, co_spawn·async_compose를 코드로 정리합니다.
  • C++ gRPC 운영 기능: 인터셉터, 로드밸런싱, 데드라인 전파, 재시도, 헬스 체크프로덕션 C++ gRPC 서비스에 필요한 인터셉터 체인, Kubernetes 환경의 round_robin 로드밸런싱, Jitter를 섞은 재시도, Health Checking Protocol과 grpc_health_probe, 그레이스풀 셧다운을 예제로 구현합니다.
  • C++ TLS 통신: OpenSSL과 Asio 연동, 인증서 관리, mTLS, 흔한 SSL 에러TLS 핸드셰이크 흐름을 짚은 뒤 Asio의 ssl::stream과 순수 OpenSSL로 각각 에코 서버·클라이언트를 구현합니다. 자체 서명·CA 인증서 생성, mTLS 클라이언트 인증 설정, 인증서 만료·호스트명 불일치·체인 누락 같은 SSL 에러 대처도 다룹니다.
  • C++에서 MongoDB 쓰기: mongocxx 설치와 연결, CRUD, Aggregation, Replica SetC++에서 MongoDB를 연동하는 방법. mongocxx·bsoncxx 드라이버 설치와 연결, insert·find·update·delete CRUD, Aggregation Pipeline, 인덱스, Replica Set과 연결 풀을 다룹니다.
  • C++에서 PostgreSQL 연동: libpq vs libpqxx, 트랜잭션, Prepared Statement, COPY와 연결 풀C++에서 PostgreSQL을 쓰는 방법을 정리합니다. C 기반 공식 라이브러리 libpq와 C++ 래퍼 libpqxx 비교, 트랜잭션과 자동 롤백, Prepared Statement로 SQL 인젝션 방지, COPY 기반 대량 입출력, 연결 풀과 재연결·재시도를 다룹니다.
  • C++에서 Redis 쓰기: hiredis·redis-plus-plus, 파이프라인, 분산 락, Lua 스크립트C용 hiredis와 모던 C++용 redis-plus-plus로 Redis에 연결하는 방법부터 Cache-Aside 캐싱, SET NX EX와 Lua 스크립트로 만드는 분산 락, 파이프라인으로 왕복 횟수 줄이기, Pub/Sub와 커넥션 풀 설정까지 예제로 정리합니다.
  • TCP 동작 원리: 3-way handshake, 흐름·혼잡 제어(CUBIC·BBR)와 소켓 디버깅TCP 3-way handshake와 연결 종료, rwnd·cwnd 기반 흐름·혼잡 제어, Reno·CUBIC·BBR 알고리즘 차이를 설명하고 C++·Python·Node.js 소켓 예제와 RST·느린 전송 문제를 분석하는 디버깅 방법을 다룹니다.
  • TLS 프로토콜 심화 가이드 | 핸드셰이크·암호 스위트·TLS 1.3 키 유도TLS 1.2와 1.3의 핸드셰이크 흐름 차이, 암호 스위트를 구성하는 키 교환·인증·대칭키·해시, 키 유도와 레코드 레이어, QUIC과의 결합, 인증서 체인 오류 진단과 mTLS 인증서 회전까지 설명합니다.
  • UDP 프로토콜 실전 활용 | 저지연·DNS·게임·스트리밍과 QUIC 연결연결 없이 데이터그램을 보내는 UDP의 헤더와 체크섬 구조, DNS·RTP·게임·statsd에서 UDP를 택하는 이유와 반례, QUIC이 UDP 위에서 연결 ID와 TLS 1.3으로 신뢰성을 구현하는 방식을 소켓 예제와 함께 설명합니다.
  • WebRTC 프로토콜 실시간 통신 | 시그널링·ICE·STUN/TURN·DTLS·SRTP 실전WebRTC 연결이 SDP 시그널링, ICE 후보 수집, STUN·TURN을 통한 NAT 통과, DTLS 핸드셰이크, SRTP 미디어 암호화 순서로 성립하는 과정을 브라우저 JavaScript와 Python aiortc 예제로 설명합니다.

난이도 표시가 없는 글 (7편)

  • C++ 멀티스레드 Asio의 딜레마 | Data Race와 Mutex의 한계 [#2]io_context 하나를 스레드 풀에서 여러 run()으로 돌릴 때 같은 세션의 핸들러가 동시에 실행되어 data race가 생기는 구조, 핸들러 안에서 mutex를 잡으면 처리량이 떨어지는 이유, 락을 잡은 채 다른 핸들러를 기다리다 빠지는 데드락을 설명합니다.
  • C++ 핸들러 메모리 최적화 | 동적 할당 오버헤드 제거 [#5]Asio 비동기 연산마다 완료 핸들러 상태를 담으려고 동적 할당이 일어나는 이유와, associated_allocator와 bind_allocator로 커스텀 할당자를 연결하는 방법, 고정 블록 풀에 폴백을 둔 스레드 로컬 풀 할당자의 설계 포인트를 설명합니다.
  • C++ Asio Composed Operation | 비동기 함수 설계 [#7]헤더를 읽고 길이만큼 바디를 읽는 두 단계 수신을 async_read_packet 하나로 묶는 Boost.Asio Composed Operation을 설계합니다. 상태 머신으로 비동기 호출을 연쇄하는 법과 async_initiate, 완료 토큰으로 콜백과 코루틴을 모두 지원하는 방법을 설명합니다.
  • C++ Asio post, dispatch, defer | 실행 큐 정밀 제어 [#4]Asio의 post는 항상 큐 뒤에 넣고, dispatch는 이미 해당 executor 안이면 즉시 실행하며, defer는 다음 턴으로 미룬다는 차이를 코드로 비교하고, 채팅 서버와 타이머·Strand 예제에서 어떤 것을 골라야 하는지 결정 기준을 제시합니다.
  • C++ Boost.Asio io_context 이벤트 루프 | 동작 원리 정리 [#1]Boost.Asio io_context가 미완료 작업 수를 세며 핸들러를 실행하는 방식, run()과 poll()의 차이, 작업이 없을 때 run()이 반환되는 이유와 work_guard의 역할, 단일·멀티 스레드 실행 모델과 graceful shutdown 구현을 다룹니다.
  • C++ Strand | 락(Lock) 없는 동시성 제어 [#3]Boost.Asio Strand가 mutex 없이 핸들러를 논리적으로 직렬화하는 원리, make_strand로 strand를 만들고 bind_executor로 완료 핸들러를 묶는 방법, 연결마다 strand 하나를 두는 세션 설계와 흔한 실수를 예제로 설명합니다.
  • I/O 멀티플렉싱 비교: select·poll·epoll·kqueue·IOCP와 C10K 문제Blocking I/O의 한계에서 출발해 select, poll, epoll, kqueue, IOCP의 동작 방식과 차이를 코드와 시간 복잡도로 설명하고, C10K 문제를 어떻게 풀었는지 다룹니다.
pkglog

0xmote가 쓰고 관리하는 C++·백엔드·DevOps 문제 해결 기록입니다.

콘텐츠

블로그 주제별 모음 용어사전

정보

소개 연락처 Sitemap

법적 고지

개인정보처리방침 이용약관 면책 조항 편집 방침·정정 이력

© 2026 pkglog. All rights reserved.

Built with Astro

이 사이트는 Google AdSense 광고 게재 및 방문 통계 분석을 위해 쿠키를 사용합니다. 자세한 내용은 개인정보처리방침에서 확인하세요.