《Linux高性能服務器編程》學習總結(一)——TCP/IP協議族


  在學長的推薦下,我用了大約半個月的時間學習了游雙老師的《Linux高性能服務器編程》一書。通讀此書,感覺這本書在知識廣度上已經很足,對網絡協議與編程方面的基礎知識棧都有講解,語言也比較通俗易懂,確是一本對於有一定網絡基礎也想繼續深入學習的同學的好書,但由於篇幅有限,對於部分知識點的講解沒有深入。

  本書共分為三大部分:第1章到第4章主要講了常用的TCP/IP協議,以及其通信過程,為后面的網絡編程打好基礎;第5到第15章共用了11章的篇幅講述了高性能服務器的各個主要方面,其中分為了四個小部分,API介紹、高性能服務器框架、I/O單元和邏輯單元;第16章到第17章講如何從系統的角度優化和檢測服務器性能。

  下面我就逐章總結一下本書的所有重點知識。

第一章      TCP/IP協議族

  TCP/IP協議族是目前世界上使用最廣,也是最重要的協議系統,其自低而上分別是:數據鏈路層,網絡層,傳輸層和應用層。

  數據鏈路層上有兩個常用的協議,ARP協議與RARP協議,其中RARP協議一般僅用於網絡上的無盤工作站,由於沒有存儲介質,無盤工作站無法記住自己的IP地址,所以可以利用網卡上的物理地址向服務器查詢自身的IP地址。

  ARP協議最為重要,他能實現任意網絡層地址到任意物理地址的轉換,不過一般只是IP地址到MAC地址的轉換。其工作原理是:主機向自己所在的網絡廣播一個ARP請求,該請求包含目標機器的網絡地址,而當其余主機收到這個請求時,只有被請求的目標主機會回應一個ARP應答,其中包含了自己的物理地址。

  ARP請求/應答報文內容共28字節,加上以太網首部14字節和尾部CRC4字節,共46字節。但是在以太網傳播的報文段最低為64字節,所以需要在幀的末尾補0。

 

 

  其中,硬件類型值為1,表示MAC地址,協議類型表示要映射的協議地址類型,值為0x0800,表示IP地址,操作字段即op字段有四種取值,1為ARP請求,2位ARP應答,3為RARP請求,4為RAPR應答。

  網絡層是整個TCP/IP協議棧中承上啟下的一層,它實現了數據包的選路和轉發。在廣域網中,相互通信的兩台主機之間一般並沒有直接連接,而是通過多個中間的路由器相連,所以網絡層的任務就是選擇這些中間點來確定通信路徑,同時,網絡層對於上層是透明的,即在傳輸層上來看,通信雙方就是直接相連的。

  在網絡層上,最核心的協議就是IP協議,在第二章中會詳細講解。此外,還有ICMP協議,他是IP協議的重要補充,主要用於網絡連接的檢測,分為兩大類,差錯報文和查詢報文。其首部包括1字節的類型,1字節的代碼,2字節的檢驗和,其余為報文內容,根據首部的不同而異。

  傳輸層為應用程序封裝了一條端到端的邏輯通信鏈路,主要包含三個協議:TCP、UDP和SCTP,一般我們只討論前兩種。TCP協議為應用層提供可靠的、面向連接的和基於流的服務,TCP協議使用了超時重傳、數據確認等方式來確保數據包被正確地發送到目的端。TCP是基於流的,基於流的數據沒有邊界限制,它源源不斷地從通信的一段流入另一端,發送端可以逐個字節地向數據流中寫入數據,接收端也可以逐個字節地讀出。而UDP協議則恰恰相反,他是無連接,不可靠和基於數據報的服務,這意味着UDP協議無法保證數據從發送端正確地傳送到目的端,如果在中途丟失,則UDP只是簡單地通知應用程序發送失敗,因此,使用UDP的應用程序通常要自己處理數據確認、超時重傳等邏輯。UDP是基於數據報的服務,每個UDP數據報都有一個長度,接收端必須以該長度為最小單位將其所有內容一次性讀出,否則數據將被截斷。

  應用層上就應該處理應用程序的邏輯,其余三層在內核空間實現,而應用層需要在用戶空間實現。應用層的協議非常多,比如:telnet、http、DNS、OSPF等。

  DNS是一套分布式的域名系統,我們平時在使用域名訪問機器時,其實本質都是訪問對方主機在網絡上對應的唯一的IP地址,但是為什么我們使用域名也可以訪問呢。我們在輸入域名的同時,主機會向DNS服務器發送一個DNS請求報文,意思就是詢問對方這個域名對應的IP地址是多少,而DNS服務器是都存放着大量機器名和IP地址的映射,而且是動態更新的,所以主機由此知道目的主機的IP地址。對於DNS解析,一共有兩種查詢方式,迭代查詢和遞歸查詢,這兩者的區別是:迭代查詢是主機A向服務器B發起DNS查詢請求,但是服務器B不知道這個域名的IP地址,則他向主機A返回另外一個服務器C的IP地址,讓主機A繼續去向服務器C查詢,也就是說在這種查詢模式下,服務器是不負責任的,都是由主機發起查詢請求;而遞歸查詢不同,若服務器B是遞歸查詢模式,那么對於主機A的查詢請求,它會全權代理,如果自己不知道目的主機的IP地址,它會繼續向上級DNS服務器查詢,直到查到了IP地址再將其返回給主機A。在Linux中,DNS服務器的地址在/etc/resolv.conf文件中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM