在一個不可以稱之為學校的學校上學,沒啥項目可練手,也沒老師指導,只能自己給自己找點事情做了,目前打算寫個掃描器,現在也在惡補網絡知識中(雖然以前學過點,但是不夠用啊······呵呵····)
IP報頭結構:
//
定義IP首部
typedef struct _iphdr{
unsigned char h_lenver; // 4 位IP版本號+4位首部長度
unsigned char tos; // 8位服務類型TOS
unsigned short total_len; // 16位IP包總長度(字節)
unsigned short ident; // 1 6位標識, 用於輔助IP包的拆裝
unsigned short frag_and_flags; // 3位標志位+13位偏移位, 也是用於IP包的拆裝
unsigned char ttl; // 8位IP包生存時間 TTL
unsigned char proto; // 8位協議 (TCP, UDP 或其他)
unsigned short checksum; // 16位IP首部校驗和,最初置零,等所有包頭都填寫正確后,計算並替換.
unsigned int sourceIP; // 32位源IP地址
unsigned int destIP; // 32位目的IP地址
}IP_HEADER;
typedef struct _iphdr{
unsigned char h_lenver; // 4 位IP版本號+4位首部長度
unsigned char tos; // 8位服務類型TOS
unsigned short total_len; // 16位IP包總長度(字節)
unsigned short ident; // 1 6位標識, 用於輔助IP包的拆裝
unsigned short frag_and_flags; // 3位標志位+13位偏移位, 也是用於IP包的拆裝
unsigned char ttl; // 8位IP包生存時間 TTL
unsigned char proto; // 8位協議 (TCP, UDP 或其他)
unsigned short checksum; // 16位IP首部校驗和,最初置零,等所有包頭都填寫正確后,計算並替換.
unsigned int sourceIP; // 32位源IP地址
unsigned int destIP; // 32位目的IP地址
}IP_HEADER;
在給張圖片看下ip報頭的結構:
計算校驗和的經典函數:
SHORT checksum(USHORT* buffer,
int size)
{
unsigned long cksum = 0;
while(size> 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>> 16) + (cksum& 0xffff);
cksum += (cksum>> 16);
return (USHORT)(~cksum);
{
unsigned long cksum = 0;
while(size> 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>> 16) + (cksum& 0xffff);
cksum += (cksum>> 16);
return (USHORT)(~cksum);
}
ICMP報頭結構:
//
定義ICMP首部
typedef struct _icmphdr{
unsigned char i_type; // 8位類型
unsigned char i_code; // 8位代碼
unsigned short i_cksum; // 16位校驗和, 從TYPE開始,直到最后一位用戶數據,如果為字節數為奇數則補充一位
unsigned short i_id ; // 識別號(一般用進程號作為識別號), 用於匹配ECHO和ECHO REPLY包
unsigned short i_seq ; // 報文序列號, 用於標記ECHO報文順序
unsigned int timestamp; // 時間戳
typedef struct _icmphdr{
unsigned char i_type; // 8位類型
unsigned char i_code; // 8位代碼
unsigned short i_cksum; // 16位校驗和, 從TYPE開始,直到最后一位用戶數據,如果為字節數為奇數則補充一位
unsigned short i_id ; // 識別號(一般用進程號作為識別號), 用於匹配ECHO和ECHO REPLY包
unsigned short i_seq ; // 報文序列號, 用於標記ECHO報文順序
unsigned int timestamp; // 時間戳
}ICMP_HEADER;
在上一張圖看看:
ICMP報文的各種狀態:
目的不可達報文
類型:3 | 代碼:0至15 | 檢驗和 |
未使用(全0) | ||
收到的IP數據報的一部分,包括IP首部以及數據報數據的前8個字節 |
源端抑制報文
類型:4 | 代碼:0 | 檢驗和 |
未使用(全0) | ||
收到的IP數據報的一部分,包括IP首部以及數據報數據的前8個字節 |
超時報文
類型:11 | 代碼:0或1 | 檢驗和 |
未使用(全0) | ||
收到的IP數據報的一部分,包括IP首部以及數據報數據的前8個字節 |
參數問題
類型:12 | 代碼:0或1 | 檢驗和 |
指針 | 未使用(全0) | |
收到的IP數據報的一部分,包括IP首部以及數據報數據的前8個字節 |
改變路由
類型:5 | 代碼:0到3 | 檢驗和 |
目標路由器IP地址 | ||
收到的IP數據報的一部分,包括IP首部以及數據報數據的前8個字節 |
回送請求和回答
類型:8或0 | 代碼:0 | 檢驗和 | |
標識符 | 序號 | ||
由請求報文發送;由回答報文重復 |
時間戳請求和回答
類型:13或14 | 代碼:0 | 檢驗和 | |
標識符 | 序號 | ||
原始時間戳 | |||
接收時間戳 | |||
發送時間戳 |
地址掩碼請求和回答
類型:17或18 | 代碼:0 | 檢驗和 | |
標識符 | 序號 | ||
地址掩碼 |
路由詢問和通告
類型:10 | 代碼:0 | 檢驗和 | |
標識符 | 序號 |
類型:9 | 代碼:0 | 檢驗和 | |
地址數 | 地址項目長度 | 壽命 | |
路由器地址1 | |||
地址參考1 | |||
路由器地址2 | |||
地址參考2 | |||
... |
........本文的內容收集與網絡········算是東湊西湊的,也不知道作者是誰?把自己要的都收集來了所以作者看到·····別怪啦····