나는 처음 커뮤니케이션 전공을 공부했다. 졸업 후, 나의 반 친구들은 그들의 꿈을 추구하는 별도의 방법을 갔고 모든 규모의 건설 현장들 사이를 여행했습니다. 하하, 농담, 특정 연구소에 들어간 놀라운 사람들도 있습니다. 그의 아버지는 감독이 아니기 때문에 너무 어두워서는 안됩니다. 컴퓨터 네트워크 (아마도이 이름)라는 매우 높은 수준의 과정이 있다는 것을 기억합니다. 악수에 대한 개념이 있으며 이제 검토하십시오.
먼저 회로도를 살펴 보겠습니다.
TCP는 연결 지향적입니다. 상대방이 데이터를 보내는 방향에 관계없이 두 당사자간에 연결을 설정해야합니다. TCP/IP 프로토콜에서 TCP 프로토콜은 안정적인 연결 서비스를 제공하며 연결은 세 가지 핸드 셰이크를 통해 초기화됩니다. 3 방향 핸드 셰이크의 목적은 두 당사자의 일련 번호와 확인 번호를 동기화하고 TCP 창 크기 정보를 교환하는 것입니다.
1. 첫 핸드 셰이크 : 연결을 설정하십시오. 클라이언트는 연결 요청 메시지 세그먼트를 보내고 SYN 위치를 1로 설정하고 시퀀스 번호는 x입니다. 그런 다음 클라이언트는 SYN_SEND 상태에 들어가 서버가 확인하기를 기다립니다.
2. 중고 핸드 셰이크 : 서버는 SYN 메시지 세그먼트를 수신합니다. 서버가 클라이언트로부터 SYN 메시지 세그먼트를 수신하면 SYN 메시지 세그먼트를 확인하고 승인 번호를 x+1 (시퀀스 번호+1)으로 설정해야합니다. 동시에, SYN 요청 정보를 보내고 SYN 위치를 1로 설정하고 시퀀스 번호를 Y로 설정해야합니다. 서버는 위의 모든 정보를 패킷 세그먼트 (즉, SYN+ACK 메시지 세그먼트)에 넣고 클라이언트에게 함께 보냅니다. 현재 서버는 syn_recv 상태로 들어갑니다.
3. 세 번째 핸드 셰이크 : 클라이언트는 서버의 SYN+ACK 패킷 세그먼트를 수신합니다. 그런 다음 승인 번호를 Y+1로 설정하고 ACK 메시지 세그먼트를 서버로 보냅니다. 메시지 세그먼트가 전송 된 후 클라이언트와 서버는 확립 된 상태로 들어가서 TCP 3 회 핸드 셰이크를 완료합니다.
세 가지 핸드 셰이크를 완료 한 후 클라이언트와 서버는 데이터 전송을 시작할 수 있습니다. 위의 것은 TCP의 3 회 핸드 셰이크에 대한 전체 소개입니다.
그 네 파도는 어떻습니까?
클라이언트와 서버가 세 가지 핸드 셰이크를 통해 TCP 연결을 설정 한 후 데이터 전송이 완료되면 TCP 연결을 분리해야합니다. 그런 다음 TCP의 연결을 끊기 위해 신비한 "네 파도"가 있습니다.
첫 번째 웨이브 : 호스트 1 (클라이언트 또는 서버로 사용될 수 있음), 시퀀스 번호 및 승인 번호를 설정하고 FIN 메시지 세그먼트를 호스트 2로 보냅니다. 이때 호스트 1은 FIN_WAIT_1 상태에 들어갑니다. 이는 호스트 1이 호스트 2로 전송 될 데이터가 없음을 의미합니다.
2. 두 번째 웨이브 : 호스트 2는 호스트 1에 의해 전송 된 FIN 메시지 세그먼트를 수신하고 ACK 메시지 세그먼트를 호스트 1로 반환했습니다. 승인 번호는 시퀀스 번호 + 1입니다. 호스트 1은 FIN_WAIT_2 상태에 들어갑니다. 호스트 2는 호스트에게 보낼 데이터가 없다고 말하면 연결을 닫을 수 있습니다.
3. 세 번째 웨이브 : 호스트 2는 핀 메시지 세그먼트를 호스트 1으로 보냅니다.
4. 네 번째 웨이브 : 호스트 1은 호스트 2에 의해 보낸 FIN 메시지 세그먼트를 수신하고 ACK 메시지 세그먼트를 호스트 2로 보낸 다음 호스트 1은 time_wait 상태로 들어갑니다. 호스트 2는 호스트 1의 ACK 메시지 세그먼트를 수신 한 후 연결을 닫습니다. 현재 호스트 1은 2MSL을 기다린 후에도 여전히 답장을받지 못하며 서버 쪽이 정상적으로 닫혔다는 것을 증명하므로 괜찮습니다. 호스트 1도 연결을 닫을 수 있습니다.
이 시점에서 TCP의 네 파도는 행복하게 완성되었습니다. 당신이 이것을 볼 때, 당신은 당신의 마음에 많은 질문이 있고, 많은 것을 이해하지 못하며, 지저분한 느낌이 듭니다. 괜찮아, 계속 요약하자.
왜 세 번 악수해야합니까?
소위 3 방향 핸드 셰이크는 TCP 연결을 설정하는 것을 의미합니다. 즉, TCP 연결을 설정할 때 클라이언트와 서버는 연결의 설정을 확인하기 위해 총 3 개의 패킷을 보내야합니다. 소켓 프로그래밍 에서이 프로세스는 Connect를 실행하는 클라이언트에 의해 트리거됩니다.
우리는 TCP의 세 가지 악수를 요약 했으므로 왜 세 번해야합니까? 우리는 왜 우리가 그것을 두 번 완성 할 수 있다고 생각합니까? 그렇다면 왜 TCP가 세 가지 연결을해야합니까? 이것이 Xie Xiren이 "컴퓨터 네트워크"에서 말한 것입니다.
실패한 연결 요청 세그먼트가 갑자기 서버로 전송되는 것을 방지하기 위해 오류가 발생합니다.
이 책에서 예는 다음과 같이 제공됩니다.
"실패한 연결 요청 세그먼트"의 생성은 이러한 경우에 다음과 같습니다. 클라이언트가 전송 한 첫 번째 연결 요청 세그먼트는 손실되지 않습니다.
대신, 특정 네트워크 노드에 오랫동안 유지되어 서버에 도달하기 전에 연결이 릴리스 된 후 특정 시간이 지연됩니다. 이것은 원래 a였습니다
오래 전에 메시지 세그먼트가 실패했습니다. 그러나 서버 가이 유효하지 않은 연결 요청 메시지 세그먼트를받은 후에는 클라이언트가 다시 보낸 새로운 제품이라고 잘못 생각했습니다.
연결 요청. 따라서 승인 세그먼트가 고객에게 전송되어 연결을 설정하기로 동의했습니다. "3 번 핸드 셰이크"가 채택되지 않았다고 가정하면 서버 만
확인을 발행하면 새로운 연결이 설정됩니다. 클라이언트가 연결 요청을 발행하지 않았으므로 서버의 확인은 무시되지 않습니다.
서버로도 전송되지 않습니다. 그러나 서버는 새로운 전송 연결이 설정되었으며 클라이언트가 데이터를 보내기를 기다리고 있다고 생각했습니다. 그래서,
서버의 많은 리소스가 낭비됩니다. 위의 현상은 "3 회 핸드 셰이크"를 사용하여 발생하지 않을 수 있습니다. 예를 들어, 지금 상황이
클라이언트는 서버의 승인에 대한 승인을 발행하지 않습니다. 서버는 확인을받을 수 없으므로 클라이언트가 연결을 설정할 필요가 없다는 것을 알고 있습니다. "
이것은 매우 명확하여 서버가 대기 및 자원을 낭비하지 못하게합니다.
왜 4 번 흔들어야합니까?
왜 4 번 흔들나요?
소위 4 방향 웨이브 핸드는 TCP 연결을 종료하는 것입니다. 즉, TCP 연결이 분리되면 클라이언트와 서버가 연결 연결을 확인하기 위해 총 4 개의 패킷을 보내야합니다. 소켓 프로그래밍 에서이 프로세스는 클라이언트 또는 서버가 근접한 서버에 의해 트리거됩니다.
TCP 프로토콜은 연결 지향적이고 신뢰할 수있는 바이트 스트림 기반 전송 계층 통신 프로토콜입니다. TCP는 전체 듀플렉스 모드이므로 호스트 1이 핀 세그먼트를 보내면 호스트 1에 데이터를 전송할 데이터가 없음을 의미합니다. 호스트 1은 호스트 2에게 데이터가 전송되었다고 말합니다. 그러나이 시점에서 호스트 1은 여전히 호스트 2의 데이터를 수락 할 수 있습니다. 호스트 2가 ACK 세그먼트를 반환 할 때, 호스트 1에 데이터를 전송할 데이터가 없다는 것을 이미 알고 있지만 호스트 2는 여전히 호스트 1에 데이터를 보낼 수 있습니다. 호스트 2가 FIN 세그먼트를 보내면 호스트 2에 데이터를 전송할 수 없으며, 호스트 1을 전송할 데이터가 없다고 말하면 서로 가이 TCP 연결을 행복하게 방해 할 것입니다. 네 파의 원리를 올바르게 이해하려면 네 파도 동안 상태의 변화를 이해해야합니다.
FIN_WAIT_1 :이 상태는 신중하게 설명해야합니다. 실제로 FIN_WAIT_1 및 FIN_WAIT_2 상태의 진정한 의미는 둘 다 상대방의 FIN 메시지를 기다리는 것입니다. 이 두 상태의 차이점은 다음과 같습니다. FIN_WAIT_1 상태는 실제로 소켓이 확립 된 상태에있을 때 연결을 적극적으로 닫고 다른 당사자에게 FIN 메시지를 보내려고합니다. 현재 소켓은 FIN_WAIT_1 상태로 들어갑니다. 상대방이 ACK 메시지에 응답하면 FIN_WAIT_2 상태로 들어갑니다. 물론 실제 정상적인 상황에서 상대방이 무엇이든 ACK 메시지는 ACK 메시지에 즉시 응답해야합니다. 따라서 FIN_WAIT_1 상태는 일반적으로보기가 어렵고 FIN_WAIT_2 상태는 종종 NETSTAT에서 볼 수 있습니다. (활성 파티)
FIN_WAIT_2 :이 상태는 위에서 자세히 설명되었습니다. 실제로, FIN_WAIT_2 상태의 소켓은 반 연결을 의미합니다. 즉, 한 당사자는 긴밀한 연결이 필요하지만 다른 당사자에게 시간을 내기 위해 귀하에게 전송할 데이터가 있다고 말한 다음 나중에 연결을 닫습니다. (활성 파티)
Close_wait :이 상태의 의미는 실제로 닫히기를 기다리고 있습니다. 이해하는 방법? 상대방이 소켓을 닫고 FIN 메시지를 자신에게 보낼 때, 시스템은 의심 할 여지없이 ACK 메시지에 상대방에게 응답 한 다음 Close_wait 상태에 들어갑니다. 다음으로, 당신이 실제로 고려해야 할 것은 여전히 다른 당사자에게 보낼 데이터가 있는지 확인하는 것입니다. 그렇지 않은 경우 소켓을 닫고 다른 당사자에게 FIN 메시지를 보낼 수 있습니다. 즉, 연결을 닫을 수 있습니다. 따라서 Close_wait 상태에있을 때는 연결을 닫을 때까지 기다리는 것입니다. (수동 측면)
Last_ack :이 상태는 상대적으로 이해하기 쉽습니다. FIN 메시지를 전한 후 상대방의 ACK 메시지를 수동적으로 닫습니다. ACK 메시지를받은 후 사용 가능한 폐쇄 상태를 입력 할 수 있습니다. (수동 측면)
Time_wait : 상대방의 FIN 메시지가 수신되고 ACK 메시지가 전송되었음을 의미합니다. 2MSL이 사용 가능한 폐쇄 상태로 돌아올 때까지 기다리십시오. Finwait1 상태에서 Fin 플래그와 ACK 플래그가 모두있는 상대방과 메시지를받을 때 Fin_Wait_2 상태를 통과하지 않고 Time_wait 상태를 직접 입력 할 수 있습니다. (활성 파티)
닫기 : 연결이 중단되었음을 나타냅니다.
요약
위의 것은 TCP/IP 프로토콜의 세 가지 핸드 셰이크와 4 개의 핸드 셰이크의 원리 및 프로세스 분석에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 단점이 있으면 메시지를 남겨 주시고 귀중한 의견을 기대하십시오.