자격증 정복/컴퓨터시스템기사

컴퓨터시스템기사 필기 10 — 네트워크 프로그래밍 구현 (소켓·TCP·UDP·스크립트)

올드 IT직장인 2026. 8. 17. 00:35

컴퓨터시스템기사 필기 10 — 네트워크 프로그래밍 구현 (소켓·TCP·UDP·스크립트)

3과목 [3-3] 네트워크 프로그래밍 구현 파트입니다.
TCP 소켓 시퀀스는 매 회차 출제되는 최빈출 주제예요.


TCP vs UDP ⭐⭐⭐

구분 TCP UDP
연결 방식 연결 지향 (3-way handshake) 비연결형
신뢰성 순서·재전송 보장 보장 안 함
속도 느림 빠름
헤더 복잡 (SYN/ACK/FIN 플래그) 단순 (포트/길이/체크섬)
용도 HTTP, FTP, 이메일 DNS, 스트리밍, VoIP
⚠️ "UDP는 신뢰할 수 있는 전송을 보장한다" → 오답! (TCP의 특징)
⚠️ "UDP 헤더에 플래그 비트 존재" → 오답! (TCP 헤더에만 있음)

TCP 소켓 시퀀스 ⭐⭐⭐ (매 회차 출제!)

[서버]
socket() → bind() → listen() → accept() → read()/write() → close()

[클라이언트]
socket() → connect() → read()/write() → close()

 

각 함수 역할:

socket()  — 소켓 생성
bind()    — 주소·포트 결합 (서버만)
listen()  — 연결 대기 상태 진입
accept()  — 연결 수락, 새 소켓 반환
connect() — 서버에 연결 시도 (클라이언트만)

 

기출 문제

Q. TCP 서버 소켓 함수 호출 순서는?

A. socket() → bind() → listen() → accept()


UDP 소켓

연결 개념 없음 → listen()/accept()/connect() 없음
socket() 이후 바로 sendto()/recvfrom() 사용
상대 주소를 매번 지정해서 데이터그램 전송

I/O 멀티플렉싱 ⭐⭐

여러 소켓/파일 디스크립터를 동시에 감시하는 기법이에요.

select()
  → 여러 파일 디스크립터 동시 감시
  → 소켓 전용이 아닌 범용 함수
  → 타임아웃 설정 가능
  ⚠️ "소켓 전용 함수" → 오답!

poll()
  → select() 개선, 감시 개수 제한 없음

epoll()
  → 리눅스 커널 2.6부터 지원
  → 고성능, stateful 방식
  → 리눅스 전용 비표준 함수
  → 레벨 트리거/엣지 트리거 모두 지원
  ⚠️ "최대 2048개만 감시" → 오답! (개수 제한 없음)

 

기출 문제

Q. 리눅스 커널 2.6부터 지원되는 고성능 I/O 멀티플렉싱 함수는?

A. epoll()


프로세스/스레드

fork() vs exec()

fork()
  → 현재 프로세스를 복제해 자식 프로세스 생성
  → 부모: 자식 PID 반환 / 자식: 0 반환
  → COW 최적화 (쓰기 시점에 실제 복사)

exec()
  → 현재 프로세스 이미지를 새 프로그램으로 교체
  → 성공 시 원래 코드로 돌아오지 않음
  → 셸: fork() 후 자식에서 exec() 실행

 

pthread API ⭐⭐

pthread_create()  — 스레드 생성
pthread_join()    — 스레드 종료 대기 + 자원 회수
pthread_detach()  — 스레드 분리 (자동 자원 회수)
pthread_cancel()  — 스레드 취소

⚠️ "pthread_detach = 스레드 종료" → 오답! (분리가 정확)
⚠️ "pthread_detach = 스레드 감시" → 오답! (분리가 정확)

 

조건 변수:

pthread_cond_wait() 호출 시 → 뮤텍스 잠근 상태로 호출!
⚠️ "해제된 상태로 호출" → 오답!

 

배리어:

pthread는 pthread_barrier_t로 배리어 제공
⚠️ "pthread에서 배리어 제공 안 함" → 오답!

 

뮤텍스 데드락 방지:

pthread_mutex_trylock()    — 잠금 시도, 실패 시 즉시 반환
pthread_mutex_timedlock()  — 시간 제한 후 포기
PTHREAD_MUTEX_ERRORCHECK   — 이중 잠금 시 에러 반환
⚠️ "pthread_mutex_lock() 사용" → 데드락 방지 아님!

IPC (프로세스 간 통신)

PIPE  — 단방향, 부모-자식 관련 프로세스만 사용 가능
FIFO  — 명명 파이프, 관련 없는 프로세스도 사용 가능

공유 메모리:
  shmget() — 공유 메모리 생성 (IPC ID 반환)
  shmat()  — 공유 메모리 부착 (주소 공간에 연결)
  shmdt()  — 공유 메모리 분리
  ⚠️ "shmat으로 공유 메모리 생성" → 오답! (생성은 shmget)

메시지 큐:
  msgsnd() — 메시지 전송
  msgrcv() — 메시지 수신
  IPC_NOWAIT — 큐 가득 찬 경우 즉시 에러 반환 (논블로킹)

프로세스 메모리 구조 ⭐⭐

텍스트(Text)  — 실행 코드
데이터(Data)  — 전역변수·정적변수
힙(Heap)      — 동적 할당 (malloc/calloc/realloc)
스택(Stack)   — 리턴 주소, 로컬 변수

⚠️ "리턴 주소/로컬 변수 = 힙" → 오답! (스택)
⚠️ "동적 할당 공간 = 스택" → 오답! (힙)

OSI 7계층 / TCP-IP ⭐

OSI 3계층(네트워크) 프로토콜 = IP
⚠️ FTP/TELNET = 7계층(응용계층), IP 아님

ARP — IP 주소로 MAC 주소 알아내는 프로토콜
TCP_NODELAY — 네이글 알고리즘 해제
  → setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, ...)

스크립트 언어

Python  — 범용 스크립트, AI/데이터 분야
Shell Script — 리눅스 자동화, bash 기반
JavaScript   — 웹 스크립트, Node.js로 서버도 가능
Perl, Ruby   — 텍스트 처리, 웹 개발

💡 실무에서는?

epoll은 대규모 네트워크 서버(수만 개 동시 접속)에서 핵심이에요. 실제 보안 솔루션에서 이벤트 처리에 epoll을 쓰고, 스레드 풀로 분산 처리하는 구조가 일반적이에요. TCP_NODELAY는 실시간 패킷 분석 도구에서 지연 최소화를 위해 필수로 설정해요.


핵심 정리

✅ TCP 서버: socket→bind→listen→accept
✅ 클라이언트: socket→connect
✅ UDP = 비연결형, 신뢰성 보장 안 함
✅ "UDP=신뢰성보장" → 오답!
✅ select() = 범용 (소켓 전용 아님!)
✅ epoll = 커널2.6부터, 개수제한없음, 리눅스전용
✅ pthread_detach = 분리 (종료/감시 아님!)
✅ 조건변수 = 뮤텍스 잠근 상태로 호출
✅ shmget=생성 / shmat=부착 (순서 중요!)
✅ 힙=동적할당 / 스택=리턴주소·로컬변수
✅ OSI 3계층=IP / ARP=IP→MAC 변환

 

다음 편에서는 디지털 논리회로 — 카르노맵·플립플롭으로 이어갑니다!

반응형
개인정보처리방침  |  블로그 소개