답변:
이 게시물은 절반 닫힌 연결에서 확장됩니다. 반 개방 연결의 경우 KContreau의 올바른 설명을 참조하십시오.
모든 TCP 연결은 서로 독립적으로 닫힌 두 개의 반 연결로 구성됩니다. 따라서 한쪽 끝이 FIN을 보내면 다른 쪽 끝은 FIN + ACK 대신 FIN을 ACK 만하면 FIN 전송쪽에 여전히 보낼 데이터가 있음을 알립니다. 따라서 양쪽 끝은 ESTABLISHED 이외의 안정적인 데이터 전송 상태, 즉 FIN_WAIT_2 (수신 끝) 및 CLOSE_WAIT (송신 끝)로 끝납니다. 이러한 연결은 절반 닫힘이라고하며 TCP는 실제로 이러한 시나리오를 지원하도록 설계되었으므로 절반 닫힌 연결은 TCP 기능입니다.
RFC 793은 "반 개폐"라는 용어를 언급하지 않고 원시 메커니즘 만 설명하지만 RFC 1122는 4.2.2.13 절에서 그 문제에 대해 자세히 설명합니다. 누가 그 기능이 필요한지 궁금 할 것입니다. TCP 설계자들은 또한 Unix 시스템을위한 TCP / IP를 구현했으며 모든 Unix 사용자와 마찬가지로 I / O 리디렉션을 좋아했습니다. W. Stevens (TCP / IP 그림 18.5 참조)에 따르면 I / O 리디렉션 TCP 스트림에 대한 요구는이 기능을 도입하려는 동기였습니다. 이를 통해 FIN ack가 EOF의 역할을 수행하거나 EOF로 변환 될 수 있습니다. 따라서 기본적으로 FIN이 "요청 종료"신호를 보내는 응용 프로그램 계층에서 즉석 요청 / 응답 스타일 상호 작용을 생성 할 수있는 기능입니다.
다른 사람은 반 개방 및 반 폐쇄 연결이 실제로 무엇을 설명하는 상당히 괜찮은 일했다 됩니다 만, 반 열린 연결의 아이디어는 종종 문제가 되 고 그 맥락에서 검색됩니다.
인터넷에서 "반 개방"또는 "반 개폐"라는 용어가 무엇을 나타내는 지에 대한 논쟁이 있지만, 제가 아는 한, 용어는 의미 론적입니다. 어떤 사람들은 "반쯤 열린"연결은 "문제"라고 말하지만 "반쯤 닫힌"은 파일 다운로드가 반 닫힘 상태에서 끝나기 전에 전송 스트림을 닫아 전송 스트림을 닫을 수있는 디자인 기능입니다 ( 다른 사용자가 설명한대로).
그러나 다른 문제에 대해서는 "문제": TCP 연결을 열기 위해 3 방향 핸드 셰이크를 닫고이를 닫으려면 4 방향 핸드 셰이크가 필요합니다.
TCP는 클라이언트로 전송 된 최종 FIN 패킷이 라우터 / 네트워크에 의해 잠재적으로 삭제 될 수있어 실제 의도가 연결을 완전히 종료하려고 할 때 연결이 절반 개방되는 취약점이 있습니다. 이러한 접근 방식과 유사한 접근 방식은 많은 대역폭이 필요하지 않지만 서버 구현에 따라 귀중한 핸들, 소켓 및 스레드를 잠재적으로 제거 할 수 있기 때문에 널리 사용되는 서비스 거부 공격 유형입니다. 우리의 무선 통신 사업자 덕분에 주파수가 증가하고 있습니다.
운영 체제는 주어진 시간에 운영 체제에 존재할 수있는 반 개방 / 폐쇄 연결 수를 제한하고 연결이 최대로 유지 될 수있는 최대 시간을 도입함으로써 반 개방 DDoS 공격에 맞서 싸우려고 시도했습니다. 반 개폐 / 폐쇄 상태. 마지막으로 개인적으로 확인했지만 Windows의 시간 제한은 꽤 높았습니다 (내 생각에 2 일).
TCP keep-alives의 선택적 특성으로 인해이 조건이 더욱 악화됩니다.이 기능은 완전히 구현 된 경우 데드 / 좀비 연결을 감지하기위한 프로토콜 수준 (응용 프로그램 수준이 아닌) 솔루션으로 의도되었습니다. 그러나 TCP가 설계되었을 때 대역폭은 현재보다 훨씬 더 귀중했으며 TCP에 대한 필수 keep-alive 타이머가 너무 "불쾌"하다는 우려가있었습니다. 따라서 연결 유지는 선택 사항이며 일반적으로 사용되지 않으며 RFC1122에 따라 라우터에서 전송되도록 보장되지 않습니다. 따라서 ... 시나리오를 탐지 / 처리하려는 시도에서 TCP 계층에서 연결 유지를 활성화하더라도 트래픽이 전 세계로 이동함에 따라 일부 라우터가 연결 유지 패킷을 삭제하고 있음을 알 수 있습니다. 잠재적으로 테스트하기 어려운 또 다른 시나리오입니다.
Half-Open 연결은 특히 TCP 기반 서버를 작성하는 코더에게 약간의 엔지니어링 과제를 제기합니다. 특히 고부하시에는 일반적으로 프로덕션 서버에서 임의로 우연히 나타날 수 있기 때문에 TCP 서버 기반 서버를 작성하는 코더에게는 다소 어려움이 있습니다. 알파 / 베타 테스트 단계에서는 눈에 띄지 않습니다. 내 경험상, 하루 250 만 회 연결을 처리하는 서버에서 40,000 개의 연결 중 1 개에서 발생하는 것으로 나타 났지만이 수는 서버와 클라이언트 사이의 모든 인터넷 구간의 트래픽 조건과 트래픽 조건에 따라 달라질 수 있습니다. .
엔지니어는 실제 배포 된 서버에서만 발생하는 문제를 추적하기 어려울 수 있으므로 TCP 서버 코드를 작성할 때이 드문 상태의 연결을 시뮬레이션하여 서버의 반응 시간을 분석하는 것이 중요합니다 이 상황에 직면했다. 예를 들어 TCP 서버가 고정 된 수의 작업자 스레드를 사용하는 경우 프로덕션에 배포 할 때 좀비 연결에 소비되는 모든 스레드를 찾을 수 있습니다. 연결에 많은 작업 메모리가 필요한 경우 최종 결과는 메모리 누수와 유사하게 나타날 수 있습니다. 등
100 % 실행 가능한 연결 유지 솔루션이 없으면 TCP는 사용자 계층에 맡겨서 반 개방 / 폐쇄 연결 처리 방법을 결정하므로 코드에 감지, 시간 초과 및 정리를위한 계획 / 메커니즘이 있어야합니다. 이 상황이 발생했을 때 리소스를 ... 즉, 이것은 여러분이 발명 한 프로토콜이라고 가정하고 프로그래머가 일반적으로 사용하는 많은 (나쁜) 공개 표준 중 하나가 아니라고 가정합니다. 물론 TCP를 통해 독점적으로 실행되는 HTTP와 같은 프로토콜을 언급하고 있습니다. 이 프로토콜은이 프로그래머의 의견에 따라 과대 평가되었습니다.
똑똑한 회사는 TCP의 약점과 HTTP / 웹 트래픽 전송에 대한 불행한 인기를 인식하여 대체물을 찾고자했습니다. 예를 들어 Google은 UDP를 통해 HTTP를 전송하는 QUIC라는 프로토콜을 실험했습니다. TSCP라는 개방형 프로토콜도 있습니다. 그러나 이러한 프로토콜 중 어느 것도 널리 채택되지 않았습니다.
원칙적으로, 나는 내 자신의 UDP 기반 프로토콜에 대해 독점적으로 대화하기 위해 모든 자신의 서버를 구축합니다. UDP는 당신이 생각하는 것보다 까다 롭고 항상 더 빠르고 똑똑하고 지연 시간이 적고 혼잡이 적도록 조정하고 있다고 생각하지만 적어도 반 열린 연결을 처리 할 필요는 없습니다. )
TCP가 연결을 설정하면 핸드 셰이크가 발생하므로 보장되는 것으로 간주됩니다.
이 시점에서 연결이 설정되고 데이터가 흐르기 시작합니다. 대조적으로, UDP 패킷은 보장되지 않으며, 그것이 도착하기를 희망하여 전송됩니다.
http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment
공식적으로 RFC에 따르면 반 열린 TCP 연결은 설정된 연결의 한쪽이 충돌하고 연결이 종료되었다는 알림을 보내지 않은 경우입니다. 이것은 오늘날 일반적인 사용법이 아닙니다.
비공식적으로, 설립 과정에서 연결 인 배아 연결을 언급 할 수 있다면.
반 닫힘은 비공식적 정의와 반대입니다. 컴퓨터가 설정된 연결을 해제하고있는 중간의 상태입니다.
TCP 연결 종료에 대한 최상의 설명
TCP 3-way Handshake Process에서 SYN 비트 세그먼트를 사용하여 TCP (Transmission Control Protocol)에서 클라이언트와 서버간에 연결이 설정되는 방법을 연구했습니다. 이 기사에서는 클라이언트와 서버 간의 TCP 연결이 어떻게 이루어지는 지에 대해 학습합니다. 여기서 FIN 비트가 1로 설정된 서버로 비트 세그먼트를 보내야합니다.
TCP에서 메커니즘 작동 방식 :
Step 1 (FIN From Client) – Suppose that the client application decides it wants to close the connection. (Note that the server could also choose to close the connection). This causes the client send a TCP segment with the FIN bit set to 1 to server and to enter the FIN_WAIT_1 state. While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment (ACK).
Step 2 (ACK From Server) – When Server received FIN bit segment from Sender (Client), Server Immediately send acknowledgement (ACK) segment to the Sender (Client).
Step 3 (Client waiting) – While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment. When it receives this segment, the client enters the FIN_WAIT_2 state. While in the FIN_WAIT_2 state, the client waits for another segment from the server with the FIN bit set to 1.
Step 4 (FIN from Server) – Server sends FIN bit segment to the Sender(Client) after some time when Server send the ACK segment (because of some closing process in the Server).
Step 5 (ACK from Client) – When Client receive FIN bit segment from the Server, the client acknowledges the server’s segment and enters the TIME_WAIT state. The TIME_WAIT state lets the client resend the final acknowledgment in case the ACK is lost.The time spent by client in the TIME_WAIT state is depend on their implementation, but their typical values are 30 seconds, 1 minute, and 2 minutes. After the wait, the connection formally closes and all resources on the client side (including port numbers and buffer data) are released.
자세한 정보 : https://www.geeksforgeeks.org/tcp-connection-termination/
반 폐쇄 연결은 서버와 클라이언트의 한쪽 끝이 연결을 종료 할 때 설정되는 프로세스입니다. TCP는 연결 지향 프로세스이므로 특정 응용 프로그램을 위해 각 소켓이 열립니다. TCP에서는 응용 프로그램을 종료 할 압력이 없습니다. 따라서 연결 지향 프로세스는 대기 신호로 종료를 연장합니다. 이것은 TCP에서 반 닫힘이라고합니다 (연결)