TCP에서 MSS보다 큰 Size의 Packet을 보낼 때 Fragmentation은 어디서 일어나는지 궁굼합니다.

ksc4042의 이미지

질문 그대로 MSS보다 큰 크기의 Packet을 보낼 때 송신측 Wireshark에서는 한 번에 MSS*4정도의 Data를 한 번에 보냈다고 나오는데, 받은 곳에서는 이를 세 개의 Packet으로 나누어 받았습니다.

이를 분할하는 부분이(분할하여 TCP Header를 붙이는 부분.) 소스에서 정확히 어느 부분인지 찾지 못하겠습니다. (net/ipv4/ip_out.c 이런 식으로..)

가상머신 환경에서 테스트하였습니다.

혹시 알고 계신 분이 있으신지요.

gilgil의 이미지

MSS 값을 가지고 TCP Data를 쪼개는 기능은 TCP Stack에서 담당을 하므로 TCP 관련 소스에서 검색을 해 보세요(IP Stack은 아님).

> 송신측 Wireshark에서는 한 번에 MSS*4정도의 Data를 한 번에 보냈다고 나오는데,
이게 무슨 뜻인지?

gilgil의 이미지

A가 B에서 TCP Data를 보낼 때 MSS값을 참조할 때, 자신(A)의 MSS값이 아닌 상대방(B)의 MSS값을 가지고 A에서 사용되게 됩니다.
이러한 MSS 값은 TCP connection이 이루어 질 때(혹은 TCP 통신 중간 과정에) 협상에 의해 결정이 됩니다(TCP option header에 존재함).
그리고 송신부에서 MSS*4 크기의 데이터를 send한다 하더라도 실제적으로 Wireshark으로 패킷을 잡아 보면 4개의 TCP Packet를 보실 수 있을 겁니다(송신부에서).

즉 TCP data를 쪼개는 것은 수신부가 아니라 송신부에서 처리를 하는 것입니다.

wariua의 이미지

MSS 값에 맞게 데이터 스트림을 패킷들로 나누는 루틴은 tcp_output.c에 있습니다. tcp_fragment(), tso_fragment() 등을 보시면 됩니다.

송신측 Wireshark(즉, libpcap 라이브러리)로 패킷을 덤프 할 때 나눠진 패킷들이 보이지 않고 MSS*4 크기의 패킷 하나만 보였다면 그건 네트워크 인터페이스 장치가 TCP segment offload 기능을 지원하기 때문입니다. (~net/core/dev.c의 dev_hard_start_xmit() 참고) 이 경우 패킷 분할은 하드웨어에서 이뤄집니다.

다른 질문글 올리신 걸 보니 TCP 위에 새로운 네트워크 계층을 추가해 넣으시려는 것 같은데... 일단 스트림 지향 프로토콜 위에 패킷별로 헤더가 붙는 프로토콜을 얹는다는 것 자체에서 적지 않은 골치거리들이 생겨나는 것 같습니다. 가령, 앞서 말씀드린 TSO 기능과 관련해서는, 송신측 호스트와 수신측 호스트의 NIC가 TSO를 지원하지 않아야 (혹은 지원한다고 해도 동작하지 않아야) 새로운 프로토콜 헤더의 정상적인 처리가 가능할 겁니다. 새로 네트워크 계층을 추가하는 대신 TCP 옵션 형태로 헤더를 끼워넣는 건 어떨까요?

$PWD `date`

gilgil의 이미지

> 송신측 Wireshark(즉, libpcap 라이브러리)로 패킷을 덤프 할 때 나눠진 패킷들이 보이지 않고 MSS*4 크기의 패킷 하나만 보였다면 그건 네트워크 인터페이스 장치가 TCP segment offload 기능을 지원하기 때문입니다. (~net/core/dev.c의 dev_hard_start_xmit() 참고) 이 경우 패킷 분할은 하드웨어에서 이뤄집니다.

오~ 이런 기능도 있는건가요?
TCP data segment를 분할하는 기능이 SW(OS)에서 처리하지 않고 HW에서 처리한다는 거군요.
좋은 정보 감사합니다. ^^

ksc4042의 이미지

일단 답해주셔서 정말 감사합니다.

사실 네트워크 헤더가 아니라, TCP헤더 아랫 부분에, 그러니까 데이터 시작 부분에 헤더를 끼워넣고 싶은겁니다.

말씀하신 대로 Option부분에 더하면, Packet이 잘릴 때 마다 그 부분도 복사가 되는지요?

ksc4042의 이미지

추가로 이 질문이 원래의 질문이었습니다.
http://kldp.org/node/129538

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.