前情回顧:一篇短短的博客明顯不能滿足TCP和UDP這兩個飢渴的漢子,而且還被應用協議占了一小半的篇幅。在昨天結束之后,相信大家都基本對TCP/IP協議棧的輪廓有一個大概的印象了,能夠對整體有所把握。
今天白天上班的時候完全抽不出時間來復習,配了一天的環境才把一個公司的項目跑起來。將近四個月的時間,實習以來我覺得配環境是最麻煩最惡心人的事兒了,沒有之一。用的是Eclipse,其中還涉及maven什么的,沒有了解過,只是按照文檔一步一步去做,出現問題報了異常也不知道是什么原因該怎么解決。只好一點點去試,一次又一次重復已經做過的步驟,以防是自己沒有嚴格按照步驟做導致的錯誤。事情不難,但真的很有挫敗感,覺得自己是兩眼一抹黑。就像微博上流傳一句調侃程序猿的話:程序跑不起來,我不知道為什么;程序跑起來了,我也不知道為什么。
我發現公司里面某些人也是一樣,都是靠試,看到什么可以設的地方就去瞎搞。你問他為什么,他也說不出個所以然來。或許有人一開始想着去弄明白,但隨着項目跑起來了,也就沒那么心思去學新東西了。下次還是會遇到相同的問題,依然不懂。
童鞋們,前輩們可以在評論里談談自己這方面的經歷啊,分享一下。
—————————————————————————————閑聊結束——————————————————————————————
今天,主要就一些常見的面試題進行分析,會參考網上的一些資料,結合我自己的理解,用自己的語言去講述。
第七章:快問快答
在面試中,面試官會在詢問項目細節的過程中突然問一些TCP/IP協議中的簡單問題,如果思考時間過長,甚至答不出來,就很影響考核的分數。(參考我上次連TCP/IP協議多少層都沒回答出來)
1.OSI參考模型有多少層?分別是哪幾層?(不建議死記硬背,可以看看我在系列文章第一篇里的描述,效果比較好,不會因為緊張而答不出來)
七層模型,自下而上分別是:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。
2.TCP/IP協議棧有多少層?分別是哪幾層?(有四層和五層的說法,其實都對,這里就只講四層的)
四層,自上而下分別是:應用層、傳輸層、網絡層以及數據鏈路層。
3.應用層典型的協議中,基於TCP、UDP協議的分別有哪些?(面試中比較少問,筆試題中常常會以選擇題的形式考察)
TCP:SMTP,FTP,TELNET,POP3,IMAP, BGP,http,SSH
UDP:SNMP,TFTP簡單文件傳輸協議,用於傳小文件,功能簡單少,DNS
4.ipconfig的作用是什么?(一些常用的指令記一記還是有好處的,最好能實際操作一下,加深印象)
顯示當前TCP/IP配置的信息。
5.請說出三個你覺得比較常見的端口以及對應的應用?(這個沒什么好說的,注意點就是了)
21-FTP、22-SSH、23-telnet、25-SMTP、80-HTTP、SNMP-161、MySQL數據庫服務-3306
6.簡單講講ICMP協議(HTTP協議、DHCP協議等)的作用和基本原理(這道題就不說答案了,大家自己去看看之前的博客,最好能再總結其他常見協議的作用和基本原理)
7.如何進行兩台電腦ping不通,你覺得可能的原因有哪些?
(這道題還是挺有意思的,如果事先不知道答案要准確回答出來,要基礎知識很扎實並且思考比較全面才行,下面是網上的參考答案,歡迎童鞋們吐槽)
(1)首先考慮是否是網絡的問題
(2)局域網設置問題,電腦互聯是要設置的。看是否安裝了必要的網絡協議,最重要的是IP地址是否設置正確。
(3)網卡驅動未安裝正確
(4)防火牆設置有問題
(5)是否有什么軟件阻止了ping包
類似的問題還有很多,我就不一一列舉出來了。光是列舉是沒有意義的,其實,只要把基礎的知識掌握好,再加上必要的練習,這樣問題就算不能脫口而出,想一想也是能回答出來的。最重要的是不要太緊張,要對自己有信心,不然很容易悲劇。至於掌握基礎知識嘛,最好是聯系起來記憶,結合模型。我能想象到某一個程度,閉上眼睛,會有一個計算機網絡世界展現在你的眼前。
第八章:有備而戰
一般寫過計算機行業簡歷的童鞋都對這么幾個字眼不會陌生:精通、熟練掌握、熟悉、了解。在上一章,快問快答的問題基本都只是了解,而下面的幾道題,至少要達到熟悉的程度。甚至在一些要求高的面試當中,會在編程層面上作要求。
第一題:TCP與UDP的區別
TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數據。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。
(最好還能夠各自舉例說明一下,例如什么協議或應用采用TCP,為什么;又有什么協議或應用采用UDP,為什么。主要是給面試官說明具體問題具體分析,兩協議沒有優劣之分)
第二題:講講TCP的三次握手(四次揮手)的整個過程
TCP 連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息。以下步驟概述了通常情況下客戶端計算機聯系服務器計算機的過程:
1)客戶端向服務器發送一個SYN置位的TCP報文,其中包含連接的初始序列號x和一個窗口大小(表示客戶端上用來存儲從服務器發送來的傳入段的緩沖區的大小)。
2)服務器收到客戶端發送過來的SYN報文后,向客戶端發送一個SYN和ACK都置位的TCP報文,其中包含它選擇的初始序列號(sequence number)y、對客戶端的序列號的確認x+1和一個窗口大小(表示服務器上用來存儲從客戶端發送來的傳入段的緩沖區的大小)。
3).客戶端接收到服務器端返回的SYN+ACK報文后,向服務器端返回一個確認號y+1和序號x+1的ACK報文,一個標准的TCP連接完成。
(四次揮手的過程類似,這里就不多說了,圖片來自參考資料http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html,上面畫的圖不錯。建議大家在面試的時候要隨身帶一支筆和一張白紙,在被問到這種需要畫圖的問題時主動畫圖給面試官看,加分不少的!像我這樣畫圖很丑的人,可以多練習幾次,不會到時候塗塗抹抹,影響講解的效果)
第三題:為什么建立連接協議是三次握手,而關閉連接卻是四次握手呢?
這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求后,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文里來發送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你不可以馬上關閉SOCKET,也即你可能還需要發送一些數據給對方之后,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這里的ACK報文和FIN報文多數情況下都是分開發送的。
第四題:講講TCP協議中滑動窗口
TCP的首部中有一個很重要的字段就是16位長的窗口大小,它出現在每一個TCP數據報中,配合32位的確認序號,用於向對端通告本地socket的接收窗口大小。也就是說,如果本地socket發送一個TCP數據,其32位確認序號是5,窗口大小是5840,則用於告訴對端,對端已經發出的4個字節的數據已經收到並確認,接下來,本地socket最多能夠接收從第5個字節開始的5840個字節長度的數據。這是由接收方進行的一種流量控制,接收方通過告訴發送方自己所能夠接收數據的大小,達到控制發送方發送速度的目的。(本段內容引子班里的一位offer大神給我的總結資料。其實還會涉及慢啟動算法等相關內容,值得深入研究)
(其實我沒有怎么看懂這一部分,《圖解TCP/IP》里面的相關內容反復讀了兩三遍都有不是很理解滑動窗口的原理到底是怎么回事。看來是腦子短路了,貌似也不是很難的樣子。等我讓會的人給我講解講解,或者過一段時間冷卻再回頭去看,會好一些。到時弄懂了,再具體貼出來。網上隨便搜了一下,沒找到特別好的講解文章,童鞋們找到的話麻煩在評論中推薦一下。)
面試題就貼這么多,尤其是第八章我只選了最最最經典的三道題型:TCP與UDP的區別、TCP的三次握手四次揮手以及TCP的滑動窗口。其實,我覺得大家沒有必要去背答案,理解記憶的效果才是最好的。有些面試官,會在你給出比較標准的答案之后詢問一些細節,這些細節是在那些總結面試題答案中沒有的。還是要去看看教材或者一些詳解的博客,了解其中的機制和原理,知道到底是什么樣子的,並且為什么要設計成這個樣子,設計成這個樣子有什么好處。例如:面試官問你,DNS用的是TCP還是UDP?你記住了答案,回答說:UDP。那他接着問,為什么要用UDP呢?你總不能回答說:他就是用UDP吖,我有什么辦法。囧。
TCP/IP相關的面試題遠遠不止這么些,題海戰術不是說沒有用,但真的是事倍功半,付出了很多代價卻沒有對等的回報。記不住答案也沒關系,因為總有你沒碰過的題目,關鍵是把握原理,能夠根據基礎知識推出來。講到推出來,我想起我一個高數很厲害的舍友。在期末考試數值計算(數學類科目)這門課之前,我問他為什么不記公式,他回答我說:記什么記,到時候推出來就行喇!不虧是高數兩學期滿績點的人,最后考了六十幾分。
True story O(∩_∩)O~
—————————————————————————————————————————————————————————————————
又堅持了一天,肯定是要說幾句的:
1.今天因為配環境的事兒,搞得有點煩躁,覺得自己很沒用。其實也是自己的問題,平時用eclipse稀里糊塗,很多設置都不知道怎么弄,項目啟動之后跑不起來一堆報錯也不知道是什么問題,更別談找到相應的解決辦法。最后求助前輩,前輩有點不耐煩,搞定后跟我說了句:記住怎么做了啊,以后別叫我幫你弄這個。這句話從下班一直讓我想到現在,一開始會覺得這個前輩怎么這樣,你有解決問題的經驗,幫幫我怎么了,你用十分鍾就頂的上我用一天的時間去瞎貓撞死老鼠。后來想想他有自己的事情要忙,能幫我已經是很夠意思了,真的不能要求太多。有些問題還是得自己去解決,不能一味依賴別人,不動腦子永遠也進步不了。
2.以后遇見這種事情,第一步是要積極去找到問題所在,思考、找資料摸索出解決方法。實在比較棘手或者趕時間才是第二步,虛心請教前輩或者同事。多要求自己,少要求別人。
3.TCP/IP協議這一塊基本結束了,明天該進行哪一部分呢?童鞋們什么好建議,可以在評論中提一提哦。