2016-11-26 2 views
0

현재 연결 유지 연결을 지원하는 다중 스레드 프록시 서버에서 작업하고 있습니다. 파이어 폭스 브라우저에서 요청을 처리하는 동안 몇 가지 이상한 문제가 나타납니다. localhost : 10001/http://url을 사용하여 로컬 프록시에 연결하고이 호스트의 모든 링크에 액세스 할 수 있습니다. 과정은 다음과 같습니다. 1. 포트를 10001에 바인드하는 소켓을 만듭니다. 2. 연결이 수락되고 클라이언트가 연결되어 있으면 fork() 3. 클라이언트 요청을 지속적 연결로 처리합니다.HTTP 프록시 서버 연결 유지 연결 지원

이제는 localhost : 10001/http://url2을 사용하여 다른 호스트에서 두 번째 URL에 액세스하기 위해 Firefox에서 새 탭을 열 때 이상한 점은 첫 번째 연결시 요청이 내 클라이언트 소켓 연결로 이동한다는 것입니다 . 나는 처음에는 그것이 내 코드로 인한 것일 수도 있다고 생각했지만, 그런 다음 나는 텔넷을 사용하여 동일한 작업을 시도했다. 그리고 모든 새로운 연결은 별도의 프로세스를 만들 것이다. 파이어 폭스 브라우저가 이렇게 특정 설정이 있습니까 ??

답변

1

HTTP keep-alive는 기본 TCP 연결을 여러 요청에 다시 사용하여 항상 새로운 TCP 연결을 만드는 오버 헤드를 건너 뛸 수있는 방법입니다. 귀하의 경우 연결 대상은 항상 동일하므로 브라우저가 동일한 TCP 연결을 다시 사용하는 것이 좋습니다. telnet을 사용하면 항상 새로운 TCP 연결을 수행하므로 telnet과의 비교에는 결함이 있습니다.

HTTP keep-alive가 사용되는 경우 연결 헤더의 HTTP 버전과 서버와 클라이언트의 동작에 지정됩니다. 서버와 클라이언트 모두 요청이 완료된 후 언제든지 유휴 연결을 닫을 수 있습니다. 즉 요청이 완료된 후에도 연결을 유지하지 않아도됩니다. 또한 그들은 Connection: keep-alive HTTP 헤더를 사용하여 연결을 열어 놓고 싶다는 메시지를 표시하거나 요청 후 Connection: close을 사용하여 닫고 싶다는 신호를 보낼 수 있습니다. 이 헤더는 HTTP 버전에 따라 기본값이 있습니다. 즉, 명시 적으로 지정되지 않은 한 HTTP/1.0을 사용하는 동안 keep-alive가 HTTP/1.1로 설정됩니다.

http://proxy/real-url과 같은 URL을 사용하여 구현하는 "프록시"는 실제 HTTP 프록시가 아닙니다. 실제 HTTP 프록시는 브라우저 내부에서 프록시로 구성되며 사용자가 사용하는 URL은 동일하게 유지되며 URL 재 작성이 프록시에 의해 수행되어야한다는 것을 의미합니다. 더 나쁜 것은 프록시에 대한 아이디어가 동일한 출처 (즉, 출처가 프록시)에있는 모든 호스트를 효과적으로 병합하므로 브라우저의 주요 보안 개념 인 same-origin policy을 효과적으로 비활성화 할 수 있다는 것입니다. 예를 들어 일부 불량 광고 서버가 이베이로 원산지를 귀하의 구현과 공유하므로 이베이 쿠키에 액세스하여 세션을 도용하여 신분 도용을 위해 오용 할 수 있습니다.

+0

고마워요. 하지만 내 프록시는 동시에 여러 연결을 제공해야합니다. 하나의 요청에 대해 HTTP/1.1 keep-alive를 사용하고 있으며 여전히 처리 중입니다. 그러나 이제는 영구적 인 새로운 요청을 지원하기를 원합니다. 브라우저가 기존 TCP 연결을 사용하고 새로운 TCP 연결을 만들지 못하도록 막을 수있는 방법이 있습니까? –

+0

@Embed_Programmer : 브라우저는 유휴 상태 일 때만 기존 연결을 재사용합니다. 즉,이 연결에 대한 요청은 끝난.다른 경우에는 새 연결을 열거 나 기존 연결이 유휴 상태가 될 때까지 기다립니다. 기존 요청이 완료되지 않았다고 생각하는 동안 브라우저가 새로운 요청을 보내는 것을 본다면 아마 요청의 끝을 판단하는 코드가 잘못되었을 수 있습니다. 브라우저가 동일한 연결에서 동시에 여러 요청을 허용하는 HTTP 파이프 라이닝을 사용하는 경우 일 수도 있습니다. HTTP/1.0 응답 만 보내면이 문제를 해결할 수 있습니다. –

+0

고맙습니다. URL을 통한 프록시 사용이 올바르지 않습니다. 나는 지금 브라우저 내부에서 프록시를 구성했고 나를 귀찮게하는 몇 가지 오류가 수정되었습니다. 당신의 도움을 주셔서 감사합니다 –

0

HTTP persistent connection 또한 대상과 함께 프록시와 함께 사용됩니다.

firefox의 경우 network.http.proxy.version1.0으로 설정하여 프록시의 동작을 변경하려고 할 수 있습니다. 그러나 이러한 재사용 된 연결을 처리 할 수 ​​있으려면 프록시를 강화해야합니다. (아마도 내부 동작을 완전히 다시 생각해야합니다.) Firefox에만 국한되지는 않습니다.

프록시가 HTTP/1.1로 응답하지 않는지 확인하십시오.