從零開始的電腦網路基礎(圖文並茂,1.8w字,面試複習必備)

前言

在互聯網高速發展的今天,我們通過手機,電腦等通訊設備可以很輕鬆達到未出茅廬便知天下事的境界。每天我們都要訪問數不勝數的網站,通過打開瀏覽器,輸入網址兩步搞定。當然更為常規的做法是打開瀏覽器,設置首頁為某個搜索引擎網站(如百度,Google),在搜索框中輸入想要訪問的關鍵詞,幾秒的功夫一個個網站就呈現在客官眼前任由客觀挑選。但,,,你有沒有想過為什麼只是輸了個網址怎麼頁面就呈現出來了呢?

preword.jpg

初探電腦網路

網路

網路的概念是指一組具有通訊功能的設備相互連接形成的。什麼叫具有通訊功能的設備呢?這個可以分為主機,如電腦、手機等;以及連接設備如路由器,交換機,數據機等。此時這些連接設備對於你來說可能只是個抽象的名詞,不過沒關係,之後我都會一一講到,請耐心地看下去。

區域網,廣域網,互聯網路

區域網(LAN),通常是私有的,用於連接一個辦公室,一棟教學樓,一個工作室等等。

如下圖,處於同一個區域網的用戶A,B。A可以聯繫到B,但卻不能聯繫到處於另一個區域網的C。

image1.jpg

廣域網(WAN),廣域網相比於區域網,有著更大的地理覆蓋範圍。可以覆蓋一個城市,一個省,一個國家,甚至全世界。

如下圖,廣域網由一個個子網路連接而成,並且廣域網中的子網路之間可以正常通訊。

image2.jpg

互聯網路,幾乎不存在孤立的區域網或廣域網,它們都相互連接在一起。當兩個或多個網路連接起來,就形成了一個互聯網路。

internet.png

資訊交換

由圖1,圖2我們很容易產生網路之間和同一網路下的用戶之間的通訊方式是一樣的錯覺。所以看到圖3很疑惑欸,箭頭沒有了,虛線來了,路由器和交換機也來了。。別忙著揍我,先聽我解釋。

電路交換網路

兩個終端之間始終保持一條專用連接,由交換機進行轉發。由圖可以發現連接兩個子網的線路更「粗」,這是因為每個終端都需要一個專用連接,所以線路的頻寬更大,也就更「粗」了。

circuit-switched.png

分組交換網路

同一個子網路的終端之間依然保持一條專用連接,但子網間的通訊不再為所有的終端建立專用連接,而是一個固定大小的線路,每個消息根據到達先後順序排隊,每次取不大於線路頻寬的消息進行轉發。細心的同學會發現上圖的交換機這裡變成了路由器,其實路由器也擁有交換機資訊轉發的功能,但除此之外還增加了一個網路層用於IP定址。這是網路間通訊的關鍵,之後會在網路層中詳細講解。

router-switch.png

為什麼資訊交換中既用交換機又用路由器

如圖3,既使用了電路交換網路,又使用了分組交換網路。之前談到過,路由器比交換機多了一個網路層,因此進行數據轉發時花費的時間更多,使用交換機進行子網內部數據轉發更加合適。而子網間通訊之所以更多選取分組交換網路,是因為雖然分組交換需要排隊會帶來一些時延,但比電路交換成本更加低廉,資源利用率也更高。

網路分層

為什麼要分層??這裡是一個例子

假如夏爾和慕恩是一對高三小情侶,為了防止親密的資訊被父母看到,他們決定對會話進行加密,享受美好的二人時光。

example1.png

從以上可以看出,夏爾和慕恩之間的通訊從上到下分為三層,第一層負責讀/寫消息,第二層負責加密/解密消息,第三次層責發送/接收。每一層相互對應,層與層之間互不干擾,每層都做自己分內的事。

TCP/IP協議簇

tcp_cen.png

網路傳輸也採用這個思想,將複雜的傳輸過程,分為一個個層次模組。模組內部接收上一層傳遞的資訊然後進行處理,處理結束後呈遞到下一層。

這裡說一下為什麼路由器接收和發送不使用同一個鏈路。因為雖然路由器有同一個網路層,但它涉及到n個鏈路和物理層協議的任意組合,路由器接收基於一對協議的鏈路1再把它投遞到基於另一對協議的鏈路2。而交換機雖然含兩層,但兩層在同一個協議集中。

關於各層次的功能特點會在之後的內容中詳細介紹。

應用層

從一個例子說起

眼看情人節到了,夏爾少爺成功熬過12點,準點發送了情人節快樂的消息。消息經應用處理為報文通過下面幾層網路成功傳遞到慕恩那裡。慕恩開心地看著手機發獃。。。

image2.png

你說的太簡單了,我需要更多的力量(知識)

進程通訊

兩個終端間的通訊本質上是終端作業系統中進程之間的通訊。

兩個不同系統中的進程,通過電腦網路交換報文而相互通訊。

作業系統中的進程是CPU資源分配的最小單位,一個進程可以被認為是運行終端系統中的一個程式。

image.png

上圖是一個終端間進程通訊的簡單示意圖。我們可以把進程比作一個房子,socket就像房子的大門,報文通過大門經傳輸層-網路層-數據鏈路層-物理層傳輸到目的地。再自下而上地去掉各層首部。

報文

在圖8所示的流程中,應用層所關心的只有一個,那就是報文。應用層協議定義了運行在不同端系統上的應用進程如何相互傳遞報文。應用層協議定義了:

  1. 報文的類型(響應報文/請求報文)。
  2. 報文類型的語法(如HTTP協議中請求報文首行是請求方法,請求地址,協議;而響應報文首行是協議,狀態碼,描述)。
  3. 欄位的語義(欄位對應的資訊含義)。
  4. 一個進程何時以及如何發送報文,對報文進行響應的規則。

你所應當了解的應用層協議

如何讓報文攜帶協議資訊呢

很容易想到可以讓報文攜帶協議的標記欄位,然後到達目的地後再檢查該欄位。那麼具體如何實現呢?其實只需要將協議標識的首部欄位加在報文的首部,然後隨報文發送而發送。檢測的話,取下首部欄位,按協議要求將數據報文發送給首部欄位對應的socket即可。

http協議

http.png

定義:

超文本傳輸協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少。簡單來說http協議起到了一個讓你點擊網站後能得到頁面回饋的作用。

http1.0

在http早期,每個http請求都要求打開一個tcp socket連接,並且使用一次之後就斷開這個tcp連接。

http1.1

http1.1可以使用keep-alive可以改善這種狀態,即在一次TCP連接中可以持續發送多份數據而不會斷開連接。通過使用keep-alive機制,可以減少tcp連接建立次數,也意味著可以減少TIME_WAIT狀態連接,以此提高性能和提高httpd伺服器的吞吐率。但是keep-alive timeout時間也不是越長越好,長時間的tcp連接容易導致系統資源無效佔用,因此設置合理的keep-alive timeout時間很重要

http2.0
  1. 多路復用。建立一個tcp連接,一個連接上有任意多個流,報文消息分割為一個幀或多個幀在位元組流裡面並發傳輸,值得注意的是同一報文的若干幀必須在同一位元組流上進行傳播。等待報文幀傳輸完成後再進行消息重組。

  2. 二進位分幀。將傳輸的報文劃分為首部和消息負載兩個幀,並採用二進位編碼。

  3. 首部壓縮:客戶端與服務端維護一份相同的靜態字典,裡面保存了常用請求頭的名稱和值,對於字典中只有名稱沒有值的首部,在傳輸時需要先索引其值在用哈夫曼編碼減少體積,客戶端和服務端還會維護一個動態字典用於存放請求用到的頭部,後續傳播就可以只傳索引,

  4. 伺服器推送:服務端可以主動向客戶端推送資源。

