2011-01-14 1 views
8

:수동 및 능동 소켓 <a href="http://www.freesoft.org/CIE/Course/Section4/6.htm">this socket tutorial</a>에서 인용

소켓은 두 가지 기본 맛에 온다. 활성 소켓 연결 ... 수동형 소켓 가 연결되지 않은 개방 된 데이터를 통해 원격 활성 소켓 접속, 오히려 연결되면 새로운 활성 소켓 스폰 것이다 수신 연결을 기다리고있다 각 포트는 포트 개방 연결에 대응 수신 연결하고 여러 활성 소켓 각 대기 단일 수동 소켓 그것에 바인더 제본 수

... 설립. 공장 노동자가 도착하는 새로운 메시지를 기다리고 것처럼 (그는이 수동 소켓 대표), 그리고 하나 메시지가 새로운 보낸 사람이 도착했을 때, 그는 는 위임하여 그들과 대응 (A 연결) 시작 다른 사람 (활성 소켓)이 실제로 패킷 을 읽고 이 필요한 경우 보낸 사람에게 응답합니다. 이렇게하면 공장 직원 이 새로운 패킷을 무료로받을 수 있습니다.

는 ...이어서 가이드는 접속이 확립 된 후에, 활성 소켓에 남아있는 바이트가 없을 때까지 계속 데이터를 수신하고 연결을 닫은 것을 설명한다.

내가 이해하지 못하는 것은 다음과 같습니다. 포트에 들어오는 연결이 있고 보낸 사람이 20 분마다 작은 데이터를 보내려고한다고 가정합니다. 남아있는 바이트가 없을 때 활성 소켓이 연결을 닫으면 송신자는 데이터를 보내려고 할 때마다 포트에 다시 연결해야합니까? 우리는 오래 동안 한 번 확립 된 연결을 어떻게 지속합니까? 내가 여기서 뭘 놓치고 있는지 말해 줄 수 있니?

내 두 번째 질문은 누가 동시에 작동하는 활성 소켓의 한계를 결정합니까?

+1

당신은 그 기사의 다른 부분에서 그 기사의 말을 바꾸고 있습니다. 컨텍스트가 다릅니다. 마지막 섹션에서는 저자가 자신의 프로그램을 설명합니다. 소켓은 기본적으로 그렇게 행동하지 않습니다. 사실 소켓을 닫지 않으면 잊어 버리고 나쁜 일이 일어날 수 있습니다. 소켓은 마지막 바이트를 받았을 때 자동으로 닫히지 않습니다. – SRM

+0

좋아, 나는 그것이 대회라고 생각하고 여기서 내가 빠진 것을 물었다. 나는 개념을 처음 사용하므로 이해하기 어려운 모든 것을 질문하고 싶습니다. – aslisabanci

+0

문제가 없으므로 소켓을 명시 적으로 닫아야한다는 사실을 알고 싶습니다. 소켓이 닫히지 않은 이유를 알아 내려고 머리를 긁적 거릴 때 줄을 서면서 두통을 줄일 수 있습니다. :) – SRM

답변

6

보낸 사람은 연결을 유지하기 위해 일정한 간격으로 KEEPALIVE 패킷을 보내야합니다. KEEPALIVE의 형식은 프로토콜에 따라 다릅니다. TCP 데이터 세그먼트에서 단일 NULL만큼 작을 수 있습니다.

두 번째 질문은 I/O에 따라 다릅니다. I/O를 차단하는 경우에는 컴퓨터에서 실행중인 스레드 수만 필요하므로 많은 클라이언트를 가질 수 없습니다. 비 차단이라면 더 많은 고객을 확보 할 수 있습니다. 프로그래밍 언어는 블로킹 I/O와 비 블로킹 I/O를 모두 지원해야합니다. (Java가하는 사실을 알고 있습니다.)

또한 대역폭, 각 클라이언트의 데이터 전송, 메모리, 클럭 속도 등에 따라 다릅니다. 그러나 비 차단 대 차단은 큰 차이를 만들 수 있습니다. 당신이 받아 들일 수있는 고객의 수. 아마도 서버 충돌없이 5 ~ 10 대 이상의 클라이언트를 차단할 수는 없지만 차단하지 않으면 수천 명이 될 수 있습니다.

+0

그래서 항상 keepalive 패킷을 매번 연결을 다시 설정하는 것보다 20 분 더 저렴한 작업으로 보내고 있습니까? 다시 연결하는 오버 헤드를 피하는 것 외에 연결을 유지하는 이점은 무엇입니까? – aslisabanci

+1

실제로 많은 클라이언트를 연결하고 각각의 요청이 빠르면 (요청한대로 20 초) 요청/응답 유형 패턴을 사용하는 것이 가장 좋습니다. 사용할 수있는 포트가 64k 밖에 없으므로 소켓을 닫지 않는 한 포트가 고갈되기 전에 64k 소켓 만 IP에 수용 될 수 있습니다. 그것은 실제로 귀하의 응용 프로그램에 따라 다릅니다. 예를 들어 MMO를 작성하는 경우 영구 연결이 필요합니다. HTML5를 사용하지 않는 한 영구 연결을 필요로하지 않지만 피하려고 시도하지만 웹 서버를 작성하는 경우에는 별다른 이야기가 아닙니다. – SRM

+2

