Network

Protocol Analyzers ด้วย TCPDUMP&Ipsumdump

posted on 24 Sep 2008 21:20 by pandamaster  in Network
Tcpdump เป็นโปรแกรม Protocol Analyzers ได้พัฒนามาตั้งแต่ ค.ศ. 1990 ที่ LawrenceBerkeley National Laboratory โดยถูกใช้สําหรับงานทางด้าน network monitor ซึ่งเป็นเครื่องมือที่วิเคราะห์คุณภาพของเครือข่าย (วิเคราะห์ข้อมูลที่
อยู่บนเครือข่าย) การทํางานของ tcpdumpตัว tcpdump จะไปเปลี่ยนการทํางานของ Interface (Lan Card) ใหัทํางานในลักษณะ promiscuous mode ซึ่งจะคอยรับขัอมูลจากเครือข่ายและสามารถนําข้อมูลเหล่านั้นมาแสดงผลได้หลาย วิธี เช่น แสดงผลบน
หน้าจอ (Console) หรือ จะแสดงผลในลักษณะของไฟล์ เพื่อนํากลับมาวิเคราะห์ในภายหลังก็ได้

ตัวอย่าง option ของ tcpdump
 - tcpdump -i interface
            เลือก interface ที่ tcpdump จะคอยรับข้อมูล ใช้สําหรับเครื่องที่มีหลาย
            interface (มี Lan Card หลายใบ)
 - tcpdump –n
            tcpdump จะไม่พิมพ์ host name ลดการค้นหาชื่อจาก DNS
 - tcpdump –l
            จะเก็บข้อมูลที่จะแสดงผลไว้ใน buffers ซึ่งสามารถนําข้อมูลเก็บลงไฟล์ได้ ดังนี้
                  #tcpdump -l | tee “filename”
                  หรือ
                  #tcpdump -l > “filename” & tail –f “filename”
 - tcpdump –w file
            เก็บข้อมูลทั้งหมดลงไฟล์ แทนที่จะแสดงผลทางจอภาพ ซึ่งสามารถนําข้อมูลกลับมา
            วิเคราะห์ได้โดยใช้option –r (ด่านล่าง)
 - tcpdump –r file
            อ่าน้อมูลจากไฟล์ (ที่บันทึกจาก option –w)
 - tcpdump –t
            ไม่แสดง timestamp
 - tcpdump –x
            แสดงข้อมูลในรูปเลขฐาน 16 (hex)
 - อื่น ๆ ดูจาก man page
            #man tcpdump



โปรแกรม Ipsumdump  ประกอบด้วย 2 ส่วน

   1. ipsumdump เป็นโปรแกรมสำหรับอ่าน IP packet จาก tcpdump หรือ network traffic และ summary โดยอยู่ในรูป
ของ ASCII
   2. ipaggcreate เป็นโปรแกรมที่ให้ข้อมลทางสถิติจาก tcpdump ซึ่งข้อมูลที่ให้คือ จำนวนของ packet (เป็นได้ทั้ง text และ binary)

การติดตั้ง (Install) ipsumdump(ดาวโหลดโปรแกรม ที่นี่)

แตกไฟล์ที่ได้โดยใช้คำสั่ง  tar -zxvf ipsumdump-1.70.tar.gz

   * ./configure
   * make
   * make install

SYNOPSIS

ipsumdump [-r | -i | ...] [--src, --dst, --sport, --dport, ...] [other options] [files or interfaces]

ตัวอย่าง OPTIONS บางส่วนของ ipsumdump (พร้อมคำอธิบาย)

Data Sources

     Data source options บอกถึง ipsumdump ใช้  data source ประเภทใด เช่น tcpdump(1) raw-packet files (--tcpdump), live network interfaces (--interface), NetFlow summary files (--netflow-summary), ipsumdump output files (--ipsumdump), DAG or NLANR-formatted files (--dag, --nlanr), or others.

     Non-option arguments specify the files, หรือ interfaces ที่อ่าน เช่น 'ipsumdump -r eth0 eth1' เป็นการอ่าน 2 tcpdump(1) files, ที่มีชื่อว่า ``eth0'' และ ``eth1''; 'ipsumdump -i eth0 eth1' เป็นการอ่านจาก 2 network interfaces, ``eth0'' และ ``eth1''.

     Options ที่อ่าน file อ่านจาก standard input เมื่อผู้ใช้ใส่ single dash – เป็นชื่อ filename หรือ เมื่อผู้ใช้ให้ option ที่ไม่มี filename ทั้งหมด