http和https的區別
  1. http是超文本傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
  2. http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
  3. https協議需要ca證書,費用較高。
  4. 使用不同的鏈接方式,埠也不同,一般而言,http協議的埠為80,https的埠為443
證書驗證

瀏覽器使用內置的根證書中的公鑰來對收到的證書進行認證,如果一致,就表示該安全證書是由可信任的頒證機構簽發的,這個網站就是安全可靠的;如果該SSL證書不是根伺服器簽發的,瀏覽器就會自動檢查上一級的發證機構,直到找到相應的根證書頒發機構,如果該根證書頒發機構是可信的,這個網站的SSL證 書也是可信的。

ssl握手過程
  1. 客戶端向服務端發出加密通訊的請求。這被叫做clientHello請求,
    • 包括支援的協議版本,一個隨機數用於等會生成會話密鑰,支援的加密方法,支援的壓縮方法
  2. 回應,serverhello,
    • 確認加密通訊協議的版本,一個隨機數用於稍後生成會話密鑰,確定加密方法,伺服器的證書
  3. 客戶端驗證服務端證書是否為可信機構頒步,如果不可信會給訪問者一個警告有起決定是否繼續通訊,
    • 返回一個隨機數用於公鑰加密,編碼改變通知(之後的資訊都用雙方商定的加密方法和密鑰發生),客戶端握手結束的通知
  4. 服務端收到客戶端的第三個隨機數後,計算生成本次會話用的「會話密鑰」,然後向客戶端發送下面資訊:
    • 編碼改變通知,表示隨後的資訊都將用雙方商定的加密方法和密鑰發送。伺服器握手結束通知,表示伺服器的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供客戶端校驗。

http協議實在太重要,涉及到的知識點比較多,這裡只是淺嘗輒止。之後會單開一篇文章專門講http協議,當然這裡推薦三元大佬寫的文章HTTP靈魂之問,鞏固你的 HTTP 知識體系.

為什麼ssl證書有過期時間

最重要的原因在於吊銷。當網站丟失了私鑰後,應該向證書頒發機構(ca)申請將其證書放入吊銷列表。如果證書永久有效,吊銷列表越來越大,會給瀏覽器和ca機構增加很大的流量壓力。而如果有過期時間,那麼ca可以剔除過期的網站,瀏覽器也不信任過期的證書。

ftp

ftp.png

如上圖,ftp協議作為一個文件傳輸協議,它的基本流程如下:

  1. 用戶提供遠程伺服器上註冊的uid和password進行用戶認證,認證成功後建立TCP連接。

  2. 用戶通過ftp用戶介面從本地的文件系統中上傳文件經TCP連接到達遠TCP端伺服器。

  3. 遠端伺服器將文件寫入遠程文件系統,至此一個文件上傳到遠端伺服器的工作完成。

與http協議的異同

ftp和http都是文件傳輸協議,並且傳輸層都基於TCP協議。

而他們最顯著的區別在於ftp協議使用了兩個並行的TCP連接(控制連接和數據連接)來保證數據的傳輸。控制連接主要用於上述提到的用戶認證以及文件存取標識(也就是標識當前是讀取文件還是存放文件)等;數據連接用於傳輸文件數據。

http默認埠是80;ftp默認埠是20和21

ftp2.png

dns

dns是一個域名解析協議,通常會配合其他應用層協議完成相應的需求。在談dns之間需要先明確幾個概念,分別是域名,ip地址,用戶主機地址(mac地址)。

域名

域名可以被近似地看作ip地址的別名,簡單來說就是你每天看到的各種網站。有一個形象的比喻是:ip地址就像你的身份證號,而域名就像你的名字一樣,名字比身份證號更容易記憶。但有所不同的是域名不會發生重名的情況(想想為什麼不能)。

ip地址

主機的主板上有一塊名為網卡的硬體,它內部考錄了mac地址,用於標識一台主機的物理地址。但由於不同廠商指定的標準不同,mac地址的編址方式也是千奇百怪。這是有人提出:創建一個邏輯層,用虛擬的ip地址映射真實的mac地址,再將ip地址的編址方式制定為一個全球通用的標準就行了。因此ip地址實際上是一個邏輯上的地址,但我們暫時不用關注ip地址和mac地址如何映射的,將ip地址視為電腦主機的網路地址標識即可。

mac地址

主機的物理地址,用於唯一標識一台主機的。當然一台主機不一定只有一個網卡,比如筆記型電腦電腦通常含一個有線網卡和一個無線網卡。

dns解析流程

其實最早的域名解析是採用本地文件hosts文件進行解析的,但隨著互聯網網站越來越多,顯然用文件解析的方式不符合這樣的需求。steam玩家對此應該不陌生:

hosts.png

一個域名的解析順序如下:

dns1.png

如果夏爾的域名是 ciel.jialidun.edu,慕恩的域名是moon.nannvnan.edu,那麼夏爾的主機是怎麼獲取慕恩的ip呢?

dns2.png

emmm,是不是跟想像中的有點不一樣呢,接下來聽我一一道來。首先弄清楚上圖中各個dns伺服器到底有怎樣的職責。

dns分散式結構

dns伺服器大體上可分為根伺服器,頂級域伺服器,權威伺服器。

  1. 根伺服器類似於樹的根部,屬於dns伺服器的頂層,多數部署在北美洲。

  2. 頂級域伺服器,常見的 com cn edu org ,比如代表國家的cn uk ca 等。

  3. 權威伺服器,在網際網路上具有公共可訪問的主機。如學校,大型公司等機構。

dns3.png

那麼之前的流程就很好解釋了,夏爾發送了域名解析請求,其中包括源域名和目標域名。

  1. 本地權威伺服器會接收到該請求並查看目標域名是否是自己的管轄區域,如果不是它將把該請求轉發給根伺服器。

  2. 根伺服器會查詢目標域名的頂級域(如這裡的edu),然後將分管該頂級域的頂級域伺服器ip發給本地伺服器,本地伺服器再向頂級域伺服器轉發請求。

  3. 頂級域伺服器收到請求後會查詢該域名屬於哪個權威伺服器管轄,然後將查詢結果返回給本地伺服器。

  4. 本地伺服器將請求轉發給目標伺服器,目標伺服器再根據域名查詢相應的ip地址再將結果返回給本地伺服器。

  5. 本地伺服器將目標域名的ip返回給夏爾的主機。

但是實際上dns查詢可能並不會完全遵守上述流程,試想每天有上億人訪問Google百度等,如果每個人的訪問都要經歷這樣冗長的流程,對於用戶體驗和伺服器性能來說是災難性的。而解決方案則是使用一個快取的機制,將用戶訪問過的網站ip地址進行快取,查詢時直接從快取中取。這裡只是簡單談談,更多的細節會在http協議中詳細講解。

應用層協議對應傳輸層協議
應用層協議 傳輸層協議 應用
HTTP TCP Web
FTP TCP 文件傳輸
DNS TCP/UDP 域名解析
SMTP TCP 電子郵件
Telnet TCP 遠程終端訪問
RIP UDP 路由選擇協議
DNS何時用TCP協議,何時用UDP協議
  1. DNS在進行區域傳輸的時候使用TCP協議,其它時候則使用UDP協議;
    DNS的規範規定了2種類型的DNS伺服器,一個叫主DNS伺服器,一個叫輔助DNS伺服器。在一個區中主DNS伺服器從自己本機的數據文件中讀取該區的DNS數據資訊,而輔助DNS伺服器則從區的主DNS伺服器中讀取該區的DNS數據資訊。當一個輔助DNS伺服器啟動時,它需要與主DNS伺服器通訊,並載入數據資訊,這就叫做區傳送(zone transfer)。
  2. UDP報文的最大長度為512位元組,而TCP則允許報文長度超過512位元組。當DNS查詢超過512位元組時,協議的TC標誌出現刪除標誌,這時則使用TCP發送。通常傳統的UDP報文一般不會大於512位元組。 因此在區傳送中使用TCP協議。

