如何學習 TCP/IP 協議?
感覺入門有點困難。看學校的教材很枯燥,概念性太強,耐不下心看。學操作系統時也是這樣,後來找了本有關自己寫微型操作系統的書後,通過編程了解了書上各個功能的實現和用法,再看教材時就覺得看得下去了,不覺得抽象。不知道tcp ip這方面有沒有類似能通過動手了解的入門書籍,或者概念比較精要,不太枯燥能入門的書籍。 希望各位前輩能給我點建議。
對TCP/IP先要有一個概念,我在另外一篇文章里寫了很多,就不重複了,以下是鏈接:
http://www.zhihu.com/question/20583641/answer/104529492?f3fb8ead20=29d476a5746f5dd5ae8a296354e817de看書是很枯燥的,如果沒有理解,看完也就忘完了,理解一個協議最好的方法,先看某個協議如ARP,看完一遍,打開抓包軟體wireshark ,用過濾器只把ARP filter in,這樣就只有ARP了,看起來清晰很多,你就可以慢慢分析它們是如何request ,reply了,二層什麼地址,ARP有哪些欄位,ARP解決什麼問題,主機怎麼緩存它,用ARP這條命令可以看。
TCP/IP並不是IP ,TCP ,UDP,它是很多協議的合集,包括ARP,ICMP,IGMP,DHCP,DNS等等,這些協議你都可以抓包來分析,還要帶著問題來看書和做實驗:為什麼有這個協議?這個協議提供什麼服務?
我強烈建議編一些UDP-based , TCP-based小程序,很簡單的,就是調用socket介面函數,分為伺服器端,客戶端,然後就可以抓包過濾分析了,看看TCP三次握手,三次握手都是socket 來完成的,無需你來寫code,你只要調用send () receive() 就可以完成數據得發送與接收。
然後你還可以capture HTTP 包來分析,看看 data link layer , IP layer , TCP layer , HTTP layer 是如何封裝的,TCP sequence number , 什麼樣flag的TCP segment 會使sequence number 增加。
總之,了解每個協議解決什麼問題,帶著這個問題看書、做實驗、編小程序,抓包分析協議交互,協議欄位,這樣可以全方位地知道更多細節,理解了就記住了。可以試著學習wireshark這種居家旅行殺人越貨的必備神器 結合奇書《tcp/ip詳解 卷一》
達特茅斯的 lab DartNet傳送門: assignmentsHowever, this lab is focused on the whole network protocol stack.這個實驗大概的升級路線是這樣的:
- 了解 socket 編程,會抓包
- 寫個 IM
- 自己實現 tcp 窗口,重傳機制
- 然後。。。假裝 TCP 不存在,重新實現 傳輸層,網路層,鏈路層
- 在你自己實現的網路棧上,支持之前的 IM
後面的幾個實驗相互銜接,並且實驗也有框架代碼。省去很多瑣碎的工作。
而且給的參考文檔也不錯。比如 socket 編程入門啦,多進程/線程 編程入門啦 之類的。可以看《TCP/IP詳解卷一:協議》,但只看這本書會有點枯燥。
可以邊看書邊抓包分析,推薦使用Wireshark和另外一款商用抓包軟體(為避嫌不說名字了,個人學習版免費)。
鏈路層,網路層,傳輸層,應用層各種細節一目了然。
這酸爽讓人無法相信。
第一階段:先了解七層模型,然後看一下CCNA/NP的教學視頻和書籍,對網路模型有初步了解。第二階段:可以去看看《TCP/IP詳解卷一》,講基礎。第三階段:學習一些理論知識,最好的還是機械工業出版社出版的《計算機網路,自頂向下網路設計》和《計算機網路,系統方法》。第四階段:看《TCP/IP詳解卷二》,講Unix TCP/IP協議棧設計。
第五階段:
看Linux 內核源碼network部分。以上都是關於TCP/IP的知識點,不包括廣域網技術和其他的接入網技術等,搞清這15個問題,那你就精通了TCP!
網路協議那麼多,為什麼面試喜歡問TCP?原因無外乎兩個:
1、TCP協議直接與進程打交道,寫網路程序要用;
2、TCP協議設計十分精巧,在一個不可靠的IP網路上實現了可靠傳輸,因為精巧,掌握TCP的原理自然也有難度,對它掌握如何,很能反映面試者的基礎水平。閑言少敘,看看這幾個問題你能不能答出來!
1、A進程通過TCP向另一台機器上的B進程發送了一個字元串「hello」,TCP返回對方成功接收的確認信息,請問,現在進程A是否可以肯定地說進程B收到了它發送的字元串?
答案:不能!舉反例,進程B所在機器的TCP收到進程A發送的「hello」信息後,告訴進程A發送成功,但有可能沒有立即將數據交給進程B,而是放在自己的緩衝區中,等待進程B讀取,如果機器此時突然掉電,緩衝區中的信息將丟失,進程B將不可能收到「hello」字元串。
2、有什麼辦法來盡量避免上述情況的發生呢?
答案:將TCP報文段首部中的PSH標誌置1,這樣會讓B端的TCP協議收到數據後儘快交給進程B,能不緩存盡量不要緩存。
3、我們知道通常TCP連接的建立需要3次握手,關閉需要4次握手,為什麼關閉會多一次呢?
答案:簡單說,就是TCP允許半關閉狀態的存在。當進程A向進程B發送FIN,B也向A發送確認後。此時此刻的狀態就是半關閉狀態,A發送的FIN就是告訴B:「我要發送的數據都發送完了」但B沒有發送FIN給A,有可能代表B還有沒發送完的數據,如果B也發送完數據了,B就發送FIN給進程A,進程A確認B發送的FIN,這時,雙方都已經發送完了數據,連接就斷開了,TCP回收相關資源。
4、假如伺服器突然掉電重啟,但客戶端並不知情,請問此時二者之間的TCP連接處於什麼狀態?
答案:處於半打開狀態。就是客戶端還覺得連接是正常的,伺服器這邊已經沒有連接的任何信息了。
5、那麼,假如此時客戶端通過這個連接向伺服器請求數據,伺服器會怎麼應對呢?
答案:伺服器收到客戶端的請求會進行一次ARP查詢,獲得客戶端MAC地址,然而由於已經丟失了所有連接信息,此時的伺服器是一臉懵逼(就像喝了孟婆湯!),於是乎,它會發一個RST給客戶端,表示:「哥們,我不認識你,想跟我說話請先發送SYN!」
6、假如客戶端按照伺服器的要求重新建立連接,卻搞錯了伺服器的埠號,會發生什麼情況呢?
答案:有兩種可能,一種是伺服器端的TCP收到客戶端請求,查看本機上是否有進程在監聽相應的埠,如果有,就把請求交給這個進程,一般而言,這個進程不會接受這個連接的,於是它會發一個RST給客戶端。還有一種可能是TCP沒有找到哪個進程在監聽相應的埠,於是TCP就會直接發一個RST給客戶端,一般而言都會是這種情況。
7、假如現在有一個多進程伺服器,伺服器進程為A,接受一個連接後新建一個進程B來處理連接,再接受一個連接後又建一個進程C來處理這個連接,請問,進程ABC是否監聽同樣的埠?
答案:是!
8、那TCP接收到發送給這個埠的報文段,怎麼決定發給哪個進程呢?
答案:首先,所有的SYN報文段都會發送給伺服器進程A,其他的報文段依據&
9、假如上面的伺服器進程A收到一個連接請求,正在為這個請求創建處理進程的時候,又有新的連接請求進來了,TCP會怎麼處理呢?
答案:一般情況下,伺服器進程A會給TCP一個指示,讓TCP維護一個適當長度的連接隊列,TCP與新連接請求完成三次握手後,就會把這個連接放入連接隊列中,伺服器進程A會在合適的時候來從這個隊列中取連接。
10、這個連接對列是否會對伺服器的並發處理能力產生影響呢?如果會,會有什麼影響?
答案:不會!二者沒有必然關係。
11、MSS和MTU各是什麼,二者是什麼關係?
答案:MSS是TCP最大報文段長度,就是TCP發送數據需要對數據分段時,最大的段的位元組數。MTU是最大傳輸單元,通常由網卡的硬體特性規定,表示通過該網卡傳輸的數據單元最大的位元組數。MSS要受同一台機器上的MTU限制。比如MTU為1500位元組,那麼MSS就只能是1460位元組,這是因為1460位元組的數據在通過網卡向外傳輸時,會加上20位元組的ip頭和20位元組的tcp頭。
12、假設機器A和B的MSS分別是1400和1600,請問,A通過TCP向B發送數據時,是否可以發送長度為1600位元組的數據段?
答案:不可以,雖然發送1600位元組的數據段沒有突破B的MSS,但是突破了A自己的MSS。這樣一來,當這1600位元組的數據段通過A的網卡向B發送時,會被切分為2個IP片,每個為840位元組,以保證不突破A的MTU,這顯然降低了傳輸的效率,因為兩個840位元組中有著相同的IP頭和TCP頭。
13、機器A和B有一條TCP連接,假如A想儘快斷開連接,應當怎麼辦?
答案:A可以直接給B發送一個RST,就可以了,相當於告訴B,我關閉連接了,你看著辦吧。這叫做異常關閉。
14、B的TCP收到A發來的RST,會怎麼辦?
答案:B的TCP會告訴上層的進程,連接已經斷開了,然後就會回收這條連接的資源,並不會發送任何確認信息給A。所謂你無情休怪我不義。
15、假設A正常斷開與B的TCP連接,當收到B的FIN時,A發送ACK給B,是否就算完成了4次握手,連接已經成功斷開?
答案:不是,A的TCP會啟動一個定時器,等待2MSL的時間,這主要是為了防止A的ACK沒有成功傳到B,讓B以為自己的FIN沒有送到A處,反覆重傳FIN的問題。2MSL的時間到時,如果A沒有再次收到B的FIN,說明B成功收到A的ACK,A就可以安全地斷開這個連接,若期間再次收到B的FIN,則A會重傳ACK。
學習TCP/IP的正確姿勢是邊看理論知識邊動手實踐。
Linux - TCP/IP網路協議基礎 把這裡面的實驗都做一遍,理解的會更深入。
1 TCP/IP簡介
2 鏈路層介紹
3 IP網際協議
4 網路層其它協議5 傳輸層:UDP協議
6 傳輸層:TCP協議
7 應用層協議看這本書,不知道有沒有中文版。絕對不會枯燥的。
如果你習慣看英文文檔,強烈建議你看「The TCP IP Guide」 Welcome to The TCP/IP Guide!個人覺得秒殺目前一切書籍,而且非常好懂,讀來一點不費勁,除了感覺有點羅嗦。
以前整理的源碼分析的豆列
豆列:TCPIP 協議棧源碼(@豆瓣app) http://www.douban.com/doubanapp/dispatch?uri=/doulist/1160152/ ,
當然看源碼是 hard way 用 tcpdump 工具 學習 詳解1 是最合理的方法。最近為了學習網路編程,結合別人的經驗之談,買了Tcp/ip 詳解卷一,重點看Tcp的部分17-24章,然後其他部分大略看一遍。這一步完成以後,我覺得就可以裝個wireshark軟體來抓包(可以買本wireshark數據包分析實戰,裡面有很多例子),結合這兩本書和wireshark軟體,就可以了吧。
如果是初步接觸基礎的話實驗樓的課程不錯TCP/IP網路協議基礎可以做一下
結合WireShark一起學,邊看邊抓包推薦書目《WireShark 數據包分析實戰》、《TCP/IP詳解 卷一》
推薦書目《TCP/IP協議原理及應用(第四版)》+《WireShark 網路分析實戰》
&
強答一波。抓包,並搞清楚你抓到的每個包(非重複)是幹啥的。
研究某FW和西廂計劃
主要用tcpdump抓包分析,照著書上提出的知識點自己想場景,然後抓包看看能否符合預期,這樣不會煩的哦。而且以後工作了也用這個的。
推薦閱讀:
※在TCP的四次分手當中,被動關閉方是如何知道數據已經接收完了?
※DNS解析的過程是什麼,求詳細的?
※《tcp/ip詳解》三卷本該怎麼看?
※為什麼整個127.*網段都被拿來當做環回地址了?
※為什麼HTTP標準中 webService 主動會關閉tcp連接?
TAG:TCPIP |