Maximum Segment Size

어플리케이션에서 소켓통신을 할 때 응용프로그램에서 보통 반복문을 통해 버퍼에 담아 조금씩 write합니다. write를 호출하면 바로 전송되는 것이 아니라 OS의 프로토콜 스택에서 내부 버퍼에 저장했다가 MSS 사이즈에 근접해지면 알아서 프로토콜 스택이 전송해줍니다.

이 때 MSS의 정보가 있어야 프로토콜 스택에서 MSS에 근접했구나 하고 전송을 할 텐데요.
MSS보다 크면 알아서 분할해서 보내는데 MSS는 검색해보니 환경마다 사이즈가 다르며 이더넷을 쓰면 통상 1500 바이트라고 합니다.

그럼 MSS의 사이즈는 windows에 하드코딩된 사이즈인가요? 아니면 네트워크 드라이버를 설치하면 설정되는 값인가요?

또한 MSS가 어차피 Low 레벨단에서 정의되었다면 소켓통신에서 어플리케이션 버퍼와 반복문을 통해 write를 여러 번 할 필요없이 한 번에 전송해도 되지 않나요? 어플리케이션 단에서 버퍼 사이즈를 고려하지 않아도 될 것 같아서 여쭤봅니다.

3개의 좋아요

아래의 글을 참고하세요

https://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=12521

https://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=12527

https://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=12528

5개의 좋아요

질문하신 것에 약간 정리해봤습니다.

Windows: 197. TCP의 MSS(Maximum Segment Size) 크기는 고정된 것일까요? (sysnet.pe.kr)

5개의 좋아요

저 역시 궁금했던 부분이었고 다른 곳에서도 버퍼의 크기를 나눠서 사용할 뿐 왜 그런지를 잘 알려주지 않아 늘 궁금했었는데, 이번에 확실히 알게 됐습니다 :slight_smile:

감사합니다!

3개의 좋아요

답변 감사드립니다!

그렇다면 MTU 사이즈는 운영체제 설치 시 이더넷을 사용하는 것으로 간주하고 기본값이 정해지는 값인가요?아니면 네트워크 장치 설치 후 드라이버를 설치하면 사용자가 사용하는 인터넷 유형에 따라 다르게 설정되는 값인가요?

MTU에 대해 검색하면 이더넷의 경우에는 1500바이트로 잡혀진다지만 모뎀은 576바이트, 기가비트 이더넷은 9000바이트 라고 합니다. 1500바이트가 운영체제에 어떤식으로 설정되는지 궁금합니다…

1개의 좋아요

MTU 크기는 운영체제가 하위 네트워크 레이어의 정보를 취득했을 때 결정될 것입니다. 그건 네트워크 어댑터가 스스로 어떤 네트워크를 지원하는지 알기 때문에 device driver는 네트워크 어댑터로부터 그 정보를 취득할 때 IP MTU가 해당 어댑터에 대해 결정될 것입니다.

가령, 이더넷 네트워크 카드를 구입했다면 그 카드는 네트워크 레이어를 이더넷과만 통신할 수 있으므로 스스로 IP MTU는 1500임을 알 것이고, 이후 운영체제가 그 정보를 구하려고 질의하면 1500을 반환할 것입니다.

알고 계신 것처럼 TCP/IP 프로토콜이 이더넷 위에서 돌아갈 때 MTU가 1500이고, 이더넷 대신 wireless network, fiber 등의 네트워크 레이어로 바뀌면 MTU는 그것들이 정한 패킷 프레임의 크기에 의해 정해집니다.

참고로, 기가비트 이더넷이 9000이라고 했는데 아마 그건 Jumbo Frame 옵션이라고 하는 것이 맞습니다. (물론, 해당 옵션을 지원하는 장비들이 대개 기가비트 이더넷이지만.)

Jumbo frame - Wikipedia

또한 관련해서는 다음의 글도 참고하세요.

개발 환경 구성: 528. 오라클 클라우드의 리눅스 VM - 9000 MTU Jumbo Frame 테스트 (sysnet.pe.kr)

3개의 좋아요

역시 운영체제에서 마음대로 임의로 정한 값이 아니었군요…ㅎㅎ 상세한 답변 정말 감사드립니다!!