lipcap을 이용한 패킷 캡쳐중에서 단편화 계산을 어떻게 해야한

ins878의 이미지

안녕하세요~~ libpcap을 이용하여 패킷을 캡쳐하는 간단한 프로그램을
만들려고 합니다.
그런데, 다른 분이 만든 간단한 패킷 캡쳐소스를 보는데, 이상한 부분이 있어서
글을 올립니다. 아래 단편화 계산부분이 있는데 단편화 계산을 어떻게 하는 것인지 아무리 봐도 모르겠습니다. &연산자와 >> 이 왜 필요한지 고수님들~~부탁드립니다.

iph->ip_v,
iph->ip_hl,
iph->ip_tos,
ntohs(iph->ip_len),
ntohs(iph->ip_id),

###########################
# 단편화 계산부분 (이부분이 모르겠음 #
###########################

(ntohs(iph->ip_off)&IP_RF) >> 15,
(ntohs(iph->ip_off)&IP_DF) >> 14,
(ntohs(iph->ip_off)&IP_MF) >> 14,
(ntohs(iph->ip_off)&0x1fff) * 8,

###########################
###########################

iph->ip_ttl,
iph->ip_p,
iph->ip_sum,
ntohs(tcph->source),
ntohs(tcph->dest),
ntohs(tcph->seq),
ntohs(tcph->ack_seq),
tcph->doff,
tcph->res1,
tcph->res2,
tcph->urg,
tcph->ack,
tcph->psh,
tcph->rst,
tcph->syn,
tcph->fin,
ntohs(tcph->window),
ntohs(tcph->check),
ntohs(tcph->urg_ptr)

mach의 이미지

* 일단 IP 프래그먼트(fragment)를 이해 하고 계시다면, C언어도 공부하세요. 기초부분을 튼튼히......

매스크(mask)에 대한 이해가 필요하신것같습니다.
특정 비트가 세팅(1로)이 되어 있는지에 대해 검사하는 방법을 공부하세요.

예를 들어 다음과 같은 경우에 대해 처리하는 방법을 알아야 합니다.

Quote:

1) 8비트 변수내의 5번째 비트가 1인지 0인지 검사하라!
char ch = 0xfe;
if ( ch & 0x10 ) //0x10 (16진법 표기) ===> 0001 0000 (2진법 표기)
;
2) 16비트 변수의 13번째 비트가 0인지 아닌지 검사하라!
위 1을 보면 쉽게 응용이 됩니다.

3) 13비트로 이루어진 변수를(16비트변수아님!) 좌로 3비트 쉬프트(shift)해서
그 값을 short int 유형으로 출력하라
쉬프트 연산자 (<<, >>)를 알면 아주 쉽습니다.

4) int x=1, y =1;
x = x * 8; // 2의 3승은 = 8
y = y << 3;
// 위 예에서 x를 계산하는 방법과 y를 계산하는 방법의 차이는?
2의 배수로 곱하는것은 << 연산과 동치입니다.

6) 2로 곱하는 연산을 shift연산으로 변경하여 처리하는것이,
속도가 빠른가? 아니면 느린가?
당연히 전자이겠지요.

답변이 아니라 문제가 되어버린 느낌이지만, 이문제를 푸시는게 더 나은 접근같습니다.
지금 IP단이라면 TCP단에서도 다시 이문제를 만나게 될것이고, 단순히 pcap
써보는게 아니라 응용을 기획한다면 아주 많이 부딪히게 되는 문제입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

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