注:本文基於《網絡是怎樣鏈接的》一書。python
背景:畢業4年了,不少當初在學校學的計算機網絡知識都忘了,此文爲工做幾年後的一次再回顧、思考和梳理,以供後續查閱。linux
注意:IP 跟 IP 地址不是一個概念,IP 是 Internet Protocol,是一個協議,而 IP 地址 Internet Protocol Address,是 IP 中的一個概念。git
但有時候有些場景,會習慣直接說 IP,其實指的是 IP 地址。知道就好。(網絡這個領域不少名詞都是使用混亂的)web
IP地址(Internet Protocol Address)
是由32位二進制位組成的 xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx。算法
若是按每8位爲一組,轉換成十進制的話,能夠寫成由三個句點分隔的4位數字的形式,即點分十進制表示法
:例如192.168.0.1。數據庫
因此,IP地址只有32位,滿打滿算42.9億個地址。瀏覽器
IP地址
有兩個主要功能:緩存
① 命令行安全
以 linux(CentOS)爲例:服務器
ifconfig
ip addr
linux的ip命令和ifconfig命令相似,但前者功能更強大,並旨在取代後者。
ifconfig是net-tools中已被廢棄使用的一個命令,許多年前就已經沒有維護了。
② OS GUI
以 MAC 爲例,打開 設置 -> 網絡:
上面看到的 IP 其實都是私網 IP(跟現實中大量使用 NAT 有關,下面會介紹),公網 IP 則須要經過別的方法:
一開始,32位的IPv4地址只由8位的網絡地址和「剩下的」24位的主機位。
這種格式用在局域網出現以前。在那時,只有一些不多很大的的網絡,例如 ARPANET。
即 IP地址 = 網絡地址 + 主機地址
是由於網關
(路由設備)當中有一張路由表
,該路由表記錄了全部ip地址的位置,這樣就能夠進行包的轉發了,若是咱們不區分網絡地址,那麼這張路由表當中就要保存有全部IP地址的方向,這張路由表就會很大。而有了網絡地址,就能夠限定擁有相同網絡地址的終端都在同一個範圍內,那麼路由表只須要維護這個網絡地址的方向,就能夠找到相應的終端了。
因此,咱們把網絡號相同的主機稱之爲本地網絡
主機,網絡號不相同的主機稱之爲遠程網絡
主機。本地網絡中的主機能夠直接相互通訊;遠程網絡中的主機要相互通訊必須經過本地網關來傳遞轉發數據。
網關(Gateway)
在網絡層以上實現網絡互連,是複雜的網絡互連設備。
網關地址實質上是一個網絡通向其餘網絡的IP地址。
網關設備有:
① A類IP地址 —— 很是大的網絡
一個A類IP地址是指,在IP地址的四段號碼中,第一段號碼爲網絡號碼,剩下的三段號碼爲本地計算機的號碼。
只有 126 個組織能夠分配 A 類網絡地址,每一個組織均可覺得 16,000,000 臺主機提供地址。
A 類地址適合那些特大型的公司/組織或政府部門。例如,通用電氣公司擁有 3.0.0.0/8,蘋果電腦公司擁有 17.0.0.0/8,美國郵政總局擁有 56.0.0.0/8。(幾乎如今全部的A類地址都在美國)
② B類IP地址 —— 數量較多規模中等的網絡
一個B類IP地址是指,在IP地址的四段號碼中,前兩段號碼爲網絡號碼,剩下的兩段號碼爲本地計算機的號碼。
最多 16,384 個組織能夠分配 B 類網絡地址,每一個網絡能夠支持 65,534 臺主機。
③ C類IP地址 —— 爲數衆多的小網絡
一個C類IP地址是指,在IP地址的四段號碼中,前三段號碼爲網絡號碼,剩下的一段號碼爲本地計算機的號碼。
C類網絡地址數量較多,有200多萬個,適用於小規模的局域網絡,每一個網絡最多隻能包含254臺計算機。
④ D類IP地址 —— 用於組播
D類地址不分網絡地址和主機地址,其IP地址前8位以「1110」開始,它是一個專門保留的地址。
⑤ E類IP地址 —— 用於研究和實驗之用
E類地址不分網絡地址和主機地址,其IP地址前8位以「1111」開始,它是一個專門保留的地址。
⑥ 總結
區分的ABCDE類的IP地址的辦法就是根據第一個8位組來判斷:
能夠看到 ABCDE 類的 IP 地址範圍並非徹底覆蓋 0.0.0.0 ~ 255.255.255.255。由於被保留 IP 地址
佔用了。
⑦ 保留地址
保留地址有不少,下面只列出一些常見的:
更多保留地址可參考:https://zh.m.wikipedia.org/zh-hans/保留IP地址
⑩ 缺點
分類劃分的主要缺點是,不能靈活隨意的劃分網絡號和主機號,這會致使幾個問題:
對於主機地址有不少的 A 類地址,天然是搶手貨,但由於 IP 地址的分配機構掌握在美國手裏,這樣,像麻省理工學院、AT&T等機構,一會兒就把A類地址瓜分殆盡,而當因特網在全世界發展起來之後,其餘國家只能申請 B類、C類地址。如今(據說)整個中國連一個A類地址都沒有,B類地址估計也只有十多個。
」富人「獲得了,卻有不少主機地址用不完;」窮人「獲得了,但主機地址卻不夠用。旱的旱死,澇的澇死。
因此,分類劃分是一個歷史概念, 在如今已經失去了意義。(接下來會介紹改進他的新辦法)
① 做用
上面提到 分類劃分 的缺點是,不能靈活隨意的劃分網絡號和主機號,而子網掩碼正是要解決這個問題。
即子網掩碼只有一個做用,就是將某個IP地址劃分出網絡地址和主機地址兩部分。
子網掩碼須要搭配 IP 地址一塊兒出現纔有意義。
② 原理
注意:子網掩碼是一串與 IP 地址長度相同的 32 比特數字,其左邊一部分都是 1,右邊一部分都是0。
③ 有類網絡 結合 子網掩碼
即每類地址都具備默認的子網掩碼:
① VLSM 與 CIDR 對比
一、介紹
VLSM(Variable Length Subnet Mask,可變長子網掩碼)
CIDR (Classless Inter-Domain Routing,無類別域間路由)
二、原理
採用借位的方法。
子網
),是將原來有類IP地址中的主機位按照須要劃出一部分做爲網絡位使用。
即:
IP 地址= 網絡號 + 子網號 + 主機號
。
超網
),是將原來有類IP地址中的網絡位劃出一部分做爲主機位使用。在某種程度上來講,VLSM 和 CIDR 之間能夠看作是逆過程。
三、無類網絡 結合 子網掩碼
[拓展] 斜線記法
又稱 「CIDR 記法」,即在IP地址後面加上一個斜線「/」,而後寫上網絡前綴所佔的比特數,即子網掩碼二進制表示法中,連續的 1 的 個數。
如 192.168.0.0/24,24 表示子網掩碼爲:11111111·11111111·11111111·00000000,即 255.255.255.0。
這樣的寫法比直接寫子網掩碼要簡潔。
推薦一個已知 CIDR 記法 ,算出可用 IP 範圍的計算器:https://www.ipaddressguide.com/cidr
四、好處
DHCP(Dynamic Host Configuration Protocol, 動態主機配置協議)
指的是由服務器控制一段IP地址範圍,客戶機登陸服務器時就能夠自動得到服務器分配的IP地址和子網掩碼。同時服務器會自動配置網關和 DNS 服務器地址。
DHCP(協議)採用的是C/S模型。
好處:若是咱們手動分配IP地址,電腦多了,不少可能會分到重複的IP地址,改起來就麻煩了。但 DHCP 服務器能夠集中管理,還能動態分配,保證網絡的穩定性。
實際生活:在路由器設置中,有專門 DHCP 服務器的設置,默認是開啓的。
IP地址是由互聯網號碼分配局(英語:Internet Assigned Numbers Authority,簡稱:IANA
)以及其餘5個區域互聯網註冊管理機構(英語:Regional Internet Registry,簡稱:RIR
)在其指定區域內分配給本地Internet註冊表,例如網絡服務提供商(英語:Internet Service Providers,簡稱:ISP)和其餘最終用戶。
除了 IPv4 自己在最初設計的時候,總量就是偏少的之外。雖而後來無類網絡的誕生,部分緩解了 IPv4 地址稀缺的問題,可是還不夠,因而,咱們須要更好的解決方案……
NAT(Network Address Translation,網絡地址轉換)
是一種在IP數據包經過路由器或防火牆時重寫來源IP地址或目的IP地址的技術。
原理:
經過映射表。若是是一對一轉換,那壓根節省不了IPv4地址空間;因此通常NAT都是一對多的,即一個公網IPv4映射多個私網IPv4。
好處:
壞處:
NAT 是一個很是好的解決方案,但 IPv6 明顯是一個更加擁抱將來的辦法。
① 介紹
IPv6 形如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344
由兩個邏輯部分組成:一個64位的網絡前綴和一個64位的主機地址。
② 好處
一、主要就是數量多
應用場景:
- 物聯網
- 實現真正的網絡實名制
二、IPv6具備更高的安全性經過IPv6協議的安全機制
三、IPV6傳輸速度更快IPv6的地址分配一開始就遵循聚類的原則,這大大減少了路由器中路由表的長度
四、IPv6加入了對自動配置的支持這是對DHCP協議的改進和擴展
五、IPv6擁有更好的頭部格式IPV6使用新的頭部格式,其選項與基本頭部分開,這簡化和加速了路由選擇過程,提升了效率
③ 發展狀況
國外:
在2019年12月,經過IPv6使用Google服務的用戶百分率首次超過30%。
國內:
工信部發布了《工業和信息化部關於開展2020年IPv6端到端貫通能力提高專項行動的通知》,通知中明確了2020年IPv6發展的三大目標、七項任務和四項保障措施。
……
發展基於IPv6的下一代互聯網,也爲5G、數據中心等新型基礎設施建設奠基基礎,更爲將來發展大規模的物聯網、工業互聯網開拓網絡空間,搭建基礎環境。
④ 阻礙
DNS: Domain Name System,域名服務系統
,是將域名和IP地址相互映射的數據庫。
DNS 的功能並不只限於此,它還能夠將郵件地址和郵件服務器進行關聯,以及爲各類信息關聯相應的名稱。
有域名,經過 DNS 查詢對應 IP 地址的操做,稱爲域名解析
。
客戶端經過 DNS 解析器
(DNS resolver)向DNS服務器發出查詢。
解析器其實是一段程序,它包含在操做系統的 Socket 庫中。
Socket 庫
可讓其餘的應用程序調用操做系統的網絡功能,用於調用網絡功能的程序組件集合。而 DNS 解析器就是這個庫中的其中一種程序組件。
來自客戶端的查詢消息包含如下 3 種信息。
(a)域名
服務器、郵件服務器(郵件地址中 @ 後面的部分)的名稱
如 www.baidu.com
(b)Class
在最先設計 DNS 方案時,DNS 在互聯網之外的其餘網絡中的應用也被考慮到了,而 Class 就是用來識別網絡的信息。不過,現在除了互聯網並無其餘的網絡了,所以 Class 的值永遠是表明互聯網的 IN
。
(c)記錄類型
表示域名對應何種類型的記錄。
例如,當類型爲 A
時,表示域名對應的是 IP 地址(A 是 Address 的縮寫);當類型爲 MX
時,表示域名對應的是郵件服務器。
就像 gmail.com 的 A 和 MX 對應的確定不是同一個 IP 地址。
DNS 服務器會接受客戶端發來的查詢消息,而後從 域名與 IP 地址的對照表中查找相應的記錄,並返回 IP 地址。
問題:互聯網中的域名太多了,將這些信息所有保存在一臺 DNS 服務器中是不可能的。
解決方案:將信息分佈保存在多臺 DNS 服務器中,這些 DNS 服務器相互接力配合,從而查找出要查詢的信息。
問題:怎麼分佈保存?
解決方案:
第 ① 步:使用域名的層次結構。域名都是用句點來分隔的,越靠右的位置表示其層級越高。
好比 www.nikkeibp.co.jp 這個域名, 最上層的 jp 表明分配給日本這個國家的域;下一層的 co 是日本國內進行分類的域,表明公司;再下層的 nikkeibp 就是分配給某個公司的域;最下層的 www 就是服務器的名稱。
注意:jp 的上面還有一級域,稱爲根域
。根域不像 jp 那樣有本身的名字,所以在通常書寫域名時常常被省略,若是要明確表示根域,應該像 www.nikkeibp.co.jp.
。
WWW
是 World Wide Web的簡稱,譯爲萬維網或全球網。它是 Web 的提出者最先開發的瀏覽器兼 HTML 編輯器的名字。如今已經成爲慣例。
第 ② 步:每一層級(域)都由不一樣的 DNS 服務器去存儲。
實際上, 一臺 DNS 服務器能夠存放多個域的信息。(這裏爲了交代清楚,不考慮這種狀況了)
第 ③ 步:
首先,將負責管理下級域的 DNS 服務器的 IP 地址註冊到它們的上級 DNS 服務器中,而後上級 DNS 服務器的 IP 地址再註冊到 更上一級的 DNS 服務器中,以此類推。
這樣,咱們就能夠經過上級 DNS 服務器查詢出下級 DNS 服務器的 IP 地址,也就能夠向下級 DNS 服務器發送查詢請求了。
其次,將根域的 DNS 服務器信息保存在互聯網中全部的 DNS 服務器中。這樣一來,任何 DNS 服務器就均可以找到並訪問根域 DNS 服務器了。 所以,客戶端只要可以找到任意一臺 DNS 服務器, 就能夠經過它找到根域 DNS 服務器, 而後再一路順藤摸瓜,找到位於下層的某臺目標 DNS 服務器。
分配給根域 DNS 服務器 的 IP 地址在全世界僅有 13 個,並且這些地址幾乎不發生變化,所以將這些地址保存在全部的 DNS 服務器中也並非一件難事。實際上, 根域 DNS 服務器的相關信息已經包含在 DNS 服務器程序的配置文件中了,因 此只要安裝了 DNS 服務器程序,這些信息也就被自動配置好了。
根域 DNS 服務器在運營上使用多臺服務器來對應一個 IP 地址,所以儘管 IP 地址只有 13 個,但其實服務器的數量是不少的。
①
IPv4中DNS協議使用的UDP數據包限制了最多隻能有13臺根服務器;(即:當時一個udp包是512字節,爲了把13個都放進去,限制了13個而不是130個)
分佈狀況:美國擁有1臺主根服務器,在其他的12臺輔根服務器中,其中9臺部署在美國,2臺在歐洲(英國和瑞典),1臺在亞洲(日本)。
隱患:
目前美國掌握着全球互聯網13臺域名根服務器中的10臺。理論上,只要在根服務器上屏蔽該國家域名,就能讓這個國家的國家頂級域名網站在網絡上瞬間「消失」。在這個意義上,美國具備全球獨一無二的制網權,有能力威懾他國的網絡邊疆和網絡主權。譬如,伊拉克戰爭期間,在美國政府授意下,伊拉克頂級域名「.iq」的申請和解析工做被終止,全部網址以「.iq」爲後綴的網站從互聯網蒸發。
中國的防治措施:
CNNIC
(中國互聯網絡信息中心)做爲中國的域名管理機構,採起了如下的應對措施:
②
到了IPv6,根服務器的數量終於能夠突破13個的限制。
2017年11月28日,由下一代互聯網國家工程中心牽頭髮起的「雪人計劃」,已在全球完成25臺IPv6 DNS根服務器架設,中國部署了其中的4臺,由1臺主根服務器和3臺輔根服務器組成。
聽說(只是聽說),之前中國也是有DNS根服務器的,由於某牆的污染可能會致使其餘國家的人沒法正常的訪問被中國封殺的網站,因此後續中國的根服務器被踢出了DNS服務器的信任名單。
③
再以後,根域名 DNS 服務器只有 13 臺這個說法並不成立了,由於 DNS 根服務器利用任播技術,拓展到了更多節點。
至今(2020.2.15)在全球已經有1089個根域名服務器節點了,當前由12個組織負責運營,咱們能夠在https://root-servers.org/看到部署狀況。(其中我國有26個根域名服務器節點)
問:最近 DNS 服務器自己的查找也很耗時,怎麼辦?
解決方案:經過緩存加快響應。
DNS 服務器中保存的信息都設置有一個有效期(TTL),當緩存中的信息超過有效期後,數據就會從緩存中刪除。並且,在對查詢進行響應時,DNS 服務器也會告知客戶端這一響應的結果是來自緩存中仍是來自負責管理該域名的 DNS 服務器。
解決方案:儘可能選大型的、離你近的 DNS 服務器。
實際生活(以 MAC 爲例):
例如:
2010年1月12日,因爲美國負責百度域名解析的根服務器遭到了DDoS 攻擊,百度首頁出現大面積的訪問故障,全國絕大多數地區均沒法訪問百度網站。
DNS劫持 就是經過劫持了 DNS 服務器,經過某些手段取得某域名的解析記錄控制權,進而修改此域名的解析結果,致使對該域名的訪問由原 IP 地址轉入到修改後的指定 IP,其結果就是對特定的網址不能訪問或訪問的是假網址。
例如:
輸入一個錯誤或不存在的 URL 後,本應該出現404頁面,而咱們看到的卻都是電信、聯通等運營商的網址導航頁面。
或者上面提到的 114.114.114.114 DNS 服務器,就提供無劫持和劫持二者類型:
純淨 無劫持
服務ip爲:114.114.114.114 和 114.114.115.115
攔截 釣魚病毒木馬網站 加強網銀、證券、購物、遊戲、隱私信息安全
服務ip爲:114.114.114.119 和 114.114.115.119
學校或家長可選攔截 色情網站 保護少年兒童免受網絡色情內容的毒害
服務ip爲:114.114.114.110 和 114.114.115.110
DNS污染是一種讓通常用戶因爲獲得虛假目標主機 IP 而不能與其通訊的方法,是一種 DNS 緩存投毒攻擊(DNS cache poisoning)。其工做方式是:因爲一般的 DNS 查詢沒有任何認證機制,並且 DNS 查詢一般基於的 UDP 是無鏈接不可靠的協議,所以 DNS 的查詢很是容易被篡改,經過對 UDP 端口 53 上的 DNS 查詢進行入侵檢測,一經發現與關鍵詞相匹配的請求則當即假裝成目標域名的解析服務器(NS,Name Server)給查詢者返回虛假結果。
例如:
2014年1月21日,因爲解析中國全部通用頂級域的根服務器出現DNS污染事件,百度、新浪、騰訊、京東等許多網站的在這次事件中均被劫持到65.49.2.178這個位於美國IP地址上,一度沒法訪問。
在沒有 DNS 的時代,是靠本地的 Hosts 文件 來維護 主機名(域名) 和 IP 地址 的對應關係。
後來有了 DNS,但 Hosts 文件依然還有做用:
以 mac 爲例:
sudo vi /etc/hosts
內容以下(只寫前三行,剩下的省略):
127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost
能夠看到咱們經常使用的 localhost 其實就是對應的 127.0.0.1。
TCP:傳輸控制協議(Transmission Control Protocol)
注意:
問:爲何須要源端口和目標端口?
答:即便你按照 ip 送達到了目的設備,可是同一臺計算機上還跑着多個網絡程序,每個網絡程序都對應着不一樣的端口。(例如你是給瀏覽器仍是給QQ?)
注:A 爲發起鏈接的客戶端,B 爲接收鏈接請求的服務器端。(下同)
步驟一、A 給 B 傳
步驟二、B 給 A 傳
步驟三、A 給 B 傳
注:
問:爲何要三次握手才能夠?
答:爲了確認 A 和 B 雙方同時具備發送和接受能力,即:
假設:A 給 B 發兩次長度爲 1000 的數據,且 A 序號從 40000 開始,B 序號 從 70000 開始。
步驟一、A 給 B 傳
步驟二、B 給 A 傳
步驟三、A 給 B 傳
步驟四、B 給 A 傳
注:
全雙工
的,即 A 能夠給 B 傳,B 也能夠給 A 傳。假設:A 給 B 主動發出斷開鏈接的請求,且 A 序號從 80000 開始,B 序號 從 90000 開始。
步驟一、A 給 B 傳
步驟二、B 給 A 傳
步驟三、假設 B 還有沒發完的數據,須要再給 A 發 3 次,每次 1000
略
步驟四、B 給 A 傳(B 發送完成,也要斷開鏈接了)
步驟五、A 給 B 傳
步驟六、B 收到 A 的 ACK 後 CLOSE,可是 A 得等到 2 倍的 MSL 時間才 CLOSE
A 給 B 發了 ACK 後,面臨兩種可能:
因而 A 須要考慮這兩種狀況的總時間,即 發去的 ACK 時間和 發來的 FIN 時間,剛好等於 2 倍的 MSL(Maximum Segment Lifetime,報文最大生存時間)
時間。(他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄)。
例如,這種方式能夠防止 A close 後,又向 B 發起新的 TCP 鏈接,可是 B 沒有關閉以前的舊鏈接,產生了髒鏈接。
問:爲何握手是三次,揮手是四次?
答:由於揮手得考慮 B 的數據有沒有發完,因此多預留了一次。
問:必須是客戶端主動斷開鏈接嗎?服務器端能夠嗎?
答:其實均可以。但通常都是數據發送完畢的一方會發起斷開過程。
以 Web 爲例, 瀏覽器向 Web 服務器 發送請求消息,Web 服務器再返回響應消息,這時收發數據的過程就所有結束了,服務器一方會發起斷開過程。
返回 ACK 號的等待時間(這個等待時間叫超時時間)須要設爲一個合適的值,不能太長也不能過短。
但由於網絡狀況複雜,波動大,因此將等待時間設置爲一個固定值並非一個好辦法。 所以,TCP 採用了動態調整等待時間的方法,這個等待時間是根據 ACK 號返回所需的時間來判斷的。 具體來講, TCP 會在發送數據的過程當中持續測量 ACK 號的返回時間,若是 ACK 號返回變慢,則相應延長等待時間;相對地,若是 ACK 號立刻就能返回,則相應縮短等待時間。
若是超過了等待時間,則會觸發重發機制。這就是 TCP 可靠傳輸的保證。
所以,網卡、集線器、路由器都沒有錯誤補償機制,一旦檢測到錯誤就直接丟棄相應的包。應用程序也是同樣。
不過,若是發生網絡中斷、服務器宕機等問題,那麼不管 TCP 怎樣重傳都無論用。 所以 TCP 會在嘗試幾回重傳無效以後強制結束通訊,並嚮應用程序報錯。
每發送一個包就等待一個 ACK 號的方式是最簡單也最容易理解的, 但在等待 ACK 號的這段時間中,若是什麼都不作那實在太浪費了。
所謂滑動窗口
,就是在發送一個包以後,不等待 ACK 號返回,而是直接發送後續的一系列包。這樣一來,等待 ACK 號的這段時間就被有效利用起來了。
接收方有必要告訴發送方本身最多能接收多少數據,而後發送方根據這個值對數據發送操做進行控制(不然接收緩衝區中的數據就會越堆越多,最後就會溢出),這稱爲窗口大小。
窗口大小是 TCP 調優參數中很是有名的一個。
Socket
的英文單詞原意就是插座,翻譯到中文就是套接字
。
Socket 能夠指任何點對點的通訊。例如:
因此,用 Socket 這個詞的不只僅只有 TCP/IP 協議,但,計算機網絡的術語使用混亂和不嚴謹是有目共睹的,因此,還有另外一種慣例,即 Sokcet 就是指 TCP/IP 協議棧(所提供的對外接口)。
這個接口,最有名的當屬 Berkeley sockets
。
而下面的敘述,都以更常見的 Python 的 socket 模塊爲例。而 Python 的 socket 模塊就是基於 Berkeley sockets。
服務器端 / 客戶端:
應用程序調用協議棧的 socket
方法建立套接字
。
原本套接字就只是一個概念而已,並不存在實體,若是必定要賦予它一個實體,咱們能夠說,在協議棧內部有一塊內存空間,用於存放通訊操做的控制信息(例如存了通訊對象的 IP 地址、端口號、通訊操做的進行狀態等,便於協議棧根據這些信息判斷下一步的行動),這些控制信息就是套接字的實體,或者說存放控制信息的內存空間就是套接字的實體。
對應的,操做系統的 netstat
命令支持顯示套接字內容,-ano 選項表示下面的意思:
① 服務器端
bind
方法,參數爲 ip(域名) 和 端口號(80/443 端口)listen
方法,參數即掛起的最大鏈接數量(用於TCP監聽,有點像數據庫鏈接池)accept
來接受客戶端來的鏈接listen 和 accept 的等待鏈接的機制以下:
問1:爲何多個客戶端能夠鏈接服務器的同一個端口
socket 的惟一標識並不只僅是 port,而是 server ip + server port + client ip + client port。
② 客戶端
應用程序調用協議棧的 connect
方法,參數爲 ip(域名) 和 端口號。
問1:爲何客戶端的端口很隨意,但服務器的端口倒是固定的 80?
答:
原本,早期的互聯網存在過經過 DNS 服務器查詢端口號的機制,只能說並無普遍普及。
如今的規則,即端口號的規則是全球統一的,由 IANA(Internet Assigned Number Authority,互聯網編號管理局)這一組織來統一管理的。規定了:
但也要注意別跟常見的應用程序默認的端口重複,好比 Postgres 的端口是 5433。
因此用戶使用瀏覽器訪問一個 url ,雖然端口號是缺省的,但瀏覽器底層是幫你默默加了 80/443 端口的。
問2:爲何叫鏈接(connect)而不是準備(ready)?
使用「鏈接」這個詞是有緣由的。 通訊技術的歷史已經有 100 多年,從通訊技術誕生之初到幾年以前的很長一段時間內,電話技術一直都是主流。而電話的操做過程分爲三個階段:
人們將電話的思路套用在如今的計算機網絡中了,因此也就天然而然地將通訊開始以前的準備操做稱爲「鏈接」了。 若是沒有這段歷史的話,說不定如今咱們就不叫「鏈接」而是叫「準備」了,畢竟通訊開始前,網絡就是鏈接好的,而之前的電話不是。
服務器端 / 客戶端:
write
方法發數據。read
方法收數據。注意:這兩種都是先寫入緩衝區,再由 TCP 自行收發。
問1:在 write 後,協議棧發送數據的時機是?
答:
write 只是寫入緩衝區的意思,並不等於 send,那協議棧何時發送數據呢?
若是協議棧一收到數據就立刻發送出去,就可能會發送大量的小包,致使網絡效率降低,所以須要在數據積累到必定量時再發送出去。至於要積累多少數據才能發送,不一樣種類和版本的操做系統會有所不一樣,不能一律而論,但都是根據下面幾個要素來判斷的:
一、第一個判斷要素是每一個網絡包能容納的數據長度。
協議棧會根據 MTU(Maximum Transmission Unit,最大傳輸單元)
和 MSS( Maximum Segment Size,最大分段大小)
來進行判斷。當超過或者接近 MSS 時再發送出去。
MTU 在以太網中通常是 1500 字節,TCP 和 IP 的頭部加起來通常是 40 字節, 因此 MSS 通常是 1460 字節。
二、另外一個判斷要素是時間。
當應用程序發送數據的頻率不高的時候,若是每次都等到長度接近 MSS 時再發送,可能會由於等待時間太長而形成發送延遲,這種狀況下,即使緩衝區中的數據長度沒有達到 MSS,也應該果斷髮送出去。
三、總結
判斷要素就是這兩個,但它們實際上是互相矛盾的。所以,在進行發送操做時須要綜合考慮這兩個要素以達到平衡。
這就跟旅遊景區的大巴同樣,等車上游客坐滿了再走,賺的錢更多,可是若是等了段時間尚未來新人,那越等損失越大,仍是走比較好。
但協議棧也給應用程序保留了控制發送時機的餘地。應用程序在發送數據時能夠指定一些選項,好比若是指定「不等待填滿緩衝區直接發送」,則協議棧就會按照要求直接發送數據。
四、拓展 —— ACK 與窗口的合併
協議棧不光會累計些數據一塊兒發,還會累計些包一塊兒發。
問2: 一次 write 太多,協議棧要怎麼發送數據?
對較大的數據進行拆分。
注意:對 HTTP 頭部 + 消息體 視爲一個總體進行拆分。
注:read 的這方,其實也會碰到 問一、問2 的狀況該如何制定策略(涉及多久讀一次數據或者拼接傳來的拆分好的原始大數據)。這裏就不贅述了。
write 和 read 方法是很基礎的,所以 python 提供了更方便的 send
和 recv
方法,後者更加經常使用。
服務器端 / 客戶端:
應用程序調用協議棧的 close
方法。
服務器端 / 客戶端誰均可以主動調用 close 方法。
會刪除套接字。
用戶數據報協議(User Datagram Protocol)
UDP 就像一張白紙,但靈活度比 TCP 更高。
因此如今冒出一些新的協議基本上都是基於 UDP 而不是 TCP。
好處:
缺點(除了跟 TCP 比):
微信用的比較綜合:
而 QQ 因爲歷史緣由,基礎的聊天用的仍是 UDP(可是上層作了可靠性的保證)。
簡單理解:一個小區就是個局域網(LAN)
,一個城市裏由一個個小區構成,就構成了城域網(MAN)
,城與城鏈接起來就構成了一個很是大和遠的網,能夠叫廣域網(WAN)
,全世界的連在一塊兒的就是互聯網
。
互聯網
的英文是 internet
,它的意思是「網絡的網絡」,是一個通用名詞,泛指有多個計算機網絡互連而成的網絡,這些網絡之間的通訊協議(即通訊規則)是能夠任意的。
因特網
,即 Internet
,記住它與 internet 之間絕對不能使用等於號,由於 Internet 是一個專有名詞,它是指當前全球最大的、開放的、有衆多網絡互相鏈接而成的特定的計算機網絡。
2002年起,有學者開始提議將「internet」一詞用小寫表示,理由是互聯網已經成爲人類生活的一部分,失去了專有的意義;2016年,美聯社認爲「互聯網」已和「電話」同樣成爲一件通常的事物,不具備專屬商標的意義,因而開始在其格式手冊中規定「internet」和「web」一詞所有小寫,紐約時報也隨後跟進,但同時亦有媒體提出不一樣意見。
互聯網
上面已經說了,這裏不贅述。
萬維網(World Wide Web)亦做 WWW、Web
,是一個透過互聯網訪問的,由許多互相連接的超文本組成的系統。
萬維網的核心部分是由三個標準構成的:
此外還須要網頁瀏覽器和網頁服務器。
此外 HTML 還需搭配 CSS 和 JavaScript 語言。
蒂姆·伯納斯-李
是萬維網的創始者,如今是萬維網聯盟(W3C)
的領導人。2017年,他因「發明了萬維網、第一個瀏覽器和使得萬維網得以擴展的基礎協議及算法」而得到2016年度的圖靈獎。
網絡的體系結構是計算機網絡各層次及其協議的集合,其層次結構通常以垂直分層模型來表示。分爲:
OSI 的參考模型
TCP/IP 的參考模型
五層協議的參考模型
他們的關係以下圖所示:
通常採用折中的方法,採用五層協議的參考模型,自上而下分別爲:
下面的敘述,如沒提,都默認以這個模型劃分爲準。
網絡協議爲計算機網絡中進行數據交換而創建的規則、標準或約定的集合。
簡單理解就是不一樣的實體之間的通訊,都須要一種規則,而咱們就把這種規則稱爲協議(protocol)
。
上面各層中,能夠換用任何一種與之層相對應的其餘協議。
互聯網協議套件
(IPS:Internet Protocol Suite)是一個網絡通訊模型,以及一整個網絡傳輸協議家族,爲網際網絡的基礎通訊架構。它常被通稱爲TCP/IP協議族
(TCP/IP Protocol Suite),簡稱爲TCP/IP
。
注意:TCP/IP 不是指 TCP 協議 + IP 協議。這麼稱呼只由於該協議家族的兩個核心協議:TCP(傳輸控制協議)和IP(網際協議),爲該家族中最先經過的標準。(另外一種說法:最先的 TCP/IP 原型設計至關於如今的 TCP 和 IP 合在一塊兒的樣子,後來才拆分紅爲 TCP 和 IP 兩個協議。)
能夠理解成:TCP/IP 是互聯網相關的各種協議族的總稱。
首先,協議棧(Protocol stack)
,是計算機網絡協議套件的一個具體的軟件實現。
其次,TCP/IP 協議棧
就是對 TCP/IP 協議的一個具體的軟件實現。
注:下文所說的協議棧,默認就指 TCP/IP 協議棧。再也不贅述。
協議棧在不一樣的操做系統上,實現方式並不相同,可是大同小異。
上面咱們提到了 廣域網、城域網、局域網的區別,前二者的具體實現咱們不涉獵了,可是局域網值得好好聊聊。
局域網屬於數據鏈路層+物理層。
要知道,最先的互聯網就是從局域網演變而來的。而局域網最先的實現又是以太網(Ethernet)
。
以太網最先是由Xerox(施樂)公司建立的,在1980年由DEC、Intel和Xerox三家公司聯合開發爲一個標準。
問:Wi-Fi 和 無線局域網 的區別?
Wi-Fi 是 無線局域網(WLAN)的一種技術實現,採用 IEEE 802.11 的標準。
上面提到了 TCP/IP 是包含了不少網絡傳輸協議的家族,因此 TCP/IP 在 網絡接口層(即五層模型裏的數據鏈路層 + 物理層)能夠依託各類的局域網實現。但主流的仍是以太網,稱爲 TCP/IP over Ethernet
。
而互聯網則是由大大小小的運營商、公司、機構、用戶鏈接起來網絡的總稱,裏面可就不止僅有以太網,還包含其餘的局域網實現。
問:爲何以太網比其餘的局域網實現更普遍的普及?
答:一、配置簡單 二、組網靈活 三、價格低廉。
IEEE 組織的 IEEE 802.3
制定了以太網的技術標準。
雙絞線的極限距離是 100 米,但光纖的鏈接距離能夠長達幾千米。
物理層傳輸媒介的不一樣,影響最大的是傳輸速率。在以太網的標準中,包括了:
以太網採用的是帶衝突檢測的載波幀聽多路訪問衝突檢測(CSMA/CD)
機制。
優勢:原理比較簡單,技術上容易實現,網絡中各工做站處於平等地位,不需集中控制,不提供優先級控制。
缺點:在網絡負載增大時,會致使發送時間增加,發送效率急劇降低。
MAC 地址(Media Access Control Address)
是用於以太網標識。
也適用於基於以太網搞的其餘類型的網絡,好比 Wi-Fi 等。
每塊網卡的MAC 地址是全世界惟一的。
MAC 地址有 48 比特(6 字節)。
跟 IP 地址比,MAC 地址不是層次化的結構,即不分網絡號主機號。
00-80-C8-2D-82-EA
00:80:C8:2D:82:EA
它們的意思是同樣的,使用任何一種寫法均可以。
問:怎麼查看 MAC 地址?
下面都以 MacOS 爲例:
方法一:跟查看的 IP 的方法同樣,輸入 ifconfig
命令,ether 後面的便是:
方法二:直接看網絡設置
問:MAC 地址能夠修改嗎?
sudo ifconfig en0 ether 20-7C-8F-73-B1-1E
注意1:上面的 en0 不是固定的,對應着用 ifconfig 命令看到的對應的網卡。
注意2:電腦重啓後,MAC 地址會恢復原樣。
這裏的包,默認基於 TCP/IP + 以太網
包是由頭部和數據兩部分構成的。
高級研究計劃局網絡(英語:Advanced Research Projects Agency Network),通稱阿帕網(英語:
ARPANET
)是美國國防高級研究計劃局開發的世界上第一個運營的數據包交換網絡,是全球互聯網的鼻祖。
關於段、包、幀,雖是不一樣叫法,但都是一回事。
每一層都負責給包添加上本身獨屬的頭部:
TCP 模塊在執行鏈接、收發、斷開等各階段操做時,除了添加 TCP 頭部,其餘都須要委託 IP 模塊將數據封裝成包發送給通訊對象。
IP 模塊會添加 IP 頭部和 MAC 頭部這兩種頭部。
注意:IP 模塊不光添加 IP 頭部,還添加 MAC 頭部。(這是 ARP 的內容,下面會介紹)
電路交換
。分組交換
技術。即把要發送的整塊數據稱爲一個報文(message)
,發送以前,先把較長的報文劃分紅爲一個個更小的等長數據段。在每個數據段前面加上必要的控制信息(如目的地址、源地址等)組成的首部(header)
,這樣就構成了一個分組(packet)
。分組又稱爲「包」,而分組的首部也可稱爲「包頭」。計算機將分組經過通訊鏈路直接發送給分組交換機
(如交換機、路由器),分組交換機收到一個分組則暫時存儲下來,先校驗錯誤,再檢查其首部,按照首部中的目的地址查找轉發表,找到合適的端口(就是分組交換機和外部鏈接的接口)轉發出去,把分組交給下一個分組交換機,這樣一步一步把分組轉發到最終的目的計算機。因爲每一個分組交換機都是將收到的分組先存儲下來再轉發出去,所以該方法被稱爲存儲轉發
方式(與之對應的是直通轉發
方式)。① 分組交換比電路交換好的地方:
不足:
② 存儲轉發比直通轉發好的地方:
不足:
下面的介紹都基於 以太網 + TCP/IP 。
例如局域網中,網線廣泛使用的是雙絞線
,其中「雙絞」的意思就是以兩根信號線爲一組纏繞在一塊兒,這種擰麻花同樣的設計是爲了抑制噪聲的影響。
雙絞線的性能是以「類」來區分的,以下圖:
建議:家用六類或超六類,不建議用七類(此爲工業所用)
網卡中的 PHY(MAU)
模塊負責包與電信號之間的轉換,電信號經過 RJ-45 接口
進出網線(電信號的本質是正負變化的電壓)。
PHY(物理層裝置)
,之前低速方式中則叫做 MAU(介質鏈接單元)
。問:MAC 模塊是怎麼知道本身的 MAC 地址的?
答:網卡的 ROM 寫入了出廠前寫入的 MAC 地址,在網卡初始化的時候,將這個值讀出並進行設置,MAC 模塊就知道本身對應的 MAC 地址了。但也有一些特殊的方法,好比從命令或者配置文件中讀取 MAC 地址並分配給 MAC 模塊,這種狀況下,網卡會忽略 ROM 中的 MAC 地址。
步驟1:電信號轉成數字信號
報頭
的波形同步時鐘,而後遇到起始幀分界符
時開始將後面的信號轉換成數字信息,到達信號的末尾時,還須要檢查 FCS
,最後存放到緩衝區中。
若是檢查 FCS 不正確,即看成錯誤包丟棄。
步驟2:檢查 MAC 地址
MAC 模塊需檢查緩衝區中已變成數字信號的包的內容,即檢查 MAC 頭部中 接收方 MAC 地址與網卡在初始化時分配給本身的 MAC 地址是否一致,以判斷這個包是否是發給本身的。若是是,繼續放在緩衝區,若是不是,則丟棄。
步驟3:網卡交付給協議棧
網卡驅動
,從網卡的緩衝區中取出收到的包。如 0080(十六進制)表明 IP 協議,網卡驅動就會把這樣的包交給 TCP/IP 協議棧;若是是 809B 則表示 AppleTalk 協議,就把包交給 AppleTalk 協議棧,以此類推。
這個是上面的反操做,就不贅述了。
中繼器
主要完成 [1] 物理層的功能。負責在兩個節點的物理層上按位傳遞信息,完成信號的複製、調整和放大功能,以此來延長網絡的長度。
集線器工做在 [1] 物理層。集線器每一個端口至關於一箇中繼器。
最先期的局域網所用的拓撲結構爲總線型。
這麼一種設計實際上是去中心化的思想,也是互聯網誕生的初衷,即美國軍方爲了戰備考慮(沒有中心設備,被摧毀任何一臺,其餘的照樣能夠繼續工做。
其實如今爲了容災,在重要的節點上會採用網狀拓撲結構。
但平常的局域網中,運用最普遍的仍是星形拓撲結構(比較簡單,方便管理),而星形拓撲的中心節點,即由集線器
承擔。
當信號到達集線器
後,會被廣播到整個網絡中,被全部鏈接在它上面的設備收到。(而後由設備根據接收方 MAC 地址來判斷是否應該接收。)
集線器能夠說是以太網思想的最好體現。
由於集線器要跟別的網卡鏈接,因此也具有:
他們負責把電信號轉化成通用格式。
但有本身特殊的模塊:中繼電路
,用於實現信號的廣播。
交換機工做在 [2] 數據鏈路層。交換機每一個端口至關於一個網卡。
但跟網卡的區別是,交換機的端口不具備 MAC 地址。相對的,交換機的端口不覈對接收方 MAC 地址,而是直接接收全部的包並存放到緩衝區中。
我們平時所說的交換機,其實專業說法叫以太網交換機。也有支持其餘(局域網)協議的交換機。
首先咱們看看集線器爲何被淘汰,由於集線器是廣播的形式,擁有以前咱們提到的以太網 CSMA/CD 機制的所有缺點,主要有:
這些都會形成:
而交換機是怎麼解決問題的呢?
交換機內部有一張 MAC 地址與網線端口的對應表,叫 MAC 地址表
。而後根據地址表,用交換電路
(內部交換矩陣)迅速將數據包傳送到目的端口,即轉發
。
若目的MAC在地址表裏找不到,交換機才廣播到全部的端口,接收端口迴應後交換機會「學習」新的地址,並把它添加入內部地址表中。(還有一種狀況會廣播,是接收方 MAC 地址是一個廣播地址。)
當交換機發現一個包要發回到原端口時,就會直接丟棄這個包。
優勢:
總之,交換機會自行更新或刪除地址表中的記錄,不須要手動維護。
當地址表的內容出現異常時,只要重啓一下交換機就能夠重置地址表,也不須要手動進行維護。
具有管理功能的高端交換機是提供手動維護地址表的功能的, 但通常的低端機型中沒有這個功能,想手動維護也不行。
其實交換機比集線器還好在一個地方,即交換機支持全雙工,集線器只支持半雙工。
問:什麼是全雙工 與 半雙工?
答:發送和接收同時並行的方式叫做「全雙工
」 ,相對地,某一時刻只能進行發送或接收其中一種操做的叫做「半雙工
」。
問:怎麼判斷兩個設備之間該用全雙工仍是半雙工?
這裏須要用到自動協商
。
首先,在以太網中,在沒有數據信號時就填充鏈接脈衝,這使得網絡中一直都有必定的信號流過,從而可以檢測對方是否在正常工做,以及網線有沒有正常鏈接。體如今以太網設備的網線接口周圍有一個綠色的 LED 指示燈。
難怪叫以太網叫以太,這個脈衝信號跟宇宙中的以太太像了。
自動協商功能就利用了這樣的脈衝信號,即經過這種信號將本身可以支持的工做模式和傳輸速率相互告知對方,並從中選擇一個最優的組合(參考下表)。
因交換機工做於 OSI 模型的第 2 層(數據鏈路層),故而稱爲二層交換機
。
顧名思義,三層交換機
就是也能夠工做在第 3 層(網絡層),具備部分路由器功能的交換機。
三層交換機能夠同時工做在三層和二層。
感興趣能夠戳:爲何三層交換機沒法替代路由器?
路由器工做在 [3] 網絡層。路由器每一個端口至關於一個網卡。
前面提到交換機端口雖然至關於網卡,可是端口自己不具備 MAC 地址,而路由器的端口具備 MAC 地址(還有 IP 地址),因此他更像網卡。
實際上,咱們家裏用的路由器已經集成了集線器和交換機的功能,像咱們介紹的這種獨立設備的狀況不多見。不過,把每一個功能獨立出來更容易理解。
冷知識:交換機比路由器更加簡單,所以可能有人覺得交換機應該比路由器出現得更早,實際上是路由器先問世的。
端口模塊:不一樣的路由器端口模塊有所不一樣,例如支持 ADSL 的路由器,支持 FTTH 的路由器,支持專線等線路的路由器等。(就跟網卡同樣,也有支持不一樣協議的網卡)
步驟1:確認收包,去 MAC 頭部
跟網卡同樣,路由器的端口都具備 MAC 地址,只接收與自身 MAC 地址相匹配的包,不然丟棄。
完成包接收操做後,丟棄包開頭的 MAC 頭部。
步驟2:查詢路由表肯定輸出接口
上面去掉包的 MAC 頭部後,獲取到 IP 頭部,而後查詢路由表
判斷轉發目標。
查看路由表命令(以 MacOS 爲例):netstat -r
① 匹配規則:
「最長匹配」原則
。
網絡號比特數越長,說明主機號比特數越短,也就意味着該子網內可分配的主機數量越少,即子網中可能存在的主機數量越少,這一規則的目的是儘可能縮小範圍,因此根據這條記錄判斷的轉發目標就會更加準確。
躍點計數越小說明該路由越近,所以應選擇躍點計數較小的記錄。
ICMP(Internet Control Message Protocol,Internet 控制報文協議)
,屬於網絡層協議,提供可能發生在通訊環境中的各類問題反饋。
問:交換機由於鏈接的設備相對少,姑且能夠在 MAC 地址表中放入全部設備的信息,可是路由器鏈接的設備那麼多,路由表怎麼放的下?
答:確實放不下,因此通常路由器都會配默認路由,即路由表最後一行(IP 地址 0.0.0.0,子網掩碼 0.0.0.0),那麼任何地址都能匹配到這一條記錄。
這一行配置的網關地址被稱爲默認網關。
② 肯定轉發目標(接口):
這就是上面提到的默認路由。
補充:對路由表進行維護的方法有幾種,大致上可分爲如下兩類。
路由協議
機制, 經過路由器之間的信息交換由路由器自行維護路由表的記錄
路由協議有不少種,例如 RIP、OSPC、BGP 等都屬於路由協議。
步驟3:轉發前,肯定 MAC 頭部填什麼 —— ARP
路由器知道要從哪一個接口轉發後,接下來須要組裝 MAC 頭部,這裏使用 ARP(Address Resolution Protocol),即地址解析協議
,它能夠根據 IP 地址查詢 MAC 地址。ARP 會利用廣播對全部設備提問:「××× 這個 IP 地址是誰的?請把你的 MAC 地址告訴我。」而後就會有人回答:「這個 IP 地址是個人, 個人 MAC 地址是 ×××。」 路由器也有 ARP 緩存表
,所以首先會在 ARP 緩存中查詢,若是找不到再發送 ARP 查詢請求。
在 OSI 模型中 ARP 協議屬於數據鏈路層;而在 TCP/IP 模型中,ARP 協議屬於網絡層。
arp -a
命令能夠顯示 ARP 緩存內容。拓展:ARP 欺騙
ARP 是創建在網絡中各個主機互相信任的基礎上的,局域網絡上的主機能夠自主發送ARP應答消息,其餘主機收到應答報文時不會檢測該報文的真實性就會將其記入本機ARP緩存;由此攻擊者就能夠向某一主機發送僞ARP應答報文,使其發送的信息沒法到達預期的主機或到達錯誤的主機,這就構成了一個ARP欺騙。
至於應對的方法有不少種,這裏略。
步驟4:改寫 MAC 頭部,發包
TTL(Time to Live, 生存時間)
。通常發送方在發送包時會將 TTL 設爲 64 或 128,而後路由器在轉發包的時候,都要減 1,當這個值變成 0 時,就表示超過了有效期,這個包就會被丟棄。如今的互聯網即使訪問一臺位於地球另外一側的服務器,最多也只須要通過幾十個路由器。
MAC 頭部很容易被誤解爲是由網卡來處理的,實際上它是由 TCP/IP 軟件來負責的。
MAC 地址表示物理地址,IP 地址表示邏輯地址。
IP 地址本質上是終點地址,它在跳過路由器的時候不會改變,而 MAC 地址則是下一跳的地址,每跳過一次路由器都會改變。
因此交換機只是將進來的包轉發出去而已,本身並不會成爲發送方或者接收方。
即 路由表管 IP 地址的轉發,ARP 管 MAC 地址的轉發。
也請注意,MAC 地址表、ARP 表、路由表 的區別。
① NAT
上面咱們討論過 NAT(Network Address Translation,網絡地址轉換)
來緩解 IPv4 地址稀缺的問題。那技術上是如何實現的呢?
早期的地址轉換機制是只改寫 IP 地址,不改寫端口號的(解決內網中的設備不能和互聯網直接收發網絡包的問題)。即映射表是一對一的關係(一個公網地址對應一個私網地址),但這節省不了IPv4地址空間。
後來,IPv4 地址稀缺,NAT 的做用來了,即,既改寫 IP 地址,也改寫端口號。而映射表是一對多的關係(一個公網地址對應多個私網地址,用端口號區分)
端口號是一個 16 比特 的數值,總共能夠分配出幾萬個端口。
額外加成:
NAT 有防火牆的做用,即對於沒有在訪問互聯網的內網設備,是沒法從互聯網向其發送網絡包的。
但有時候咱們但願可以從互聯網訪問公司內網,這須要進行一些設置才能實現。之因此沒法從互聯網訪問內網,是由於映射表裏沒有相應的記錄,那麼咱們只要事先手動添加這樣的記錄就能夠了。
② 路由器的包過濾
功能
包過濾指的是,路由器在對包進行轉發時,根據 MAC 頭部、IP 頭部、TCP 頭部的內容,按照 事先設置好的規則決定是轉發這個包,仍是丟棄這個包。
咱們一般說的防火牆設備或軟件,大多數都是利用這一機制來防止非法入侵的。
嚴格來講,IP 模塊和 MAC 模塊有各自的責任範圍,MAC 頭部應該由 MAC 模塊(例如網卡)去添加,而不是 IP 模塊,但從現實來看,讓 IP 負責是有利的。 若是在交給網卡以前,IP 模塊可以完成打包工做,那麼網卡只要將打好的包發送出去就能夠了(至於接收操做也同樣),對於除 IP 之外的其餘類型的包也是如此。這樣一來,同一塊網卡就能夠支持各類類型的包。與其機械地設計模塊和設備之間的分工,致使網卡只能支持 IP 包,不如將分工設計得現實一些,讓網卡可以靈活支持各類類型的包。
嚴格來講,TCP 模塊和 IP 模塊有各自的責任範圍,TCP 頭部屬於 TCP 的 責任範圍,而 IP 頭部屬於 IP 模塊的責任範圍。而現實中是,當包交給 TCP 模塊以後,TCP 模塊須要查詢 IP 頭部中的接收方和發送方 IP 地址來查找相應的套接字,這個過程就顯得有點奇怪。由於 IP 頭部是 IP 模塊負責的,TCP 模塊去查詢它等因而越權了。
若是要避免越權,應該對二者進行明確的劃分,IP 模塊只向 TCP 模塊傳遞 TCP 頭部以及它後面的數據,而對於 IP 頭部中的重要信息,即接收方和發送方的 IP 地址,則由 IP 模塊以附加參數的形式告知 TCP 模塊。然而,若是根據這種嚴格的劃分來開發程序的話,IP 模塊和 TCP 模塊之間的交互過程必然會產生成本, 並且 IP 模塊和 TCP 模塊進行相似交互的場景其實很是多,整體的交互成本就會很高,程序的運行效率就會降低。所以,就像以前提過的同樣,不妨將責任範圍劃分得寬鬆一些,將 TCP 和 IP 做爲一個總體來看待,這樣能夠帶來更大的靈活性。
ping 能夠說是 ICMP 協議最著名的應用。利用「ping」命令能夠檢查網絡是否連通,能夠很好地幫助咱們分析和斷定網絡故障。
用法:ping baidu.com
原理:用類型碼爲0的ICMP發請求,收到請求的主機則用類型碼爲8的ICMP迴應。
ping 是 ICMP 協議,工做在網絡層,因此確定是 ping 不了端口的。
方法一:telnet
以 CentOS 爲例,默認是沒有安裝 telnet 的,因此須要安裝下: yum install telnet
。
用法:telnet baidu.com 80
方法二:nc( MacOS 下)
MacOS 下有自帶的 nc 命令,跟 telnet 命令同樣,他也能夠操縱 TCP or UDP。
用法:nv -vz -w 2 baidu.com 80
traceroute 是用來偵測主機到目的主機之間所經路由狀況的重要工具,也是最便利的工具。
用法:traceroute baidu.com
原理:traceroute 的原理是很是很是的有意思,它收到到目的主機的IP後,首先給目的主機發送一個TTL=1的UDP數據包,而通過的第一個路由器收到這個數據包之後,就自動把TTL減1,而TTL變爲0之後,路由器就把這個包給拋棄了,並同時產生一個主機不可達的ICMP數據報給主機。主機收到這個數據報之後再發一個TTL=2的UDP數據報給目的主機,而後刺激第二個路由器給主機發ICMP數據報。如此往復直到到達目的主機。這樣,traceroute就拿到了途徑全部的路由器IP。
接入網
用於鏈接網絡運營商(ISP)的線路,鏈接用戶與互聯網。
接入網這個詞表示的是通訊線路的用法,而並不表示通訊線路的結構。例如公司裏使用的專線,當它用來鏈接互聯網時就叫做接入網,而用來鏈接總公司和分公司時就不叫接入網。 此外,接入網這個詞也不只限於互聯網,當使用運營商提供的通訊服務時,通常都會將用戶與運營商之間的線路叫做接入網。
通常家用的接入網方式包括 ADSL、FTTH 、CATV、電話線、ISDN 等,公司則還可能使用專線。接入網的線路有不少種類,咱們沒法探索全部這些線路,下面值介紹兩種最經常使用的。
專線
是固定鏈接線路,不須要進行身份認證,其實,這就是最古老的互聯網接入方式。
ADSL:Asymmetric Digital Subscriber Line,不對稱數字用戶線
。它是一種利用架設在電線杆上的金屬電話線來進行高速通訊的技術,它的上行方向(用戶到互聯網)和下行方向(互聯網到用戶)的通訊速率是不對稱的。
用戶端所需設備:
分離器
。ADSL Modem
,Modem
即調制解調器
,實際上是Modulator(調製器)與Demodulator(解調器)的簡稱。
有些狀況下會使用集成了互聯網接入路由器和 ADSL Modem 的多功能 ADSL Modem(也叫
路由型 ADSL Modem
),其實就是把路由器和 ADSL Modem 裝到一個外殼裏而已。
FTTH:Fiber To The Home,光纖到戶
。指的是將光纖接入家庭的意思。
① 光纖
先將數字信息轉換成電信號,而後再將電信號轉換成光信號。亮表示 1,暗表示 0。
發送端是光源
。
接收端有能夠感應光線的光敏元件
,光敏元件能夠根據光的亮度產生不一樣的電壓。當光信號照射到上面時,光亮的時候就產生高電壓,光暗的時候就產生低電壓,這樣就將光信號轉換成了電信號。
② 單模光纖和多模光纖
單模光纖
和多模光纖
在光的傳導方式上有所不一樣,這決定了它們的特性也有所不一樣。
使用場景:單模光纖的失真小,能夠比多模光纖更長,所以多模光纖主要用於一座建築物裏面的鏈接,單模光纖則用於距離較遠的建築物之間的鏈接。
FTTH 主要使用單模光纖。
③ 直連和分路
一種光纖的接入方式是用一根光纖直接從用戶端鏈接到最近的電話局。 用戶端使用光纖收發器
(即光 Modem),將電信號轉換成光信號的設備。
另外一種光纖的接入方式是在用戶附近的電線杆上安裝一個名爲分光器
的設備,經過這個設備讓光纖分路,同時鏈接多個用戶。在這種方式下,用戶端不使用光纖收發器,而是使用一個叫做 ONU(Optical Network Unit, 光網絡單元)
的設備,它和光纖收發器同樣,能夠將電信號轉換成光信號。
經過光纖分路鏈接多個用戶的光纖接入模式統稱爲
PON(Passive Optical Network, 無源光網絡)
, 可分爲 GE-PON、WDM-PON、B-PON、G-PON 等多種方式,如今大多使用最高速率爲 1 Gbit/s 的 GE-PON 方式。
終端盒
能夠當是對光纖收發器和 ONU 等光纖終端設備的統稱。
順着上面的內容,用戶發送的網絡包會經過 ADSL 和 FTTH 等接入網到達運營商的 BAS(Broadband Access Server,寬帶接入服務器)
。
BAS 又稱 BRAS(Broadband Remote Access Servers),一樣是寬帶接入服務器。
問:BAS 也是一種路由器,那與通常的路由器有什麼不一樣?
答:BAS 能夠提供用戶認證和配置下發功能。例如 BAS 讓終端用戶須要先輸入用戶名和密碼,登陸以後才能訪問互聯網。
BAS 經過 PPPoE(Point-to-Point Protocol over Ethernet,以太網的點對點協議)
來實現上面的功能。
PPPoE 是由傳統電話撥號上網上使用的 PPP 協議發展而來的,屬於數據鏈路層。
PPPoE 包的頭部組成:
互聯網的實體並非由一個組織運營管理的單一網絡,而是由多個運營商網絡相互鏈接組成的。
POP: Point of Presense,中文通常叫做「接入點」
ADSL、FTTH 等接入網與用戶簽約的運營商相連的設備,稱爲 POP。
互聯網的入口就位於這裏。
NOC: Network Operation Center,網絡運行中心
NOC 是運營商的核心設備,從 POP 傳來的網絡包都會集中到這裏,並從這裏被轉發到離目的地更近的 POP,或者是轉發到其餘的運營商。
這裏須要配備高性能的路由器。到底須要多高的性能才行呢?咱們來看實際產品的參數。面向運營商的高性能路由器中有些產品的數據吞吐量超過 1 Tbit/s ,而通常面向我的的路由器的數據吞吐量也就 100 Mbit/s 左右,二者相差 1 萬多倍。固然,路由器的性能不徹底是由吞吐量決定的,但從這裏能夠看出規模和性能的差別。
其實,NOC 和 POP 並沒有很是嚴格的界定。NOC 裏面也能夠配備鏈接接入網的路由器,不少狀況下是和 POP 共用的。所以,你們能夠簡單地認爲,NOC 就是規模擴大後的 POP。
IX: Internet eXchange,互聯網交換中心
用於不一樣運營商之間的鏈接。
這裏的路由器會使用到 BGP: Border Gateway Protocol,邊界網關協議
。且路由交換可分爲兩類:
轉接
。非轉接
,也叫對等
。拓展:租借光纖
只有有限的幾家大型運營商才擁有本身的光纖。那麼,其餘運營商怎麼辦呢?其實也不難,只要從其餘公司租借光纖就能夠了,擁有光纖的公司通常都會提供光纖租用服務,這個光纖租用不必定租用的就是光纖,可能也是將本身的光纖的一部分通訊能力租借給客戶。
這種服務就叫做
通訊線路服務
。
爲了保證在遇到停 電、火災等事故,以及地震等天然災害時,路由器等網絡設備還能繼續工做,IX 所在的大樓都裝有自主發電設備,並具備必定的抗震能力。其實這樣的要求也不只限於 IX,運營商的 NOC 也是同樣。