計算機網絡基礎
- 2020 年 6 月 26 日
- 筆記
- Python基礎, Python網絡編程
網絡協議介紹
互聯網的本質就是一系列的網絡協議。一台硬設有了操作系統,然後裝上軟件就可以正常使用了。然而這樣只能局限於擁有者一個人使用,如果每一個人都這樣那麼其實是彼此之間孤立且不互通的。將地理位置不同的且具有獨立功能的多台計算機及其外部設備,通過通信線路連接起來,在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統就叫做計算機網絡。
其實計算機和計算機之間的通信和兩個人打電話之間的通信原理是一樣的。比如中國有很多地區,如果一個新疆人和一個廣西人打電話彼此都用着自己地區的方言。那麼互相之間是誰都聽不懂對方說什麼的,但是如果統一說普通話,這兩個人互相就能聽得懂了。既然有了大家統一都說了普通話的標準,那麼至少在中國範圍內是全部都聽得懂了。但是如果到了國外又不行了,外國人聽不懂普通話呀,所以大家這時候就全部說英語。那就又能都彼此聽得懂了。
網絡協議其實也是和上面的道理是一樣的,各個計算機為了能夠互相之間進行通信,故而產生了一系列共同遵守的規則,這些規則就被稱之為協議。網絡硬件本就是基於協議運作的。
互聯網協議的功能:定義計算機如何接入 Internet ,以及對已經接入 Internet 的計算機之間的通信制定標準。
大家可能經常聽說過 OSI 七層網絡協議以及 TCP/IP 網絡通信協議等等。實際上這些多少層多少層的都是很抽象的東西,只是按照不同的協議實現的具體功能而劃分出的這些層次(層次本身就是虛擬概念,是不存在的東西)。
OSI七層模型與TCP/IP五層模型介紹
如今的協議在教科書上一般都會介紹OSI七層協議與TCP/IP五層協議,但是現實生活中基本都是用的TCP/IP協議居多,理解OSI能夠更好的理解TCP/IP協議。
每一層都運行的有不同的網絡協議,實際上每一層的劃分就是通過這些網絡協議的功能來劃分的。當然每一層也運行着常見的網絡物理設備。
關於每一層的具體功能下面會逐一做詳細的介紹。但是表示層和會話層這邊不做具體的詳解,感興趣的朋友可以自己百度一下相關方面的資料。
TCP/IP五層模型之物理層
物理層主要負責基於電器特性發送高低電壓 (電信號),高電壓對應數字1低電壓對應數字0,物理層就是負責線路聯通和傳輸電信號,不斷的101010來產生數據。數據本身是沒有意義的,但是具有了相應的規則就會產生意義。
物理層包括(光纜,電纜,雙絞線,無線電波等等…)
TCP/IP五層模型之數據鏈路層
數據鏈路層最大的作用就是對電信號來制定規則。因為單純的電信號0和1是沒有任何意義。必須要規定多少電信號位一組,每組什麼意思,早期的時候各個公司都有自己的分組方式,後來形成了統一的標準。就是以太網協議 ethernet。
以太網協議規定一組電信號構成一個數據包,叫做幀。
每一數據幀分成:報頭head和數據data兩個部分。
Head 包含:(固定18個位元組)
發送者 / 源地址 :6個位元組
接受者 / 目標地址 :6個位元組
數據類型: 6個位元組
Data包含:(最短46位元組,最長1500位元組)
數據包的具體內容
Head + data = 最短64位元組,最長1518位元組。超過最大限制就分片發送。
MAC地址:
Head中包含的源和目標地址由來:ethernet規定接入Internet的設備必須要具備網卡。發送端和接收端的地址便是指的網卡的地址,即是MAC地址。
MAC地址在每一塊網卡出廠時候都會被燒紙一個世界上唯一的MAC地址。長度為48位2進制。通常由12位16進制數表示,前六位是廠商地址,後六位是流水線地址。
廣播:
有了MAC地址,同一網絡內的兩台主機就可以通信了。(一台主機通過ARP協議獲取另一台主機的MAC地址)。ethernet採用最原始的方式,即廣播的方式進行通信,即計算機通信基本靠吼。
TCP/IP五層模型之網絡層
網絡層由來:有了ethernet,MAC地址,廣播的發送方式,世界上的計算機就可以彼此通信了,但是有一個問題就是說全世界範圍內的互聯網都是由一個個彼此隔離的小小的局域網組成,如果所有的通信都採用以太網的廣播方式。那麼一台機器發送的包全世界都會收到,這不僅僅是效率低的問題,更是一種災難。
由於有太多的局域網了,必須找出一個方法來區分哪些計算機同屬於一個廣播域,哪些不是,如果是的話再採用廣播的方式發送,如果不是就採用路由的方式(向不同的廣播域 / 子網分發數據包),並且MAC地址是無法區分廣播域的,它只跟廠商有關,於是網絡層誕生了,主要功能:引入一套新的網絡地址(非MAC地址)用來區分不同的廣播域 / 子網。
因此網絡層定義了一種叫做IP協議的東西。
IP協議:
規定網絡地址的協議叫做IP協議,它定義的地址稱為IP地址,目前廣泛採用V4版本。V4版本規定網絡地址由32位2進制表示。
範圍:0 . 0 . 0 . 0 —> 255 . 255 . 255 . 255
IP地址通常用點分十進制來定義,例如:172.16.10.1
IP地址分為兩部分即:
網絡部分:標識子網
主機部分:標識主機
子網掩碼:
所謂」子網掩碼」,就是表示子網絡特徵的一個參數。它在形式上等同於IP地址,也是一個32位二進制數字,它的網絡部分全部為1,主機部分全部為0。比如,IP地址172.16.10.1,如果已知網絡部分是前24位,主機部分是後8位,那麼子網絡掩碼就是11111111.11111111.11111111.00000000,寫成十進制就是255.255.255.0。
知道」子網掩碼」,我們就能判斷,任意兩個IP地址是否處在同一個子網絡。方法是將兩個IP地址與子網掩碼分別進行AND運算(兩個數位都為1,運算結果為1,否則為0),然後比較結果是否相同,如果是的話,就表明它們在同一個子網絡中,否則就不是。
比如,已知IP地址172.16.10.1和172.16.10.2的子網掩碼都是255.255.255.0,請問它們是否在同一個子網絡?兩者與子網掩碼分別進行AND運算,
172.16.10.1:10101100.00010000.00001010.000000001
255255.255.255.0:11111111.11111111.11111111.00000000
AND運算得網絡地址結果:10101100.00010000.00001010.000000001->172.16.10.0
172.16.10.2:10101100.00010000.00001010.000000010
255255.255.255.0:11111111.11111111.11111111.00000000
AND運算得網絡地址結果:10101100.00010000.00001010.000000001->172.16.10.0
結果都是172.16.10.0,因此它們在同一個子網絡。
總結一下,IP協議的作用主要有兩個,一個是為每一台計算機分配IP地址,另一個是確定哪些地址在同一個子網絡。
IP數據包:
IP數據包和數據幀是一樣的,都是有一個head和data。在head里也包括了目標IP地址和自身的IP地址。但是網絡層的數據包和數據鏈路層的數據包都是基於物理層端口傳輸出去的,這就產生了一個問題,有兩個包。怎麼解決呢?其實只要把IP數據包放到ethernet數據包的data部分就好了。最後通過物理層電信號發送出去。最終的數據幀就變成了下圖。
Arp協議(數據鏈路層的協議,此處舉例是為了與網絡層IP協議配合完成通信):
ARP協議作用:廣播的方式發送數據包獲取主機的MAC地址。
協議工作方式:每台主機的IP地址都是已知的。
1.準備發送數據
2.分析目標IP是否與自身存在於同一廣播域(是)
3.查看自身ARP緩存 (IP地址,MAC地址 一一對應)
4.如果沒有則吼一聲 目標MAC填寫12個F 目標IP填上對應的目標IP地址
5.所有當前廣播域計算機收到該包,拆開一看如果IP是自己則告訴發送方自身的MAC地址
6.發送方拿到回應信息,更新ARP緩存
7.接下來的通信將不用通過廣播的方式發送,而是點對點的進行通信
ARP協議外網通信過程:
1.準備發送數據
2.分析目標IP是否與自身存在於同一廣播域(不是)
3.查看自身ARP緩存
4.目標IP填寫網關IP,目標MAC填寫12個F
5.網關回應,拿到網關MAC地址,更新ARP緩存
6.目標IP填寫目標的IP地址,目標MAC填寫12個F
7.開啟漫長的路由過程,通過IP地址去找目標計算機的廣播域,並拿到其目標MAC地址
8.發送方拿到回應信息,更新ARP緩存
9.接下來的通信將不用再去先獲取網關的MAC地址了,而是通過路由點對點的與外網目標計算機進行通信
TCP/IP五層模型之傳輸層
傳輸層的由來,就是在網絡層前提下產生來的。打個比喻,有了IP地址,有了MAC地址我們確實是能和目標計算機進行通信。但是問題是怎麼具體和目標計算機怎麼通信呢?通過QQ ? 微信?還是其他的通信軟件?所以這個時候就需要使用端口,一個端口對應一個軟件。而端口是和網卡綁定到一起的,網卡上有MAC地址,有IP地址。如果沒有端口號,是找不到相應的應用程序的。
把局域網比作一個房間,IP地址表示目標計算機在哪個房間,MAC地址表示目標計算機坐在了哪裡,端口號則表示了怎麼和目標計算機進行溝通。是丟紙條?還是直接對話?
傳輸層就是基於端口的一個層面。而端口可指定的範圍是0 – 65535,0 – 1024位系統佔用端口。
TCP協議
可靠傳輸,TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度。以確保單個TCP數據包不會被分割。
UDP協議
不可靠傳輸,報頭部分只有 8 個位元組,總長度不超過65,535,正好放進一個IP數據包
TCP/IP五層模型之應用層
應用層就是屬於跑應用程序的一層。
應用層的功能:規定應用程序的數據格式
例:TCP協議可以為各種各樣的程序傳遞數據,比如Email,www,ftp等等,那麼,必須有不同協議規定電子郵件,網頁,ftp數據的格式。這些應用程序之間的協議就構成了應用層。
其他的比如:
表示層就是做一個數據的壓縮和解壓縮以及加密解密的協議。(不做詳解)
會話層主要就是一些會話方面的協議而已。(不做詳解)
我們其實在今後的學習中使用最多的也就是應用層,在應用層中我們可以定製屬於自己的協議(其他層不行),需要注意的是我們自定製的協議必須也要是由Head和data兩部分組成。
總結:數據包的的發送就是一個封裝的過程,不斷的封裝解包封裝解包。
IP地址並不是憑空產生的,而是由兩種情況產生。
1.手動靜態配置
2.通過DHCP服務器自動獲取(基於UDP協議)
接下來我們就講解通過DHCP服務器獲取IP地址的這一套流程,首先這個請求IP地址的過程是通過UDP協議進行的,我們來看一下它的數據組成部分。
以太網標頭 | IP標頭 | UDP標頭 | DHCP數據包 |
---|
以太網標頭
包含本機MAC地址,DHCP服務器的MAC地址。由於我們剛開機,所以DHCP服務器的MAC地址是不知道的,所以這個時候通過ARP協議將接收方的MAC地址設為FF-FF-FF-FF-FF-FF。
IP標頭
這一部分是設置發送方的IP地址與接收方的IP地址。由於我們剛開機,這兩者都不知道,所以對於發送發也就是自身的IP地址來說填上0.0.0.0,而對於接收方的IP地址我們也不知道,就填上255.255.255.255
UDP標頭
這一部分填入的發送方的端口與接收方的端口,由DHCP協議規定死的,發送方的端口是68,而接收方的端口是67
首先,這個數據包構造完成後會在當前廣播域以廣播的方式發送,同一子網內的所有計算機都會收到該數據包,由於接收方地址是FF-FF-FF-FF-FF-FF,所有的計算機都不知道這個包是要發給誰,當所有的計算機對該包進行拆包分析的時候就會看到發送方的IP地址是0.0.0.0而接收方的地址是255.255.255.255,進行到這一步DHCP服務器恍然大悟,原來這個包是發給我的。而其他計算機則可以丟棄這個包。
此時,DHCP服務器會分配好IP地址,並發送回一個「DHCP響應”的數據包,這個響應包的結構也是類似的。以太網標頭的MAC地址是雙方的網卡地址,IP標頭的IP地址是DHCP服務器的IP地址(發送方)和255.255.255.255(接收方),UDP標頭的端口是67(發送方)和68(接收方),分配給請求端的IP地址和本網絡的具體參數則包含在Data部分。
新加入的計算機收到這個響應包,於是就知道了自己的IP地址、子網掩碼、網關地址、DNS服務器等等參數。
淺析DNS服務
DNS( Domain Name System)是”域名系統”的縮寫,它的主要職責就是提供域名解析服務。
其實我們的互聯網通信絕大多數都是基於TCP/IP協議進行,有了IP地址加端口就可以找到全世界範圍內獨一無二的一台計算機上的一個網絡程序。但是這樣做會很麻煩因為我們根本不可能記住太多的毫無規則的IP地址。為了解決這種情況,出現了域名這個玩意兒,這玩意兒和IP地址一一對應,當你在瀏覽器內輸入一個域名的時候就會通過DNS解析出它對應的IP地址。
那麼,我們輸入一個網址的時候是如何解析出其對應的IP地址呢?這個就有一系列非常複雜的過程(其本質也是通過UDP協議進行發包,因為速度快,不用建立雙向鏈接通道)
我這裡盡量用通俗的語言來闡述這一過程,在研究該過程之前我們先來研究一下域名的組成部分。
這裡貼一張圖,並附上一段視頻鏈接感興趣的朋友可以看一下裏面介紹的很詳細:域名詳解視頻
通常我們可以這麼區分:
二級域:兩個點如: www.baidu.com ; tieba.baidu.com等等
主機名: 如www,mail等等
域名解析流程:
1) 瀏覽器緩存
當用戶通過瀏覽器訪問某域名時,瀏覽器首先會在自己的緩存中查找是否有該域名對應的IP地址(若曾經訪問過該域名且沒有清空緩存便存在);
2) 系統緩存
當瀏覽器緩存中無域名對應IP則會自動檢查用戶計算機系統Hosts文件DNS緩存是否有該域名對應IP;
3) 路由器緩存
當瀏覽器及系統緩存中均無域名對應IP則進入路由器緩存中檢查,以上三步均為客服端的DNS緩存;
4) ISP(互聯網服務提供商)DNS緩存
當在用戶客服端查找不到域名對應IP地址,則將進入ISP DNS緩存中進行查詢。比如你用的是電信的網絡,則會進入電信的DNS緩存服務器中進行查找;
5) 根域名服務器
當以上均未完成,則進入根服務器進行查詢。全球僅有13台根域名服務器,1個主根域名服務器,其餘12為輔根域名服務器。根域名收到請求後會查看區域文件記錄,若無則將其管轄範圍內頂級域名(如.com)服務器IP告訴本地DNS服務器;
6) 頂級域名服務器
頂級域名服務器收到請求後查看區域文件記錄,若無則將其管轄範圍內主域名服務器的IP地址告訴本地DNS服務器;
7) 主域名服務器
主域名服務器接受到請求後查詢自己的緩存,如果沒有則進入下一級域名服務器進行查找,並重複該步驟直至找到正確紀錄;
8)保存結果至緩存
本地域名服務器把返回的結果保存到緩存,以備下一次使用,同時將該結果反饋給客戶端,客戶端通過這個IP地址與web服務器建立鏈接。
13台根服務器 | ||
---|---|---|
URL | IP | 所在地 |
A.root-servers.net | 198.41.0.4 | 美國 |
B.root-servers.net | 192.228.79.201 | 美國(另支持IPv6) |
C.root-servers.net | 192.33.4.12 | 法國 |
D.root-servers.net | 128.8.10.90 | 美國 |
E.root-servers.net | 192.203.230.10 | 美國 |
F.root-servers.net | 192.5.5.241 | 美國(另支持IPv6) |
G.root-servers.net | 192.112.36.4 | 美國 |
H.root-servers.net | 128.63.2.53 | 美國(另支持IPv6) |
I.root-servers.net | 192.36.148.17 | 瑞典 |
J.root-servers.net | 192.58.128.30 | 美國 |
K.root-servers.net | 193.0.14.129 | 英國(另支持IPv6) |
L.root-servers.net | 198.32.64.12 | 美國 |
M.root-servers.net | 202.12.27.33 | 日本(另支持IPv6) |
除此之外DNS查詢過程還分為遞歸查詢和迭代查詢兩種模式。
1)遞歸查詢
遞歸查詢是一種DNS 服務器的查詢模式,在該模式下DNS 服務器接收到客戶機請求,必須使用一個準確的查詢結果回復客戶機。如果DNS 服務器本地沒有存儲查詢DNS 信息,那麼該服務器會詢問其他服務器,並將返回的查詢結果提交給客戶機。
2)迭代查詢
DNS 服務器另外一種查詢方式為迭代查詢,DNS 服務器會向客戶機提供其他能夠解析查詢請求的DNS 服務器地址,當客戶機發送查詢請求時,DNS 服務器並不直接回複查詢結果,而是告訴客戶機另一台DNS 服務器地址,客戶機再向這台DNS 服務器提交請求,依次循環直到返回查詢的結果
為止。
參考文獻
本文主要記錄于海峰老師關於計算機網絡中的講解,其中有些深入知識點並沒有涉及。這些會在後面做一個詳細的補充,附上B站視頻鏈接
看海峰老師如何詳解計算機網絡基礎:
視頻鏈接://www.bilibili.com/video/BV19b41137Xp
原文章鏈接://www.cnblogs.com/linhaifeng/articles/5937962.html