傳輸層

從另一個例子講起

一天,夏爾學習到很晚肚子餓了,於是他熟練地打開美團,點了一份炸雞套餐。不一會兒外賣小哥就將一份香噴噴的炸雞送到夏爾的快樂椅前了。。。

kfc.png

從之前的知識我們可以猜想到我想吃脆皮炸雞這段報文是由應用層協議負責的。那麼報文資訊的傳遞是怎麼實現的呢?從上圖可以看出夏爾與肯德基之間彷彿通過美團外賣在邏輯上建立了連接,但將炸雞送到夏爾家確實由外賣員在物理層面建立的連接。說到這裡是不是有點感覺了呢,傳輸層的作用就是在兩個終端之間建立邏輯連接,而網路層的作用則是實打實地建立了兩個終端地址的連接。(之前有提到網路層其實也是抽象的邏輯連接,這個問題先按下不表,之後網路層會有所解答)

為什麼需要邏輯連接(傳輸層)呢

根據之前的知識我們知道路由器中最頂層的是網路層,也就是說分組交換中根本用不到傳輸層,那麼費盡周折地弄一個傳輸層有什麼意義呢?我們知道微信可以影片聊天,可以語音聊天,可以文字聊天。那麼假如夏爾和慕恩有特殊癖好(影片聊天的同時打字聊天),夏爾和慕恩的ip地址都是暫時固定的,那麼文字流和影片流都會在這兩個ip地址間進行傳遞。那麼問題來了,我們知道影片聊天服務和文字聊天服務肯定是兩個會話服務,那麼怎麼將文字流交給文字會話,影片流交給影片會話呢?本著遇事不決量子力學的態度,我們大膽猜想可以在報文上加標記,這就是傳輸層所著手解決的一個問題,當然傳輸層的作用還不止這些。

傳輸層怎麼實現端到端會話傳輸的呢

多路分解和多路復用

image.png

不知道大家對這張圖還沒有印象,之前提到過報文由應用程式進程通過socket呈遞給傳輸層到站後再通過傳輸層分發到相應socket由另一個終端的應用程式接收。我們可以近似地把進程理解為會話,而socket是進程與傳輸層之間的橋樑。

多路分解:將運輸層報文段中的數據交付到正確的套接字(socket)。

多路復用:在源主機從不同套接字中收集數據塊,並未每個數據塊裝上首部資訊(標記)從而生成報文段,然後將報文段傳遞到網路層。

值得一提的是多路分解和多路復用並不是傳輸層所特有的,它們是所有電腦網路都需要的。

了解了多路分解和多路復用後,我們知道套接字應該是具有唯一標識的橋樑,同時它還要告知行人這座橋通向何處。這就引申出了埠這個概念,埠分為源埠號(從哪來)和目的埠號(到哪裡去)。報文分別用了16個比特位標識源埠和目的埠,也就是說埠的範圍在0-65535之間。同時0-1023埠是受限制的(被一些很重要的諸如http協議等使用了)。之前提到過http協議默認佔用80埠,你可以試試下面鏈接跟你平時看到的度娘相比有什麼不同。//www.baidu.com:80

傳輸層雙雄

UDP和TCP的區別

  1. tcp是面向連接的,udp是無連接的
  2. tcp提供可靠交互,報文傳輸無差錯,不丟失,不重複地按序到達,而udp是儘可能地實現交互,即提供不可靠交互
  3. tcp是面向位元組流,udp面向報文。應用層一次發送給tcp一個數據塊,tcp將其視為無結構位元組流,tcp中有一個快取,當應用程式數據塊太長tcp會將其劃分為更小的塊傳輸。而udp則無論應用層發送多大的報文都會照樣直接發送,因此應用層必須選擇合適的報文大小,太長ip層需要分片,降低效率;太短,ip太小。
  4. tcp支援1對1的交互,udp支援1對1,1對多,多對多的交互
  5. tcp首部為20個位元組,udp首部只佔8位元組
  6. 文件,郵件用tcp,影片用udp

因為雙雄各有千秋,所以有各自適應的場景。總的來說udp無論是首部開銷還是無連接的特點都使得其速度比tcp快,但在可靠交互,流量控制和擁塞處理這方面tcp顯然是更好的一方。

UDP

報文結構

udp.png

源埠號,目的埠號

目的埠號是為了報文到站後尋找合適的socket,那麼為什麼要把源埠號也帶上呢?因為連接是全雙工模式,也就是說接收方既是發送方也是接收方,當接收方想回饋資訊給發送方時只需要從報文中獲取源埠號作為回饋報文的目的埠號即可。

長度

一組報文的長度,用於分割報文組同時檢測是否出現丟包現象。

校驗和

16比特位,用於檢驗報文是否在發送過程中受外界干擾出現了比特改變的情況。(我們知道數據最終是由電纜或光纜或電磁波傳遞的,物理學上外界環境可能會影響這些訊號,比如使得高電平變為低電平對應到比特位就是將1變為了0)

校驗原理:

  1. 將udp報文中的所有16位比特字進行相加

  2. 將比特字相加的結果轉換為其反碼(如果有溢出,它要被回卷),作為其檢驗和

  3. 接收方將所有16位比特字相加(包括檢驗和),查看結果是否為1111111111111111

    //假定,udp首部有這三個16位比特 0110011001100000   0101010101010101  1000111100001100
    	0110011001100000
    +	0101010101010101
    =	1000111100001100
    +	1000111100001100
    =	0100101011000010	(這裡產生了溢出將進行回卷,所謂回卷是指捨棄高位進位而在最低位+1)
    
    反碼運算是將0 => 1; 1 => 0。	0100101011000010  => 1011010100111101
    
    //接收方
    之前三個16比特 + 檢驗和
    原碼 + 補碼 = 1111(源碼位數個1)
    所以如果不為1111111111111111,那麼數據在傳輸過程中一定發送了比特變化。
    

udp的特性

1. udp是無連接的。也就是說使用udp協議傳輸報文,不需要事先建立一條資訊通道,而是添加首部後直接交給網路層
2. udp提供不可靠交互。之前講解udp報文欄位時我們看到了雖然udp提供了差錯檢測的功能,但它卻對差錯回復無能為力。也就是說當udp接收到受損的報文時,只能將其丟棄。(也就是影片中存在的丟幀現象)
3. 面向報文。為報文添加首部後,直接交給網路層進行傳遞。
4. 1對1,1對多。因為不需要建立信道,所以可以實現類似網路層廣播的一個效果。

TCP

報文結構

tcp.png

序號和確認號

用於建立連接(創建傳輸信道),斷開連接。同時也是實現可靠數據傳輸的關鍵,之後會更多地討論。

首部長度和保留未用

TCP首部的長度是可變的,首部長度欄位用於將首部與數據欄位區分開。保留未用如其名,為保留欄位。

URG,ACK,PSH,RST,SYN,FIN

各佔一個比特位。ACK比特用於指示欄位中的值是有效的,RST,SYN和FIN用於建立和斷開連接,URG用於標記報文段是否為「緊急」的數據,PSH被置1時,接收方應該立即將數據交給上傳。(實踐中,PSH,URG並沒有使用)

緊急數據指針

指向緊急數據尾部的指針,與URG配合使用。(實踐中並沒有用到)

接收窗口

用於流量控制,之後會詳細地講解。

選項

