>  기사  >  백엔드 개발  >  golang tcp는 결코 연결을 끊지 않습니다

golang tcp는 결코 연결을 끊지 않습니다

王林
王林원래의
2023-05-15 10:21:371106검색

Golang에서는 TCP가 연결을 설정한 후 기본적으로 연결이 끊어집니다. 연결이 끊어지면 TCP 프로토콜 자체가 연결의 안정성을 보장해야 하기 때문입니다. 그러나 TCP 연결이 끊어지지 않기를 바라는 상황도 있습니다. 예를 들어 동시성이 높은 상황에서는 연결을 자주 설정하면 서버에 추가적인 부담이 가해집니다. 그렇다면 Golang TCP가 연결 해제되지 않았는지 확인하는 방법은 무엇입니까?

1. TCP Keep-Alive

TCP Keep-Alive는 연결이 여전히 활성 상태인지 감지하기 위해 TCP 프로토콜에서 제공하는 메커니즘입니다. TCP 연결이 일정 기간 동안 데이터를 전송하지 않으면 Keep-Alive 메커니즘은 연결이 여전히 존재하는지 확인하기 위해 피어에게 특정 감지 패킷을 보냅니다. 피어가 프로브 패킷에 응답하지 않으면 피어의 연결이 끊어진 것으로 간주되어 연결이 적극적으로 닫힙니다. 피어가 프로브 패킷에 응답할 수 있으면 연결이 여전히 존재하는 것입니다. Golang TCP 비연결을 달성하기 위해 TCP Keep-Alive 메커니즘을 사용할 수 있습니다.

1.1 TCP Keep-Alive 활성화

TCP Keep-Alive를 활성화하려면 소켓 속성을 설정해야 합니다. Golang은 net 패키지의 TCPConn 구조를 사용하여 TCP 연결을 나타낼 수 있습니다. TCPConn은 TCP 연결을 작동하는 다양한 방법을 제공합니다. 그 중 SetKeepAlive 메소드를 사용하여 TCP Keep-Alive를 설정할 수 있습니다.

샘플 코드는 다음과 같습니다.

conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
    fmt.Println("dial error:", err)
    return
}
tcpConn := conn.(*net.TCPConn)
// 设置为开启 TCP KeepAlive,默认为不开启
tcpConn.SetKeepAlive(true)

1.2 TCP Keep-Alive 매개변수 설정

TCP Keep-Alive에는 세 가지 매개변수가 있으며, TCPConn의 설정 방법을 통해 이러한 매개변수를 설정할 수 있습니다. KeepAlive, KeepAlivePeriod 및 KeepAliveCount가 있습니다.

  • KeepAlive: TCP Keep-Alive를 활성화할지 여부를 나타냅니다. 기본값은 활성화되어 있지 않습니다.
  • KeepAlivePeriod: 탐지 패킷을 보내는 시간 간격을 나타냅니다. 기본값은 설정되지 않으며 운영 체제에 의해 결정됩니다.
  • KeepAliveCount: 감지 패킷이 전송된 횟수를 나타냅니다. 기본값은 설정되지 않으며 운영 체제에 의해 결정됩니다.

실제 필요에 따라 이 세 가지 매개변수를 설정할 수 있습니다.

샘플 코드는 다음과 같습니다.

tcpConn.SetKeepAlive(true)          // 开启 TCP Keep-Alive
tcpConn.SetKeepAlivePeriod(time.Duration(30) * time.Second) // 设置探测包发送时间间隔为 30 秒
tcpConn.SetKeepAliveCount(3)        // 设置探测包的发送次数为 3

1.3 Keep-Alive 감지 패킷 전송 빈도

기본적으로 Keep-Alive 감지 패킷 전송 빈도는 운영 체제에 의해 결정됩니다. 대부분의 운영 체제에서는 TCP Keep-Alive 프로브 패킷이 2시간마다 전송됩니다. 빈도를 변경해야 하는 경우 운영 체제에서 매개변수를 변경하면 됩니다. Linux 운영 체제에서는 proc 파일 시스템의 매개변수를 수정하여 TCP 연결 유지 감지 패킷 전송 빈도를 변경할 수 있습니다.

2. 긴 연결 사용

Golang TCP의 연결 끊김을 방지하는 또 다른 방법은 긴 연결을 사용하는 것입니다. 긴 연결은 클라이언트와 서버 간의 중단 없는 연결을 의미합니다. 장기 연결 모드에서는 클라이언트가 서버와 연결을 설정한 후 클라이언트가 언제든지 요청을 보낼 수 있고 서버도 언제든지 응답을 보낼 수 있습니다. 이를 통해 자주 연결을 설정할 때 발생하는 오버헤드를 줄이고 서버 성능을 향상시킬 수 있습니다.

긴 연결을 구현하는 방법과 관련하여 참고할 수 있는 간단한 샘플 코드는 다음과 같습니다.

package main

import (
    "bufio"
    "fmt"
    "net"
)

func main() {
    listen, err := net.Listen("tcp", ":8080")
    if err != nil {
        panic(err)
    }

    for {
        conn, err := listen.Accept()
        if err != nil {
            continue
        }
        go handle(conn)
    }
}

func handle(conn net.Conn) {
    defer conn.Close()

    reader := bufio.NewReader(conn)
    for {
        data, err := reader.ReadString('
')
        if err != nil {
            return
        }

        response := fmt.Sprintf("echo: %s", data)
        conn.Write([]byte(response))
    }
}

위 샘플 코드에서는 TCP 서비스를 시작하여 클라이언트의 요청을 수락합니다. 클라이언트가 서버와 연결을 설정하면 서버는 루프를 통해 클라이언트의 요청을 수신하고 응답을 반환합니다. 서버와 클라이언트 간의 연결이 능동적으로 끊어지지 않으므로 클라이언트는 언제든지 서버에 요청을 보낼 수 있습니다.

3. 요약

이 글에서는 Golang TCP의 연결 끊김을 방지하는 두 가지 방법, 즉 TCP Keep-Alive 메커니즘을 사용하는 방법과 긴 연결을 사용하는 방법을 소개합니다. 실제 개발에서는 실제 상황에 따라 자신에게 맞는 방법을 선택해야 합니다. TCP 연결만 가볍게 사용한다면 TCP Keep-Alive를 사용하는 것이 좋습니다. 요청을 자주 보내야 한다면 긴 연결을 사용하는 것이 좋습니다. 어떤 방법을 사용하든 실제 애플리케이션에서는 보안 허점을 피하기 위해 연결 보안을 표준화하고 보호하는 데 주의를 기울여야 합니다.

위 내용은 golang tcp는 결코 연결을 끊지 않습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.