클라이언트의 관점에서, 단일 서버에 대한 간단한 keepalive는 많은 작업이 아닙니다. 인터넷에 연결되어있을 때 이미 정기적으로 6 개의 Keepalives를 보내고있을 것입니다. 서버의 관점에서 보면 I/O 성능을 향상시키기 위해 소켓 목록의 소켓 수를 최소한으로 유지하는 것이 유리할 수 있습니다. 데이터 전송 사이의 대기 시간이 20 분이라면 매번 새로운 연결을 만들 것입니다. 클라이언트에서는 무시할 만하지만 서버에서는 무시해도됩니다. – ktm5124

0

첫 번째 질문 : 예, 소켓을 닫으면 열기를 다시 시작하여 통신을 다시 시작해야합니다.

두 번째 질문 : .원하는 경우 서버에 64k 연결을 생성하여 포트 고갈을 겪을 수 있습니다 (권장하지 않음). ktm5124가 말했듯이, 그것은 모두 여러분의 어플리케이션에 달려 있습니다. 비동기 I/O 및/또는 스레드 풀을 사용하여 클라이언트 요청을 처리하는 등 여러 가지 방법으로 서버를 확장 가능하게 만들 수 있습니다.

+0

윌의 대답을 참조하십시오 http://stackoverflow.com/a/2332756/1418457 어쩌면 당신이 TCP – onmyway133

+0

에 대해 오해 할 수 있습니다. 알았어, tcp/ip 포트 고갈이 클라이언트 측 일 경우 (클라이언트 당 64k 제한에 의해 암시되는 서버 포트 당 실제 포트 문제가 발생하는 이유는 무엇입니까? 튜플의 모든 값을 여전히 사용할 수 있습니다. 아마도 64k 숫자가 잘못되었지만 튜플이 보유 할 수있는 조합의 수에는 엄격한 제한이 있습니다. 조합이 부족한 경우 주소를 다시 사용하지 않는 한 주소가 없어져서 연결이 지정되지 않고 연결이 거부됩니다. – SRM

3

네트워크를 통한 TCP/IP 구현에서 전송 된 실제 패킷과 프로그램과 TCP/IP를 구현하는 라이브러리 간의 상호 작용을 혼동하지 마십시오.

소켓은 TCP/IP 구현 (라이브러리 또는 커널 OS)을 통해 프로그램에 제공되는 추상화에 불과합니다. 소켓을 파이프에 대한 연결로 시각화 할 수 있습니다 (localIP : port-remoteIP : port). 프로그램은 소켓을 열고 소켓을 통해 데이터를 전달하며 더 이상 자원을 확보 할 필요가 없으면 소켓을 닫을 수 있습니다. 이것은 정상적인 흐름입니다. 그러나 TCP/IP 구현은 유효한 이유 때문에 소켓을 닫을 수 있습니다. 그 이유 중 일부는 네트워크 액세스 케이블 연결 끊김, 네트워크 라우팅 오류, 서버 다운 등입니다. 따라서 프로그램이 TCP/IP 소켓을 닫지 않았더라도이를 찾을 수 있습니다.

이제 내 질문에 내 프로그램이 긴 잠깐 동안 작은 데이터 세그먼트를 보내는 경우 어떻게해야합니까? 대답은 일시 중지 시간과 상대방이 듣는 프로그램에 따라 다릅니다. 대부분의 TCP/IP 구현에는 신뢰할 수없는 실제 네트워크를 통해 안정적인 연결을 추상화 할 수있는 연결 시간 제한 개념이 있습니다. 따라서 프로그램이 tcp/ip timeout보다 더 오래 멈 추면 소켓이 라이브러리에 의해 닫히고 socket을 다시 열어야합니다. 그것은 또한 통신을 다시 시작하게 할 수도 있습니다. tcp/ip 연결 파이프의 다른 쪽에서 청취하는 프로그램에 따라 다릅니다.

tcp/ip 시간 초과를 늘리고이를 유지하는 방법이 있습니다. 그것들은 네트워크 설정, 서버 소프트웨어 설정, 또는 TCP/IP 라이브러리 호출에서 KEEPALIVE 매개 변수를 설정하여 소켓을 열어 둘 것을 명시 적으로 요구함으로써 이루어질 수 있습니다. 그것은 여전히 ​​열려 있든 그렇지 않든간에 달려 있습니다. tcp/ip가 소켓을 열어 놓는 방법에 대한 자세한 내용은 코드와 아무 관련이 없으므로 혼동해서는 안됩니다. TCP/IP에는 안정적인 안정적인 연결이 가능하다는 환상을 프로그램에 제공하기 위해 여러 가지 설정과 타임 아웃이 있습니다. 좋은 부분은 남용하지 않는 한 프로그램 코드에서 숨겨집니다. 몇 초 내에 일시 중지 유지 :) 신뢰할 수있는 로컬 네트워크의 작은 응용 프로그램에 대해 한 세트의 시간 제한 설정이 잘 작동 할 수 있으며 부하가 높은 응용 프로그램 또는 교차 대륙 연결에서 작동하지 않습니다. 각각의 특정 상황에는 고유 한 솔루션이 있습니다.

"20 분마다 약간의 데이터를 보내려면"이 특정 질문에서 각 통신에 대한 소켓 연결을 닫고 열 것을 권합니다. 열 시간은 1 초 미만이므로 의사 소통에 영향을주지 않아야합니다. 답례로 통신 프로토콜의 복잡성이 줄어 듭니다. 리시버는 새로운 소켓 연결에서 항상 새로 시작되며 두 시스템은 필요하지 않을 때 20 분에 걸쳐 tcp/ip 통신으로 무료 리소스를 사용할 수 있습니다.

관련 문제