在一個不可以稱之為學校的學校上學,沒啥項目可練手,也沒老師指導,只能自己給自己找點事情做了,目前打算寫個掃描器,現在也在惡補網絡知識中(雖然以前學過點,但是不夠用啊······呵呵····)
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 | |||
| ... | |||
........本文的內容收集與網絡········算是東湊西湊的,也不知道作者是誰?把自己要的都收集來了所以作者看到·····別怪啦····