通常為空,該欄位用於發送方與接收方協商最大報文欄位長度時,或在告訴網路環境下用作窗口調節因子時使用。

建立連接

三次握手

3

  1. 客戶端發送一個syn=1連接請求和一個序列號seq=x,然後客戶端進入syn_send狀態,等待伺服器的確認
  2. 伺服器收到客戶端的syn請求,需要對syn進行確認於是將ack=x+1,然後將序列號seq=y;最後將上述資訊放到一個報文段中發送給客戶端,伺服器進入syn_receive狀態
  3. 客戶端收到服務端的確認資訊,ack=y+1,seq=x+1,向服務端發送ack確認報文。該報文發送完畢後連接建立完成。
為什麼要三次握手

主要是為了防止已經失效的請求報文段突然又傳送到了服務端造成錯誤。舉個例子,客戶端向服務端發送的連接請求報文因網路原因超時,延期很久後到達服務端。服務端收到該連接請求認為是一次新的連接就像客戶端發送連接確認請求,但因為該連接報文早已失效,客戶端並不會響應服務端的確認資訊。不過沒有三次握手,服務端會認為連接已經完成,一直等待客戶端發送數據,這樣服務端的很多資源就浪費了。

SYN洪泛攻擊:
  • SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地發送SYN包,Server則回復確認包,並等待Client確認,由於源地址不存在,因此Server需要不斷重發直至超時,這些偽造的SYN包將長時間佔用未連接隊列,導致正常的SYN請求因為隊列滿而被丟棄,從而引起網路擁塞甚至系統癱瘓。
  • 防範SYN攻擊措施:降低主機的等待時間使主機儘快的釋放半連接的佔用,短時間受到某IP的重複SYN則丟棄後續請求。
四次揮手

4.png

  1. 客戶端發送一個fin=1連接關閉的請求,序號seq=u,客戶端的進入fin_wait_1狀態
  2. 服務端收到連接釋放報文段後即發出確認報文段,(ACK=1,確認號ack=u+1,序號seq=v),客戶端進入fin_wait_2狀態
  3. 服務端向客戶端發送FIN報文段,請求關閉連接,同時主機2進入LAST_ACK狀態(FIN=1,ACK=1,序號seq=w,確認號ack=u+1)
  4. 客戶端收到服務端的fin報文,向客戶端發送ack報文然後進入time_wait狀態。服務端收到報文後關閉連接。客戶端等待兩個msl時間後關閉連接(ACK=1,seq=u+1,ack=w+1)
為什麼四次揮手

因為tcp是全雙工模式,當主機1發送fin報文表示主機1沒有數據要發送了,主機2收到該報文發送一個ack確認報文表示我知道主機沒有要發送的數據了,但主機1還可以接收報文,主機2發送一個fin到主機1,主機1收到後表示我知道主機2也沒有數據要發送了。然後雙方再愉快的分手

為什麼等待2msl
  1. 保證tcp的全雙工連接能正常關閉。如果客戶端直接關閉,那麼ack報文可能因為網路問題導致服務端沒有收到客戶端的ack確認請求。那麼服務端會重新發送fin報文但此時客戶端已經關閉該連接因此找不到與服務端對應的連接。
  2. 保證此次連接的數據段從網路中消失。如果客戶端直接關閉連接,然後馬上建立下一次連接,那麼有可能新老連接使用的是同一個埠,舊連接因網路原因滯留在網路中的某些數據就會在新連接建立後到達服務端,這樣新老連接的數據教會發生混淆
  3. msl表示報文最大生存時間,2msl表示發送接收一個來回報文的最大生存時間

TCP協議如何來保證數據的順序性

流量控制
  • 控制發送方的發送速度,讓接收方來得及接收而不至於數據丟失。
  • 使用滑動窗口機制,a向b發數據,建立連接時b告訴a我的接收窗口rwnd=n,因此發送窗口的位元組量不能大於該窗口。當報文某一欄位丟失b會向a發送一個ack報文,Ack=1,ack=上次接收到的序列號隊尾+1,新的rwnd;當接收窗口滿了也會發送ack報文,當數據全部接受會發送一個ack,rwnd=0
擁塞控制

發送方維持一個擁塞窗口cwnd,該窗口的大小隨網路擁塞程度動態變化

  1. 慢開始演算法:建立連接時將cwnd設置為最大報文段mss的數值,試探性發送,收到確認資訊後逐倍加大cwnd的大小。cwnd有一個門限值,當cwnd < 門限則使用慢開始演算法,大於使用擁塞避免,等於則兩者即可。
  2. 擁塞避免:與慢開演算法相比,cwnd不再是逐倍數放大,而是每次加1,讓其線性緩慢增長
  3. 快重傳:要求接收方收到一個失序報文後立即發出確認報文而不是等到需要自己發送數據時在攜帶該資訊。當收到連續3個重複的確認資訊時發送方立即重傳該缺失報文
  4. 快恢復:當發送方連續收到三個重複確認資訊後,將慢開始門限減半,然後不執行慢開始而是使用擁塞避免演算法使cwnd窗口線性增大

TCP協議怎麼保證數據的可靠傳輸

校驗與重傳策略
  • 校驗策略是說每一個tcp數據都會帶著數據的校驗和,服務端接收到tcp數據首先會驗證校驗和,如果驗證不對,服務端將丟棄這個tcp數據和不確認收到此報文段(希望發送方重發該數據)。
  • 重傳策略是說,每一次數據發送是客戶端都會同時起一個定時器,如果在指定時間內沒有接收到服務端的確認,就把數據再發一次。定時器時長是一個動態變化的過程,簡單來說是由當前網路的擁塞程度和之前定時器時長的加權平均值確立的,但對於使用快恢復演算法之後的定時器則只跟當前網路擁塞程度有關。

TCP粘包,TCP拆包

TCP粘包和TCP拆包是什麼

通過前面的學習我們知道,TCP協議是面向位元組流需要通過Socket獲取(/上傳)數據。Socket大門不可能是無限大的,它存在一個最大長度。報文大小與Socket大小有下面情況

tcp粘包

  1. 如上圖中的第一根bar所示,服務端一共讀到兩個數據包,每個數據包都是完成的,並沒有發生粘包的問題,

  2. 服務端僅收到一個數據包,這個數據包包含客戶端發出的兩條消息的完整資訊,這個時候基於第一種情況的邏輯實現的服務端就蒙了,因為服務端並不能很好的處理這個數據包,甚至不能處理,這種情況其實就是TCP的粘包問題。

  3. 服務端收到了兩個數據包,第一個數據包只包含了第一條消息的一部分,第一條消息的後半部分和第二條消息都在第二個數據包中,或者是第一個數據包包含了第一條消息的完整資訊和第二條消息的一部分資訊,第二個數據包包含了第二條消息的剩下部分,這種情況其實是發送了TCP拆包問題,因為發生了一條消息被拆分在兩個包裡面發送了,同樣上面的伺服器邏輯對於這種情況是不好處理的。

什麼情況下會發生TCP粘包
  1. TCP連接復用造成的粘包問題
  2. TCP默認使用Nagle演算法,該演算法會導致TCP粘包
  3. 數據包過大造成的粘包問題
  4. 網路擁塞造成的TCP粘包
  5. 接收方不及時接受快取區的包,造成一次接受多個包

如何處理粘包、拆包

通常會有以下一些常用的方法:

  1. 使用帶消息頭的協議、消息頭存儲消息開始標識及消息長度資訊,服務端獲取消息頭的時候解析出消息長度,然後向後讀取該長度的內容。
  2. 設置定長消息,服務端每次讀取既定長度的內容作為一條完整消息,當消息不夠長時,空位補上固定字元。
  3. 設置消息邊界,服務端從網路流中按消息編輯分離出消息內容,一般使用『\n』。
  4. 更為複雜的協議,例如樓主最近接觸比較多的車聯網協議808,809協議。

