# MTU(Maximum Transmission Umit)
최대전송단위
TCP/IP 네트윅 등과 같이 패킷 또는 프레임 기반의 네트윅에서 전송될수 있는 최대 크기의 패킷 또는 프레임을 가리킨다.
MTU가 너무 크면 커다란 크의 패킷을 처리할수 없는 라우터르 만났을때 재전송해야하는 경우가 생길수 있으며
MTU가 너무 작으면 상대적으로 헤더 및 송수신 확인에 따르는 오버헤드가 생길수 있다.
일반적인 기본 MTU값은 1500옥텟이며 이것은 이더넷의 표준 MTU값과 같다.
# MSS(Maximun Segment Size)
TCP상(TCP/UDP가 아니라 그냥 TCP)에서의 전송할수 있는 사용자 데이터의 최대크기.
MSS값은 기본적으로 설정된 MTU값에 의해 결정된다.
MSS = MTU - ( IP Header크기) - ( TCP Header크기)
Ethernet일경우 MTU 1500에 IP헤더크기 20Byte TCP헤더크기 20Byte를 제외하면 1460이 MSS값으로 세팅된다.
TCP로 통신할때는 통신 양단간에 서로 MSS값을 주고 받는다.
TCP는 3-way 핸드쉐이킹으로 session을 establish 하며
이 과정 중에 상대방에게 자신의 MSS 값을 알려 주게 됩니다.
< 3-way Hand shaking 과정 >
Client Server
< SYN, MSS=1380 >
( MTU 1420 ) -------------------------------------> ( MTU 1500 )
< SYN,ACK, MSS=1460>
<-------------------------------------
< ACK >
------------------------------------->
위의 그림처럼 Client 의 MTU 가 1420 이고 Server 의 MTU가 1500 라고 가정할때
클라이언트가 초기 TCP 세션을 성립하기 위해
Syn패킷을 서버로 보낼때 TCP Header의 option 필드에 MSS값을 설정하여 서버로 전달합니다.
그러면 서버는 SYN, ACK 를 보내면서 역시 TCP 헤더 옵션에 자신의 MSS 값을 보냅니다.
그러면 세션이 성립되어 패킷을 전달할때 실제 단위 패킷의 사이즈가 1420을 초과하지 않게 패킷을 나누어서 전송하게 됩니다.
서버는 자신의 MTU가 1500 이라고 해서 패킷을 1500 단위로 나누지 않습니다.
만약 패킷을 1500 크기로 보내면 client에서는 자신의 용량을 초과하기 때문에 데이타를 수신할 수 없게 됩니다.