Go net/http 패키지 TCP 연결 메커니즘과 HTTP/2 성능 최적화
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

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 스트리밍은 고并发 환경에서 필수적이다.