TCP의 fragmentation에 대해..
글쓴이: urmajest / 작성시간: 금, 2003/09/19 - 10:39오후
안녕하세요
서버 A와 서버 B를 예로 들어서(http로 할께요)
A->B : GET filename
B->A : OK -- 패킷 1
B->A : continue -- 패킷 2
B->A : continue -- 패킷 3
이런식으로 파일을 전송할 때 크기가 커서 fragment되는 경우죠.
이럴 때 패킷 1 에는 (TCP datagram의 payload에) http header가 있고 그 뒤에 데이터가 들어오겠죠
그리고 패킷 2,3은 header없이 데이터만 들어오겠죠
이런 상황에서 패킷 1은 fragment된 TCP datagram의 첫번째이고,
패킷 2,3은 거기에 연결된 data라는 것을
TCP header를 통해서 알수가 있나요?
실제로 패킷덤프 프로그램을 사용해서 보면
TCP에서 fragment된 패킷에는 continuation이라고 나오던데
그걸 어떻게 판별하는지 궁금하네요..
그럼 도움 부탁드릴께요
Forums:
Re: TCP의 fragmentation에 대해..
fragmentation이 일어났는지 transport layer에서 알아서는 안됩니다.
packet을 dump해 보면 알겠지만 IP header의 identification, flags,
fragment offset 을 통해서 fragmentation 과 reassembly가 가능합
니다. fragmentation이 일어나기 전의 온전한 data를 datagram이라고
할 때 어떻게 같은 datagram에 속하는지는 identification이 같음을 확인
함으로써 알 수 있고, 아직 받아야할 packet이 더 있음은 flags 의 MF 가
설정돼 있음을 보고 알 수 있습니다. 물론 offset 은 정확한 크기를 알기위함
이죠.
그런데..
캡춰한 화면을 올립니다..
프래그먼트 된 첫 패킷과 두번째 패킷인데
identification은 서로 다르고
MF 도 설정되어 있지 않네요..
항상 이렇던데 왜 그런거죠?
위 내용은 application 에서는 긴 데이터를 보냈을지라도, tcp
위 내용은 application 에서는 긴 데이터를 보냈을지라도, tcp 계층에서는 잘라서 보냈기 때문에, MF 가 설정되지 않은 것처럼 보입니다.
그 continuation은 아마 fragmentation과는 다른 얘기를 하는 것 같군요.
---
http://coolengineer.com
음... 오해를?
헤더없는 패킷은 있을 수 없습니다.
또한 위에서 말씀하신 것과 같이 플레그멘테이션은 IP수준에서 하는 것입니다.
또한 재결합도 IP수준에서 하고요.
캡쳐해서 보내주신 것을 보더라도 more fragment = 0으로 되어 있고
identification이 다른걸 보니 분열이 일어난 패킷이 아니란걸 알 수 있습니다.
간단하게 분열 테스트를 하시려면 로컬에서 ping의 -s 옵션으로 메가 단위로
패킷을 보내 보시던지, MTU값보다 크게 패킷을 보내시면 될 것 입니다.
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
Re: 그런데..
이것은 tansport layer 내의 http protocol이 지원하는 것입니다.
이미지 같이 크기가 큰 데이터를 보낼 때 tcp session을 여러개 여는 것은
비효율적이기 때문에 하나의 tcp session에서 모두 처리하도록 protocol
designer 가 결정한 것이죠. tcp session의 ack가 모두 같음을 주목하시기
바랍니다. 그러니까 위에서 다른 문이 말한 대로 보통 말하는 fragmentation
이 아닙니다. ethereal 같은 프로그램이 너무 똑똑해서 거기까지 잘 보여준
것이죠.
Fragmentation 은 MTU, MSS 와 관련이 있습니다.
TCP
<1> Fragmentation
fragmentation 은 transport layer (tcp/udp) 에서 한번에 보내는
데이터의 양이 MSS (Maximum segment size) 를 넘을때 생기는 현상입니다.
A->B : GET filename
B->A : OK -- 패킷 1
B->A : continue -- 패킷 2
B->A : continue -- 패킷 3
B->A 로 데이터를 보낼때 send or sendto, sendmsg 등의 데이터
센드의 양이 MSS (Maximum segment size) 를 넘게되면 IP 레이어에서
fragmentation 을 만들지요.
* 일반적으로 MSS (Maximum segment size) 크기는 1460 바이트입니다.
MTU - 40bytes (IP, TCP header) 로서
Ethernet 에서 MTU 크기는 1500 bytes 로 TCP 접속시에 양방향
shakehand 를 통해서 결정됩니다.
[ 1단계 ]
접속을 시도한쪽(A)에서 자신의 MSS 를 connect 패킷의 TCP options 필드에
정보를 넣어서 보냅니다.
[ 2단계 ]
접속을 수신하는 쪽(B)에서는 자신의 MSS 를 시도한 쪽(A)으로 보내서
최대공약수에 해당하는 MSS 가 앞으로의 tcp 데이터 전송에 사용됩니다.
따라서 이 MSS 를 넘는 경우는 IP 레벨에서 fragmentation 이 발생하지요.
[3단계]
이 때 접속수신측 (B) 이 접속의 응답으로 MSS 정보를 보내지 않는다면
기본 MTU 크기인 576 바이트를 현재 TCP 세션의 데이터 전송에 사용합니다.
따라서 MSS는 536 바이트가 되겠지요.
A --- connect req (TCP syn bit set with Option MSS negotiation) --------> B
A <-- connet ack (TCP syn/ack bit set with options MSS negotiation) -- B
< 2 > continue
B-A 로 보내는 데이터가 fragmentation 이 돼지 않은데도 continue 로 나타나는 것은 HTTP GET method 의 응답으로 계속적으로 B->A 로 데이터가
보내지기 때문인 것으로 생각됩니다.
참조정보
http://www.microsoft.com/technet/treeview/default.asp?url=/technet/prodtechnol/winntas/reskit/net/sur_tcp2.asp
TCP/IP 에 관한 윈도우에서의 처리 및 일반적인 사항.
http://www.microsoft.com/technet/treeview/default.asp?url=/technet/itsolutions/network/deploy/depovg/tcpip2k.asp
Microsoft Windows 2000 TCP/IP Implementation Details
사랑과 평화 넘치는 행복한 세상을 꿈꾸며
Re: Fragmentation 은 MTU, MSS 와 관련이 있습니다.
여기 질문한 분의 경우 fragmentation은 일어나지 않는 경우이지만
fragmentation과 관련된 생각이 달라서 답변을 붙입니다.
MTU 크기는 미리 정해져 있습니다.
PMTU discovery에 의해 MSS값이 조정 되는 것입니다. MSS에 의해
MTU가 결정되는 것이 아닙니다.
window에서는 EnablePMTUDiscovery 가 0으로 설정 돼 있을 때 576 byte를
기본으로 사용합니다.
댓글 달기