2010-03-16 39 views
5

Tôi phải thực hiện một sniffer làm nhiệm vụ cho khóa học bảo mật. Tôi đang sử dụng C và thư viện pcap. Tôi có mọi thứ hoạt động tốt (kể từ khi tôi nhận được một mã từ internet và thay đổi nó). Nhưng tôi có một số câu hỏi về mã.Phân tách tiêu đề IP

u_int ip_len = (ih->ver_ihl & 0xf) * 4; 

ih là loại ip_header, và hiện nay nó chỉ để IP header trong gói tin.
ver_ihl cung cấp phiên bản IP.
Tôi không thể hình dung ra là gì: & 0xf) * 4;

+0

+1 để trung thực và triệt để :) –

Trả lời

3

& là Bitwise và nhà điều hành, trong trường hợp này bạn anding ver_ihl với 0xF mà có tác dụng làm sạch tất cả các bit khác với ít nhất signifcant 4

0xff & 0x0f = 0x0f

ver_ihl được định nghĩa là 4 bit đầu tiên = phiên bản + thứ hai 4 = Độ dài tiêu đề Internet. Các hoạt động và loại bỏ các dữ liệu phiên bản để lại dữ liệu độ dài của chính nó. Chiều dài được ghi nhận là số lượng các từ 32 bit nên * 4 biến ip_len vào đếm byte trong tiêu đề

Đáp lại bình luận của bạn:

Bitwise và ands các bit tương ứng trong toán hạng. Khi bạn và bất cứ điều gì với 0 nó trở thành 0 và bất cứ điều gì với 1 vẫn như cũ.

0xF = 0x0F = nhị phân 0000 1111

Vì vậy, khi bạn và 0x0F với bất cứ điều gì trong 4 bit đầu tiên được thiết lập để 0 (như bạn đang anding chúng chống lại 0) và 4 bit cuối cùng vẫn như trong toán hạng khác (như bạn đang và chống lại chúng 1). Đây là một kỹ thuật phổ biến được gọi là bit masking.

http://en.wikipedia.org/wiki/Bitwise_operation#AND

+0

tôi đã có ý tưởng (ver_ihl chứa phiên bản (4 bit) + Độ dài tiêu đề Internet (4 bit)) nhưng tôi vẫn chưa hiểu cách thao tác này đang xóa dữ liệu phiên bản . khi bạn đang anding với 0xf điều này có nghĩa là bạn anding chỉ nắm tay 4 bit? – scatman

0

Trường ver_ihl chứa hai số nguyên 4-bit, đóng gói như các nybble thấp và cao. Độ dài được chỉ định là một số từ 32 bit. Vì vậy, nếu bạn có một phiên bản 4 IP khung, với 20 byte tiêu đề, bạn muốn có một giá trị trường ver_ihl của 69. Sau đó, bạn sẽ có điều này:

01000101 
& 00001111 
    -------- 
    00000101 

Vì vậy, có, "& 0xF "mặt nạ ra 4 bit thấp.

1

Đọc từ RFC 791 định nghĩa IPv4:

Một bản tóm tắt các nội dung của tiêu đề internet sau:

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
|Version| IHL |Type of Service|   Total Length   | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

Đã có 8 bit đầu tiên của tiêu đề IP là một sự kết hợp của phiên bản và trường IHL.

IHL: 4 bit

Internet header Length là chiều dài của tiêu đề internet trong 32 lời bit, và do đó điểm đến đầu của dữ liệu. Lưu ý rằng giá trị tối thiểu cho một tiêu đề chính xác là 5.

Mã bạn đang làm, đang lấy 8 bit đầu tiên ở đó và cắt phần IHL, sau đó chuyển đổi thành số byte. Bitwise AND by 0xF sẽ cách ly trường IHL và nhân với 4 là vì có 4 byte trong từ 32 bit.

Các vấn đề liên quan