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 연결을 유지하려면 하트 비트가 필요합니까?
연결이 끊어진시기를 감지하는 데 유용합니다.
심장 박동은 사용자가 살아 있음을 서버에 알리는 좋은 방법입니다. 즉, 서버가 DoS 공격 방지 시스템을 사용하는 경우 해당 연결에 대해 할당 된 모든 리소스를 감지 한 후 제거 할 수 있습니다. 지정된 기간 동안 활동이 없습니다.
하트 비트 메커니즘을 구현할 의무가 없습니다.
그러나 주요 기준이 응답 성인 애플리케이션을 설계하는 경우 유용합니다. 연결 설정, DNS 조회 및 경로 검색에 시간을 낭비하고 싶지 않을 것입니다. 항상 연결을 유지하고 하트 비트를 계속 전송하면 응용 프로그램이 연결이 활성 상태임을 알고 연결 설정이 필요하지 않음을 알 수 있습니다. 간단히 보내고 받기만하면됩니다.
TCP는 연결을 유지합니다. 애플리케이션 하트 비트는 장애 조치,로드 밸런싱 또는 잠재적 문제에 대해 관리자에게 경고와 같은 애플리케이션 수준 고려 사항을위한 것입니다.
기본적으로 TCP 연결은 경로를 따라 스위치에 저장된 링크 상태를 생성합니다. 끊어진 연결을 감지하려면 (적절한 연결 해제를 보내지 않고 한 상대가 충돌하는 경우) 이러한 상태를 일정 시간 동안 사용하지 않으면 제거해야합니다. 그리고 이런 일이 발생하면 TCP 연결이 닫힙니다. 이 시간 제한이 얼마나 오래 걸리는지 정확히 알 수는 없지만 장치 제조업체 및 / 또는 인터넷 제공 업체에 따라 달라지는 것 같습니다. 내 유휴 SSH 터미널 세션이 Kabel-BW 제공 연결을 사용할 때 몇 시간 동안 열려있는 동안 이전 1 & 1 인터넷 제공 업체에 의해 빠르게 (유휴 시간 15 분 미만) 닫혔다는 것을 기억합니다.
마지막으로, 이전 연사들과 함께 결론을 내립니다. 심장 박동은 연결이 아직 살아 있고 걷어차는지 알 수있는 좋은 방법입니다 ...
하트 비트라고 부르는 것은 시간 초과를 설정하려고 할 때 유용합니다. 소켓이 열려있는 것처럼 보일 수 있지만 상대방이 BSOD를 겪고있을 수 있습니다. 작동하지 않는 클라이언트 / 서버를 감지하는 가장 쉬운 방법 중 하나는 시간 제한을 설정하고 메시지가 자주 수신되는지 확인하는 것입니다.
어떤 사람들은이를 NOOP (No Ops)라고 부릅니다.
그러나 아니요, 연결을 유지하는 데 필요하지 않으며 상태를 아는 데만 도움이됩니다.
하트 비트가 없다면 TCP / IP 연결이 열려 있는지 여부는 중요하지 않습니다.
Heartbeat isn't a necessity for TCP protocols. It's implementation is there to detect whether the otherside has terminated the connection in the non standard way (i.e not gone through the tear down process).
TCP/IP as a protocol is specified as not being closed until you send a close packet. I have had sockets remain open even after having spotty wireless or internet connections.
However, this is all very dependent on implementations. Most likely there will be a "timeout" which means the maximum amount of time to wait for a response before considering the connection to be "dead". Sometimes this is based on the application itself, sometimes on NAT routers.
Therefore, I would highly recommend you keep a "heartbeat" to detect bad connections and keep them open.
The connection will remain open - there is no need to implement a heartbeat, and most applications that use sockets do not do so.
A lot of protocols implement a heartbeat or a health status type of thing like Lloyd said. Just so you know the connection is still open and if you may have missed anything
참고URL : https://stackoverflow.com/questions/865987/do-i-need-to-heartbeat-to-keep-a-tcp-connection-open
'development' 카테고리의 다른 글
쿠키 비활성화 여부를 서버 측에서 감지하는 방법 (0) | 2020.09.05 |
---|---|
Visual Studio 2013에서 응용 프로그램 설정 만들기 (0) | 2020.09.05 |
Ocaml / F #의 함수가 기본적으로 재귀 적이 아닌 이유는 무엇입니까? (0) | 2020.09.05 |
Google Maps API에서 'meta viewport user-scalable = no'의 요점은 무엇입니까? (0) | 2020.09.05 |
투명한 배경으로 matplotlib에서 플롯을 내보내는 방법은 무엇입니까? (0) | 2020.09.05 |