Go의 net/http 패키지에서의 TCP 연결 메커니즘
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Go로 웹 서버 개발을 하는 중급~고급 개발자
난이도: 중급 이상 (시스템 콜, 파일 디스크립터, Go 내부 메커니즘 이해 필요)
핵심 요약
- 소켓과 파일 디스크립터는 네트워크 통신의 핵심 요소로,
syscall
을 통해 생성됨 - HTTP/2의 스트리밍을 통해 단일 TCP 연결로 여러 요청 처리 가능
- 연결 풀 관리(
idleConn
,maxIdleConns
)와 타임아웃 제어(SetDeadline
)로 성능 최적화 - goroutine 기반의 비동기 처리로 요청 병렬 처리 구현
섹션별 세부 요약
1. 소켓과 파일 디스크립터
- 소켓은 애플리케이션 계층과 전송 계층 사이의 인터페이스로, 파일처럼 읽기/쓰기 가능
- 파일 디스크립터는 OS에서 파일/소켓을 식별하는 정수로,
syscall
을 통해 생성됨 - Go에서
socket(family, SOCK_STREAM, IPPROTO_TCP)
시스템 콜로 소켓 생성
2. 서버 측 연결 처리 흐름
bind(fd, addr)
→listen(fd, backlog)
로 소켓 바인딩 및 리스닝Accept()
를 통해 새로운 연결 수락 후goroutine
생성 (srv.newConn(rw).serve(ctx)
)dial()
로 TCP 연결 생성 후conn
객체로 HTTP 연결 래핑
3. 멀티플렉싱과 연결 풀 관리
- HTTP/1.1: Keep-Alive로 TCP 연결 재사용
- HTTP/2: 스트리밍을 통해 단일 연결로 다중 요청 처리
Transport
구조체에서idleConn
맵으로 비활성 연결 풀 관리maxIdleConns
로 최대 비활성 연결 수 제한
4. 타임아웃 및 오류 처리
conn.SetDeadline(time.Now().Add(timeout))
로 연결 타임아웃 설정- 오류 시
dial()
재시도 로직:retry
루프 +time.Sleep(backoff)
5. 전체 통신 메커니즘
net/http
패키지는 TCP 연결을 추상화하여 개발자가 직접 관리 필요 없음- 연결 재사용, 병렬 처리, 타임아웃 제어 등 효율적인 메커니즘 제공
결론
Go의 net/http
패키지는 TCP 연결을 추상화하여 개발자에게 편의성을 제공하지만, 소켓/파일 디스크립터 관리, 연결 풀 최적화, 타임아웃 설정 등 핵심 메커니즘을 이해해야 성능 향상이 가능함. 특히, goroutine
기반의 비동기 처리와 HTTP/2 스트리밍은 고并发 환경에서 필수적이다.