TCP를 설정하려면 3방향 핸드셰이크가 필요하고, 연결을 해제하려면 4방향 핸드셰이크가 필요합니다. 전체 과정은 아래 그림에 나와 있습니다.
먼저 연결 설정 방법을 살펴보겠습니다.
[2017.01.04 업데이트] 해당 내용에 잘못된 사진이 있는 점 양해 부탁드립니다. 잘못된 사진은 비교를 위해 삭제하지 않습니다. 이해가 좋아. 업데이트하는데 너무 오래 걸려서 죄송합니다! !
오류 그림은 다음과 같습니다.
먼저 클라이언트는 연결 요청 메시지를 서버 세그먼트에서 수락한 후 ACK로 응답합니다. 메시지를 보내고 이 시간에 대한 연결을 할당합니다. 클라이언트는 ACK 메시지를 받은 후 Server 세그먼트에도 ACK 메시지를 보내고 자원을 할당함으로써 TCP 연결이 설정됩니다.
연결을 끊는 방법은 무엇인가요? 간단한 과정은 다음과 같습니다.
[참고] 연결 끊김 끝은 클라이언트 끝 또는 서버 끝일 수 있습니다.
클라이언트가 연결 중단 요청, 즉 FIN 메시지를 보낸다고 가정합니다. 서버가 FIN 메시지를 받은 후에는 "내 클라이언트가 당신에게 보낼 데이터가 없습니다"라는 뜻이지만, 아직 보낼 데이터가 있다면 서둘러 소켓을 닫을 필요 없이 계속해서 보낼 수 있습니다. 데이터. 그래서 먼저 ACK를 보냅니다. "고객에게 요청을 받았지만 아직 준비가 안 되었다고 전해주세요. 계속해서 제 메시지를 기다려주세요". 이때 클라이언트는 FIN_WAIT 상태로 진입하여 계속해서 서버로부터 FIN 메시지를 기다린다. 서버는 데이터가 전송되었음을 확인하면 클라이언트에게 " 클라이언트에게 말해 주세요. 데이터 전송을 마쳤으며 연결을 닫을 준비가 되었습니다 "라고 FIN 메시지를 보냅니다. 클라이언트는 FIN 메시지를 받은 후 연결을 닫을 수 있다는 것을 알지만 여전히 네트워크를 신뢰하지 않고 서버가 연결을 닫는 것을 알지 못하는 것을 두려워하여 ACK를 보낸 후 TIME_WAIT 상태로 들어갑니다. 서버가 ACK를 받지 못하면 재전송 할 수 있습니다. "서버가 ACK를 받은 후 " 연결을 끊을 수 있다는 것을 알게 될 것입니다 ". 클라이언트는 2MSL을 기다린 후에도 여전히 응답을 받지 못했습니다. 이는 서버가 정상적으로 닫혔음을 증명합니다. 클라이언트도 연결을 닫을 수 있습니다. 좋아, TCP 연결은 이렇게 닫혔어! 전체 프로세스 동안 클라이언트가 경험한 상태는 다음과 같습니다:
서버가 경험한 프로세스는 다음과 같습니다:
【참고】 TIME_WAIT 상태에서 TCP 클라이언트가 보낸 마지막 ACK가 손실되면 다시 전송됩니다. TIME_WAIT 상태에 필요한 시간은 구현에 따라 다릅니다. 일반적인 값은 30초, 1분, 2분입니다. 기다린 후 연결이 공식적으로 종료되고 모든 리소스(포트 번호 포함)가 해제됩니다.
【질문 1】연결할 때는 3자 핸드셰이크가 되고, 닫을 때는 4자 핸드셰이크가 되는 이유는 무엇인가요?
답변: 서버가 클라이언트로부터 SYN 연결 요청 메시지를 받으면 직접 SYN+ACK 메시지를 보낼 수 있기 때문입니다. ACK 메시지는 응답을 위해 사용되고, SYN 메시지는 동기화를 위해 사용됩니다. 하지만 연결을 닫을 때 서버가 FIN 메시지를 받았을 때 SOCKET이 즉시 닫히지 않을 가능성이 높기 때문에 클라이언트에게 "당신이 보낸 FIN 메시지를 받았습니다. " 내 서버 측의 메시지가 모두 전송되어야만 FIN 메시지를 보낼 수 있으므로 함께 보낼 수 없습니다. 따라서 4단계 악수가 필요합니다.
【질문 2】 왜 TIME_WAIT 상태가 CLOSE 상태로 돌아가기 전에 2MSL(최대 세그먼트 생존 시간)을 통과해야 합니까?
답변: 4개의 메시지가 모두 전송되었고 CLOSE 상태로 직접 들어갈 수 있다는 것은 타당하지만 네트워크가 신뢰할 수 없고 마지막 ACK가 손실될 수 있다고 가정해야 합니다. 따라서 TIME_WAIT 상태는 손실될 수 있는 ACK 메시지를 다시 보내는 데 사용됩니다.
위 내용은 TCP에서 3방향 핸드셰이크와 4방향 핸드셰이크는 무엇을 의미합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!