--tcpdump, -r

      เป็น option ที่เกี่ยวกับการอ่าน file จาก tcpdump -w option (pcap files)  และ File ที่มีการ compress เป็นนามสกุล  gzip หรือ bzip2 ซึ่ง  ipsumdump จะสามารถ uncompress ได้

--interface, -i

      เป็น option ที่อ่านจาก network interfaces ipsumdump จะทำงานต่อเนื่องจนกระทั่งมี interrupt เกิดขึ้นที่ SIGINT or SIGHUP  และ kernel จะแสดงว่ามีจำนวน packets เท่าไรที่มีการ dropped ก่อนการเป็น output.

--ipsumdump

      เป็น option ที่อ่าน ipsumdump files ที่ลักษณะ packet ไม่ได้ระบุชนิด input files

--format=format

      เป็น option ที่อ่าน ipsumdump files ที่มีการระบุ format file โดย format ควรจะเป็น space-separated list

--dag[=encap]

      เป็น option ที่อ่าน DAG-formatted trace files

--nlanr

       เป็น option ที่อ่าน NLANR-formatted trace files (fr, fr+, or tsh format)

--netflow-summary

      เป็น option ที่อ่าน NetFlow summary files

--tcpdump-text

      เป็น option ที่อ่านจาก tcpdump ที่มีรูปแบบเป็น text file

Dump Contents

--timestamp, -t

      เป็น option เกี่ยวกับ packet timestamp ใน dumpfile

--first-timestamp, -T

      เป็น option เกี่ยวกับ flow-begin timestamp ใน dumpfile

--src, -s

      เป็น option เกี่ยวกับ IP source address ใน dumpfile เช่น: 192.168.1.101.

--dst, -d

      เป็น option เกี่ยวกับ IP destination address เช่น 18.26.4.44.

--sport, -S

      เป็น option เกี่ยวกับ TCP หรือ UDP source port ใน dumpfile

--dport, -D

      เป็น option เกี่ยวกับ TCP หรือ UDP destination port ใน dumpfile. เช่น 80

--length, -l

      เป็น option เกี่ยวกับ ความยาวของ packet ใน  dumpfile.

--protocol, -p

      เป็น option เกี่ยวกับ IP protocol ใน  dumpfile. โดย T คือ TCP  , U คือ UDP , I คือ ICMP

--id

      เป็น option เกี่ยวกับ IP ID field ใน  dumpfile. เช่น 19371.

--fragment, -g

      เป็น option เกี่ยวกับ IP fragment test  ใน  dumpfile  โดย F คือ first fragments และ f คือ second และ subsequent fragments  ส่วน nonfragment  คือ single period

--fragment-offset, --fragoff, -G

      เป็น option เกี่ยวกับ IP fragment offset ใน  dumpfile  โดย field value ของ fragment offset อยู่ในรูปของ bytes

--ip-opt

      เป็น Option เกี่ยวกับ IP ใน  dumpfile

--ip-sum

      เป็น Option เกี่ยวกับ IP checksum ใน  dumpfile  เช่น 34987.

--tcp-seq, -Q

      เป็น Option เกี่ยวกับ TCP sequence number ใน  dumpfile  เช่น 4009339012

--tcp-ack, -K

      เป็น Option เกี่ยวกับ TCP acknowledgement number ใน  dumpfile  เช่น4009339012

--tcp-flags, -F

      เป็น Option เกี่ยวกับ TCP flags byte ใน dumpfile แต่ละ flag เป็นการแสดงถึง uppercase letter  เช่น F คือ FIN, S คือ SYN, R คือ RST, P คือ PSH, A คือ ACK, U คือ URG, E คือ ECE (flag bit 6), C คือ CWR (flag bit 7), และ N คือ Nonce Sum (flag bit 8).
 
--tcp-window, -W

      เป็น Option เกี่ยวกับ TCP receive window  ใน dumpfile

Include in the dump. This value is not scaled by the connection's window scale, if any. Example: 480. For non-TCP packets, and for fragments after the first, this field is a single dash -.

--tcp-opt, -O

      เป็น Option เกี่ยวกับ TCP ใน dumpfile

--tcp-sack

      เป็น Option เกี่ยวกับ SACK-related TCP options ใน dumpfile 

