《Linux高性能服务器编程》学习笔记
《Linux高性能服務器編程》學習筆記
- Linux高性能服務器編程
- TCP/IP協議族
- TCP/IP協議族體系結構以及主要協議
- 數據鏈路層
- 網絡層
- 傳輸層
- 應用層
- 封裝
- 分用
- 測試網絡
- ARP協議工作原理
- 以太網ARP請求/應答報文詳解
- ARP高速緩存的查看和修改
- DNS工作原理
- DNS查詢和應答報文詳解
- IP協議詳解
- IP服務的特點
- IPv4頭部結構
- IPv4頭部結構
- 使用tcpdump觀察IPv4頭部結構
- IP分片
- IP路由
- IP模塊工作流程
- 路由機制
- 路由表更新
- IP轉發
- 重定向
- ICMP重定向報文
- IPv6頭部結構
- IPv6固定頭部結構
- IPv6擴展頭部
Linux高性能服務器編程
TCP/IP協議族
TCP/IP協議族體系結構以及主要協議
TCP/IP協議族是一個四層協議結構,自底向上分別是數據鏈路層,網絡層,傳輸層和應用層
數據鏈路層
-
功能:實現了網卡接口的網絡驅動程序,以處理數據在物理媒介(以太網、令牌環等)上的傳輸。
-
常用協議:
它們都實現了IP地址和機器物理地址(通常是MAC地址)之間的相互轉換。
-
ARP協議(Address Resolve Protocol,地址解析協議)
目標機器的IP地址 -> 物理地址
網絡層使用IP地址尋址一臺機器,數據鏈路層使用物理地址尋址一臺機器,因此網絡層必須將目標機器的IP地址轉化成物理地址,才能使用數據鏈路層提供的服務。
-
RARP協議(Reverse Address Resolve Protocol,逆地址解析協議)
用于網絡上的某些無盤工作站,因為缺乏存儲設備所以無盤工作站無法記住自己的IP地址,但可以使用網卡的物理地址來向網絡管理者(服務器或網絡管理軟件)查詢自身IP地址。
網絡管理者通常存有該網絡上所有機器的物理地址到IP地址的映射。
-
網絡層
-
功能:實現數據包的選錄和轉發
因為通信的兩臺主機并不是直接相連的,而是通過多個中間節點(路由器)連接的,網絡層就是要選擇這些中間節點,來確定兩臺主機之間的通信路徑。
網絡層對上層協議隱藏了網絡拓撲連接的細節,使得在傳輸層和應用層看來,通信雙方是直接相連的。
-
常用協議:
-
IP協議(Internet Protocol,因特網協議)
根據數據包的目的IP地址來決定如何投遞它。
使用逐跳(hop by hop)的方式確定通信路徑。
-
ICMP協議(Internet Control Message Protocol,因特網控制報文協議)
IP協議的重要補充,用于檢測網絡連接。
報文格式:
-
8位類型:區分報文類型
- 差錯報文:回應網絡錯誤(比如目標不可到達(類型值為3)、重定向(類型值為5))
- 查詢報文:查詢網絡信息(ping程序使用ICMP報文查看目標是否可到達(類型值為8))
-
8位代碼:進一步細分不同的條件
比如重定向報文,使用代碼值0代表對網絡重定向,代碼值1表示對主機重定向。
-
16位校驗和字段:對整個報文進行循環冗余校驗(CRC),以檢驗報文在傳輸過程是否損壞。
ICMP協議并非嚴格意義上的網絡層協議!因為它使用屬于同一層的IP協議提供的服務。
-
-
傳輸層
-
功能:為兩臺主機上的應用程序提供端到端通信。(只關心起始端和目的端,不在乎數據包的中轉過程)
-
常用協議:
-
TCP協議(Transmission Control Protocol,傳輸控制協議)
為應用層提供可靠的,面向連接的和基于流的服務。
使用超時重傳、數據確認等方式來確保數據包被正確地發送到目的端。
-
UDP協議(User Datagram Protocol,用戶數據報協議)
為應用層提供不可靠、無連接和基于數據報的服務。
-
SCTP協議(Stream Control Transmission Protocol,流控制傳輸協議)
較新,為了在因特網上傳輸電話信號設計的。
-
應用層
-
功能:處理應用程序的邏輯,比如文件傳輸、名稱查詢和網絡管理等。
-
常用協議:
-
ping
應用程序,不是協議。前文說過它可以利用ICMP報文檢測網絡連接,是調試網絡環境的必備工具。
-
telnet協議
一種遠程登錄協議,使我們可以在本地完成遠程任務。
-
OSPF協議(Open Shortest Path First,開放最短路徑優先)
動態路由更新協議,用于路由器之間的通信,以告知對方各自的路由信息。
-
DNS協議(Domain Name Service,域名服務)
提供機器域名到IP地址的轉換
應用層協議可能跳過傳輸層直接使用網絡層的服務(比如ping和OSPF),也可以既使用TCP服務又可以使用UDP服務,比如DNS協議。
-
封裝
應用程序數據在發送到物理網絡上之前,沿著協議棧從上往下依次傳遞。
封裝:每層協議都將在上層數據的基礎上加上自己的頭部信息(有時還有尾部信息),以實現該層的功能。
經過UDP封裝后的數據稱為UDP數據報(UDP diagram)。和TCP對應用程序數據的封裝不同給的是,UDP無須為應用層數據保存副本,因為提供的服務是不可靠的。
當UDP數據報發送成功后,UDP內核緩沖區中的數據報就被丟棄了。
如果需要重發數據報的話,應用程序需要重新從用戶空間將改數據報拷貝到UDP內核發送緩沖區中。
經過IP封裝后的數據稱為IP數據報(IP diagram),也包括頭部信息和數據部分,數據部分就是一個TCP報文段、UDP數據報或者ICMP報文。
經過數據鏈路層封裝的數據稱為幀(frame)。傳輸媒介不同,幀的類型也不同,比如以太網上傳輸的是以太網幀,令牌環網絡上傳輸的令牌環幀(token ring frame)。
以以太網幀為例,
分用
分用:當幀到達目的主機的時候,將沿著協議棧自底向上傳遞。各層協議依次處理幀中本層負責的頭部數據,以獲得所需的信息,并最終將處理后的幀交給目標應用程序。
是依靠頭部信息中的類型字段實現的。
-
因為IP協議、ARP協議、RARP協議都使用幀傳輸數據,所以幀的頭部需要提供某個字段(具體情況取決于幀的類型)來區分它們。
以以太網幀為例,使用2字節的類型字段來標識上層協議。
- 0x800 -> IP 數據表
- 0x806 -> ARP請求或應答報文
- 0x835 -> RARP請求或應答報文
-
同樣,ICMP協議、TCP協議、UDP協議都是用IP協議,所以IP數據報的頭部都采用16位協議字段來區分它們。
-
TCP報文段和UDP數據報則通過其頭部16位的端口號(port number)字段來區分上層應用程序。
幀通過上述分用步驟后,最終將封裝前的原始數據送至目標服務。這樣,在頂層目標服務看來,封裝和分用似乎沒有發生過。
測試網絡
分析ARP協議、IP協議、ICMP協議、TCP協議和DNS協議。
通過抓取網絡上的以太網幀,查看其中的以太網幀頭部、IP數據報頭部、TCP報文段頭部信息,以獲得網絡通信的細節。
ARP協議工作原理
APR協議能實現任意網絡層地址到任意物理地址的轉換,這里僅討論IP地址到MAC地址的轉換。
-
工作原理:
主機向自己所在的網絡廣播一個ARP請求,該請求包含目標機器的網絡地址。此網絡上的其他機器都會收到這個請求,但只有被請求的目標機器會回應一個ARP應答,其中包含自己的物理地址。
以太網ARP請求/應答報文詳解
- 硬件類型:物理地址的類型,值為1表示MAC地址
- 協議類型:要映射的協議地址類型,0x800表示IP地址
- 硬件地址長度和協議地址長度:單位是字節,MAC地址長度為6字節,IP地址長度為4字節
- 操作:指出4種操作類型
- 1 :ARP請求
- 2 :ARP應答
- 3 :RARP請求
- 4 :RARP應答
- 最后四個字段指定通信雙方的以太網地址和IP地址
- 發送端填充除目的端以太網地址外的其他3個字段,構建ARP請求并發送。
- 接收端發現該請求的目的端IP地址是自己,就把自己的以太網地址填進去,然后交換兩個目的端和兩個發送端地址,構建ARP應答并返回。
上圖中顯示ARP請求/應答報文長度是28字節,加上以太網幀頭部和尾部的18字節一共46字節,但有的實現要求以太網幀數據部分長度至少46字節,此時ARP請求/應答報文將增加一些填充字節。在這種情況下,一個攜帶ARP請求/應答報文的以太網幀長度為64字節。
ARP高速緩存的查看和修改
ARP維護一個高速緩存,其中包含經常訪問(比如網關地址)或最近訪問的機器的IP地址到物理地址的映射,避免重復的ARP請求,提高發送數據包的速度。
Linux下使用arp命令來查看和修改ARP高速緩存
- 查看:arp -a
- 刪除:arp -d [IP address]
- 添加:arp -s [IP address] [MAC address]
DNS工作原理
因為我們平時都是用域名來訪問機器而非IP地址,比如訪問網上的各種網站。
將機器的域名轉換成IP地址:需要使用域名查詢服務
域名查詢服務有很多方式(NIS網絡信息服務、DNS和本地靜態文件等)。這里主要討論DNS
DNS查詢和應答報文詳解
DNS是一套分布式的域名服務系統。
每個DNS服務器上都存放著大量的機器名和IP地址的映射,并且是動態更新的。
DNS查詢和應答報文的格式如下:
-
**16位標識:**標記一對DNS查詢和應答,以區分一個DNS應答是哪個DNS查詢的回應。
-
**16位標志:**協商具體的通信方式和反饋通信狀態。細節如下圖所示:
-
QR:查詢/應答標志。0表示查詢報文,1表示應答報文
-
opcode:定義查詢和應答的類型。0表示標準查詢,1表示反向查詢,2表示請求服務器狀態
-
AA:授權應答標志,僅由應答報文使用。1表示域名服務器是授權服務器。
-
TC:截斷標志
-
RD:遞歸查詢標志
-
RA:允許遞歸標志
-
zero:這三位未用,全部設置為0
-
rcode:4位返回碼,表示應答的狀態,常用值有0(無錯誤)和3(域名不存在)
-
接下來的四個字段(16位問題個數、16位應答資源記錄個數、16位授權資源記錄數目、16位額外資源記錄數目)分別指出DNS報文的最后4個字段的資源記錄數目。
- 查詢報文:包含1個查詢問題,其他三個都是0
- 應答報文:應答資源記錄數至少為1
-
查詢問題
- 格式:
- 查詢名:以一定的格式封裝了要查詢的主機域名
- 16位查詢類型:如何執行查詢操作(比如獲取目標主機的IP地址、獲得目標主機的別名、反向查詢)
- 16位查詢類通常為1,表示獲取因特網地址(IP地址)
-
應答、授權、額外信息
都使用資源記錄格式
IP協議詳解
IP服務的特點
-
IP協議為上層協議提供無狀態、無連接、不可靠的服務。
-
無狀態:IP通信雙方不同步傳輸數據的狀態信息,因此所有IP數據報的發送、傳輸和接收都是相互獨立、沒有上下文關系的。
-
最大的缺點:無法處理亂序和重復的IP數據報,接收端的IP模塊無法檢測到亂序和重復,因為沒有上下文關系。
上層收到的數據可能是亂序、重復的。
TCP協議能夠自己處理亂序的、重復的報文段,它遞交給上層協議的內容是有序、正確的。
-
優點:簡單、高效,無須為保持通信狀態而分配內核資源和攜帶狀態信息
(UDP協議和HTTP協議都是無狀態協議)
-
-
無連接:IP通信雙方都不長久地維持對方的任何信息。所以上層協議每次發送數據的時候,都必須明確指定對方的IP地址。
-
**不可靠:**指IP協議不能保證IP數據報準確地到達接收端。所以使用IP服務的上層協議(比如TCP)需要自己實現數據確認、超時重傳等機制來達到可靠傳輸的目的。
-
IPv4頭部結構
IPv4頭部結構
-
4位版本號:指定IP協議的版本,對IPv4來說,其值為4。
-
4位頭部長度:該IP頭部有多少個32bit字(4字節),因為4位最大能表示15,所以IP頭部最長是60字節。
-
8位服務類型:包括一個3位的優先權字段,4位的TOS字段和1位保留字段(置零)
-
4位TOS字段:最小延時、最大吞吐量、最高可靠性、最小費用。最多有一個能置1。
比如ssh和telnet需要最小延時,文件傳輸程序ftp需要最大吞吐量
-
-
16位總長度:整個IP數據報的長度(字節),最大長度為(2^16 - 1)字節,但由于MTU限制,長度超過MTU的數據報都會被分片傳輸。接下來的3個字段描述如何實現分片。
-
16位標識:唯一標識主機發送的每一個數據報。
-
3位標志字段:
- 第一位保留
- 第二位“禁止分片“,設置則不對數據報進行分片,但如果IP數據報長度超過MTU的話就丟棄數據報并返回ICMP差錯報文。
- 第三位”更多分片“,除了數據報最后一個分片外,其他分片都置一
-
13位分片偏移
-
8位生存時間:數據報到達目的地之前允許經過的路由器跳數。防止數據報陷入路由循環。
-
8位協議:區分上層協議。
-
16位頭部校驗和:發送端填充,接收端對其使用CRC算法來檢驗(僅)頭部是否損壞
-
32位源端IP地址和目的端IP地址:標識數據報的發送和接收端
-
選項字段:
- 記錄路由(傳遞路徑)
- 時間戳(數據報在各個路由器被轉發的時間)
- 松散源路由選擇(發送過程必須經過其中所有的路由器)
- 嚴格源路由選擇(只能經過被指定的路由器)
使用tcpdump觀察IPv4頭部結構
IP分片
-
當IP數據報的長度超過幀的MTU時,將被分片傳輸。
可能發生在發送端、中轉路由器上,但在最終的目標機器上才會被重新組裝。
-
IP頭部的數據報標識、標志、分片偏移為IP的分片和重組提供足夠的信息。
因為IP數據報的每個分片都具有自己的IP頭部,具有相同的標識值,不同給的片偏移,除了最后一個分片外都有MF標識
-
以太網幀的MTU是1500字節,IP頭部占20字節,所以數據部分最多是1480字節。如果要用IP數據報封裝一個1481字節的ICMP報文(包括8字節的ICMP頭部,所以其數據部分長度為1473字節),則該數據報在使用以太網幀傳輸時必須要被分片。
IP分片的標識符都是61197,說明是同一個IP數據報的分片。
第一個分片的片偏移值為0,第二個是1480。第二個分片的片偏移值是第一個分片的ICMP報文長度。
第一個分片設置了MF標志(flags [+])以表示還有后續分片,第二個是none表示是最后一個分片,
兩個分片的長度分別為1500和21字節,和圖中描述一致。
IP路由
IP協議的一個核心任務是數據報的路由,即決定發送數據報到目標機器的路徑。
IP模塊工作流程
從右往左:
-
IP模塊接收到來自數據鏈路層的IP數據報時,先對該數據報的頭部做CRC校驗,確認無誤后分析頭部具體信息
-
如果設置了源站選路選項(松散源路由選擇或嚴格源路由選擇),則IP模塊調用數據報轉發子模塊來處理該數據報
- 如果數據報的頭部中目標IP地址是本機中的某個IP地址/廣播地址,則IP模塊就根據數據報的協議字段來決定派發給哪個上層應用
- 如果IP模塊發現這個數據報不是發送給本機的,則也調用數據報轉發子模塊來處理
-
數據報轉發子模塊先檢測系統是否允許轉發
- 不允許:丟棄
- 允許:對數據報進行一些操作,然后將它交給IP數據報輸出子模塊
-
計算下一跳路由即IP路由過程:IP數據報應該發送到哪個下一跳路由(或目標機器),以及經過哪個網卡來發送
核心:路由表,按照數據報的目標IP地址分類,同一類型的IP數據報將被發往相同的下一跳路由器。
-
IP輸出隊列:存放的是所有等待發送的IP數據報,其中除需要轉發的IP數據報外,還包括封裝了本機上層數據的IP數據報。
路由機制
要研究IP路由機制,需要先了解路由表的內容,可以用route命令或netstat命令查看路由表。
- IP的路由機制:
- 查找路由表中和數據報的目標IP地址完全匹配的主機IP地址
- 如果找到,就使用該路由項
- 沒找到跳步驟2
- 查找路由表中和數據報的目標IP地址具有相同網路IP的網絡IP地址(Gateway項)
- 如果找到,就使用該路由項
- 沒找到則轉步驟3
- 選擇默認路由項:這通常意味著數據報的下一跳路是網關
路由表更新
route命令可以修改路由表,比如:
- 第一行:添加主機192.168.1.109(kongming20)對應的路由項,所有從主機發送到該地址的IP數據報將通過網卡eth0直接發送到目標機器的接收網卡
- 第二行:刪除網絡192.168.1.0對應的路由項
- 第三行:刪除默認路由項,后果是無法訪問因特網
- 第四行:重新設置默認路由項,這次的網關是機器192.168.1.109而不是能直接訪問因特網的路由器。
經過修改后路由表如下:
IP轉發
對于允許IP數據報轉發的系統,數據報轉發子模塊將對期望轉發的數據報執行如下操作:
重定向
–>> ICMP重定向報文也能用于更新路由表
ICMP重定向報文
- ICMP重定向類型值為5
- 代碼有四個可選,區分不同的重定向,這里我們只討論主機重定向(1)
數據部分含義很明確,給接收方提供如下兩個信息:
接收主機可以根據這兩個信息斷定重定向的IP數據報應該使用哪個路由器轉發,并更新路由表(路由表緩沖,而不是直接更改路由表)
一般來說,主機只能接收ICMP重定向報文,路由器只能發送ICMP重定向報文。
IPv6頭部結構
- 解決了IPv4地址不夠用的問題
- 增加了多播和流的功能
- 引入自動配置功能
- 增加專門的網絡安全功能
IPv6固定頭部結構
- 4位版本號:指定IP協議的版本,IPv6是6
- 8位通信類型:數據流通信類型或優先級
- 20位流標簽:(新)用于某些對連接的服務質量有特殊要求的通信,比如音頻或視頻
- 16位凈荷長度:IPv6擴展頭部和應用程序數據長度之和,不包括固定頭部長度
- 8位下一個包頭:緊跟固定頭部后的包頭類型,如擴展頭或上層協議頭(TCP、UDP、ICMP)
- 8位跳數限制:和TTL含義一樣
16字節的IPv6地址用十六進制字符串表示,比如
可以用“零壓縮法”來簡寫,也就是省略連續的、全零的組。比如:
不過零壓縮法對一個地址只能用一次,否則我們無法計算每個::之間省略了多少個全零組。
IPv6擴展頭部
長度可以是0或者多個擴展頭部。
IPv6并不是IPv4的拓展,而是完全獨立的協議,用以太網幀封裝的數據報具有不同的類型值。IPv6:0x86dd, IPv4: 0x800
總結
以上是生活随笔為你收集整理的《Linux高性能服务器编程》学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机基础】存储器层次 Memory
- 下一篇: 【数据结构】排序算法及优化整理