TCP 연결을 열린 상태로 유지하려면 하트 비트가 필요합니까?


94

TCP / IP를 통해 통신하는 두 가지 구성 요소가 있습니다. 구성 요소 A는 서버 / 수신기 역할을하고 구성 요소 B는 클라이언트입니다. 두 사람은 가능한 한 빨리 통신해야합니다. 한 번에 하나의 연결 만있을 수 있습니다 (이 질문은 제외). 우리 회사의 한 선임 개발자는 연결이 열린 상태를 유지하기 위해 두 구성 요소간에 응용 프로그램 수준 하트 비트를 사용해야한다고 말했습니다.

TCP / IP로 연결이 열려 있다고 생각했지만 여러 블로그 / 사이트에서 이러한 응용 프로그램 간의 심장 박동에 대한 표준 관행을 읽었습니다.

구성 요소 A가 구성 요소 B를 하트 비트하는 이유의 일부를 알고 있으므로 구성 요소 B와의 통신 문제 (링크가 다운되었거나 구성 요소 B가 실행 중이 아님)가있는 경우 지원팀에 알릴 수 있습니다. 다른 이유로 하트 비트가 필요합니까? "파이프에"뭔가가 자주 열려 있는지 확인하는 것과 같이?

구성 요소 A는 현재 구성 요소 B를 20 초마다 하트 비트하고 120 초 동안 구성 요소 B에서 아무것도 수신하지 않으면 연결을 닫습니다. 그런 다음 링크가 끊어지면 구성 요소 B가 주기적으로 재 연결을 시도한다는 가정하에 연결 수신을 재개합니다. 이것은 성공적으로 작동합니다.

내 질문을 반복하려면 : TCP / IP 연결을 유지하려면 하트 비트가 필요합니까?


1
이 동작도 구현에 따라 달라질 수 있습니까? 이것은 TCP 표준에 지정된 것입니까, 아니면 구현 세부 사항으로 남아 있습니까? 다른 사람도 대답 할 수 있기를 바랍니다.
dss539

1
모든 TCP / IP 기반 프로토콜이 구현하는 것은 아니므로 구현 세부 사항은 전적으로 사용자에게 달려 있습니다.
Lloyd

5
예-TCP / IP 때문이 아닙니다.하지만 다른 하드웨어 나 소프트웨어로 인해 비활성 TCP 연결을
끊는

답변:


54

연결 관계없이 열려 있어야 하지만 예 를 들어 PING 명령을 사용하는 IRC와 같이 끊어진 연결을 감지하는 데 도움을주기 위해 프로토콜이 하트 비트를 구현하는 것이 일반적 입니다.


34
킵 얼라이브의 또 다른 일반적인 이유는 nat 게이트웨이를 통해 연결을 유지하는 것입니다. TCP 자체는 작동을 위해 킵 얼라이브가 필요하지 않지만, nat 게이트웨이는 주어진 시간 초과 후 tcp 연결을 "삭제"하는 것이 일반적입니다.
nos

4
정상적인 시간 제한은 무엇입니까? 초, 분, 시간?
MiniGod

@Lloyd 나는 MiniGod가 " 정상 타임 아웃 이 얼마나 오래 걸릴 까요?" 라는 뜻을 "생각 "합니다. (초, 분, 시간에 주어진 답, ...)
jeromej

알고 @JeromeJ, 그것은 몇 년이었다)
로이드

또한 연결이 프록시를 통과하는 경우 부실한 것으로 간주되면 연결이 끊어 질 것으로 예상 할 수 있습니다. 하지만이 경우에는 연결 유지가 도움이되지 않는다고 생각합니다. tcp의이 측면이 응용 프로그램에 전파되지 않기 때문입니다.
Ghita 2015-08-30

49

다른 많은 사람들이 언급했듯이 TCP 연결은 자체 장치에 남겨두면 계속 유지됩니다. 그러나 연결 중 상태를 추적하는 장치 (예 : 방화벽)가있는 경우 상태 테이블 항목이 만료되지 않도록 유지하려면 연결 유지가 필요할 수 있습니다.


TCP 연결은 영원히 살아 있다고 말할 것입니까?
user7817808

22

구성 요소 :

  • 기존 유선 네트워크에 있음
  • 그들 사이에 방화벽이나 NAT 라우터가 없습니다
  • 둘 다 충돌하지 않습니다

그러면 심장 박동이 필요하지 않습니다.

이러한 가정 중 하나라도 거짓이면 (GPRS를보고 있습니다!) 하트 비트가 오히려 빠르게 필요합니다.


1
그러나 이것은 일반적으로 네트워킹입니다. Peter Deutsch의 분산 컴퓨팅 오류를 고려하십시오. 우리는 네트워크가 본질적으로 신뢰할 수 없다는 것을 알고 있으므로 애플리케이션에서 거의 특정 실패 지점으로 취급해야합니다. 이러한 맥락에서 기존의 유선 네트워크 여부에 관계없이 특정 지점에서 오류가 발생할 것이라고 가정하고 해당 시나리오를 처리하도록 애플리케이션을 설계합니다.
Steven Bakhtiari

11

직접 하트 비트를 보낼 필요는 없습니다. TCP 연결은 사용량에 관계없이 열린 상태로 유지됩니다.

TCP 구현 선택합니다 킵 얼라이브 그런 다음에야 오히려 일부 나중에 데이터를 전송 할 필요없이,시기 적절하게 닫힌 연결을 식별하는 데 사용 할 수있는 메커니즘이 연결을 발견 닫힙니다.


