亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
慕課專欄

目錄

索引目錄

網絡編程32講

原價 ¥ 58.00

立即訂閱
01 開篇詞:帶你走進網絡編程的世界
更新時間:2020-09-16 16:50:58
能夠生存下來的物種,并不是那些最強壯的,也不是那些最聰明的,而是那些對變化作出快速反應的。——達爾文

什么是 Socket 編程?

你好,我是陳子興,是一名老程序員,在音視頻實時通訊行業有著十多年從業經驗。在接下來的幾個月里,我會和你一起學習 Socket 編程相關技術。Socket 編程也叫網絡編程,是針對接入網絡的各種設備進行編程,從而滿足人們學習、工作、生活的需要。我們后續會開發一個 nwchecker 程序,目的是檢查網絡的連通性,實現結構如下:

圖片描述

如圖中描述,nwchecker 是一個 C/S 結構的網絡應用程序,基本功能就是 Client 定時發出 ping 請求,Server 收到 ping 請求后回復 pong 響應,Client 能夠收到服務器的 pong 響應,證明網絡狀況是良好的。Client 和 Server 的結構是對稱的,分為 4 層:nwchecker 應用層、TCP 層、IP 層、Ethernet 層。nwchecker 定義的是應用層協議,即 ping/pong;TCP 是傳輸層,通過端口號標識一個服務;IP 層代表一個網絡主機,通過 IP 地址來尋址;Ethernet 是以太網層,通過 MAC 地址來局域網尋址。關于這些技術概念,本專欄會一一講到。

在這幾十年里,計算機網絡技術給整個世界帶來了難以想象的變化,真是說不完道不盡啊。從最早只能透過玻璃窗才能看到連接起來的神秘計算機到今天人手一部手機,你可以隨時上網娛樂、購物、交易。尤其是近年來移動互聯網和物聯網的飛速發展,人們的吃、穿、住、用、行已經完全離不開手機了。你有沒有因為手機沒電而吃不上飯的經歷呢?不管你在意還是不在意,網絡就在你身邊,如影隨形。想象一下,現代社會如果沒有網絡又會是什么狀況呢?

網絡的重要性毋庸置疑,那么是否每個程序員都需要學習網絡編程呢?就作者本人的工作經歷來看,不管你的工作是否和網絡傳輸直接相關,最好還是認真學習一下網絡編程。如果你有條件,最好研究一個或者多個網絡中間件,比如 ACE,libuv 等。接下來,我就談一下自己的經歷和感受吧。

為什么要學習 Socket 編程?

我是 2006 年畢業以后進入華為接入網產品線,從事的是接入網軟件開發。在校招面試的時候,面試官考察了 OSI 模型、TCP/IP 參考模型、TCP 三次握手等相關知識。后來在擔任 team leader 期間也參加過很多次面試,面試題自然少不了網絡相關的知識。比如,TCP 的 TIME_WAIT 狀態是怎么產生的,有什么影響?epoll 的基本工作原理是什么?

其實在華為的這段時間內,工作內容可以說是和網絡編程沒有直接關系。我是在一個基礎平臺之上做控制協議開發,只需要調用別人提供的 API 即可,并看不到 socket、listen 等 API 調用。然而軟件本身是 C/S 架構,經常遇到收不到消息的問題,如何分析解決此類問題呢?這就需要一定的網絡知識,需要會使用一些網絡分析工具,用以判定網絡是否連通、是否有丟包等。

我接觸的第一個跨平臺網絡層中間件是 ACE,它是通過 C++ 語言實現的。ACE 針對網絡層進行了面向對象抽象和封裝,不僅大量應用了工廠模式、單例模式、代理模式等常用的設計模式,而且針對網絡事件提出了特有的 Reactor 模式和 Proactor 模式,充分體現了依賴倒轉原則。后來分析過 Linux 內核 2.6.3 網絡協議棧,不僅加深了自己對網絡協議棧實現的理解,而且學習到了很多設計思想。比如,我在產品設計中借助了 Linux 網絡協議棧 sk_buff 的設計思想解決數據包共享的問題。

學習完 ACE 和 Linux 網絡協議棧以后,發現分析 libuv、Nginx 等源碼會輕松很多。這些開源網絡項目實現思想基本是類似的,比如大家都通過 Reactor 模型來實現事件驅動機制。我好像是掌握了內功心法一樣,發現多數開源組件的實現是套路相同、招式不同。

總體來講,學習網絡編程不單單是學習網絡協議相關知識,更重要的是要學習網絡中間件的設計思想和實現思路,這會增加你的技術深度,使你更容易做出正確的方案選擇和技術決策。

怎樣學習 Socket 編程?

首先,我會和你一起學習 TCP/IP 參考模型中提出的主要協議,比如 TCP 和 UDP。學好這些協議,只是看書是完全不夠的,需要動手實踐。tcpdump 和 wireshark 是我們最好的老師,在分析協議工作原理的時候,我會和你一起通過 wireshark 抓包,一步一步分析相關協議格式,搞清楚協議的基本工作原理。

其次,我們主要學習 BSD Socket API,像 linux、Mac OS 等 UNIX-Like 系統都是采用 BSD Socket API。Windows 系統的 winsock1 也是采用 BSD Socket API。當然 Windows 系統的 winsock2 是 Windows 風格的 API,本專欄不會涉及。只要我們學好了 BSD Socket API,回頭學習 winsock2 會容易很多。我會編寫一些小程序來講解這些 Socket API 具體用法。Socket API 的返回值是非常重要的,不同的返回值往往意味著發生了不同的網絡狀況,要想編寫健壯的網絡程序,必須仔細處理這些返回值。

最后,我們一定要熟練應用 tcpdump 和 wireshark 這兩個抓包工具。同時,要學會應用 ipconfig、netstat、nload 等網絡工具。

所謂學以致用嘛,我們最后一起開發一個網絡檢測工具,可以檢測網絡帶寬、延遲、抖動、丟包等技術指標。開發這個工具一定要采用事件驅動的 I/O 模型,讓我們的小程序有一種高大上的現代感。

Socket 編程要學習哪些內容?

專欄分為介紹篇、基礎理論篇、Socket 編程基礎篇、Socket 編程高級篇、總結篇,一共是五個部分。每個篇章包含的內容,可以概覽下圖。

圖片描述

后記

工欲善其事必先利其器。學習 Socket 編程一定是少不了做實驗,所以需要準備一個 linux 環境,可以安裝自己喜歡的發行版。如果你是第一次用 Linux,推薦你用 Ubuntu 最新版??梢栽谧约旱碾娔X通過 VMware 虛擬機虛擬一臺 Linux。

另外需要在 Windows 上安裝 wireshark,這是一個非常便于協議分析的圖形化工具。在 Linux 上使用 tcpdump 即可,這是系統自帶的工具,適合抓包和進行簡單的文本化分析。

在學習 Socket 編程的過程中,涉及到協議格式、工作原理,我會做實驗抓包分析。希望你能像我一樣動起來,親自去做實驗分析,這樣會理解的更透,記憶的更牢。

那就讓我們一起努力吧!

}
立即訂閱 ¥ 58.00

你正在閱讀課程試讀內容,訂閱后解鎖課程全部內容

千學不如一看,千看不如一練

手機
閱讀

掃一掃 手機閱讀

網絡編程32講
立即訂閱 ¥ 58.00

舉報

0/150
提交
取消