Thứ Tư, 27 tháng 3, 2013

Python Implementation of IP Checksum


Introduction

Tôi muốn viết một chương trình tính IP header checksum.

Background

Trước tiên chúng ta tìm hiểu cơ bản về IP checksum là gì, tại sao cần phải có IP checksum, cách tính IP checksum ? 

Checksum là gì?
checksum đơn giản là một giá trị được tính toán từ từ data packet nhằm kiểm tra tính toàn vẹn của nó (data packet). Thông qua checksum chúng ta có thể biết được dữ liệu được có bị lỗi hay không. Đó là bởi vì trong khi "traveling" qua mạng data packet có thể bị corrupt và phải có một cách nào đó để phía nhận dữ liệu biết được rằng dữ liệu bị corrupted hay không. Đó là lí do checksum field được thêm vào header. Ở phía nguồn, checksum được tính toán và được set trong header như là một trường. Ở phía đích checksum được tính toán lại một lần nữa và kiểm tra chéo với giá trị checksum tồn tại trong header để thấy được data packet có OK hay không. 

IP header checksum?

IP header checksum được tính toán trên IP header chỉ như phần dữ liệu, các TCP header , ICMP header đều có phần checksum riêng của nó. Now, để tính toán được một thuật toán tính checksum bạn cần phải có kiến thức cơ bản về cấu trúc của header trong IP protocol.

Cơ chế để tính IP checksum đó là : 16 bit one’s complement of the one’s complement sum of all 16 bit words in the header

có nghĩa là nếu chúng ta chia IP header thành các 16 bit words và thực hiện cộng dồn chúng lại và sau đó ta tiến hành đảo bit (0 --> 1, 1 --> 0) khi đó kết quả cuối cùng của các phép tính là checksum. 

Now, việc  tính toán phía trên được thực hiện tại phía nguồn gửi data packet. Tại phía đích nhận data packet sẽ thay thế giá trị checksum trong header bằng tất cả zeros và tính lại checksum dựa theo cơ chế giống như cơ chế tính tại nguồn. Sau bước này giá trị checksum đạt được sẽ được so sánh với giá trị checksum đến từ IP header. Việc so sánh sẽ quyết định xem IP header có bị corrupt hay fine. 

IP header checksum example

Dựa trên cơ sở nền tảng nêu phần trên, chúng ta thực hiện dump một IP header từ IP packet nhận được tại đích và tiến hành tìm hiểu cơ chế tính toán. Qua ví dụ sau:

Dưới đây là một IP header được lấy ra từ IP packet nhận được tại đích: 

                         4500 003c 1c46 4000 4006 b1e6 ac10 0a63 ac10 0a0c
* '45' tương ứng với hai trường đầu tiên trong IP header, '4 ' là IP version và '5' là header length. bởi vì header length được mô tả trong 4 byte words nên header length thực sự bắt đầu là 5 * 4 = 20 bytes.
* '00' ám chỉ đến trường TOS, giá trị này ám chỉ rằng đây là một operation bình thường. 
* '003c' là total length field của IP header. So, trong trường hợp này tổng độ dài của packet là 60.
* '1c46' là identification field.
* '4000' được chia trong 2 bytes. 2 bytes (tương ứng với 3 bits và 13 bits ) tương ứng với các trường flags và fragment offset. 
* '4006' được chia thành '40' và '06', '40' tương ứng với trường TTL, '06' tương ứng với trường protocol . '06' ám chỉ đây là TCP.
* 'be16' là giá trị checksum được tính tại nguồn (nơi gửi packet). Chú ý rằng trường này được set đến 0 khi ta tính toán checksum tại đích. 
* Tập hợp các bytes tiếp theo 'ac10' và '0a0c' tương ứng với các trường IP nguồn và IP đích.

Chúng ta thực hiện chuyển đổi tất cả giá trị của các trường theo cách phân chia 4 byte words sang giá trị nhị phân: 
4500 -> 0100010100000000
003c -> 0000000000111100
1c46 -> 0001110001000110
4000 -> 0100000000000000
4006 -> 0100000000000110
0000 -> 0000000000000000 // Note that the checksum is set to zero since we are computing checksum at destination end
ac10 -> 1010110000010000
0a63 -> 0000101001100011
ac10 -> 1010110000010000
0a0c -> 0000101000001100
Cộng các giá trị binary từng cặp với nhau 
4500 -> 0100010100000000
003c -> 0000000000111100
453C -> 0100010100111100  /// First result

453C -> 0100010100111100  // First result plus next 16-bit word.
1c46 -> 0001110001000110
6182 -> 0110000110000010 // Second result.

6182 -> 0110000110000010 // Second result plus next 16-bit word.
4000 -> 0100000000000000
A182 -> 1010000110000010 // Third result.

A182 -> 1010000110000010 // Third result plus next 16-bit word.
4006 -> 0100000000000110
E188 -> 1110000110001000 // Fourth result.

E188 -> 1110000110001000 // Fourth result plus next 16-bit word.
AC10 -> 1010110000010000
18D98 -> 11000110110011000 // One odd bit (carry),  add that odd bit to the result as we need to keep the checksum in 16 bits.

18D98 -> 11000110110011000
8D99 -> 1000110110011001 // Fifth result

8D99 -> 1000110110011001 // Fifth result plus next 16-bit word.
0A63 -> 0000101001100011
97FC -> 1001011111111100 // Sixth result

97FC -> 1001011111111100  // Sixth result plus next 16-bit word.
AC10 -> 1010110000010000
1440C -> 10100010000001100 // Again a carry, so we add it (as done before)

1440C -> 10100010000001100
440D -> 0100010000001101 // This is seventh result

440D -> 0100010000001101 //Seventh result plus next 16-bit word
0A0C -> 0000101000001100
4E19 -> 0100111000011001 // Final result.
Thực hiện việc đảo bit kết quả thu được 
4E19 -> 0100111000011001
B1E6 ->1011000111100110 // CHECKSUM

2 nhận xét:

  1. Xin cảm ơn bạn, mình đang cần thông tin này để tính IP header checksum, đóng gói UDP bằng FPGA.

    Trả lờiXóa

  2. Những món ăn hằng ngày luôn được mọi người quan tâm để có thể cải thiện cũng như an đảm bảo cho sức khỏe. Và nhiều bạn đọc thắc mắc rằng Ăn tiết canh có tốt không. Ngoài ra, những quan niệm trong nhân gian được rất nhiều người tin vào. Họ cho rằng Nhện bò vào nhà là điềm gì gì đó mang một ý nghĩ tâm linh.

    Đặc biệt, chúng tôi còn nhận vận chuyển hàng trung quốcnhận ship hàng từ trung quốc để quý khách có thể tha hồ mua sắm các mặt hàng tại nước ngoài một cách dễ dàng nhất.
    chúng tôi chuyên nhận mua hộ hàng zara nhật về Việt nam giá cạnh tranh. Ngoài ra chúng tôi còn chuyên hàng xách tay nhậtmua đồ chơi nhật bản chắc chắn sẽ mang lại nhiều sự hài lòng cho quý khách hàng. Ngày nay, đời sống của người tiêu dùng tăng cao, mua hàng hiệu ở nhậtmua đồ điện tử ở nhật bản luôn được nhiều người quan tâm đến.

    Trả lờiXóa