2017-11-16 6 views
0

저는 처음부터 재미있게 웹 서버를 구축 중이며 Chrome에서 이상한 동작을 감지하고 있습니다.크롬이 연결을 열었지만 아무 것도 보내지 않는 이유

GET/HTTP/1.1 
Host: localhost:8000 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 
DNT: 1 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.9 

아무것도 특별하지만, 그것은 또한 내 서버에 다른 요청을하고 그것을 기다리고 내 서버에 결과 아무것도를 보내지 않습니다 : 나는 /에 GET 요청에 대한 크롬에서 얻을 요청은 다음과 같습니다 들어오는 메시지는 영원히.

Safari에서는이 동작을 찾을 수 없습니다. 모든 요청마다 403으로 응답하도록 서버를 설정했지만 영구 연결은 유지됩니다. 이 연결의 목적은 무엇이며 어떻게 처리해야합니까? HTTP 프로토콜에서 뭔가 빠졌습니까?

답변

1

HTTP/1.1 브라우저는 여러 개의 TCP 연결을 열어 경향이 있습니다. 서버가 한 번에 하나의 연결에서만 작동하면 교착 상태가 발생할 수 있습니다. 요청이 준비되면 스레드 또는 비 블로킹 IO (select)를 사용하여 각 연결을 처리해야합니다.

크롬이 추가 소켓을 열면 첫 번째 소켓이 닫히면 준비가 완료되지만 확실하지 않습니다. HTTP/1.1은 소켓을 닫는 것 외에 요청/응답을 취소 할 수있는 방법이 없으며, 응답을 완료 한 후 서버가 Connection: close을 전송할 수도 있으므로 브라우저가 이후 요청을 준비하고 있습니다.

+0

Chrone는 이전 연결이 더 효율적으로 끝나기 전에 다른 연결을 열어 두는 것이 합당한 것처럼 보이지만 내 서버는 모든 요청에 ​​'Connection : close'를 포함합니다. 아마 당신이 옳고 크롬이 다음 요청을 기다리고 있지만 Chrome이 빠르게 보이게 만드는 데 서버 시간을 낭비하는 것은 그리 좋지 않은 것 같습니다. –