1. 기본 개념
- Blocking: 제어권이 해당 처리에 묶여서, 프로그램이 다음 줄로 넘어가지 못하고 대기 상태가 되는 것을 의미한다.
- Non-blocking: 프로그램이 대기 상태가 되지 않아 다른 작업을 동시에 할 수 있지만, 데이터가 준비되었는지 계속 확인하는 과정(Polling)이 필요하다.
- Blocking socket : 데이터 송신함수와 수신함수가 block(차단, 대기) 될 수 있는 경우다. socket()으로 socket을 생성하면, blocking socket이 생성된다.
- Non-blocking socket: 데이터 송신함수와 수신함수가 block 되지 않고, 곧바로 리턴된다.
2. Socket 버퍼의 동작
socket은 송신 버퍼(send buffer)와 수신 버퍼(receive buffer)를 하나씩 갖는다. 모두 FIFO 형태로 작동한다.
데이터 송신 시:
송신 함수를 호출하면 data가 송신 버퍼에 채워지고, 잠시 후 통신 선로를 통해 점차적으로 빠져나간다.
- blocking socket: 송신 버퍼가 가득 찼다면, blocking이 발생한다. 공간이 생길 때까지 기다려서, 데이터를 넣은 후 리턴한다.
- non-blocking socket: 송신 버퍼가 가득 찼다면, 기다리지 않고 "EWOULDBLOCK"(나중에 다시 시도해)라는 에러 코드를 리턴한다.
데이터 수신 시:
수신 함수를 호출하면 수신 버퍼에서 데이터를 꺼낸다.
- blocking socket: 수신 버퍼가 비어 있다면, blocking이 발생한다. 수신 버퍼에 데이터가 들어올 때까지 기다린다.
- non-blocking socket: 수신 버퍼가 비어 있다면, 기다리지 않고 "EWOULDBLOCK"(나중에 다시 시도해)라는 에러 코드를 리턴한다.
3. 프로토콜에 따른 수신 버퍼 초과 대응
수신 함수가 수신 버퍼에서 데이터를 꺼내는 속도가 운영체제가 수신 버퍼의 데이터를 채우는 속도보다 느려 수신 버퍼가 꽉 차는 경우, 이때 프로토콜(데이터를 어떻게 보낼지)에 따라 차이가 발생한다(TCP, UDP).
- TCP(연결지향): 흐름 제어를 수행한다. 수신 측 OS가 송신 측에 버퍼가 꽉 찼음을 알려서(window size = 0), 송신 측의 송신 함수가 block 된다. 즉, TCP 연결은 끊어지지 않고 속도가 빠른 쪽(송신)이 느린 쪽(수신)에 맞춰 작동한다.
- UDP(비연결 지향): 흐름 제어가 없다. 송신 측은 계속 데이터를 보낸다. 이때 수신 측에 도착하는 패킷은 OS에 의해 폐기(Drop)된다.
참고자료
'컴퓨터' 카테고리의 다른 글
| Claude Code 기반 백엔드 개발: 포트폴리오 자동화 (0) | 2026.08.16 |
|---|---|
| 외부 라이브러리 링킹 과정 (0) | 2026.01.20 |
| [프로젝트] 투표 시스템 확장 (0) | 2026.01.15 |
| 윈도우에서 nginx와 php, mysql을 연동해보자 (0) | 2023.05.07 |
| 윈도우에서 Nginx와 php를 연동해보자 (0) | 2023.05.06 |