Limitation of 65536 open TCP connections

리눅스 환경에서 큰 규모의 네트워크 요청을 처리하다 보면, 65536개의 connection 제한에 걸리는 경우를 경험할 수 있습니다.

출처 : https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml

IANA에서 정리한 Ports 번호를 살펴봐도 65536개 이내에서, 영역을 나눠서 사용을 하도록 되어있음을 알 수 있습니다.

이 포스팅은 “왜 65536개로 제한이 되었는지”와, 만약 “65536보다 더 큰 값이 필요하면 어떻게 해야 할까?”에 대한 답에 대한 글입니다.



왜 65536개 일까?

65536은 친숙한 숫자입니다. 2의 16승인 이 값은 어디서 온 것 일까요? 답은 TCP Header 규격에 있습니다.

출처 : https://en.wikipedia.org/wiki/Transmission_Control_Protocol

Source와 Destination에 대한 port를 표현하는 field의 크기가 16bit로 구성이 되어있기 때문에 65536개로 제한이 되는 것이죠. 그런데 위에 그림은 IPv4에 해당하는 TCP Header 규격입니다. IPv6로 가면 문제가 해결이 될 수 있을까요?

출처 : https://en.wikipedia.org/wiki/Transmission_Control_Protocol

답은 “아니오” 입니다. Source / Destination을 위한 공간은 4배로 커졌지만, port에 대한 field는 동일하게 16bit를 유지하기 때문에 65536 보다 큰 값을 표현할 수 없습니다.

65536보다 더 많이는 쓸 수 없을까?

물론 가능합니다. TCP 규격을 눈여겨 보았으면, Address + Port로 요청에 대한 Source와 Destination을 구분하는 것을 파악하셨을 것입니다. 그렇다고 하면 가능한 방법은 다음과 같을 것입니다.

  1. Address를 바꾸거나
  2. 동일 Address에서 Port 범위를 바꾸거나

2번은 TCP 규격을 바꿔야 하는 많은 노력과 시간이 필요한 현실적으로 불가능한 접근이지만, 1번은 NIC (Network Interface Card)을 추가만으로 IP Address를 추가로 할당 받을 수 있기 때문에 상대적으로 쉬운 방법이죠.

결과적으로 “NIC 갯수 * 65536” 만큼의 Port, 즉 TCP Connection을 사용할 수 있다고 정리할 수 있겠습니다.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.