성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>이더넷(Ethernet) 환경의 TCP 통신에서 MSS(Maximum Segment Size) 확인</h1> <p> 많은 자료에서 이미 다루고 있지만, MSS는 단일 TCP 패킷에서 TCP의 헤더를 제외한 순수 데이터, 즉 TCP의 payload 크기를 의미합니다. 이에 대한 계산을 이더넷 환경으로 알아볼까요? ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Maximum transmission unit ; <a target='tab' href='https://en.wikipedia.org/wiki/Maximum_transmission_unit'>https://en.wikipedia.org/wiki/Maximum_transmission_unit</a> </pre> <br /> Layer2의 이더넷 최대 프레임 크기가 64~1522 바이트라고 나오고, 이 중에서 header와 footer를 제외한 크기를 리눅스의 경우 ifconfig 명령어로 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>ifconfig</span> ...[생략]... enp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> <span style='color: blue; font-weight: bold'>mtu 1500</span> inet 192.168.100.50 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::92e6:baff:fe44:8f73 prefixlen 64 scopeid 0x20<link> ether 90:e6:ba:44:8f:73 txqueuelen 1000 (Ethernet) RX packets 933558 bytes 446079995 (446.0 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 975865 bytes 933459931 (933.4 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ...[생략]... </pre> <br /> MTU(Maximum Transmission Unit) 1500에 다음의 header와 footer를 붙이면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > MAC dst: 6바이트 MAC src: 6바이트 Ethertype or length: 2바이트 Payload: 1500바이트 Frame Check Sequence: 4바이트 (참고로, <a target='tab' href='https://osqa-ask.wireshark.org/questions/30702/ethernet-frame-check-sequence-incorrect-is-this-a-concern'>FCS의 경우 OS가 아닌 NIC에 의해 처리</a>되므로 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12518'>Wireshark 같은 도구</a>를 이용해 캡처해도 보이지 않습니다.) </pre> <br /> 총 1518 바이트의 이더넷 프레임 크기가 나옵니다. 여기서 중요한 것은, TCP/IP 스택의 경우 IP 프로토콜이 사용할 수 있는 총 데이터가 1500 바이트라는 점입니다. <a target='tab' href='https://en.wikipedia.org/wiki/IPv4'>이러한 IPv4 MTU는 다시 통신을 위해 20 ~ 36 바이트의 header와 남은 영역을 body</a>로 나눕니다. 하지만 대개의 경우 IP 헤더는 20바이트만 사용되므로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [1바이트] Version: 4비트 IHL: 4비트 [1바이트] DSCP: 8비트 ECN: 2비트 Total Length: 2바이트 Identification: 2바이트 [2바이트] Flags: 4비트 Fragment Offset: 16비트 Time To Live: 1바이트 Protocol: 1바이트 Header Checksum: 2바이트 Source IP Address: 4바이트 Destination IP Address: 4바이트 </pre> <br /> <a target='tab' href='https://en.wikipedia.org/wiki/Transmission_Control_Protocol'>TCP 프로토콜</a>에서 가용한 공간은 1480 바이트가 됩니다. 그리고 TCP 역시 20 ~ 40 바이트의 header를 가질 수 있지만 IP 헤더와 마찬가지로 대개 20 바이트로 구성되므로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Source port: 2바이트 Destination port: 2바이트 Seqence number: 4바이트 Acknowledge number: 4바이트 [1바이트] Data offset: 4비트 Reserved: 3비트 NS: 1비트 [1바이트] CWR, ECE, URG, ACK, PSH, RST, SYN, FIN 각각 1비트 Window Size: 2바이트 Checksum: 2바이트 Urgent pointer: 2바이트 </pre> <br /> 결국 실질적으로 TCP 통신을 위해 socket에서 (쪼개지 않고) 단일 패킷으로 보낼 수 있는 최대 데이터 크기는 1460 바이트 정도가 됩니다. 그리고 이를 가리켜 TCP MSS(Maximum Segement Size)라고 부릅니다.<br /> <br /> [그림 출처: <a target='tab' href='https://blog.apnic.net/2014/12/15/ip-mtu-and-tcp-mss-missmatch-an-evil-for-network-performance/'>https://blog.apnic.net/2014/12/15/ip-mtu-and-tcp-mss-missmatch-an-evil-for-network-performance/</a>]<br /> <img alt='tcp-mtu-mss.jpg' src='/SysWebRes/bbs/tcp-mtu-mss.jpg' /><br /> <br /> <hr style='width: 50%' /><br /> <a name='ping_mtu'></a> <br /> 자, 그럼 실제로 우리가 사용하는 컴퓨터에서 1460 바이트가 최대 크기인지 한 번 확인해 볼까요? 이에 대한 간단한 테스트는 ping을 이용할 수 있습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>ping www.microsoft.com -s 1473 -c 1 -v -M do</span> PING e13678.dscb.akamaiedge.net (104.109.245.165) 1473(1501) bytes of data. <span style='color: blue; font-weight: bold'>ping: local error: message too long</span>, mtu=1500 --- e13678.dscb.akamaiedge.net ping statistics --- 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>ping www.microsoft.com -s 1472 -c 1 -v -M do</span> PING e13678.dscb.akamaiedge.net (104.109.245.165) 1472(1500) bytes of data. 1480 bytes from a104-109-245-165.deploy.static.akamaitechnologies.com (104.109.245.165): icmp_seq=1 ttl=55 time=2.84 ms --- e13678.dscb.akamaiedge.net ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 2.839/2.839/2.839/0.000 ms </pre> <br /> 1473 바이트를 보내면 오류가 발생하고 1472로 하니 정상적으로 하나의 패킷으로 전송이 되었습니다. 여기서 1472 바이트인 이유는, ping은 IP payload에 TCP가 아닌 (8바이트의 헤더를 가진) ICMP 헤더를 실어 보내기 때문입니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
2768
(왼쪽의 숫자를 입력해야 합니다.)