怎樣算得上熟悉 TCP/IP 協議編程?

本人軟體工程本科大三學生,想找一份c/c++方向的工作/實習。看了許多招聘信息,發現許多信息中都有該條要求:
熟悉tcp/ip協議(或 熟悉tcp/ip編程熟悉網路編程)。

專業開過計算機網路的課程,但只講解了OSI模型中的七層模型,實驗也只是socket通信。所以現在對於TCP/IP協議了解的很少。

現在想問的是,招聘信息中所指的熟悉TCP/IP編程到底是指掌握什麼技能,是對於TCP/IP協議本身有具體的掌握,還是能運用一些介面(如Socekt)進行通信編程。

弱問一句,這個能速成以應付筆試面試嗎。。


能進行網路編程

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)熟練階段的知識
針對業務的需求,快速選型,定框架。
不再認為多線程是萬能的。
知道穩定性比性能更加重要。
數據包去了哪兒,不用看代碼,也能預估出來。

6)源代碼是最好的老師,永遠都是。
----------------------------------------------------------------------------------------------------
以上,差不多或者已經達到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的一般性的編寫方法等等,足夠了。


寫一個單機能handle500k並發連接的server就全搞定了,一般公司不會派出比這個水平再高的面試官面學生的,現成的可以看懂nginx 網路部分code


《TCP/IP》詳解其實閱讀卷一已經足夠了。但是本書的作者寫的另外的兩本本書卻是不得不看《unix網路編程》(卷一和卷二)。基本上能夠將卷一讀透的話就已經是深入理解TCP/Ip的精髓了!


自己寫一個TCP/IP協議棧


寫測試程序,在邏輯正常情況下,

能讓網卡使用率始終在10%以上 是入門

70%以上 是了解

90%以上 是熟悉

98% 以上 那就OK了,換個方向吧。


抓包分析別人的程序,從而理解tcp的機制


1. 對《TCP/IP協議詳解》一書中的大部分主題信手拈來
2. 理解socket編程從應用層介面到驅動收發包的全部過程
3. 對某一系統如Linux網路子系統的實現有一定的了解,至少對著代碼能講清楚


將 《TCP/IP 詳解三》看完


推薦閱讀:

不同結構的網路之間的關係是怎樣的?
MQTT比TCP協議好在哪兒?
思科模擬器如何配置兩個不同的vlan通過一個路由器ping通另一個網段的電腦?
網路上有若干客戶端向一台機器的某個埠一直不停發送UDP包 這台機器打開埠和不打開埠的區別在哪?
《TCP/IP詳解 卷1:協議》哪些章節需要重點閱讀?

TAG:編程 | 計算機 | 計算機網路 | 網路編程 | TCPIP |