TCP의 fragmentation에 대해..

urmajest의 이미지

안녕하세요

서버 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이라고 나오던데

그걸 어떻게 판별하는지 궁금하네요..

그럼 도움 부탁드릴께요

File attachments: 
첨부파일 크기
Image icon cap2.JPG132.03 KB
Image icon cap1.JPG131.85 KB
kyong의 이미지

urmajest wrote:
안녕하세요

서버 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이라고 나오던데

그걸 어떻게 판별하는지 궁금하네요..

그럼 도움 부탁드릴께요

fragmentation이 일어났는지 transport layer에서 알아서는 안됩니다.
packet을 dump해 보면 알겠지만 IP header의 identification, flags,
fragment offset 을 통해서 fragmentation 과 reassembly가 가능합
니다. fragmentation이 일어나기 전의 온전한 data를 datagram이라고
할 때 어떻게 같은 datagram에 속하는지는 identification이 같음을 확인
함으로써 알 수 있고, 아직 받아야할 packet이 더 있음은 flags 의 MF 가
설정돼 있음을 보고 알 수 있습니다. 물론 offset 은 정확한 크기를 알기위함
이죠.

urmajest의 이미지

캡춰한 화면을 올립니다..

프래그먼트 된 첫 패킷과 두번째 패킷인데

identification은 서로 다르고

MF 도 설정되어 있지 않네요..

항상 이렇던데 왜 그런거죠?

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트
Image icon 0바이트
pynoos의 이미지

위 내용은 application 에서는 긴 데이터를 보냈을지라도, tcp 계층에서는 잘라서 보냈기 때문에, MF 가 설정되지 않은 것처럼 보입니다.
그 continuation은 아마 fragmentation과는 다른 얘기를 하는 것 같군요.

불량청년의 이미지

이럴 때 패킷 1 에는 (TCP datagram의 payload에) http header가 있고 그 뒤에 데이터가 들어오겠죠 

그리고 패킷 2,3은 header없이 데이터만 들어오겠죠 

헤더없는 패킷은 있을 수 없습니다.

또한 위에서 말씀하신 것과 같이 플레그멘테이션은 IP수준에서 하는 것입니다.

또한 재결합도 IP수준에서 하고요.

캡쳐해서 보내주신 것을 보더라도 more fragment = 0으로 되어 있고

identification이 다른걸 보니 분열이 일어난 패킷이 아니란걸 알 수 있습니다.

간단하게 분열 테스트를 하시려면 로컬에서 ping의 -s 옵션으로 메가 단위로

패킷을 보내 보시던지, MTU값보다 크게 패킷을 보내시면 될 것 입니다.

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

kyong의 이미지

urmajest wrote:
캡춰한 화면을 올립니다..

프래그먼트 된 첫 패킷과 두번째 패킷인데

identification은 서로 다르고

MF 도 설정되어 있지 않네요..

항상 이렇던데 왜 그런거죠?

이것은 tansport layer 내의 http protocol이 지원하는 것입니다.
이미지 같이 크기가 큰 데이터를 보낼 때 tcp session을 여러개 여는 것은
비효율적이기 때문에 하나의 tcp session에서 모두 처리하도록 protocol
designer 가 결정한 것이죠. tcp session의 ack가 모두 같음을 주목하시기
바랍니다. 그러니까 위에서 다른 문이 말한 대로 보통 말하는 fragmentation
이 아닙니다. ethereal 같은 프로그램이 너무 똑똑해서 거기까지 잘 보여준
것이죠.

agfe2의 이미지

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

사랑과 평화 넘치는 행복한 세상을 꿈꾸며

kyong의 이미지

여기 질문한 분의 경우 fragmentation은 일어나지 않는 경우이지만
fragmentation과 관련된 생각이 달라서 답변을 붙입니다.

agfe2 wrote:

* 일반적으로 MSS (Maximum segment size) 크기는 1460 바이트입니다.
MTU - 40bytes (IP, TCP header) 로서
Ethernet 에서 MTU 크기는 1500 bytes 로 TCP 접속시에 양방향
shakehand 를 통해서 결정됩니다.

MTU 크기는 미리 정해져 있습니다.

Quote:

[ 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

PMTU discovery에 의해 MSS값이 조정 되는 것입니다. MSS에 의해
MTU가 결정되는 것이 아닙니다.
window에서는 EnablePMTUDiscovery 가 0으로 설정 돼 있을 때 576 byte를
기본으로 사용합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.