計算機網絡【3】網絡層

主要任務時把分組從源端發送到目的端,為分組交換網上的不同主機提供服務。網絡層傳輸單位是數據報
功能:

  • 路由選擇與分組轉發(最佳路徑 )
  • 異構網絡互聯
  • 擁塞控制

數據交換方式

  • 電路交換:通信時延小、有序傳輸、沒有沖突、實時性強、獨占資源
    建立連接時間長、線路獨占,使用效率低,靈活性差,沒有差錯控制能力
  • 報文交換
    在這里插入圖片描述
  • 分組交換

在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述

IP數據報格式

在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述片偏移量=首地址/8
總長度單位是1B
片偏移量單位是8B
首部長度單位是4B

在這里插入圖片描述MTU:數據鏈路層可封裝數據的最大傳送單元。在以太網中MTU為1500字節

IP地址

分類的IP地址

全世界唯一的32位/4字節標識符,標識路由器主機的接口
IP地址 := (網絡號,主機號) 點分十進制
路由器不同的接口有不同的IP地址
在這里插入圖片描述在這里插入圖片描述A類網絡減去網絡號全0(特殊地址)和全1(127,環回地址)
B類和C類都要減去網絡號全0,不清楚為什么
最大主機數減去全0和全1.

特殊地址
在這里插入圖片描述所謂的環回地址指的是該數據報不會實際發送出去,多用于測試。實際上就是自己。
在這里插入圖片描述私有IP地址不能在廣域網中使用。

網絡地址轉換(NAT)

路由器對目的地址是私有IP地址的數據報一律不進行轉發
網絡地址轉換NAT(Network Address Translation):在專用網連接到因特網的路由器上安裝NAT軟件,安裝了NAT軟件的路由器叫NAT路由器,它至少有一個有效的外部全球IP地址

局域網中的計算機先將數據發送給NAT路由器,NAT路由器再以自己的IP發送給外網
外網會將信息發送給NAT路由器,NAT路由器再根據NAT轉換表發送給應該接收的電腦。
在這里插入圖片描述
將源IP和端口號(傳輸層概念)按照NAT轉換表轉換為可以在外網發送的源IP和端口號。同理,接收外部信息的時候也會首先發送給NAT路由器,再按照NAT路由器將目標IP和端口號更換為局域網中的私有IP和端口號

NAT轉換表中LAN端有不同的IP地址,WAN端根據端口號對應不同的IP地址。

子網劃分和子網掩碼

分類IP地址的弱點:

  1. IP地址空間的利用率有時很低
  2. 兩級IP地址不夠靈活

將主機號拆分為子網號和主機號,當某些單位劃分子網后,對外仍表現為一個網絡,即本單位外的網絡看不見本單位內子網的劃分。
在這里插入圖片描述主機號至少要留下兩位
如果只剩下一位,那么主機號要么全0要么全1,這都是不允許的。
子網號能夠全0全1要看情況(一般子網劃分不允許,只有CIDR中可以)

兩級IP地址的子網掩碼根據類別,比如B類的子網掩碼就是255.255.0.0
三級IP地址的子網掩碼也很簡單,就是不變的地方都是1
子網網絡地址:子網掩碼與IP地址逐位相與
在這里插入圖片描述
路由表中應該包含:

  1. 目的網絡地址
  2. 目的網絡子網掩碼
  3. 下一跳地址

直接交付:路由器直接交給連接的子網
間接交付:路由器需要傳給下一跳

路由器轉發分組的算法:

  1. 提取目的IP地址
  2. 是否直接交付
  3. 特定主機路由
  4. 檢測路由表中有無路徑
  5. 默認路由0.0.0.0
  6. TTL耗盡,丟棄,報告轉發分組出錯

無分類編制CIDR

為了解決IP地址快要耗盡的情況
也叫做無分類域間路由選擇CIDR

  1. 消除了傳統A類、B類和C類地址以及劃分子網的概念
    在這里插入圖片描述
    CIDR記法:IP地址后加上/,然后寫上網絡前綴(可以任意長度)的位數
  2. 融合子網地址和子網掩碼,方便子網劃分
    CIDR地址塊:CIDR把網絡前綴都相同的連續的IP地址組成一個CIDR地址塊
    同前面一樣,主機部分最多是所有情況-2(不能全0和全1)
    如果給CIDR繼續劃分子網,子網號是可以全0、全1的。

