第一篇:【個人總結(jié)系列-46】計算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識學(xué)習(xí)-數(shù)據(jù)包格式分析-傳輸過程-IP地址分類-網(wǎng)絡(luò)設(shè)備
計算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識學(xué)習(xí)-數(shù)據(jù)包格式分析-傳輸過程-IP地址分類-網(wǎng)
絡(luò)設(shè)備
1.1 計算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識學(xué)習(xí)
1.1.1 對數(shù)據(jù)包格式的分析
由于在對包進(jìn)行分析時都要參考數(shù)據(jù)包的格式,所以數(shù)據(jù)包的格式是相當(dāng)重要的。在抓包時,首先是獲得鏈路層的幀,根據(jù)幀頭可以獲得源mac和目的mac以及上層的協(xié)議。一般幀頭是14byte,鏈路層幀的包頭結(jié)構(gòu)在程序中的表示如下:
/* 6字節(jié)的mac地址 */ typedef struct mac_address {
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;u_char byte5;u_char byte6;} mac_address;
/* 14字節(jié)的ether幀頭 */ typedef struct ether_header {
mac_address dest_mac;
mac_address src_mac;
u_short protocal;} ether_header;
根據(jù)幀頭的長度將指針往后移,然后可以獲得IP數(shù)據(jù)報的頭部指針,根據(jù)報頭信息可以獲得源IP、目的IP、上層協(xié)議、頭部長度、總長度等信息,IP數(shù)據(jù)報的頭部格式如下圖所示:
圖2.2.2.1 IPV4頭部格式
圖2.2.2.2 IPV6頭部格式
IPV4報文結(jié)構(gòu)在程序中的表示:
/* 4字節(jié)的IP地址 */ typedef struct ip_address {
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;} ip_address;/* IP頭部 */
typedef struct ip_header {
u_char ver_ihl;
// 版本(4 bits)+ 首部長度(4 bits)
u_char tos;
// 服務(wù)類型(Type of service)
u_short tlen;
// 總長(Total length)
u_short identification;// 標(biāo)識(Identification)
u_short flags_fo;
// 標(biāo)志位(Flags)(3 bits)+ 段偏移量(Fragment offset)(13 bits)
u_char ttl;
// 存活時間(Time to live)
u_char proto;
// 協(xié)議(Protocol)
u_short crc;
// 首部校驗(yàn)和(Header checksum)
ip_address saddr;
// 源地址(Source address)
ip_address daddr;
// 目的地址(Destination address)
u_int
op_pad;
// 選項(xiàng)與填充(Option + Padding)} ip_header;
然后根據(jù)報頭長度又可以計算出TCP或UDP的頭部指針,根據(jù)TCP或UDP的頭部信息可以獲得源端口號和目的端口號等信息,一般TCP的頭部長度為20bytes,UDP的頭部長度為8bytes,TCP和UDP的報文格式如下所示:
圖2.2.2.3 TCP報文格式
圖2.2.2.4 UDP報文格式
TCP/UDP包頭結(jié)構(gòu)在程序中的表示:
/* TCP頭部 */
typedef struct tcp_header {
u_short srcPort;
// 源端口號 16bits
u_short destPort;
// 目的端口號 16bits
u_int seqNum;
// 序號 32bits
u_int ackNum;
// 確認(rèn)號 32bits
u_short headLen_other;
// 首部長度+保留未用+其他字段 16bits
u_short windowSize;
// 窗口大小 16bits
u_short checkSum;
// 檢驗(yàn)和 16bits
u_short pointer;
// 緊急數(shù)據(jù)指針 16bits
u_int option;} tcp_header;
/* UDP頭部 */
// 選項(xiàng) 可選、不定長 typedef struct udp_header {
u_short srcPort;
// 源端口號 16bits
u_short destPort;
// 目的端口號 16bits
u_short udpLen;
// udp長度 16bits
u_short checkSum;
// 檢驗(yàn)和 16bits } udp_header;
最后就是應(yīng)用層的數(shù)據(jù)了,根據(jù)上層的報文頭部信息可以計算出應(yīng)用層數(shù)據(jù)的頭部指針,同時根據(jù)IP數(shù)據(jù)包的頭部信息可以計算出應(yīng)用層數(shù)據(jù)的長度,因此就可以通過程序?qū)?yīng)用層的數(shù)據(jù)取出來,應(yīng)用層又根據(jù)不同的協(xié)議取出實(shí)際有用的數(shù)據(jù)。應(yīng)用層協(xié)議主要有FTP、HTTP、DNS等。
通過以上對數(shù)據(jù)包格式的了解,那么就可以很容易對捕獲的數(shù)據(jù)包進(jìn)行一層一層的解析了,一般捕獲的數(shù)據(jù)包都是取得鏈路層的幀,然后再根據(jù)頭部信息一層一層地剝離,具體的程序分析流程如下圖所示:
圖2.2.2.5 數(shù)據(jù)包分析流程
以下就是根據(jù)以上分析流程捕獲到包并對其進(jìn)行分析而得出的結(jié)果(一個TCP數(shù)據(jù)包):
------data-----------frame-----dest_mac: 0.26.c6.67.77.14 src_mac: c8.3a.35.32.41.28 protocal: 800--ip packet--version:4 head len:20 type of service: 0 total len: 121 identifi: 14155 flag: 2 offset: 0 time to live: 50 protocal: 6 check sum: 5bb source addr: 125.39.205.67 dest addr: 192.168.0.102------------------------------tcp datagram------------------------------srcPort:80 destPort:1695 seqNum:396591251 ackNum:1797819109 headLen:20 windowSize:47386 checkSum:40441 pointer:0--app_data--數(shù)據(jù)長度:81.Q..Q....1.9Q...#[SkY#...d..qK"....xu...T.{...u.o...,.{.....a....h....-.tI...]...1.1.2 計算機(jī)網(wǎng)絡(luò)原理和數(shù)據(jù)包在網(wǎng)絡(luò)中的傳輸過程
其實(shí)協(xié)議就是為了規(guī)定一種大家都遵循的格式,在應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層都有自己的協(xié)議數(shù)據(jù)單元(PDU),按照數(shù)據(jù)包在網(wǎng)絡(luò)中傳輸?shù)倪^程,首先是應(yīng)用層將實(shí)際的數(shù)據(jù)根據(jù)應(yīng)用層的協(xié)議(格式)封裝成一個應(yīng)用層數(shù)據(jù)包(相當(dāng)于一個字符串,更確切的是一個字節(jié)串),然后向下傳,傳到傳輸層,傳輸層將拿到的串作為自己數(shù)據(jù)包的數(shù)據(jù)部分,并在前面加上自己的頭部,頭部有許多字段,每個字段都有各自的含義,這樣就生成了一個新的串,繼續(xù)向下傳。傳到了網(wǎng)絡(luò)層,網(wǎng)絡(luò)層進(jìn)行和上面類似的操作,繼續(xù)傳到數(shù)據(jù)鏈路層。數(shù)據(jù)鏈路層也加上自己的頭部,生成一個新的串,并且在串的頭部和尾部都做好標(biāo)記,然后繼續(xù)向下傳。傳到了物理層,物理層就直接將收到的串轉(zhuǎn)化成二進(jìn)制的電信號進(jìn)行傳輸。假如傳輸?shù)阶詈蟮哪康牡兀ǘ讼到y(tǒng)中),首先是物理層收到電信號,將其轉(zhuǎn)化成一串字節(jié),向上傳。傳到了數(shù)據(jù)鏈路層,數(shù)據(jù)鏈路層根據(jù)之前對串的頭部和尾部做好的記號將有用信息提取出來,并根據(jù)頭部信息提取出數(shù)據(jù)部分,只將數(shù)據(jù)部分向上傳。傳到了網(wǎng)絡(luò)層,網(wǎng)絡(luò)層根據(jù)網(wǎng)絡(luò)層的頭部信息,提取出數(shù)據(jù)部分,傳給上一層,依次類推。數(shù)據(jù)在網(wǎng)絡(luò)中(整個傳輸過程不包括兩個端系統(tǒng)的部分)的傳輸過程只有3層,即物理層到數(shù)據(jù)鏈路層,再到網(wǎng)絡(luò)層,傳輸?shù)倪^程和上面描述的一樣。
1.1.3 保留IP地址的分配
一個機(jī)構(gòu)網(wǎng)絡(luò)要連入Internet,必須申請公用IP地址。但是考慮到網(wǎng)絡(luò)安全和內(nèi)部實(shí)驗(yàn)等特殊情況,在IP地址中專門保留了三個區(qū)域作為私有地址,使用保留地址的網(wǎng)絡(luò)只能在內(nèi)部進(jìn)行通信,而不能與其他網(wǎng)絡(luò)互連。因?yàn)楸揪W(wǎng)絡(luò)中的保留地址同樣也可能被其它網(wǎng)絡(luò)使用。IP劃分方案中留出了三部分IP地址空間,給不連接到Internet的企業(yè)內(nèi)部網(wǎng)專用。這三部分保留的IP地址空間分別在A、B和C類地址空間中都存在,地址范圍為:
10.x.x.x 172.16.x.x ~ 172.31.x.x 192.168.x.x
比如,在局域網(wǎng)內(nèi)計算機(jī)數(shù)量少于254臺的情況下,一般在C類IP地址段里選擇IP地址范圍就可以了,如從“192.168.1.1”到“192.168.1.254”。
1.1.4 特殊IP地址的分配
0.0.0.0 :所有不清楚的主機(jī)和目的網(wǎng)絡(luò)。這里的“不清楚”是指在本機(jī)的路由表里沒有特定條目指明如何到達(dá)。
255.255.255.255 :限制廣播地址。對本機(jī)來說,這個地址指本網(wǎng)段內(nèi)(同一廣播域)的所有主機(jī)。127.0.0.1 :本機(jī)地址,主要用于測試。在Windows系統(tǒng)中,這個地址有一個別名“Localhost”,尋址這樣一個地址,是不能把它發(fā)到網(wǎng)絡(luò)接口的。
224.0.0.1 :組播地址,注意它和廣播的區(qū)別。從224.0.0.0到239.255.255.255都是這樣的地址。224.0.0.1特指所有主機(jī),224.0.0.2特指所有路由器。這樣的地址多用于一些特定的程序以及多媒體程序。
169.254.x.x :如果你的主機(jī)使用了DHCP功能自動獲得一個IP地址,那么當(dāng)你的DHCP服務(wù)器發(fā)生故障,或響應(yīng)時間太長而超出了一個系統(tǒng)規(guī)定的時間,Windows系統(tǒng)會為你分配這樣一個地址。
10.x.x.x, 172.16.x.x~172.31.x.x, 192.168.x.x :私有地址,即前面的保留IP地址
1.1.5 常見的網(wǎng)絡(luò)設(shè)備的理解
1.中繼器:由于傳輸?shù)慕橘|(zhì)(比如雙絞線)是有一定的傳輸距離的,超過這個距離信號就會衰減,為了讓信號沿著這條線一直往下傳,于是在線中間加一個中繼器,就是將接收到的信號放大后繼續(xù)往后傳,就像一個為信號中間補(bǔ)充能量的設(shè)備。
2.集線器:工作在物理層,有許多接口,可以連接許多傳輸設(shè)備,但是是以共享的方式發(fā)送的,一個設(shè)備發(fā)送時其他設(shè)備必須等待,而且是廣播式的,一個設(shè)備發(fā)送的數(shù)據(jù),所有連接在這個集線器上的其他設(shè)備都可以接收到。
3.交換機(jī):工作在數(shù)據(jù)鏈路層,與集線器有點(diǎn)類似,但是功能更強(qiáng)大,而且多個設(shè)備之間可以并行傳輸數(shù)據(jù)。由于交換機(jī)可以識別mac地址,所以不是以廣播方式發(fā)送的。
4.路由器:工作在網(wǎng)絡(luò)層,識別IP地址,控制數(shù)據(jù)包從一個網(wǎng)絡(luò)到另一個網(wǎng)絡(luò)的轉(zhuǎn)發(fā)。