程式設計師面試寶典隨筆記(一)-----TCPIP和socket程式設計面試技巧
****能進行網路程式設計*****
1.如果你說你會select,epoll,iocp模型,那會讓對方覺得更靠譜
2.如果你說出你做過im,下載之類那會讓對方來興趣.
3.如果你說設計了通訊協議,會讓對方覺得更貼切
4.如果你說做過,熟悉, ftp http snmp smtp 這些簡單的老古董協議,會加分,但不大.
5.如果你說熟悉bt,emule,udt等協議,那會對你很有好感.
6.如果你說你破解過某大牌 qq,360內某通訊協議,那會對你加分很大.
...
目測樓主在0.5的位置,嘿嘿
我對熟悉的定義是:閉著眼能想起原理和實現,能和其他人侃侃而談,能在搜尋的幫助下,不慢的整出來.
精通的定義是:觀點一針見血,實現一揮而就.*************************************************** ***********************實戰練習******************** 抓包
先從熟悉的下手,HTTP,FTP。
封裝包
自己封裝包,和現有協議通訊。TCP/IP協議作為一個底層協議,不僅可以編寫聊天程式,很多高層協議都是基於TCP/IP編寫的。
自己造輪子,這樣也有助於理解其它協議,比如連線、查詢MySQL(用Socekt函式而不是庫函式),自己封裝一個memched函式庫…
以前我大學時用perl傳送“飛鴿傳書”包,經常上課的時候同學們集體收到彈出資訊,卻不知道傳送者是誰,很有成就感。如果你做已經事沒有成就感,就很快會失去動力。
他山之石
經常去github。
原始碼
讀讀TCP/IP協議的實現程式碼,去翻翻 linux 1.0 原始碼。
****************************************************** **************步奏*******************************
1)熟悉TCP/IP協議族的基本原理
IP地址的分類,定義,獲得,大概的管理方法
TCP、UDP等主要協議的特點,主要格式,以及重要欄位在協議互動中起到的作用。
2)對於簡單的TCP/IP協議導致的問題,有基本的判斷
熟悉網路問題的解決方法,一個問題,應該是由上而下(top-button),還是由下而上(button-top)來分析?
3)基本的程式設計知識。
在系統內,構建簡單通訊。
在系統間,構建簡單的通訊。
熟悉系統內的API,知道在什麼時候,改使用哪些API協調工作。
能夠熟練使用這些API,在系統間傳遞資訊,檔案。
能夠熟練使用這些API,實現自己的簡單的私有協議。
4)進階程式設計知識
知道一兩個已經封裝好的框架(framwork),它們之間的差別。
使用一個框架,寫過能正常工作的程式。
知道網路協議處理也是要講究效能的,知道效能的瓶頸會在什麼地方產生。
能有較好的設計技巧,將私有協議設計得更加具有彈性,優雅。
熟悉系統間協議處理的細微的差異,以及將會對業務造成的影響,時延、狀態不一致、自定義欄位、、、、、
5)熟練階段的知識
針對業務的需求,快速選型,定框架。
不再認為多執行緒是萬能的。
知道穩定性比效能更加重要。
資料包去了哪兒,不用看程式碼,也能預估出來。
----------------------------------------------------------------------------------------------------
以上,差不多或者已經達到4)的時候,就是“熟悉”了。 ***********************************************
*****************************工作需求******************
大部分提這個的到最後都用不上socket程式設計,畢竟現在是WebService的時代,大部分時候都可以把對外提供服務的協議限定在HTTP、WebSocket和JSON-RPC三種協議上。這就看你對崗位的瞭解了。
而且熟悉協議和熟悉程式設計本質上來說是兩個要求啊……熟悉協議是指底層(三層及以下)資料包交換的規則,而熟悉socket程式設計,指的是熟悉socket, bind, listen, accept, recv, send等一系列介面,這個可要比熟悉協議簡單多了。至於真的稱得上熟悉協議的我覺得沒多少,我做網路相關也不會指望招人的時候能來個熟悉TCP協議的,比如說窗長為什麼最多是2^30位元組,窗長和頻寬、延遲各自是什麼關係,TCP有哪些選項,TCP選項如何協商,為什麼初始的seq序號需要在不同五元組上獨立生成,TCP協商的MSS與實際傳送的包長和payload大小是什麼關係等等,說實話真的有點難,TCP作為一個有狀態的協議是非常難懂的。RFC都修了好多個版本了。
熟悉socket程式設計相對來說就簡單多了,主要要點在於理解TCP是個流(所以真心不要再問為什麼會“粘包”了),是可靠傳輸,有緩衝區限制,然後理解一下每個介面的作用和使用方法就行了。然後瞭解下如何使用多執行緒和epoll/select同時處理多個socket,tcpserver的一般性的編寫方法等等,足夠了。 **************************************************************