1
리눅스에서 어떻게 작동한다고 가정합니까? 실제로 작동합니까? 시간 제한을 2 시간 미만으로 예약 할 수 있습니까? 예를 들어 30 초?
Itay Levin 2012

이 기능이 작동하려면 애플리케이션이 연결 유지를 지원해야합니다. Linux에서 활성화하는 것만으로는 충분하지 않습니다.
Mike Vella

9

Windows를 사용하는 경우 TCP Keep-alive에주의하십시오. 기본적으로 Windows 레지스트리 또는 setsockopt를 통해 전역 적으로 설정하지 않는 한 비활성화됩니다.

기본 연결 유지 간격은 2 시간입니다.

http://msdn.microsoft.com/en-us/library/ms819735.aspx

2 시간 연결 유지가 바람직하지 않은 경우 자신의 심장 박동을 구현하고 Windows에서 TCP 연결 유지를 비활성화해야 할 수 있습니다.


3

TCP / IP 연결을 유지하려면 하트 비트가 필요합니까?

연결이 끊어진시기를 감지하는 데 유용합니다.


3

TCP는 연결을 유지합니다. 애플리케이션 하트 비트는 장애 조치,로드 밸런싱 또는 잠재적 문제에 대해 관리자에게 경고와 같은 애플리케이션 수준 고려 사항을위한 것입니다.


3

심장 박동은 사용자가 살아 있음을 서버에 알리는 좋은 방법입니다. 즉, 서버가 DoS 공격 방지 시스템을 사용하는 경우 해당 연결에 대해 할당 된 모든 리소스를 감지 한 후 제거 할 수 있습니다. 지정된 기간 동안 활동이 없습니다.
하트 비트 메커니즘을 구현할 의무가 없습니다.

그러나 주요 기준이 응답 성인 애플리케이션을 설계하는 경우 유용합니다. 연결 설정, DNS 조회 및 경로 검색에 시간을 낭비하고 싶지 않을 것입니다. 항상 연결을 유지하고 하트 비트를 계속 전송하면 응용 프로그램이 연결이 활성 상태임을 알고 연결 설정이 필요하지 않음을 알 수 있습니다. 간단히 보내고 받기만하면됩니다.


2

프로토콜로서의 TCP / IP는 닫기 패킷을 보낼 때까지 닫히지 않는 것으로 지정됩니다. 무선 또는 인터넷 연결이 불안정한 후에도 소켓이 열려 있습니다.

그러나 이것은 모두 구현에 따라 크게 달라집니다. 대부분의 경우 "시간 초과"는 연결이 "불능"상태로 간주되기 전에 응답을 기다리는 최대 시간을 의미합니다. 때때로 이것은 애플리케이션 자체를 기반으로하며 때로는 NAT 라우터를 기반으로합니다.

따라서 불량 연결을 감지하고 개방 상태로 유지하려면 "하트 비트"를 유지하는 것이 좋습니다.


2

기본적으로 TCP 연결은 경로를 따라 스위치에 저장된 링크 상태를 생성합니다. 끊어진 연결을 감지하려면 (적절한 연결 해제를 보내지 않고 한 상대가 충돌하는 경우) 이러한 상태를 일정 시간 동안 사용하지 않으면 제거해야합니다. 그리고 이런 일이 발생하면 TCP 연결이 닫힙니다. 이 시간 제한이 얼마나 오래 걸리는지 정확히 알 수는 없지만 장치 제조업체 및 / 또는 인터넷 제공 업체에 따라 달라지는 것 같습니다. 유휴 SSH 터미널 세션이 Kabel-BW 제공 연결을 사용할 때 몇 시간 동안 열려있는 동안 이전 1 & 1 인터넷 제공 업체에 의해 빠르게 (유휴 시간 15 분 미만) 닫혔다는 것을 기억합니다.

마지막으로, 이전 연사들과 함께 결론을 내립니다. 심장 박동은 연결이 아직 살아 있고 걷어차는지 알 수있는 좋은 방법입니다 ...


1

하트 비트라고 부르는 것은 시간 초과를 설정하려고 할 때 유용합니다. 소켓이 열려있는 것처럼 보일 수 있지만 상대방이 BSOD를 겪고있을 수 있습니다. 작동하지 않는 클라이언트 / 서버를 감지하는 가장 쉬운 방법 중 하나는 시간 제한을 설정하고 메시지가 자주 수신되는지 확인하는 것입니다.

어떤 사람들은이를 NOOP (No Ops)라고 부릅니다.

그러나 아니요, 연결을 유지하는 데 필요하지 않으며 상태를 아는 데만 도움이됩니다.


1

하트 비트가 없다면 TCP / IP 연결이 열려 있는지 여부는 중요하지 않습니다.


1

하트 비트는 TCP 프로토콜에 필요하지 않습니다. 다른 쪽이 비표준 방식으로 연결을 종료했는지 (즉, 해체 프로세스를 거치지 않았는지) 감지하기 위해 구현됩니다.


0

연결은 열린 상태로 유지됩니다. 하트 비트를 구현할 필요가 없으며 소켓을 사용하는 대부분의 응용 프로그램은 그렇게하지 않습니다.


-2

많은 프로토콜이 Lloyd가 말한 것과 같은 심장 박동 또는 건강 상태 유형을 구현합니다. 연결이 아직 열려 있고 놓친 것이 있다면

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.