--udp-length

      เป็น Option เกี่ยวกับบอกความยาวของ UDP ใน dumpfile

--payload-length, -L

      เป็น Option เกี่ยวกับบอกความยาวของ packet payload ใน dumpfile

--payload

      เป็น Option เกี่ยวกับ actual packet payload ใน  dumpfile

--payload-md5

      เป็น Option เกี่ยวกับ MD5 checksum ของ packet payload ใน dumpfile

--capture-length

      เป็น Option เกี่ยวกับ ความยาวของ captured IP data ใน dumpfile

--packet-count, -c

      เป็น Option เกี่ยวกับ การนับ packet ใน dumpfile

--link

      เป็น Option เกี่ยวกับ link number ใน dumpfile

Other Options

--output=file, -o file

      เป็น Option เกี่ยวกับการเขียน summary dumpfile ออกมาในรูปของ text file

--binary, -b

      เป็น Option เกี่ยวกับการเขียน summary dumpfile ออกมาในรูปของ binary
 

tcpdump=file, -w file

      เป็น Option เกี่ยวกับการเขียน processed packets ของ tcpdump

--filter=filter, -f filter

      เป็น Option เกี่ยวกับ packets และ flows matching a tcpdump filter

เช่น 'ipsumdump -f ``tcp && src net 18/8''' เป็นการ summarize data ของ TCP packets จาก net 18. (The syntax for filter is currently a subset of tcpdump's syntax.)

--bad-packets

      เป็น Option เกี่ยวกับ Print lines like '!bad IP header length 4' ของ packets ที่ไม่มี IP headers, bad IP headers, หรือ bad TCP/UDP headers. (A bad header คือ ความยาวที่ไม่ถูกต้อง หรือ unexpected version, หรือ spread across multiple fragments.)

--anonymize, -A

      เป็น Option เกี่ยวกับ Anonymize IP addresses เป็น output  การ anonymization คือ การเก็บ prefix และ class.

--no-promiscuous

      เป็น Option เกี่ยวกับ Do not place interfaces into promiscuous mode.

--sample=p

      เป็น Option เกี่ยวกับ Sample packets with probability p. p is the chance that a packet will cause output to be generated.

--multipacket

      เป็น Option ที่จะมีผลกับการอ่าน NetFlow หรือ IP summaries

--collate

      เป็น Option เกี่ยวกับการ Sort output packets โดยเรียงจากเวลาที่เพิ่มมากขึ้น โดยใช้ option นี้เมื่อมีการอ่านจาก multiple tcpdump(1) files

--interval=time

      เป็น Option เกี่ยวกับเวลาของการ process packet ซึ่งอยู่ในหน่วยของวินาที

--limit-packets=count

      เป็น Option เกี่ยวกับนับ packets

--map-address=addrs

      เป็น Option เกี่ยวกับ addrs เป็น a space- หรือ comma-separated list ของ IP addresses และ prefixes. เมื่อ Summary dump เสร็จสมบูรณ์, ipsumdump จะเขียน addresses นั้นเป็น standard error, paired ที่ anonymzed counterparts.

--record-counts=time

      เป็น Option ที่ใช้ประโยชน์เมื่อมีการอ่านจาก interfaces. เป็น Option ที่เมื่อ ipsumdump มีการเขียน comment recording the cumulative number of packets output และ จำนวนของ packets ที่มีการ dropped โดย kernel ก่อนที่ ipsumdump จะ processมันในทุก ๆ วินาที

--random-seed=seed

      เป็น Option เกี่ยวกับการ Set random seed โดย random seed คือ การ random ค่า โดยใช้ /dev/random ร่วมกับ data อื่น ๆ เช่น packet และ ค่าของ anonymized IP addresses.

--no-mmap

      เป็น Option เกี่ยวกับบอกให้รู้ว่าไม่มีการใช้ memory mapping เมื่อมีการ read file

--quiet, -q

      เป็น Option เกี่ยวกับไม่มีการ print a progress bar

--config

      เป็น Option เกี่ยวกับการ configuration ipsumdump

--verbose, -V

      เป็น Option เกี่ยวกับบอก error messages.

--help, -h

      เป็น Option เกี่ยวกับ help message เพื่อช่วยในการใช้งาน

--version, -v

      เป็น Option เกี่ยวกับบอกเวอร์ชั่น และข้อมูล license

ข้อมูลเพิ่มเติม http://en.wikipedia.org/wiki/Tcpdump
ข้อมูลเพิ่มเติม http://www.cs.ucla.edu/~kohler/ipsumdump/

http://www.thaiopensource.org/blog/3

DTE and DCE

posted on 11 Sep 2008 09:12 by pandamaster  in Network
Data Terminal Equipment (DTE)
Data circuit terminating equipment (DCE )

            DCE : อุปกรณ์ที่มีฟังก์ชั่นการทำงานต่าง ๆ ที่ทำให้เกิดการเชื่อมต่อ ทำให้การเชื่อมต่อยังดำเนินต่อไป และยุติการเชื่อมต่อ นอกจากนียังใช้เปลี่ยนลักษณะของสัญญาณและสร้างรหัสสัญญาณต่าง ๆ ที่จำเป็นต้องใช้ในการสื่อสารข้อมูลระหว่าง DTE (data terminal equipment) และ data circuit โดย DCE อาจเป็นส่วนใดส่วนหนึ่งของคอมพิวเตอร์หรือไม่ก็ได้

            DTE : เป็นอุปกรณ์ที่ประกอบไปด้วยตัวส่งข้อมูล (data source) หรือ ตัวรับข้อมูล(data sink) หรือเป็นทั้งตัวส่งและตัวรับข้อมูลก็ได้ เป็นอุปกรณ์ที่ประกอบด้วย function unit ต่อไปนี้ control logic , bufferstore และอุปกรณ์อินพุทหรือเอาท์พุทจำนวนหนึ่งตัวหรือมากกว่าก็ได้ หรือรวมเครื่องคอมพิวเตอร์เข้าไปด้วยก็ได้ DTE อาจจะรวมส่วน error control , synchronization และความสามารถในการบ่งหรือระบุว่าต้องการเกี่ยวข้องกับอุปกรณ์ตัวใด (station identification capability) เข้าไปด้วยก็ได้
             DTE จะแทนแหล่งกำเนิดข้อมูลแหล่งแรก และ/หรือ อุปกรณ์ที่เป็นแหล่งรับข้อมูลแหล่งสุดท้าย เช่นเครื่องพิมพ์ หรือ จอภาพ (CRT) เป็นอุปกรณ์ที่รับข้อมูลได้เพียงอย่างเดียว จะเป็น DTE เพราะเป็นอุปกรณ์ที่รับข้อมูลเป็นตัวสุดท้าย คีย์บอร์ดเป็นทั้งตัวรับและตัวกำเนิดข้อมูล ส่วน DCE เป็นอุปกรณ์ที่ทำให้การสื่อสารข้อมูลระหว่างแหล่งกำเนิดกับตัวรับข้อมูลที่ปลายทาง ทำให้สะดวกขึ้น ตัวอย่างหนึ่งของ DCE ก็คือโมเด็ม ขอให้ดูตัวอย่างประกอบ

             จากรูปที่ 1 ถูกต่อเข้ากับคอมพิวเตอร์ปลายทางหลัก (remote host computer) ซึ่งใช้เป็นระบบจัดสรรเวลา (time-sharing service) โดยการเชื่อมต่อทำผ่านสายโทรศัพท์ จากรูป 1 นี้จะเห็นว่าที DCE และ DTE อยู่อย่างละ 2 ตัว DTE ตัวแรกเป็นเทอร์มินอล CRT ส่วน DTE อีกตัวหนึ่งเป็นคอมพิวเตอร์ปลายทางหลัก เหตุที่ทั้งตัวเป็น DTE ก็เพราะคอมพิวเตอร์ปลายทางเป็นตัวส่งข้อมูล (แหล่งกำเนิดข้อมูล) แหล่งแรก (ต้นสุด) ส่วน CRT เป็นตัวรับข้อมูลตัวสุดท้าย (ปลายสุด) ส่วนโมเด็มทั้งสองตัวที่ต่อที่ปลายสายโทรศัพท์ทั้งสองด้านเป็น DCE เพราะโมเด็มทำหน้าที่เปลี่ยนลักษณะสัญญาณซึ่งทำให้สามารถทำการสื่อสารข้อมูลระหว่าง DCE ทั้งสองตัว เราใช้การเชื่อมโยงทางโทรศัพท์ (telephone link) ส่วนการเชื่อมโยงระหว่าง DCE นั้นใช้ RS-232-C เป็นมาตรฐานหลัก

 

รูป 1

จากรูป 1 จะสรุปได้ว่าการเชื่อมโยงในมาตรฐาน RS-232-C จะต้องมีอุปกรณ์หนึ่งเป็น DTE และอุปกรณ์ตัวที่เหลือ จะต้องเป็น DCE

 

 

รูป 2

                 ตามรูป 2 เมื่อ จอ CRT เป็นอุปกรณ์ DTE ดังนั้นคอมพิวเตอร์ซึ่งปกติอาจเป็น DTE หรือDCE ก็ได้ ในกรณีนี้จะต้องเป็น DCE หากคู่อุปกรณ์เป็น DCE หรือ DTE ทั้งคู่ จะต้องใช้ null modem เปลี่ยนทิศทางของข้อมูล
null เป็นอุปกรณ์ที่ไม่สามาระทำงานได้ด้วยตัวเอง มีหน้าที่เพียงเปลี่ยนทิศทางการเคลื่อนที่ของข้อมูลเท่านั้น
modem เป็น DCE ใช้ null modem แทรกเข้าไประหว่างอุปกรณ์ DTE ทั้งสองตัวเพื่อให้อุปกรณ์นั้นสื่อสารข้อมูลในมาตรฐาน RS-232-C ได้

                1.สายสัญญาณที่ใช้ในการสื่อสารข้อมูลของอุปกรณ์ DCE และ DTE จะมีลักษณะดังต่อไปนี้
                2.สายสัญญาณจะมี 2 เส้น แต่ละเส้นจะมีทิศทางการเคลื่อนที่ของสัญญาณต่างกัน
DCE และ DTE จะมีทิศทางการรับ/ส่งข้อมูลดังแสดงในรูป 3

 

รูป 3
รูป 3 แสดงทิศทางการรับ / ส่งข้อมูลของอุปกรณ์ DTE และ DCE

 

รูป4
                          

รูป 4 แสดงวิธีการใช้ NULL MODEM เปลี่ยนทิศทางของข้อมูลเพื่อให้อุปกรณ์ DTE กับ DTE และ DCE กับ DCE สื่อสารกันได้

ref:http://www.geocities.com/manana20032003/dtedce.html

edit @ 11 Sep 2008 09:14:47 by PandaMaster

Python เป็นภาษาหนึ่งในการเขียนโปรแกรม ที่ผมว่าน่าจะครอบจักรวาลเลยก็ว่าได้
นอกจากจะเขียนง่ายแล้วยังทำได้เกือยทุกอย่าง อย่าตอนนี้ที่จะลองใช้กัน พอดีต้องเขียนโปรแกรม
เพื่อติดต่อกับ Serial Port หรือ Com Port นั่นเอง จริง ๆ อาจมีหลายภาษาที่ทำได้เหมือนกัน
แต่เราจะมาลองเขียนด้วย Python บน Windows กันครับ (จริง ๆ  Linux ก็น่าจะได้เหมือนกัน)

โปรแกรมที่ต้องใช้
1. Python 2.5 เป็นตัวแปลภาษาของ python ครับ ดาวน์โหลดได้จาก http://www.python.org/download/
2. PyWin32 เป็น extension สำหรับการติดต่อบน Windows ดาวน์โหลดได้จาก http://sourceforge.net/projects/pywin32/
3. PySerial เป็น extension สำหรับติดต่อกับ Serial Port พระเอกของเราในครั้งนี้ครับ ดาวน์โหลดได้จาก http://sourceforge.net/projects/pyserial/

เมื่อ โหลดมาแล้ว เราก็มาลองทดสอบกัน โดยที่ http://pyserial.sourceforge.net/ ก็มีตัวอย่างให้ครับ

#!C:/Python25/python.exe

import serial
ser = serial.Serial(0)   # เปิดพอร์ต serial พอร์ต 0 หรือพอร์ตแรก
print ser.isOpen()
ser.close()

 เมื่อลองรันดู ผมที่ได้คือ

>> True

หมายถึงพอร์ตเปิดแล้ว

ยังมีคำสั่งอื่น ๆ ให้ใช้อีกมากมายครับ เช่น

setRTS(level=1)         #set RTS line to specified logic level
setDTR(level=1)         #set DTR line to specified logic level
getCTS()                #return the state of the CTS line
getDSR()                #return the state of the DSR line
getRI()                 #return the state of the RI line
getCD()                 #return the state of the CD line
สำหรับผม ใช้คำสั่ง setRTS() เพื่อกำหนดให้วงจรปิดเปิดไปทำงาน ตอนนี้ถือว่าใช้ได้เลยทีเดียว ง่ายและรวดเร็ว
ส่วน Front-End ก็อาจจะใช้ PyGTK ก็ได้ครับ 
ที่มา:http://sake.in.th/story/%E0%B8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B9%88%E0%B8%AD-serial-port-comport-%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2-%E0%B9%86-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-python-%E0%B8%9A%E0%B8%99-windows

การคำนวณค่า checksum

posted on 09 Jun 2008 00:48 by pandamaster  in Network
บทความนี้จะอธิบายถึงการคำนวณค่า checksum ในโปรโตคอล IP, ICMP, TCP ว่ามีการคำนวณอย่างไร โดยผมจะใช้ฟังก์ชั่น software_checksum เป็นตัวอย่างสำหรับการคำนวณ
    ค่า checksum นี้ มีไว้สำหรับตรวจสอบความถูกต้องของข้อมูลที่ส่งไป ฝ่ายที่ส่งข้อมูลจะทำการคำนวณค่า checksum แล้วใส่ค่า checksum ลงไปใน header ของแต่ละโปรโตคอล เมื่อฝ่ายรับข้อมูล รับข้อมูลมาแล้วจะนำเอาค่า checksum นี้มาตรวจสอบข้อมูลที่รับมาว่าถูกต้องหรือไม่

Code:
WORD software_checksum(BYTE *rxtx_buffer, WORD len, DWORD sum)
{
// build the sum of 16bit words
while(len>1)
{
sum += 0xFFFF & (*rxtx_buffer<<8|*(rxtx_buffer+1));
rxtx_buffer+=2;
len-=2;
}
// if there is a byte left then add it (padded with zero)
if (len)
{
sum += (0xFF & *rxtx_buffer)<<8;
}
// now calculate the sum over the bytes in the sum
// until the result is only 16bit long
while (sum>>16)
{
sum = (sum & 0xFFFF)+(sum >> 16);
}
// build 1's complement:
return( (WORD) sum ^ 0xFFFF);
}
Function arguments
  • BYTE *rxtx_buffer เป็น pointer ที่ชี้ไปที่บัฟเฟอร์ โดยจะชี้ไปที่ตำแหน่งแรกของข้อมูลที่ต้องการนำมาคำนวณค่า checksum เช่น&rxtx_buffer[ IP_P ]
  • WORD len ขนาดของข้อมูลที่ต้องการนำมาคำนวณค่า checksum (เป็น bytes) เช่น sizeof(IP_HEADER) ขนาดของข้อมูลจะเท่ากับขนาดของ IP header
  • DWORD sum เป็นค่าเริ่มต้นของค่า checksum ตัวแปลนี้จะใช้งานก็ต่อเมื่อ ต้องการคำนวณค่า checksum ของโปรโตคอล TCP เท่านั้น สำหรับโปรโตคอล IP, ICMP ตัวแปลนี้จะต้องเป็น 0
Return value
  • ค่าที่ส่งกลับจากฟังก์ชั่นนี้จะเป็นค่า checksum ที่คำนวณได้
การทำงานของฟังก์ชั่น
  • ฟังก์ชั่นจะคำนวณค่า checksum แบบ 16-bits จนกว่าขนาดของข้อมูล (len ) จะน้อยกว่า 1-byte จึงหยุดคำนวณค่า checksum แล้วมาตรวจสอบว่ายังมีข้อมูลเหลืออีกหรือไม่


Code:
// build the sum of 16bit words
while(len>1)
{
sum += 0xFFFF & (*rxtx_buffer<<8|*(rxtx_buffer+1));
rxtx_buffer+=2;
len-=2;
}


ถ้ายังมีข้อมูลเหลืออีก 1-byte ให้เพิ่ม low byte เข้าไป ค่าใน low byte จะเป็น 0x00 แล้วนำข้อมูลที่เหลือไปคำนวณค่า checksum ต่อ.

Code:
// if there is a byte left then add it (padded with zero)
if (len)
{
sum += (0xFF & *rxtx_buffer)<<8;
}


ถ้าค่า checksum ที่ได้มีความยาวมากกว่า 16-bits ให้นำ 16-bits บน ( 16..31 ) มาบวกกับ 16-bits ล่างอีกที ทำแบบนี้จนกว่าผลลัพธ์ที่ได้เหลือเพียง 16-bits.

Code:
// now calculate the sum over the bytes in the sum
// until the result is only 16bit long
while (sum>>16)
{
sum = (sum & 0xFFFF)+(sum >> 16);
}


นำค่า checksum ที่ได้มาทำ 1's complement แล้วส่งค่า checksum กลับไป

Code:
// build 1's complement:
return( (WORD) sum ^ 0xFFFF);


    ค่า checksum ของโปรโตคอล IP คือข้อมูลขนาด 16-bits ที่ได้จากการทำ 1's complement ของการบวกข้อมูลแบบ 16-bits ก่อนที่จะคำนวณค่า checksum ทุกครั้ง ในช่อง checksum จะต้องเป็นศูนย์ ก่อนเสมอ, ข้อมูลที่นำมาคำนวณจะเริ่มจาก address แรกของ IP Header (0x0E) ไปจนถึง address สุดท้ายของ IP Header (0x21) ดังรูปตัวอย่าง.

Code:
ตัวอย่างการคำนวณค่า checksum ของ IP Header.
45 00 
+ 00 34 =  4534
+ 48 18 =  8d4c
+ 40 00 =  cd4c
+ 40 06 = 10d52
+ 00 00 = 10d52
+ 0a 01 = 11753
+ 01 4c = 1189f
+ 0a 01 = 122a0
+ 01 01 = 123a1
23a1 + 0001 = 23a2
นำ 23a2 มาทำ 1's complement = dc5d



รูปตัวอย่างของ IP checksum

    ค่า checksum ของโปรโตคอล ICMP เป็นค่าผลรวมแบบ 16-bits ของข้อมูลที่เป็น header และ data ของโปรโตคอล ICMP ข้อมูลที่นำมาคำนวณจะเริ่มจาก address แรกของ header (0x22) ไปจนถึง address สุดท้ายของข้อมูล (ในรูปตัวอย่างคือ 0x49) และก่อนที่จะคำนวณค่า checksum ในช่อง checksum จะต้องเป็น 0 ก่อนเสมอ


รูปตัวอย่างของ ICMP checksum

    ค่า checksum ของโปรโตคอล TCP เป็นค่าผลรวมแบบ 16-bits ของข้อมูลที่เป็น header และ data ของโปรโตคอล TCP ข้อมูลที่นำมาคำนวณจะเริ่มจาก address แรกของ Source IP address (อยู่ใน IP Header ) ไปจนถึง address สุดท้ายของข้อมูล (TCP data) โดยค่าที่นำมาคำนวณรวมกับ Header, data ของ TCP ก็จะมีดังรูป



    ซึ่งค่า Protocol กับความยาวของ TCP นี้จะนำมาบวกกันแล้วส่งให้ฟังก์ชั่นผ่านตัวแปล DWORD sum ตัวอย่าง IP_PROTO_TCP_V + sizeof(TCP_HEADER) + dlength ในที่นี้ ค่า Protocol ก็คือ IP_PROTO_TCP_V (อยู่ใน ip.h) ค่าความยาวของ TCP ก็คือ sizeof(TCP_HEADER) + dlength (dlength คือความยาวของ TCP data) และก่อนคำนวณค่า checksum ทุกครั้ง ในช่อง TCP checksum จะต้องเป็น 0 เสมอ


รูปตัวอย่างของ TCP checksum

    ค่า checksum ของโปรโตคอล UDP เป็นค่า 16-bits ที่ได้จากการบวกแบบสิบหกบิทของข้อมูลแล้วนำมาทำ 1's complement โดยเริ่มจากตำแหน่ง Source IP address ใน IP Header ไปจนถึง Address สุดท้ายของ UDP data โดยที่ก่อนที่จะคำนวณค่า checksum จะต้องทำให้ค่า checksum เก่าเป็นศูนย์ก่อน และค่าที่นำมาคำนวณค่า checksum ด้วยก็คือ Protocol, Total length โดยค่าทั้งสองจะเอามาบวกกันแล้วส่งค่านี้ไปให้ฟังก์ชั่นผ่านตัวแปล DWORD sum





ตัวอย่างค่า UDP checksum  ที่มา:avrportal