HTTP 요청이 조기에 종료되면 어떻게됩니까? 위해 긴 작업을 시작합니다. 요청이

브라우저에 URL을 입력하고 브라우저가 HTTP 요청을 제출한다고 가정합니다. 원격 HTTP 서버는 요청을 수락하고 요청을 처리하기 위해 긴 작업을 시작합니다.

요청이 완료되기 전에 요청을 종료하면 (예 : Esc 또는 Firefox에서) 요청이 어떻게 종료됩니까? 브라우저가이 중단 요청을 서버에 전달합니까 (그렇지 않은 것 같습니까)?

긴 작업이 완료되면 서버가 결과로 무엇을합니까? 어쨌든 다시 보내나요? 그렇다면 어떻게됩니까? 내 PC까지 도달합니까? 아니면 길에서 길을 잃었습니까?

이것은 단지 나의 호기심을위한 것입니다.

시간 내 줘서 고마워 🙂



답변

글쎄, 그것은 모두 서버가하는 일에 달려 있습니다. 일반적으로 전송이 시도 될 때까지 종료 된 요청을 “감지”하지 않습니다. 이 시점에서 스크립트는 웹 서버에서 user_abort 메시지를 얻습니다 (php에서는 사용자가 중단 된 것을 무시하도록 지시 할 수 있습니다 ignore_user_abort(true);). 클라이언트에 데이터를 보내려고하지 않으면 서버가 요청이 중단되었음을 알 수있는 방법이 없습니다.

닫힌 TCP 연결로 요청을 보내려고하면 서버 소프트웨어에 따라 달라집니다. Apache는 다음과 같이 작동합니다. 동적 스크립트가 처리되는 동안 전송 된 데이터가 여전히 있으면 중단에 대해 스크립트에 알리고 원하는 방식으로 처리하도록합니다 (PHP-기본적으로 종료 됨). 스크립트가 완료되었거나 정적 파일 요청 인 경우 닫힌 연결을 무시하고 반환됩니다.


답변

나는 그것이 일종의 전기라고 생각합니다. 요금. 일부 연결이 종료되면 전송되는 데이터가 청구됩니다. 특정 전송에 사용할 수있는 청취 소켓이 없기 때문에 사라집니다. 소켓이있는 경우에만 일부 통신이 발생합니다.

예:

우리 http://localhost는 apache2 httpd에 부딪쳤다 . 실행 중이 아니라고 가정하십시오. 브라우저는 소켓을 열고 포트 80 (기본값)으로 메시지를 보내고 응답이 있는지 확인합니다. 아파치가 실행 중이 아니기 때문에 리스너가 없으므로이 핑 요청은 응답을 전혀받지 않습니다. 적어도 200 ok 또는 모든 종류의 손떨림. 그럼 핑은 어떻게 되나요? http는 어떤 것을 보낸다 GET http://localhost 80. GET http://localhost 80? 그것은 단지 충전이며 사라집니다.

이것은 단지 제 믿음이며, 더 명확하게 하려면 먼저 TCP 를 참조해야 합니다. 그래야만 인터넷 프로토콜과 그 이후의 http가 어떻게 동작하는지 이해할 수 있습니다. 궁극적으로 조기 종료 된 HTTP 요청에 대한 구체적인 정의가없는 것 같습니다. 이것이 조기 종료라고하는 이유입니다.