網路層

沒錯,又是一個例子

某天,慕恩心血來潮準備給夏爾來個「飛鴿傳書」,於是她情意滿滿地寫了封信愉快的投遞到郵筒A(女孩子應該挺喜歡弄點小浪漫的吧)。然後負責A-B區域的郵遞員叔叔將郵件從A運輸到B,然後再經過一些傳遞最終到達夏爾手中。

網路層.png

上述例子中我們著重關心一下郵筒,分解一下它的工作步驟。

  1. 接收郵件(源地址)

  2. 查詢最近郵筒地址(因為如果超遠距離傳輸,不可能讓一個郵遞員叔叔橫跨幾千里就為了給你倆飛鴿傳書吧)

  3. 轉發郵件到最近的郵筒(或目標地址)。

聰明的你也想到了,這就是網路層所起到的作用。不過路由器替代了上述郵筒的功能,而路由器是怎麼分組轉發數據,以及路由器是怎麼尋找下一個路由器的呢?請聽我一一道來。

虛電路和分組交換

首先需要明確的是,網路層其實也分為面向連接和無連接的,被稱為虛電路網路和數據報網路。與你想的一樣面向連接那麼需要事先建立連接管道,更多資訊可以查看《電腦網路 自頂向下》。其適用於ATM機等,而網際網路使用的是數據報網路,這也是我們學習的重點,所以之後主要談的是該網路。

路由器工作原理

router.png

​ 路由器由輸入埠,交換結構,輸出埠,和路由選擇處理器四個部分組成(注意這裡的埠不同於傳輸層的埠,類似於物理上的介面)。

  1. 輸入埠: 它將一條輸入的物理鏈路與路由器的物理層相連接,同時它能實現入鏈路遠端的數據鏈路層和路由器數據鏈路層的交互,更為重要的是它會根據最長公共前綴匹配原則查找輸出埠。

  2. 交換結構:將輸入埠和輸出埠相連接。

  3. 輸出埠:輸出埠從交換結構中接收分組,並將通過數據鏈路層和物理層傳輸這些分組。

  4. 路由選擇處理器:執行路由選擇協議,維護路由選擇表和連接的鏈路狀態資訊並為路由器計算轉發表。

IPv4

ipv4.png

之前提到了很多關於ip地址,ip協議的點,但提到路由器原理時貌似沒有跟ip沒什麼關係,是這樣的嗎?其實從上圖數據報不難看出源地址和目的地址跟路由器的輸入埠,輸出埠有著千絲萬縷的關係。那麼首先我們還是來看看報文各欄位的含義吧。

  1. 版本: 規定了數據包的IP協議版本,現在使用的有ipv4和ipv6兩種協議。
  2. 首部長度: 分隔首部和數據欄位,但大多數IP數據報具有20位元組首部通常不包含該欄位
  3. 服務類型: 這是一個高級選項,由路由器管理員控制,可以為特定用戶(VIP)提供特定等級的服務。
  4. 數據報長度: IP數據報的總長度
  5. 標識、標值、片偏移: 這三個欄位與IP分片有關,用於保證IP分片後組裝的順序性和丟包等差錯檢測。
  6. 壽命(TTL,相信Ping過ip地址的同學都對這個欄位有所了解): 用於確保數據報不會永遠在網路中循環(為什麼數據報會在網路中循環呢?)。每當數據報由一台路由器處理時,該欄位減1,若TTL欄位減為0,則該數據報必須丟棄。
  7. 首部校驗和: 與之間類似,用於檢測比特錯誤
  8. 源和目的IP地址: 每台主機和路由器都有一個IP地址(不一定時公網IP),當某源生成一個數據報時,它在源IP欄位中插入它的IP地址,在目的IP地址欄位中插入其最終目的地的地址。
  9. 選項: 選項欄位允許IP首部被擴展。
  10. 數據: payload,需要傳輸的數據

點分十進位

從IPv4的數據報文中,我們得知ip地址是由32為比特標識,理論上可以由40億公網ip地址(去年已全部分配完畢)。但32比特位表示特別不方便,於是通常我們都是用十進位 . 十進位進行標識,稱為點分十進位。如223.0.0.1(每8個比特位用十進位標識,然後用.分隔)。

子網掩碼

ip地址是由權威機構分發的,但是不可能讓一個結構給全世界每個人發一個ip地址。更合理的做法是採用之前應用過的分散式的思想,某機構向權威機構申請一部分ip地址 => 該機構向其內部人員發放ip地址。這樣怎麼進行劃分就成了一個問題,你總不可能隨機分配吧(不利於管理),所以這裡就有了子網掩碼的概念。223.0.0.0/24/24就是子網掩碼,它表示該子網前24個比特位不變,後8位可以由該子網自由分配。也就是說該機構拿到了這塊地址後,就可以向內部人員分配223.0.0.1,223.0.0.2,223.0.0.99…這樣互聯網就被劃分為了許許多多的子網路,值得注意的時子網掩碼最多30位(規定子網最少容納兩台主機)。

ip地址不夠用咋辦

但劃分子網始終需要是2的倍數同時總共也就40億個,對於資訊大爆炸的今天完全不夠用,那麼怎麼解決呢?這個問題專家們早就想到了,所以很早開始了ipv6的協議制定,當然替換一個協議相當於動搖了一個摩天大廈的根基,這務必是一個緩慢的過程。所以聰明的開發人員採用了網路地址轉換(NAT)的方法擴充了ip地址

NAT

提到這個詞大家估計還有點疑惑這是個啥,不過提到內網穿透,大家估計就來勁了。還是用圖說一下原理吧。

NAT.png

上圖簡單地反映了內網穿透的原理(其實就是利用了傳輸層埠的多路復用)。我們知道HTTP協議的默認埠是80埠,同時用戶只能訪問公網ip上的資訊。所以當右邊的用戶想要訪問左邊用戶上的服務時,會在公網伺服器上開放一個埠然後與區域網的埠連接(實際上是80埠監聽時,將該請求轉發到某埠),之後建立了一條通訊隧道,與之類似,左邊用戶也與公網伺服器建立一條隧道。這樣看起來兩個用戶通過公網伺服器(中介)進行相互訪問一樣。舉個生活中的例子就是,在同一個家庭組(WIFI網路下),三大運營商只會隨機分配給你一個ip,但連接該WIFI的通常不少於一人,那麼虛擬子網路中的用戶使用虛擬ip與其他家庭組用戶之間進行通訊時所用到的技術就涵蓋了內網穿透。

ICMP

ICMP協議是一個用於差錯報告的協議,它的報文類型如下

icmp.png

ipv6

ipv6.png

從數據報就可以看出ipv6相比ipv4更加簡潔清晰,刪去了很多不必要的欄位。然後將ip地址的比特位數從32位增加到128位,據說地球上的每一粒沙都可以分配一個ip地址。以下為欄位說明:

  1. 版本: 與ipv4起到的作用一樣。
  2. 流量類型: 標識流量的優先順序。
  3. 流標籤: 用於標識一條數據報的流,可以按發送方的要求進行特殊處理的流,可以設置優先順序(會員機制)。更多內容請參考《電腦網路 自頂向下方法》
  4. 有效載荷長度: Content數據的長度
  5. 下一個首部: 該欄位標識數據報中內容需要交給哪一個協議(如TCP或UDP)
  6. 跳限制: 數據報每經過路由轉發其值-1,當其值為0時,該數據報被丟棄。與ipv4中TTL類似

IPv4如何向IPv6遷移

