2012-03-07 1 views
11

브라우저와 웹 서버 간의 TCP 연결을 이해하려고합니다. 내 로컬 컴퓨터에서 실행중인 웹 서버가 있고 localhost : 3000 또는 127.0.0.1:3000을 사용하여 예상대로 잘 탐색 할 수 있습니다. ("rails s"과 WEBrick을 실행 중입니다.)웹 서버에 연결할 때 socat에 "fork"가 필요한 이유는 무엇입니까?

저는 브라우저와 웹 서버 사이에 소프트웨어 중개자를 배치하려고 했으므로 socat을 실험하기 시작했습니다. 다음은 잘 작동합니다 :

socat TCP-LISTEN:8080,fork TCP:localhost:3000 

나는 localhost : 8080을 탐색 할 수 있으며 예상대로 작동합니다. 그러나, "fork"인수를 생략하면,

socat TCP-LISTEN:8080 TCP:localhost:3000 

로컬 레일 웹 사이트는 브라우저에서 꽤 깨져 보입니다.

왜 fork 인수가 필요합니까? 왜 브라우저가 없으면 < -> 웹 서버 연결이 필요하지 않습니까?

답변

23

fork이 없으면 socat은 단일 TCP 연결을 허용하고 연결이 열려있는 동안 두 끝점간에 양방향으로 데이터를 전달한 다음 종료합니다. 당신은 쉽게 자신을 볼 수 있습니다

  • 실행 다른 터미널 창에 8080을 localhost로 socat 텔넷
  • 터미널 창 하나. socat 인스턴스에 연결됩니다.
  • 세 번째 터미널 창에서 localhost 8080에 텔넷하십시오. socat이 (는) 더 이상 새 연결을 수신하지 않기 때문에 연결이 거부되었습니다. 이미 연결되어있는 서비스를 계속 처리했습니다.
  • 두 번째 터미널 창에 HTTP 요청을 입력하십시오. HTTP 응답을 받게되고 연결이 닫히면 socat이 종료됩니다.

fork 옵션을 사용하면 부모가 새로 연결을 기다리는 동안 다시 허용 된 새 연결을 처리 할 수 ​​있습니다.

socat의 사전 처리 또는 연결 풀링과 같은보다 정교한 것이 아닌의 사용은 socat으로 고성능 미들웨어를 구현하고 싶지 않은 이유입니다!

+0

대단히 감사합니다. Celada. 그건 좋은 말이야. – user691307

+0

내가 실제로하려는 것은 브라우저와 웹 서버 사이에 내 "중간"프로그램을 작성하는 것입니다. 웹 서버에 클라이언트 TCP 연결을 열고 다른 포트에 "수신 대기"TCP 서버를 엽니 다. 브라우저는 수신 대기 포트에 대한 클라이언트 연결을 엽니 다. 그래서 한 쪽 브라우저에는 여러 TCP 세션이 열리고 닫히는 순서가 있습니다. 그러나 웹 서버 측에는 하나의 설정된 TCP 연결 만 있습니다. 그건 실패합니다. 클라이언트가 시작하고 TCP 연결을 중지 할 때마다 내 자제 중개자가 웹 서버 연결을 닫고 다시 열 수 있다고 생각합니다. 괜찮아? – user691307

+0

소리도 좋아요. 또한 가장 간단한 일입니다. 코드는 HTTP 사용자 에이전트가 할 때마다 서버에 대한 새 연결을 열고 동시에 닫습니다. HTTP 요청의 내용을 해석하는 것보다 작업량이 적어 서버를 향한 하나의 연결로 클라이언트를 구성하는 여러 연결을 집계하기 위해 내용을 조정할 수있는 경우와 그렇지 않은 경우를 파악할 수 있습니다. 그렇게하면 본격적인 HTTP 프록시 서버를 구현할 수 있습니다! – Celada