如何學習網絡協議(學習筆記)

一個前輩寫的網絡協議學習方法



 


        網絡這東西就是一個靠實踐的東西,只靠看書是不行的。當年在學校還上過史美林教授/張公忠教授所講的計算機網絡體系結構課,用的是Tanabaum寫的那本,考試還得了九十多分,可實際還是連TCPUDP有什麼區別都分不清,就是死記背,到畢業的時候基本上是忘光了,工作後等於重新來過。


      上班了要在Linux做一些底層的網絡處理,不得不從頭來學Linux和網絡,編程部分主要看Richard Stevens的那幾本書APUEUNPTCP/IP Illustraion等,學Linux則看得很雜,市面上各種Linux入門書大都翻了一遍,俺是習慣在書店裏看書,愛看書而不愛買書,汗,,然後就是去各大BBS、論壇把他們的精華區都下載下來狂看,邊看邊實踐,基本上在一個月內熟悉了Linux的操作。


           學網絡協議剛開始也是看書,但看了之後沒多少印象,那些東西靠死記真是沒法記的,後來找到一個好辦法,就是自己寫個sniffer,自己寫個協議分析器,先學怎麼抓包,就看tcpdump的源碼,然後看libpcap的源碼,知道了什麼是網卡的混雜模式,很快就能抓到網卡上包的。

 

接下來就是對包進行分析,就看作TCP/IP Illustraion,從以太頭、ARP/IPICMP/IGMP/TCP/UDPHTTP/FTP/TELNET/SMTP等這麼一點一點、一個字段一個字段分析下來,很快就明白了所謂TCP/IP到底是怎麼回事。另外爲了TCP狀態轉換表,根據所抓的包的TCP標誌分析通信雙方當前是什麼狀態,剛開始還只能從頭一方發SYN包開始分析,到後來是可從連接中間包如手就能逐漸判斷雙方的TCP狀態,基本上是徹底搞清楚了TCP的狀態轉移是怎麼回事,後來再理解防火牆的狀態檢測原理就很容易了。另外在分析過程中,爲徹底掌握IP碎片,還特地ping大包來抓,把抓上來的包自己重組,搞明白了IP頭的碎片offset字段是怎麼用的。

 


          能抓包後進而又開始學如何自己構造包“干擾”正常通信了,開始是學怎麼發TCPRST包來切斷一個正常的TCP連接,就的學會如何計算IP頭校驗和,TCP校驗和,知道了算TCP校驗和時必須加IP僞頭數據,然後是正確計算序列號和確認號,知道了原來SYNFIN標誌也是算一位的,最重要的是理解了什麼是網絡序什麼是主機序,現在基本把ntohs(l),htons(l)處理都成了一種編程的本能意識了。學會用RST切斷TCP後,進一步實現了直接發一個頁面信息告訴客戶端訪問了非法信息,也就是以後實現URL過濾時客戶端顯示的拒絕畫面。後來也學發ARP信息胡亂通告MAC地址,也就是以前寫的那篇ARP攻擊的由來。

 

 


           後來俺寫的這個協議分析器逐步完善,能解析的就解析,不能解析的就打印出16進制數,可打印字符也打印出來,對HTTPFTPPOP3SMTP這些文本協議幾乎就一下看明白了,對於非文本協議,如DNS,也根據協議解析了出來,而且解析DNS時不得不用了我一向不愛用的遞歸方法來編程。隨着網絡應用的增加,在用到前都先作協議解析,除了各種TCPUDP的協議,還增加了BPDUPPPOEOSPFESPAHIKE等的解析處理,現在俺的協議分析器也可以分析上百種協議,平時抓包就只用俺這個,TCPDUMP基本不再用了,畢竟自己寫的自己更清楚,如果有不能解析的再現加進去。現在學新協議時,往往先抓包看看協議的基本數據格式,再看RFC瞭解細節。


              學協議剛開始是看書,到後來要更深入瞭解或追詢最新發展情況就只能看RFC了,畢竟網絡的東西變化太快,書的東西只能算入門,說不定很快就出新的了,到現在也看了數百篇的RFC了。


             通過編程分析來學協議,慢是慢了點,花了一個多月的時間,但感覺學得紮實,正所謂磨刀不誤砍柴功,而且一通百通。到現在雖然已經好幾年了,IP頭,TCP頭有哪些字段還是一下就可以說得出來,對理解各種網絡攻擊原理從而進行防範更是有幫助,我覺得對我來說這種方法是很有效,如果哪位覺得有更有效的學習方法,可以共同交流一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章