我們注意到兩個協議上都有版本欄位,那麼是否可以通過修改該欄位進行遷移呢?當然是不行的,ipv4和ipv6數據報首部完全不一樣,沒辦法採用與原協議方法進行傳輸。

所以比較直接的方法是採用雙棧的方法,假定兩個IPv6節點要是有IPv6數據報進行交互,但他們是由中間IPv4路由器互聯的。我們將兩台IPv6路由器之間的中間IPv4路由器的集合稱為一個隧道。隧道中,IPv6將其所有欄位放到IPv4的數據報欄位中,再由IPv4傳輸給另一個IPv6,詳情參考《電腦網路 自頂向下方法》

RIP,OSRF

之前有提到過路由選擇演算法,而實現路由選擇有兩個比較有名的協議分別是RIP和OSPF。

RIP

RIP是一種距離向量協議,每個路由器內部維護了一個路由選擇表的RIP表,它包含了當前路由到達目標地所經歷的跳數。

rip1.png

rip2.png

OSPF

OSPF是基於鏈路狀態的協議,路由器在本地運行迪傑斯特拉演算法(最短路徑演算法),求出當前路由器據個節點的權重,然後將所有鏈路費用設置為1,然後如何根據權重選擇鏈路由管理員自己決定。

RIP和OSPF的區別

1、路由演算法:

RIP協議是一種典型的距離矢量協議,它使用的也是距離矢量演算法,該演算法可以用一句話來概括:進行路由更新時傳遞路由表。

OSPF協議則是一種典型的鏈路狀態協議,它使用的是Dijkstra演算法,該演算法是通過OSPF鄰居之間泛洪發送LSA(鏈路狀態通告)來進行路由更新,並且它會計算出去往所有已知目的地址的所有無環路徑,以不同種類的LSA類型將其保存到LSDB(鏈路狀態資料庫)中,所有運行OSPF的設備都會有自己的LSDB,然後將LSDB中最優的LSA更新到路由表中。

2、度量值:

RIP協議的度量值是以跳數來計算的,即每經過一跳,度量值就會加一,這樣的度量值計算並不符合當前的網路環境,因為當前頻寬爆炸性的增長,可能會導致RIP選擇了次優路徑。

OSPF協議的度量值計算則是以頻寬為基準來計算的,其公式為10的8次方/頻寬,所以從度量值的計算方式來看,OSPF要更加合理。

3、最大網路直徑:

RIP的最大網路直徑為15,也就是說RIP協議所能傳遞路由資訊的最大跳數就是15跳,超過15跳就表示不可達。

OSPF協議的最大網路直徑為255,可以適應更大的網路環境。

4、鄰居關係的建立:

RIP本身並沒有鄰居關係的概念,它只會將資訊發送給所有直連的且運行RIP協議的所有設備。

OSPF則有很詳盡的鄰居概念,並且根據交互LSA的不同,可以分為鄰居(2-way)以及鄰接(full)兩種不同的鄰居關係,前者只會相互發送hello報文,維持鄰居關係,而後者則會相互發送路由更新。

5、防環機制:

RIP協議作為典型的距離矢量協議,它的防環機制有兩種:水平分割和毒性逆轉,簡單來說,水平分割就是從一個介面接收的路由更新,不會再從該埠發送出去。毒性逆轉則是從一個介面接收的路由更新,會再從該介面發出去,但是會將其置為不可達狀態(16跳)。

OSPF協議從演算法上就可以達成防環,請參考第一條…

6、路由傳遞機制:

RIP協議默認會進行自動匯總(有類路由協議),即傳輸的路由條目會自動進行主類的匯總,這樣會導致路由條目不精確,後續RIP協議為了解決該問題,將RIPV1升級為RIPV2,V2版本不僅支援手動匯總,使路由條目傳遞更加精準,而且將路由更新方式從V1的廣播變成了V2的組(224.0.0.9),提升了路由更新效率。

OSPF協議默認不會進行自動匯總(無類路由協議),並且會在每個網段的鄰居中選舉一個DR指定路由器,所有路由更新會通過224.0.0.6發送給DR,DR再通過224.0.0.5發送給其他所有鄰居,這樣可以防止重複的路由條目更新。

這個點是mark「RIP協議」與「OSPF協議」的相同點與不同點是什麼?的,為了方便整理到了一起,大家可以去看看原文。

數據鏈路層

如你所想,例子如期而至

夏爾去外地參加比賽了,慕恩打算在他生日那天給他一個驚喜(閃現貼臉)。她可以選擇飛機,火車和自行車作為交通工具但最終出發點和目的地都是一致的。

travel.png

鏈路層的不同鏈路就像連接兩地的路線,鏈路層的作用就是將A地的數據通過鏈路傳輸到B地。

鏈路層的特點

  1. 封裝成幀: 將網路層的數據報封裝為多個數據幀(由一個數據欄位和若干首部欄位組成)。
  2. 鏈路接入: MAC協議規定了幀在鏈路上的傳輸規則。
  3. 可靠交互: 類似於傳輸層的TCP,鏈路層也能提供可靠的交互。但對於一些低比特差錯的鏈路,如光纖、同軸電纜等,可靠交互被認為時不必要的開銷。
  4. 差錯檢測和糾正: 發送方在幀中加入校驗位比特,接收方對數據幀進行差錯檢測和糾正。

差錯檢查和糾正比特

鏈路層的差錯檢查和糾正有奇偶校驗法,校驗和法,CRC編碼法。

奇偶校驗法

奇偶校驗法的思路很簡單,就是在數據幀中增加一個比特位使數據幀為奇數稱為奇校驗,為偶數稱為偶校驗。接收方接收到數據後只需檢測數據幀為奇數還是偶數。但顯然這樣簡單的做法會帶來一些問題,雖然同一數據幀多個比特位都被雜訊干擾產生比特變化的概率很低,但這樣的情況一旦發生了,該差錯檢驗方法就沒有起到作用。同時奇偶校驗法只能檢測差錯而不能糾正錯誤。

校驗和法

與之前傳輸層差錯檢驗的方法基本一致。

循環冗雜檢測(CRC)編碼

  1. 發送方和接收方協商一個r+1比特模式,稱為生成多項式,我們將其表示為G

  2. 對於一個給定的數據段D,發送方要選擇r個附加比特R,並將它們附加到D上,使之得到的d+r模式用模2運算恰好能被G整除。

  3. 接收方用G去除接收到的d+r比特,如果餘數為零則無差錯,否則則認為數據出錯丟棄該幀。

    CRC.png

多路訪問鏈路和協議

點到點傳播和廣播

我們將鏈路連接的設備(交換機,路由器,主機等)稱為節點。

點對點鏈路由鏈路一端的單個發送方和鏈路另一端的單個接收方組成。

廣播鏈路能讓多個發送和接收節點都連接到相同的單一的、共享的廣播信道上。(這裡的廣播跟教室里老師上課的情景很像)

信道劃分協議

時分復用
  1. 將時間分割為一個或多個時間幀(與前面提到的數據幀不一樣),並進一步劃分每個時間幀為N個時隙。
  2. 為每條鏈路分配一個時隙
  3. 每條鏈路在分配到的時隙內進行數據傳輸

shifen.png

頻分復用

與時分復用類似,所謂頻分復用是把頻寬劃分為多個信道分配給每條鏈路,數據在分配好的頻率下進行傳輸。

碼分復用

碼分復用對每個節點分配一種不同的編碼,然後每個節點用它唯一的編碼來對它發送的數據進行編碼。

隨機接入協議

時隙(ALOHA)
  1. 當節點有一個新幀要發送時,它等到下一個時隙開始並在該時隙傳輸整個幀。
  2. 如果沒有碰撞,該節點成功的傳輸它的幀
  3. 如果有碰撞,則該節點在時隙結束之前檢測到這次碰撞,該節點有隨機概率p的幾率重傳該幀。
