트래픽이 많은 사이트는 65535 개 이상의 TCP 연결을 어떻게 처리합니까?


29

하나의 시스템이 가질 수있는 포트 수에 제한이 있고 소켓이 사용되지 않은 포트 번호에만 바인딩 할 수있는 경우 요청 수가 매우 많은 (최대 포트 수보다 많은) 서버는이를 어떻게 처리합니까? 시스템을 여러 시스템에 분산시키는 것만으로 완료 되었습니까?

답변:


55

포트 번호는 매우 잘못 이해합니다. 서버는 한 포트에서만 수신하고 클라이언트가 해당 포트에 연결하는 개방형 소켓을 많이 가질 수 있습니다.

TCP 레벨에서 튜플 (소스 IP, 소스 포트, 대상 IP, 대상 포트)은 각 동시 연결마다 고유해야합니다. 이는 단일 클라이언트가 서버에 대한 65535 개 이상의 동시 연결을 열 수 없음을 의미합니다. 그러나 서버는 클라이언트 당 (이론적으로) 서버 65535 동시 연결을 할 수 있습니다 .

따라서 실제로 서버는 서버에 대한 TCP 연결 수가 아니라 요청을 처리해야하는 CPU 전력, 메모리 등으로 인해 제한됩니다.


나는 캐리어 급 NAT이 어떤 영향을 미칠지 궁금
TheLQ

@TheLQ CGN이 없으면 각 클라이언트는 동일한 서버에 대한 65535 개 이상의 연결을 열 수 없으므로 클라이언트는 거의 동일한 서버에 대한 많은 연결이 필요하지 않습니다. CGN을 사용하면 각 CGN이 동일한 서버에 대한 65535 개 이상의 연결을 열 수 없으므로 해당 CGN을 사용하는 모든 클라이언트간에 연결을 공유해야합니다. CGN이 한 서버에 대한 65535 연결과 다른 서버에 대한 65535 연결을 동시에 열 수 있는지 여부는 구현 세부 사항이며, CGN 구현마다 다를 수 있습니다.
kasperd

CGN에 더 많은 IP 주소를 추가하거나 더 많은 CGN을 배포하여 제한을 늘릴 수 있습니다. 그러나 이중 스택 만 배포 할 수도 있습니다. 그러면 IPv6을 지원하는 서버에 대한 연결은 CGN을 거치지 않으므로 귀중한 포트 번호를 소비하지 않습니다.
kasperd

14

당신은 착각합니다-소켓의 독창성은 4 가지 요소에 의해 결정됩니다 :

  1. 로컬 IP 주소
  2. 로컬 포트 ​​번호
  3. 원격 IP 주소
  4. 원격 포트 번호

네트워크 서비스를 제공 할 때 1. 및 2.는 일반적으로 고정되어 있지만 (예 : IP 10.0.0.1, 포트 80) 단일 클라이언트 (또는 단일 NAT 게이트웨이) 에서 수천 개의 연결 기대하지 않는 한 로컬 리소스가 부족하기 전에 3. 및 4.의 가능한 조합에 대한 경계.

따라서 실제로 클라이언트는 다른 대상 IP 주소에 대한 연결을 열기 위해 연결에 이미 사용중인 포트를 사용하지 않더라도 거의 모든 응용 프로그램에서 포트 번호 고갈은 최소한의 문제가 될 것입니다. 고객 입장에서.

문제는 개방형 아웃 바운드 연결 (예 : 토렌트)이 많은 클라이언트에 NAT 게이트웨이 (라우터)가있는 실제 문제입니다. NAT에 사용 가능한 포트 풀이 비워지면 포트 번호가 고갈되는 것을 볼 수 있습니다. 이 경우 NAT 게이트웨이는 추가 연결을 만들 수 없으므로 클라이언트가 인터넷을 효과적으로 차단합니다.


2

문제는 대규모 (> 64k) 연결 수를 처리하는 방법이었습니다. 가장 일반적인 두 가지 방법은 다음과 같습니다.

  • 서버를 추가하면 src / dst 주소 수와 포트 번호 튜플이 증가합니다. 여러 서버에서로드를 공유하는 여러 가지 방법이 있습니다. DNS 라운드 로빈은 하나입니다. 다른 사람이있다

  • "캐리어 등급 NAT"를 배포합니다 (제 생각에 친구가 정확하고 정확하게 "크루 미어 등급 NAT"라고 함). 이것은 본질적으로 NAT의 NAT입니다. 이는 응용 프로그램에 매우 나쁜 영향을 미치지 만 일부 대형 공급자는 IPv4 공간 및 / 또는 포트 번호가 부족하거나 IPv6으로 이동하고 싶지 않을 때 수행하는 작업입니다.


2
제목 이상을 읽으면이 질문은 포트 소진에 관한 것이며 OP는 작동 방식에 대해 잘못 알고 있음을 알 수 있습니다. 이 답변이 어떻게 새로운 가치를 더할 수 있습니까?
MDMarra

2
OP는 "헤드 라인뿐만 아니라 헤드 라인에 명시 적으로" "어떻게 많은 양의 요청이 서버에 발생합니까?"를 묻습니다. 소켓의 작동 방식에 대한 혼란을 피하면서 유효한 질문입니다.
user8162

1
문장 중간 질문을 잘라내는 훌륭한 직업. 그 문장의 나머지 부분은 다음과 같이 말합니다 (more than the max port number).
MDMarra

2
아마도 당신은 OP가 소켓 메커니즘을 이해하지 못한다고 규정 한 부분을 놓쳤을 것입니다. 64k 포트를 초과하는 방법은 토론에 유효한 주제라고 생각합니다. 당신이 동의하지 않으면 죄송하지만, 그 질문과 내가 두 가지 답변을 제공 한 것이 었습니다. 이것이 어떻게 반응하는지 물었습니다. 그 방법입니다.
user8162

3
반 질문입니다. OP의 최종 문장이 뒷받침하는 큰 문제는 64k 장벽을 무너 뜨리는 방법입니다.
user8162
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.