地址塊記法:最小地址
地址掩碼(子網掩碼):網絡前綴部分全都是1
在這里插入圖片描述

構成超網

將多個子網聚合成一個較大的子網,叫做構成超網,或者路由聚合。
方法:將路由前綴縮短
用相同的部分當作前綴

最長前綴匹配

使用CIDR時,查找路由表可能得到幾個匹配結果,應該選擇具有最長網絡前綴的路由。(前綴越長,地址塊越小,路由越具體)。
在這里插入圖片描述

ARP協議

每個主機和路由器都有ARP高速緩存:IP地址和MAC地址的映射(只存同一個局域網內部的
在這里插入圖片描述
首先檢查ARP高速緩存查新IP地址對應的MAC地址,如果沒有就發出ARP廣播。
ARP緩存每10-20min更新一次。
廣播ARP請求分組:
在這里插入圖片描述
目的地址為全1說明是廣播分組(幀)
如果是同一個網段內的:單播ARP響應分組
在這里插入圖片描述
如果發現不是一個網段的(子網掩碼和目標IP相與,發現與自己的網絡部分不同):先請求到網關的MAC地址,然后發送給網關,然后在路由器之間傳遞,知道到達正確的網段,然后路由器再發出廣播詢問MAC地址,得到回應以后直接發給目標主機。
在這里插入圖片描述
在數據鏈路層上傳送數據必須使用MAC地址
ARP協議4中典型情況:

  1. 主機A發給本網絡上的主機B:用ARP找到主機B的硬件地址
  2. 主機A發給另一網絡上的主機B:用ARP找到本網絡上一個路由器(網關)的硬件地址
  3. 路由器發給本網絡的主機A:用ARP找到主機A的硬件地址
  4. 路由器發送給另一網絡的主機B:用ARP找到本網絡上的一個路由器的硬件地址

ARP緩存10-20min更新一次。

ARP是用來獲取本網絡對應IP的MAC地址
ARP協議是自動進行的,主機是無法意識到的。

例題:主機發送IP數據報給主機B,經過了5個路由器,這個過程使用了6次ARP協議

DHCP協議

主機如何獲得IP地址:

  • 靜態配置:由管理員配置IP地址、子網掩碼、默認網關
  • 動態配置:DHCP服務器動態給主機分配IP地址

動態主機配置協議DHCP是應用層協議,使用客戶/服務器方式,客戶端和服務端通過廣播方式進行交互,基于UDP

DHCP提供即插即用聯網的機制,主機可以從服務器動態獲取IP地址、子網掩碼、默認網關、DNS服務器名稱與IP地址,允許地址重用,支持移動網絡加入網絡,支持在用地址續租

工作流程:

  1. 主機廣播DHCP發現報文(試圖找到網絡中的服務器,服務器獲得一個IP地址)
  2. DHCP服務器廣播DHCP提供報文(服務器擬分配給主機一個IP地址及相關配置,先到先得)
  3. 主機廣播DHCP請求報文(主機向服務器請求提供IP地址)
  4. DHCP服務器廣播DHCP確認報文(正式將IP地址分配給主機)

發送的都是廣播報文,第三四步之所以在已經確定DHCP服務器和主機IP的情況下仍然使用廣播,是要告訴其他DHCP服務器該主機使用一個IP地址,其他DHCP服務器不用再管,而且不能夠再使用這個IP地址

ICMP協議

為了更有效地轉發IP數據報和提高支付成功的機會
差錯(或者異常)報告
在這里插入圖片描述

ICMP差錯報告報文

  1. 終點不可達:當路由器或者主機不能交付數據時就像遠點發送源點不可達報文。(無法交付)
  2. 源點抑制:當路由器或者主機由于擁塞而丟棄數據報時,就向源點發送源點抑制報文,使得原點知道應當把數據報的發送速率放慢(擁塞丟數據)(現在不會用到)
  3. 時間超過:當路由器收到生存時間TTL=0的數據報時,除丟棄該數據報外,還要向源點發送時間超過報文。當終點在預先規定的時間內不能收到一個數據報的全部數據報片時,就把已經收到的數據報片都丟棄,并向源點發送時間超過報文(TTL=0或者數據報殘缺)
  4. 參數問題:當路由器或者目的主機收到的數據報的首部中有的字段的值不正確時就丟棄該數據報,并向源點發送數據問題報文(首部字段有問題)
  5. 改變路由(重定向):路由器把改變路由報文發送給主機,讓主機知道下次應將數據報發送給另外的路由器(可通過更好的路由)。
    在這里插入圖片描述
    不應該發送ICMP差錯報文的情況:
  6. 對ICMP差錯報告報文不再發送ICMP差錯報告報文
  7. 對第一個分片的數據報片的所有后續數據報片都不發送ICMP差錯報告報文
  8. 對具有組播地址的數據報都不發送ICMP差錯報告報文
  9. 對具有特殊地址(127.0.0.00.0.0.0)數據報不發送ICMP差錯報告報文

ICMP詢問報文

  1. 回送請求和回答報文:主機或路由器向特定目的主機發出詢問,收到此報文的主機必須給源主機或者路由器發送ICMP回答報文。測試目的站是否可達以及了解其相關狀態ping
  2. 時間戳請求和回答報文:請求某個主機或路由器回答當前的時間和日期。用來進行時鐘同步或者測量時間。
  3. 掩碼地址請求和回答報文(不再使用)
  4. 路由器詢問和通告報文(不再使用)

ICMP的應用

PING:測試兩個主機之間的連通性,使用了ICMP回送請求和回答報文
Traceroute 跟蹤一個分組從源點到終點的路徑,使用了ICMP時間超過差錯報告報文
Traceroute原理:發送一系列TTL從1遞增的IP報,然后讓不同距離的路由器都發送錯誤報告

IPv6

解決地址耗盡問題,改進首部格式(快速處理/轉發數據報),支持QoS(Quality of Service,服務質量)
QoS(Quality of Service服務質量):指一個網絡能夠利用各種基礎技術,為指定的網絡通信提供更好的服務能力,時網絡的一種安全機制,是用來解決網絡延遲和阻塞等問題的一種技術。
在這里插入圖片描述在這里插入圖片描述對比IPv4和IPv6:

  1. IPv6將地址從32位(4B)擴大到128位(16B),更大的地址空間
  2. IPv6將IPv4的校驗和字段徹底移除,減少每條的處理時間
  3. IPv6將IPv4的可選字段移出首部,變成了擴展首部,成為靈活的首部格式。路由器通常不對擴展首部進行檢查,大大調高了路由器的處理效率
  4. IPv6支持即插即用(自動配置),不需要DHCP協議。
  5. IPv6的首部長度必須時8B的整數倍,IPv4首部時4B的整數倍。
  6. IPv6只能在主機處分片,IPv4可以在路由器和主機處分片
  7. IPv6使用ICMPv6:附加報文類型:分組過大
  8. IPv6支持資源的預分配,支持實時視像要求
  9. IPv6取消了協議字段,改成下一個首部字段
  10. IPv6取消了總長度字段,改用有效載荷長度字段
  11. IPv6取消了服務類型字段

IPv6地址標識形式:冒號十六進制記法,每四個十六進制位放在一起
如果每個分組前面有多個0,可以刪去
在這里插入圖片描述IPv6基本地址類型:

  • 單播:一對一通信,可作為源地址+目的地址
  • 多播:一對多通信,可作為目的地址。IPv6中沒有廣播地址,用多播實現
  • 任播:一對多中的一個(最近的)通信,可作為目的地址

IPv6向IPv4過渡

  • 雙棧協議:雙協議棧技術就是在一臺設備上同時啟用IPv4協議棧和IPv6協議棧。這樣的話,這臺設備既能夠和IPv4網絡通信,又能夠和IPv6網絡通信。如果這臺設備時一個路由器,那么這臺路由器的不同接口上,分別配置了IPv4和IPv6地址,并很可能分別連接了IPv4網絡和IPv6網絡。如果這臺設備是一個計算機,那么它將同時擁有IPv4和IPv6地址,并具備同時處理這兩個協議地址的功能。
  • 隧道技術:隧道協議將其他協議的數據幀或包重新封裝然后通過隧道發送(IPv6偽裝成IPv4等等)

路由算法

靜態路由算法(非自適應路由算法):管理員手工配置路由信息。
優點:簡答可靠,在負荷穩定、拓撲變化不大的網絡中運行效果很好,廣泛應用于高端安全性的軍事網絡和較小的商業網絡
缺點:路由更新慢,不適用大型網絡
動態路由算法(自適應路由算法):路由器間彼此交換信息,按照路由算法優化路由表項。
路由更新快,使用大型網絡,及時響應鏈路費用或網絡拓撲變化。
缺點:增加網絡負擔、算法復雜

在這里插入圖片描述在這里插入圖片描述

動態路由算法

全局性:所有路由器掌握完整的網絡拓撲和鏈路費用信息(OSPF)
分散性:路由器只掌握物理相連的鄰居及鏈路費用(RIP)

分層次的路由選擇協議:因為因特網規模很大;許多單位不想讓外界知道自己的路由選擇協議,但是還想連入因特網,所以產生了自治系統AS

自治系統AS:在單一的技術管理下的一組路由器,而這些路由器使用一種AS內部的路由選擇協議和共同的度量以確定分組在該AS內的路由,同時還使用一種AS之間的路由協議以確定在AS之間的路由。
一個自治系統AS內的所有網絡都屬于一個行政單位來管轄,一個自治系統的所有路由器在本自治系統內都必須連通

  • 內部網關協議IGP:一個AS內使用的RIP、OSPF
  • 外部網關協議EGP:AS之間使用的BGP

RIP協議

RIP是一種分布式的基于距離向量的路由選擇協議,是因特網的協議標準,最大的優點是簡單
RIP協議要求網絡中的每一個路由器都維護從他自己到其他沒有給目的網絡的唯一最佳距離記錄(即一組距離)

最佳距離:經過的路由器跳數最少

直接交付的距離(跳數)為1,最多包含15個路由器,因此距離16標識網絡不可到達

RIP協議只適用于小網絡

  1. 僅僅和相鄰路由器交換信息
  2. 路由器交換的信息是自己的路由表
  3. 每30S交換一次路由信息,如果從超過180S沒有收到鄰居路由器的通告,則判定鄰居沒了,并更新自己的路由表。
    剛開始交換直接連接的網絡,距離為1.

經過若干次更新后,所有路由器都會知道到達本自治系統任何一個網絡的最短距離和下一跳路由器的地址,即“收斂”。

RIP報文:包含路由表

距離向量算法
  1. 修改相鄰路由器發來的RIP報文中的所有表項:對地址為x的相鄰路由器發來的RIP報文,修改報文,把下一跳的地址改為x,并把距離+1.
  2. 對修改后的RIP報文中的每一個項目:
  • 如果沒有目的IP,則填入路由表;
  • 如果有目的IP,且下一跳是同一個路由器,則更新(有可能距離不一樣);如果下一跳和自己的路由表中的不是同一個路由器,且距離比表中的更近,則更新為距離最近的
  1. 如果180S還沒有收到相鄰路由器x的更新路由表,則把x設置為不可達路由器(把距離為16)
    在這里插入圖片描述
    在這里插入圖片描述
    RIP是應用層協議,使用UDP數據報傳輸
    RIP的特點:當網絡出現故障的時候,要經過比較長的時間(數分鐘)才能將此信息傳送給所有的路由器

壞消息傳的慢(慢收斂),好消息傳的快

OSPF協議

開放最短路徑優先OSPF協議:開放標明OSPF協議不是受一家廠商控制的,而是公開發表的;“最短路徑優先”是因為使用了Dijkstra提出的最短路徑算法SPF

主要特征:使用分布式的鏈路狀態協議

  1. 使用洪泛法向自治系統內所有路由器發送信息,即路由器通過輸出端口向所有相鄰的路由器發送信息,而每一個相鄰路由器又再次將此信息發往其所有的相鄰路由器。(相當于廣播)
  2. 發送的信息就是與本路由器相鄰 的所有路由器的鏈路狀態(本路由器和哪些路由器相鄰,以及該鏈路的度量:費用、距離、時延、帶寬)
  3. 只有當鏈路狀態發生變化時,路由器才向所有路由器洪泛發送此信息

最后,所有路由器都能建立 一個鏈路狀態數據庫,即全網拓撲圖。

鏈路狀態路由算法
  1. 每個路由器發現他的鄰居節點【HELLO問候分組】,并了解鄰居節點的網絡地址。(每隔10S)
  2. 設置到它的每個鄰居的成本度量metric
  3. 構造【DD數據庫描述分組】,向鄰站給出自己的鏈路狀態數據庫中所有鏈路狀態項目的摘要信息
  4. 如果DD分組中的摘要自己都有,則鄰站不做處理;如果有自己沒有的或者是更新的,則發送【LSR鏈路狀態請求分組】請求自己沒有的和比自己更新的信息
  5. 收到鄰站的LSR分組后,發送【LSU鏈路狀態更新分組】進行更新
  6. 更新完畢后,鄰站返回一個【LSAck鏈路狀態確認分組】進行確認
  7. 使用Dijkstra根據自己的鏈路狀態構造最短路徑

在這里插入圖片描述在這里插入圖片描述
OSPF是網絡層協議

其他特點:

  1. 每隔30min更新一次
  2. 當互聯網規模很大時,OSPF協議要比距離向量協議RIP好得多
  3. OSPF不存在壞消息傳得慢的問題,它的收斂速度很快

BGP協議

與其他AS的鄰站BGP發言人交換信息
在這里插入圖片描述交換的網絡可達性信息,即要到達某個網絡所要經過的一系列AS(路徑向量)
發生變化時更新有變化的部分
各個BGP發言人根據所采用的策略從收到的路由信息中找到到達各個AS的較好路由
在這里插入圖片描述
BGP是一個應用層協議,借助TCP傳送
特點:

  • 支持CIDR
  • 只需要在發生變化時更新有變化的部分

在這里插入圖片描述

三種路由協議比較

在這里插入圖片描述
在這里插入圖片描述

IP組播(多播)

  • 單播:使用一個IP地址作為目的地址,點對點通信
  • 廣播:點對多點的傳播方式,目的地址是全1的廣播地址(MAC地址為全F)
  • 組播(多播):當網絡中的某些用戶需要特定數據時,組播數據發送這僅僅發送一次數據,借助組播路由協議為組播數據報建立組播分發樹,被傳遞的數據到達距離用戶端盡可能金的節點后才開始復制和分發,是一種點對多點的傳輸方式

在這里插入圖片描述在這里插入圖片描述

IP組播地址

IP組播地址讓原設備能夠將分組發送給一組設備,屬于多播組的設備將被分配一個組播組IP地址(一群相同需求主機的相同標識)

組播地址范圍為224.0.0.0~239.255.255.255(D類地址),一個D類地址表示一個組播組。只能用作分組的目的地址。源地址總是為單播地址。

  1. 組播數據報是“盡最大可能交付”,不提供可靠交付,應用于UDP(速度快,實時性)。
  2. 對都組播數據包不產生ICMP差錯報文
  3. 并非所有D類地址都可以作為組播地址
    在這里插入圖片描述

硬件組播

組播MAC地址以十六進制值01-00-5E打頭,剩下的6個十六進制位是根據IP組播組地址的最后23位轉換得到的
在這里插入圖片描述
收到多播數據報的主機,還要在IP層利用軟件進行過濾,把不是本主機要接收的數據報丟棄

IGMP協議&組播路由選擇協議

IGMP:網際組管理協議
在這里插入圖片描述
IGMP屬于網絡層協議,用IP數據報傳遞報文

在這里插入圖片描述
組播路由器知道的成員關系只是所連接的局域網中有無組播組的成員。
如果局域網中有一個主機響應,那么其他也屬于組播組的成員將不會響應。

組播路由選擇協議的目的是找出以源主機為根節點的組播轉發樹

構造樹可以避免在路由之間兜圈子。
對不同的多播組對應于不同的多播轉發樹:同一個多播組,對不同的源點也會有不同的多播轉發樹。

組播路由選擇協議常使用的三種算法:

  • 基于鏈路狀態的路由選擇
  • 基于距離向量的路由選擇
  • 協議無關的組播(稀疏/稠密)

移動IP

移動IP技術是移動結點(計算機/服務器等)以固定的網絡IP地址,實現跨越不同網段的漫游功能,并保證了基于網絡IP的網絡權限在漫游過程中不發生任何改變。

移動結點:具有永久IP地址的移動設備
歸屬代理(本地代理):一個移動結點擁有的就居所稱為歸屬網絡。在歸屬網絡中代表移動節點執行移動管理功能的實體叫做歸屬代理。
外部代理(外部代理):在外部網絡中幫助移動結點完成移動網絡管理功能的實體稱為外部代理

永久地址(歸屬地址/主地址):移動站點在歸屬網絡中的原始地址
轉交地址(輔地址)移動站點在外部網絡使用時的臨時地址
在這里插入圖片描述在這里插入圖片描述

路由器

轉發和路由選擇的區別:

  • 轉發是一個路由器內不同端口的變化,而且一個分組進入輸入端口不一定轉發到輸出端口,也有可能是協議之間通信用來維護路由信息的分組,這樣的分組就會轉發給路由選擇處理機。
  • 路由選擇是比較宏觀的傳輸路徑的選擇
    在這里插入圖片描述在這里插入圖片描述
    查表和轉發是路由器中最重要的

在這里插入圖片描述若路由器處理分組的速率趕不上分組進入隊列的速率,則隊列的存儲空間最終必定減少到零,這就使得后面再進入的隊列的分組由于沒有存儲空間只能被丟棄。
路由器中的輸入和輸出隊列產溢出是造成分組丟失的重要原因。

三層設備的區別

路由器:可以互聯兩個不同網絡協議的網段。
網橋:可以互聯兩個物理層和數據鏈路層不同的網段。
集線器:直通式設備,不能互聯兩個物理層不同的網段。

判斷:對于任何層次的設備,都可以互聯該層次及一下層次的不同。 錯誤,集線器設備是物理層設備,但是集線器無法連接兩個物理層不同的網段

在這里插入圖片描述

路由表和路由選擇

路由轉發總是用軟件實現的。
在這里插入圖片描述
轉發表由路由表得來,可以用軟件實現,也可以用特殊的硬件來實現。
轉發表必須包含完成轉發功能所必須的信息,在轉發表的每一行必須包含從要到達的目的網絡到輸出端口和某些MAC地址的映射。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383654.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++空類的大小

https://blog.csdn.net/lihao21/article/details/47973609 本文中所說是C的空類是指這個類不帶任何數據,即類中沒有非靜態(non-static)數據成員變量,沒有虛函數(virtual function),也沒有虛基類(virtual base class)。 直觀地看&#xff0c…

Linux探秘之用戶態與內核態

https://www.cnblogs.com/bakari/p/5520860.html 一、 Unix/Linux的體系架構 如上圖所示,從宏觀上來看,Linux操作系統的體系架構分為用戶態和內核態(或者用戶空間和內核)。內核從本質上看是一種軟件——控制計算機的硬件資源&…

哈夫曼算法證明+哈夫曼編碼譯碼程序實現

哈夫曼算法證明 哈夫曼算法是一種貪心算法,我們考慮證明其最優子結構和貪心選擇性質: 最優子結構:假設一個樹是哈夫曼樹,則以其任意節點為根節點的最大子樹也是哈夫曼樹。 證明:子樹的根節點的值是其所有葉子節點出現…

Python3小知識

對于迭代器對象,Python默認賦值是將引用賦值,即指向同一片內存空間。為了實現對內存空間的賦值,我們可以使用分片進行深復制。例如: 當定義元組的時候,我們一般使用小括號將元素包圍起來,也可以不使用括號…

匯編:實現日歷星期數查詢工具

編制一個簡單日歷查詢工具,輸入年、月、日,能夠判斷當日的星期數,并進行輸出,數據的輸入和結果的輸出要有必要的提示,且提示獨占一行。 查閱資料 ? 經過查閱資料,發現有兩個相關的算法可以解決這個問題&…

一個通用純C隊列的實現

https://blog.csdn.net/kxcfzyk/article/details/31728179 隊列并不是很復雜的數據結構,但是非常實用,這里實現一個隊列是因為在我的另一篇博客非常精簡的Linux線程池實現中要用到。 隊列API定義如下: //queue.h #ifndef QUEUE_H_INCLUDED…

Dijkstra算法介紹+正確性證明+性能分析

算法介紹 源點s,數組d[u]表示s到u的最短距離,空集S,點集Q初始化:將源點s從點集中去掉,加入S,d[s]0,?v∈Q,d[v]w[s][v]\forall v\in Q ,d[v]w[s][v]?v∈Q,d[v]w[s][v]將Q中d[v]最小的點去掉加入S,并對u∈…

Linux C 實現一個簡單的線程池

https://www.cnblogs.com/GyForever1004/p/9185240.html 線程池的定義 線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級…

斐波那契數列求解+尾遞歸

1.普通遞歸 這里觀察f[4]的遞歸樹代替f[10]的遞歸樹(后者比較大,畫不下)。 使用遞歸求解的時候復雜度為T(n)T(n?1)T(n?2)T(n)T(n-1)T(n-2)T(n)T(n?1)T(n?2),觀察遞歸樹,發現降速最快的是最右邊每次減2&#xff0c…

循環服務器,并發服務器模型以及I/O多路轉接模型

https://blog.csdn.net/xinianbuxiu/article/details/53455784 一、基于TCP/IP協議的基本循環服務器 tcp_server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #incl…

c++繼承父類的子類,如何調用父類的同名函數?

https://blog.csdn.net/qq_26399665/article/details/52080215 子類調用父類的同名函數&#xff1a; 子類和父類返回值參數相同&#xff0c;函數名相同&#xff0c;有virtual關鍵字&#xff0c;則由對象的類型決定調用哪個函數。 子類和父類只要函數名相同&#xff0c;沒有vi…

LCS最長公共子串

問題介紹 LCS問題(longest common subsequence problem)指的是求解兩個字符串最長公共子序列問題。這里的子序列是可以不連續的。LCS問題廣泛地出現在計算生物學中&#xff08;DNA序列、系統生成樹等等&#xff09;。這里介紹如何解決LCS問題&#xff0c;以及算法的正確性證明…

將字符串中的空格用%20替換

如果不需要原地操作&#xff0c;則一遍遍歷&#xff0c;將非空串復制&#xff0c;遇到空格加上%20&#xff0c;如果需要原地操作&#xff0c;首先進行遍歷出空格的個數x,然后擴容2x,從后往前遍歷實現。如果非空格字符串比空格字符串多的多的時候而且字符串非常長的時候使用原地…

12步輕松搞定python裝飾器

http://python.jobbole.com/81683/ 呵呵&#xff01;作為一名教python的老師&#xff0c;我發現學生們基本上一開始很難搞定python的裝飾器&#xff0c;也許因為裝飾器確實很難懂。搞定裝飾器需要你了解一些函數式編程的概念&#xff0c;當然還有理解在python中定義和調用函數…

操作系統【六】虛擬內存

傳統存儲管理方式的不足 一次性&#xff1a;作業必須一次性全部裝入內存后才能開始運行。這會造成&#xff1a;當作也很大時不能全部裝入內存&#xff1b;當大量作業要求運行時&#xff0c;由于內存無法容納所有作業&#xff0c;因此只有少量作業能夠運行&#xff0c;導致多道…

python裝飾器詳解

https://blog.csdn.net/xiangxianghehe/article/details/77170585 你會Python嘛&#xff1f; 我會&#xff01; 那你給我講下Python裝飾器吧&#xff01; Python裝飾器啊&#xff1f;我沒用過哎 以上是我一個哥們面試時候發生的真實對白。 ———————————————-分…

SQL Server【一】簡介和基本概念和命令

數據結構和數據庫的區別 數據庫是應用軟件級別研究數據的存儲和操作&#xff08;主要針對磁盤上的數據&#xff09; 數據結構是在系統軟件級別研究數據的存儲和操作&#xff08;主要是針對內存中的數據&#xff09; 對硬盤數操作是數據庫的強項&#xff0c;是數據庫研究的核心…

SQL Server【二】單表查詢

查詢 計算列 select * from emp; -- *通配符&#xff0c;表示所有的字段 -- from emp 從emp表查詢select empno, ename from emp; select ename as "員工姓名", sal*12 as "年薪" from emp;-- as可以省略&#xff0c;用于設置字段名 -- 注意用雙引號將字…

SQL Server【三】連接查詢

將兩個表或者兩個以上的表以一定的連接條件連接起來&#xff0c;從中檢索出滿足條件的數據。 內連接 使用inner join&#xff0c;inner可以省略 -- 查詢員工的姓名和部門名稱 select "E".ename as "員工姓名", "D".dname as "部門名稱&q…

Linux下網絡socket編程——實現服務器(select)與多個客戶端通信

一、關于socket通信 服務器端工作流程&#xff1a; 調用 socket() 函數創建套接字 用 bind() 函數將創建的套接字與服務端IP地址綁定調用listen()函數監聽socket() 函數創建的套接字&#xff0c;等待客戶端連接 當客戶端請求到來之后調用 accept()函數接受連接請求&#xff0c…