具有碰撞檢測的載波偵聽多路訪問(CSMA/CD)
  1. 適配器從網路層獲取數據報,封裝成幀後放入設配器快取。
  2. 如果適配器偵聽到信道空閑,它開始傳輸幀。在另一方面,如果適配器監聽到信道正在忙,它將等待,直到監聽到信道空閑時再開始傳輸幀。
  3. 在傳輸過程中,適配器監視來自其他使用該廣播信道的適配器的訊號能量的存在。
  4. 如果適配器傳輸整個幀而未檢測到來自其他適配器的訊號能量,該適配器就能完成該幀。在另一方面,如果適配器在傳輸時檢測到來自其他適配器的訊號能量,它中止傳輸。
  5. 中止傳輸後,適配器等待一個隨機時間量,然後返回步驟2。

輪流協議

輪詢協議

輪詢類似於一個中介模式,主節點能夠檢測信道上是否缺乏訊號。主節點輪詢各個節點,告訴每個節點能夠傳輸幀的最多數量。

令牌傳遞協議

當一個節點擁有令牌且有數據幀需要傳輸時,它發送最大數目的幀數,然後將令牌轉發給下一個節點。

如果擁有節點的令牌沒有數據幀需要傳輸,那麼它會立即將令牌轉發給下一個節點。

鏈路層定址

MAC地址

又稱LAN地址,物理地址,嚴格來說是網卡的地址而不是主機的地址。由48個比特位構成,前24位位標誌位,後24位為地址為,採用十六進位表示。

地址解析協議(ARP)

接收一個IP地址,返回一個MAC地址(先從快取找,沒有的話再廣播),RARP與之功能相反即接收一個MAC地址返回一個IP地址。

乙太網

「乙太網幾乎佔據了現有的有限區域網市場,它之於區域網的地位不亞於網際網路之於全球聯網的地位。」

乙太網的結構

LAN.png

  1. 數據欄位: 該欄位承載了P數據報。
  2. 目的地址: 包含了目的適配器的MAC地址。
  3. 源地址: 包含了傳輸該幀到區域網上的適配器的MAC地址。
  4. 類型欄位: 允許乙太網復用多種網路層協議。
  5. CRC欄位: 判定接收適配器檢測幀中是否引入了差錯。
  6. 前同步碼: 該前同步碼的前7個位元組的值都是10101010,最後一個位元組時10101011。前同步碼欄位的前7個位元組用於喚醒接收適配器,並且將他們的時鐘和發送方的時鐘同步。

鏈路層交換機

交換機的特點
  1. 自主學習,即插即用。交換機維護了一個交換機表(類似於路由表,只是使用的是MAC地址),初始化時,它會向與之相連的節點進行廣播以獲取它們的MAC地址,然後當一個節點很久沒有接入到鏈路中時,則從交換機表中刪除該MAC地址。
  2. 交換擁有過濾和轉發的功能,過濾是決定一個幀應該轉發到某個介面還是應當將其丟棄的交換機功能;轉發是決定一個幀應該被導向哪個介面。
  3. 在使用交換機構建的區域網中,不會因為碰撞而浪費頻寬,並且不同鏈路能夠以不同的速率運行在不同的媒體上,因此,對於原有的設備與新設備混用,交換機是理想的。
交換機和路由器比較
  1. 交換機是第二層的分組交換機,而路由器是第三層的分組交換機。
  2. 交換機即插即用
  3. 大型交換網路中要求主機和路由器中由大量的ARP表,這將生成可觀的ARP流量和處理量。

物理層

傳輸最底層的訊號如電訊號,光訊號等(高低電平分別表示1和0)。

更多資訊

網路安全

網路攻擊

XSS攻擊

  • 攻擊方式

    跨站腳本攻擊是指惡意攻擊者往Web頁面里插入惡意Script程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script程式碼會被執行,從而達到惡意攻擊用戶的目的。

  • 解決方案

    為cookie設置httpOnly屬性,對用戶的輸入進行檢查,進行特殊字元過濾

CSRF攻擊

  • 攻擊方式

    CSRF跨站點請求偽造(Cross—Site Request Forgery),跟XSS攻擊一樣,存在巨大的危害性,你可以這樣來理解:
    攻擊者盜用了你的身份,以你的名義發送惡意請求,對伺服器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以你的名義發送郵件、發消息,盜取你的帳號,添加系統管理員,甚至於購買商品、虛擬貨幣轉賬等。

  • 解決方案

使用驗證碼,檢查https頭部的refer,使用token

中間人攻擊

  • 攻擊方式

    也稱瀏覽器劫持,web劫持。簡單來說就是黑客通過各種各樣的技術手段,在服務端發送出的HTTP報文與顯示器呈現的WEB頁面之間做了一些手腳,纂改網頁的部分或全部內容。主要分為網路挾持纂改和終端挾持纂改(比如盜版遊戲中植入的一些木馬經常會纂改你的瀏覽器主頁)。
    更多資訊

  • 解決方案

    使用HTTPS協議傳輸報文,遠離不安全的網站。

網路安全是什麼

  1. 報文的機密性:只有發送發和希望的接收方能夠理解傳輸報文的內容
  2. 報文完整性:報文在傳輸的過程中未發生變化或者惡意篡改
  3. 運行安全性:幾乎所有的機構都有與公共網際網路相連接的區域網,這些網路都因此潛在地能夠被危及安全

密碼學

對稱加密

對稱加密演算法

發送方和接收方持有同一把密鑰,發送消息和接收消息都使用該密鑰。相比非對稱加密演算法,該演算法加密和解密的速度都更快,但由於雙方都需要事先直到密鑰,因此在傳輸過程中更容易被捕獲,安全性不如非對稱。

愷撒密碼

大名鼎鼎的尤利烏斯·愷撒是古羅馬共和國著名的執政官,他的傳奇事迹無需概述。我們都知道行軍打仗除了兵馬糧草之外,情報也是非常重要的,現代戰爭儼然一副情報戰。於是愷撒使用了一種加密方法進行情報加密再讓接收方對情報進行解密,我想這也是他能在高盧戰場取得重大勝利的原因之一吧。

//愷撒密碼,在闡述網路分層的例子我們就用到了這種加密方法
a b c d e f g h i j k l m n o p q r s t u v w x y z (26個字母的閉環)
k = 5
i love u
n qtaj z 
塊密碼
  1. 將數據報文分塊
  2. 每一塊報文由一個T表進行加密處理
  3. 將塊報文組裝起來

blockS.jpg

流密碼
  1. 在加密報文之前,發送方生成一個隨機比特串k,作為初試向量c0,發送給接收方。
  2. 發送方將初始數據m1與隨機向量c0亦或後使用密鑰進行加密
  3. 對於第i個數據報,發送方根據ci = Ks(mi ^ c(i-1))生成第i個密文塊
  4. 接收方根據Ks進行解密

上述過程中隨機生成的比特串是為了標識數據報。因為有一定可能出現相同的數據報,如果不加入隨機標識符,那麼相同的數據報會採用相同的加密方法,攻擊者可能潛在地猜出明文。

非對稱加密

非對稱加密演算法

接收方生成一個公鑰和一個私鑰,將公鑰發送給發送方。發送方通過該公鑰對會話進行加密然後發送到接收方,接收方通過私鑰進行解密。發送過程中就算被竊取數據,沒有服務端的私鑰也難以對資訊進行解密,因而安全性較高。

RSA演算法

