描述
內容簡介
| 網路程式設計真正的門檻,不只是會呼叫Socket API,而是理解一筆資料如何從應用程式進入Linux核心,經過TCP/IP協定堆疊、網路卡,再傳送到另一台主機。
本書從OSI參考模型、TCP/IP、ARP、IP、交換器與跨網段通訊出發,逐步深入Linux核心的網路封包收發流程,再延伸到TCP、UDP、I/O模型、select、poll、epoll、Raw Socket、Unix Domain Socket、群播、廣播、零複製與百萬連線。 書中涵蓋網路位元組序、Socket位址、TCP狀態機、TFO、SYN Cookies、UDP可靠性、io_uring、Socket選項、檔案描述元傳遞,以及Reactor架構等實務技術,將網路協定、系統呼叫、Linux核心機制與伺服器架構串成完整脈絡。 對想從一般Socket程式設計進一步理解Linux網路底層、高效能I/O與高併發伺服器設計的開發者而言,這是一本兼具底層原理與實作細節的網路程式設計參考書。
本書共分14章 ◼第1章介紹OSI參考模型、TCP/IP、ARP、交換器與跨網段通訊 ◼第2章介紹Socket概念及Linux核心的網路封包收發流程 ◼第3章介紹網路位元組序、Socket位址、IP與網域名稱轉換及Socket核心函式 ◼第4章介紹TCP狀態機、TCP程式設計、TFO與SYN Flood ◼第5章介紹UDP程式設計、掉封包、順序錯亂與可靠性處理 ◼第6章介紹循環式伺服器、並行伺服器與I/O多工伺服器 ◼第7章介紹阻塞、非阻塞、訊號驅動、非同步I/O與io_uring ◼第8章介紹select、poll與epoll ◼第9章介紹Socket選項與sysctl ◼第10章介紹網路層與資料連結層Raw Socket,以及使用者空間TCP/IP實作 ◼第11章介紹Unix Domain Socket與檔案描述元傳遞 ◼第12章介紹群播、IGMP與廣播 ◼第13章介紹mmap、DMA、sendfile與splice等零複製技術 ◼第14章介紹單機百萬連線、系統限制調整與Reactor架構 |
作者簡介
| 袁菘華
具有十餘年Linux研發經驗,曾就職於世界500強企業和中國某通訊公司。擅長以圖文的形式寫作技術文章,將複雜的技術知識講得通俗易懂。個人微信公眾號「物聯網心球」深受廣大讀者的喜歡。 |
目錄
| ▍第1 章 電腦網路基礎
1.1 OSI 參考模型 1.2 TCP/IP 1.3 兩台主機直連 1.4 區域網路通訊 1.5 跨網段通訊 ▍第2 章 認識通訊端 2.1 從不同角度看 Socket 2.2 從核心看Linux 接收資料 2.3 從核心看Linux 傳送資料 2.4 常見 Socket 介紹 ▍第3 章 Socket 程式設計基礎 3.1 位元組序 3.2 Socket 位址 3.3 IP 位址轉換 3.4 網域名稱與 IP 位址的轉換 3.5 Socket核心函式 3.6 Socket 發送函式 3.7 Socket 接收函式 ▍第4 章 TCP Socket 程式設計 4.1 TCP 程式設計基礎 4.2 TCP Socket 程式設計基礎 4.3 優雅關閉 Socket 4.4 TCP 連線快速開啟 4.5 SYN Flood 攻擊 ▍第5 章 UDP Socket 程式設計 5.1 UDP 程式設計基礎 5.2 UDP 通訊端程式設計基礎 5.3 UDP 可靠性程式設計 ▍第6 章 伺服器模型 6.1 迴圈伺服器 6.2 並行伺服器 6.3 I/O 多工伺服器 6.4 本章小結 ▍第7 章 I/O 模型 7.1 同步I/O 和非同步I/O 的區別 7.2 阻塞I/O 7.3 非阻塞I/O 7.4 I/O 多工 7.5 訊號驅動I/O 7.6 非同步I/O ▍第8 章 I/O 多工 8.1 從核心看select 8.2 select 程式設計實戰 8.3 select 小結 8.4 從核心看poll 8.5 poll 程式實戰 8.6 poll 小結 8.7 從核心看epoll 8.8 epoll 程式設計實戰 8.9 epoll 小結 ▍第9 章 通訊端選項 9.1 通訊端選項簡介 9.2 setsockopt 和getsockopt 函式 9.3 sysctl 相關知識 9.4 常用的通訊端選項 ▍第10 章 原始通訊端 10.1 從核心看原始通訊端 10.2 網路層原始通訊端 10.3 鏈結層原始通訊端 10.4 使用者層TCP/IP 程式設計 ▍第11 章 網域通訊端 11.1 網域通訊端基礎 11.2 SOCK_STREAM 網域通訊端 11.3 SOCK_DGRAM 網域通訊端 11.4 socketpair 網域通訊端 11.5 傳遞檔案描述子 ▍第12 章 群播和廣播 12.1 群播 12.2 群播程式設計 12.3 廣播 12.4 廣播程式設計 ▍第13 章 零複製 13.1 傳統檔案傳輸 13.2 零複製技術 13.3 零複製網路程式設計 ▍第14 章 百萬高併發 14.1 開啟百萬個通訊端檔案 14.2 建立上百萬個網路連線 14.3 百萬高併發常見問題 14.4 Reactor 模型 |
序
| 前言
網路程式設計的應用領域非常廣泛,幾乎涵蓋所有與電腦和網際網路相關的產業,是每位開發者必備的技能。如果你對網路程式設計還不瞭解,那麼本書一定能幫你打開網路程式設計世界的大門。 寫作背景 網路程式設計技術是一項偏應用的技術。偏應用的技術有一個特點,就是需要學習的知識點特別多。然而,筆者認為,之所以要學習這麼多知識點,是因為開發者對技術的理解浮於表面,不懂得技術實現的底層原理。例如,當我們學習Linux 系統中的管道(用於行程間通訊)和sendfile(零拷貝技術,用於提高網路傳輸效率)兩個知識點時,需要花費一定的時間。如果你對底層技術很了解(核心原始碼),就會發現它們都是基於管道(環形緩衝區)實現的,這兩個看似毫無關係的知識點,底層實現原理居然是一樣的。理解了底層實現原理,再去學習這兩個知識點,就可以大大地提高學習效率。 對於Linux 開發者來說,最有價值的內容藏在Linux 的核心原始碼中。我們碰到的絕大部分Linux 技術問題能從Linux 核心原始碼中找到本質原因。然而,實際情況是,大部分Linux 開發者看不懂Linux 核心原始碼,並且認為學習Linux 核心原始碼的難度非常高。於是,筆者萌生了一個想法:結合Linux 核心原始碼分析,把技術知識的本質講解清楚。目前,市面上的大多數教材偏向於教你如何用,如函式介面如何使用、針對用戶端和伺服端如何程式設計等。如果只停留在使用層面,那麼當遇到問題或者需要對軟體架構進行最佳化時,往往無能為力。 我們再來聊聊為什麼選網路程式設計這個主題?主要有以下幾個原因:網路程式設計這項技術很重要,每位開發者都需要掌握;很多開發者的網路程式設計基礎比較薄弱,只會照搬別人的程式碼;筆者一直從事Linux 網路開發工作,對網路程式設計和Linux 核心網路協定堆疊的工作原理非常了解。 圖書定位 開始寫這本書之前,我對這本書就有了明確的定位。 首先,這本書必須具有稀缺性。市面上已經有了很多關於網路程式設計的書,為什麼還要寫一本呢?因為市面上還沒有一本「有趣」的網路程式設計書。這種趣味性主要體現在圖文並茂的表達方式,本書共有200 多張配圖,盡量做到每個重要的知識點都配一張圖。底層的技術往往是枯燥並且難以理解的,透過圖文方式講解可以降低大家的學習門檻,讓大家在輕鬆愉悅的氛圍中學會技術知識。另外,讀者的技術水準是參差不齊的,有些問題對於一些讀者很簡單,但是對於另一些讀者來說很難,以圖文方式講解能夠最大程度顧及所有的讀者。 其次,這本書的內容要過硬。沒有硬核的內容,再漂亮的圖文也只是花瓶。我希望讀者學完本書後,能夠真正理解網路程式設計,所以在圖書內容的選擇上一直要求很高。這種高要求體現在以下兩個方面。 • 內容全面:本書共14 章,覆蓋網路程式設計各個方面的知識點,內容由淺入深,層層遞進。全面的內容能夠幫助讀者建立完整的知識體系並加強系統性思維。相反,碎片化的知識並不會給讀者帶來多大的提升。 • 內容有深度:這種深度體現在把知識點講解透徹,把問題的本質呈現出來。如果筆者的資訊來源和讀者一樣,都是網路上的各種貼文、文章,或者是AI 給出的答案,那麼筆者輸出的內容只能是大眾化的,價值一定非常有限。筆者的資訊主要來自Linux 核心原始碼,這樣能夠最大程度保證資訊的準確性。同時,直接閱讀核心原始碼,能夠遮蔽垃圾資訊的干擾,直接揭露問題的本質。 本書能夠解決實際問題,每個知識點都配備範例(如範例程式碼、設定指令、完整解決方案等),這些範例都是完整的,可以直接拿來使用,以便於讀者進行除錯,透過實作加深對理論知識的理解。 最後,我希望本書能夠成為讀者的朋友,希望讀者能夠把這本書擺在書桌上最顯眼的位置,當碰到問題或者有空閒時,隨手拿起來翻一翻。 這本書能給你帶來什麼 學完這本書,讀者的網路程式設計水準一定會有很大程度的提升。這不僅能夠幫你解決實際問題,也會影響你的職業生涯。對於技術人員來說,技術水準不僅直接決定了薪資待遇,還是職位晉升的重要條件,學好網路程式設計會增加你求職成功的機率。 除了上述實際價值,這本書也會改變你對技術的看法。透過本書,你會發現,技術知識不是一堆難以理解的「八股文」,而是一個個鮮活的生命。學習技術知識就像學習藝術一樣,能夠讓我們的精神愉悅。 最後,我想對讀者說,從現在開始,一定要學會做內容輸出。我們可以嘗試輸出一些筆記、文章、影片等,輸出的過程其實也是學習的過程,這個過程會讓你看到自己的不足,倒逼自己進步。另外,持續輸出內容,也會讓你慢慢累積自己的影響力,讓你變得越來越有價值。 |




















