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

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

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

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

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

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



답변

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


답변

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


답변

구성 요소 :

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

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

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


답변

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

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


답변

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

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

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

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


답변

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

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


답변

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