最常用的非對稱加密演算法之一

  1. 選擇兩個大素數pq,這兩個值越大,就越難以破解,而執行加密和解密所用的時間也就越長。
  2. 計算 n = pq z = (p-1)(q-1)
  3. 選擇小於n的一個數e,且使得ez沒有(非1的)公因數。(也就是e和z互素)
  4. 求一個數d,使得 ed-1 可以被z整除。ed mod z = 1(mod 是取余的意思)
  5. 接收方使用的外界可用的公鑰Key+是一對數(n,e),其私鑰Key-是一對數(n,d)
  • 發送方發送給接收方一個由m表示的比特組合數據,且m<n。那麼加密後的值cc = m ^ e mod n(^ 表示冪)

  • 接收方解密m = c ^ d mod n

為什麼這樣可以解密??

你或許和我一樣亦或為什麼這樣就能解密出原始的報文資訊呢,這就涉及到數論知識了,畢竟這個演算法是由三位數學家發明的。(沒錯這三個字母就算他們名字的縮寫)

  1. 上述式子整理一下我們需要證明的是 (m ^ e mod n) ^ d mod n = m

  2. 在模運算中(a mod n) ^ d mod n = a ^ d mod n,因此(m ^ e mod n) ^ d mod n <=> m ^ (ed) mod n

  3. 數論中有這樣一個結論:如果pq是素數,且有n = pq,z = (p-1)(q-1)x ^ y mod n <=> x ^ (y mod z) mod n ,應用這個結論,對於x = m,y = ed, m < n,可得m ^ ed mod n = m ^ 1 mod = m

RSA演算法原理(一)

RSA演算法原理(二)

報文完整性

密碼散列函數

校驗和算是比較簡單的密碼散列函數,因此所謂的密碼散列函數以m作為輸入,並計算得到一個稱為散列的固定長度的字元串H(m),要求對於任意兩個不同的報文x,y使得H(x) != H(y)

常見的密碼散列函數有MD5加密演算法

報文鑒別碼
  1. 發送方生成報文m,用s級聯m以生成m + s,並計算散列H(m + s)H(m + s)被稱為報文鑒別碼
  2. 發送方將報文鑒別碼附加到報文m上,生成擴展報文(m,H(m + s)),並將該擴展報文發送給接收方
  3. 接收方收到一個擴展報文(m,h),由於知道s,計算出報文鑒別碼H(m + s)。如果H(m + s) = h,那麼接收方表示報文沒問題。
數字簽名
  1. 發送方用將初始報文通過散列函數生成擴展報文,然後再用自己的私鑰進行數字簽名,然後發送給接收方
  2. 接收方使用公鑰解密得到散列函數,再與維護在本地的散列函數表中的散列函數進行比對,如果匹配,則接收方可以確認報文的完整性以及發送方的可信任性
公鑰認證
  1. 服務方向CA證書頒發機構申請證書認證
  2. 客戶方向服務方請求服務,服務方將證書發給客戶方
  3. 客戶方使用本地內置的證書公鑰與服務方發送的證書中的公鑰進行校對
  4. 驗證通過後,再商量建立密鑰建立的協議版本,加密方式等,詳情見SSL。

應用場景

應用層

token用戶認證
  • 組成
    1. uid(用戶唯一標識)
    2. time(當前時間的時間戳)
    3. sign(簽名,token前幾位以哈希演算法壓縮成的一定長度十六進位字元串)
  • 特點
    1. 服務端無狀態化、支援在多個服務間共享
    2. 安全,可以防止csrf攻擊
    3. 完全由應用管理,可以避開同源策略
  • 流程
    1. 登錄
      image
    2. 業務請求
      image
    3. token過期,刷新token
      image

SSL -讓TCP更加安全

SSL被稱為安全套接字層,SSL版本3的一個稍加修改的版本被稱為運輸層安全性(TLS)。

之前談到HTTPS協議的安全性時提到了SSL,這裡複述一下吧:

ssl握手過程
  1. 客戶端向服務端發出加密通訊的請求。這被叫做clientHello請求,

    • 包括支援的協議版本,一個隨機數用於等會生成會話密鑰,支援的加密方法,支援的壓縮方法
  2. 回應,serverhello,

    • 確認加密通訊協議的版本,一個隨機數用於稍後生成會話密鑰,確定加密方法,伺服器的證書
  3. 客戶端驗證服務端證書是否為可信機構頒步,如果不可信會給訪問者一個警告有起決定是否繼續通訊,

    • 返回一個隨機數用於公鑰加密,編碼改變通知(之後的資訊都用雙方商定的加密方法和密鑰發生),客戶端握手結束的通知
  4. 服務端收到客戶端的第三個隨機數後,計算生成本次會話用的「會話密鑰」,然後向客戶端發送下面資訊:

    • 編碼改變通知,表示隨後的資訊都將用雙方商定的加密方法和密鑰發送。伺服器握手結束通知,表示伺服器的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供客戶端校驗。

更多資訊

網路層

IPsec

IPsec有兩種不同的分組形式,一種是隧道模式,一種是運輸模式。更為蛇和VPN的隧道模式比運輸模式部署得更為廣泛。

IPsec.jpg

  1. 在初始IPv4數據報後面附上一個「ESP尾部」欄位
  2. 使用演算法和由SA規定的密鑰加密該結果
  3. 在這個加密量的前面附加上一個稱為「ESP首部」的欄位
  4. 使用演算法和由SA規定的密鑰生成一個覆蓋整個enchilada的報文鑒別碼
  5. 該報文鑒別碼附加到enchilada的後面形成載荷
  6. 生成一個具有經典IPv4首部欄位的全新IP首部,該新首部附加到載荷之前

更多資訊

防火牆的工作是什麼

linux作業系統中常見的防火牆有iptables和firewall,作為一枚小白在部署程式碼時在這上面可是吃盡了苦頭,那麼防火牆到底有什麼不可或缺的理由讓我們痛並快樂著呢?

傳統分組過濾器

分組過濾器獨立地檢擦每個數據報,然後基於管理員特定的規則決定該數據包應當允許通過還是應當丟棄。過濾決定取決於下列因素:

  • IP源或目的地址
  • 在IP數據報中的協議類型欄位如TCP,UDP,ICMP
  • TCP或UDP的源和目的埠
  • TCP標誌比特:SYN、ACK
  • ICMP報文類型
  • 數據報離開和進入網路的不同規則
  • 對不同路由器介面的不同規則
狀態過濾器

狀態過濾器通過用一張連接表來跟蹤所有進行中的TCP連接,再維護一張訪問控制列表來實現訪問過濾。

table.jpg

​ (圖37,選自電腦網路 自頂向下方法)

應用程式網關

一個應用程式網關是一個應用程式特定的伺服器,所有應用程式數據都必須通過它。多個應用程式網關可以在同一主機上運行,但是每一個網關都是由自己的進程的單獨伺服器。

最後

感謝你閱讀到這裡,由於筆者能力有限,不可能面面俱到,文章中可能有錯誤的或講解不清晰的地方,希望您能指出,我會儘快地進行處理。如果本文對你有所幫助的話,希望能幫忙點贊收藏一下,你的支援是我前進的動力。

thanks

參考文獻

電腦網路 自頂向下方法 第6版

兩張動圖-徹底明白TCP的三次握手與四次揮手

「RIP協議」與「OSPF協議」的相同點與不同點是什麼?

電腦網路 – 物理層筆記

RSA演算法原理(一)

RSA演算法原理(二)

MD5加密演算法

Token 認證的來龍去脈

IPsec介紹

web中間人攻擊的威脅

TLS 握手優化詳解

[電腦網路] DNS何時使用TCP協議,何時使用UDP協議

面試官多次問我TCP粘包,而我為何屢屢受挫?

Socket 中粘包問題淺析及其解決方案

(建議收藏)TCP協議靈魂之問,鞏固你的網路底層基礎