最近一段時間,看了一下極客時間的《趣談網(wǎng)絡協(xié)議》,簡單整理一下。網(wǎng)絡,雖然是計算機行業(yè)的基礎知識,但是更多的像文科內(nèi)容,這么多年了,還是那些內(nèi)容,同樣也需要記憶。那本文就通過幾個經(jīng)典案例,梳理一下網(wǎng)絡的核心知識。
1 瀏覽器中輸入網(wǎng)址,敲擊回車,到底發(fā)生了什么?
1.1 分層
因為后續(xù)所有的分析都要基于網(wǎng)絡分層這個概念,所以我們先簡單講一下網(wǎng)絡分層。
網(wǎng)絡分為4層(OSI的7層只是理論指導,我們在此不分析)。
- 傳輸鏈路層: MAC
- 網(wǎng)絡層: IP
- 傳輸層: TCP/UDP
- 應用層: HTTP 等
但是沒有想過,為什么要分層呢?
就是因為網(wǎng)絡太復雜了,分層之后,各層之間相互協(xié)作,上層依賴下層,每一層有自己的使命。
1.2 本機配置IP(DHCP)
在點擊回車發(fā)送之前,我們有一個默認前提, 就是自己的電腦已經(jīng)有了IP,但是我們有沒有想過,這個IP是怎么設置的呢?
很久之前,都是手動配置。
但是有沒有想過,如果在一個幾萬人的公司,你需要抱著電腦到處開會溝通,如果每到一個區(qū)域都要配置一個網(wǎng)絡,是不是要累死了,那怎么辦呢?就是用了DHCP - 動態(tài)主機配置協(xié)議。
DHCP主要分了三個過程: 為主機配置IP , IP 回收, IP 續(xù)租。
1.2.1 為主機配置IP

1.2.2 IP 回收
不用了,直接收回即可。
1.2.3 IP 續(xù)租
租期過去50%,客戶機要想DHCP server發(fā)送續(xù)租請求,進行續(xù)租即可。
1.3 查找域名對應的IP與MAC
我們已經(jīng)為主機配置了IP,此時就進入點擊回車的步驟了。
我們輸入的是域名,那么會怎樣找到對應的機器呢?不要慌,我們先找ip。
1.3.1 IP的分類
在找ip之前,我們先看下IP的分類。
ip之前分A/B/C/D/E幾類,前三類 分網(wǎng)絡號+ 主機號,主機號太短,可用的主機太少,后來就淡化分類,采用CIDR。

另外,在大的局域網(wǎng)中,還區(qū)分了內(nèi)網(wǎng)跟外網(wǎng),每個分類給自己留了一堆內(nèi)網(wǎng)地址。
1.3.2 IP的結構與組成
A、B、C類的組成結構:

1.3.3 DNS 域名解析
前面講了IP的分類與組成,這部分我們來看下根據(jù)一個域名,是如何找到對應的IP的。
其流程如下:

畫個圖說明一下根、頂級、權威三級域名服務器的關系:

另外,DNS處理域名解析之外,還有負載均衡的作用,在大型網(wǎng)絡部署中通過DNS解析,使得對應地區(qū)的用戶訪問就近機房的機器。這兒我們就不講解了。
1.3.4 ARP: 連接建立之前,先要找到對應的MAC地址
前面我們講過,網(wǎng)絡傳輸是從上層到下層的,IP的下一層是傳輸鏈路層,對應的是MAC。找到了域名對應的IP,那我們看下MAC。
1.3.4.1 MAC地址

1.3.4.2 ARP
ARP的功能很簡單,就是實現(xiàn)了IP到MAC的轉換。
如果IP是同一網(wǎng)段,發(fā)個廣播,對應IP的MAC地址就找到了。
如果目標IP跟源IP不是同一網(wǎng)段,則需要路由器轉發(fā)(轉發(fā)規(guī)則在下一小節(jié)介紹),一級一級地找。
具體流程參見 參考文獻部分。
插播一條 RARP: 由MAC找IP, 主要用在無盤工作站。
工作流程:在網(wǎng)絡中配置一臺RARP服務器,里面保存著IP地址和MAC地址的映射關系,當無盤工作站啟動后,就封裝一個RARP數(shù)據(jù)包,里面有MAC地址,然后廣播到網(wǎng)絡上去,當服務器收到請求包后,就查找對應的MAC地址的IP地址裝入響應報文中發(fā)回給請求者。因為需要廣播請求報文,因此RARP只能用于具有廣播能力的網(wǎng)絡
1.3.4.3 網(wǎng)關路由

1.4 建立連接
1.4.1 三次握手
找到了ip ,那我們就要開始建立連接了。經(jīng)典的三次握手。

1.4.2 為什么不是兩次握手?為什么不是四次握手?

1.5 消息傳輸?shù)腡CP可靠性保證
握手建立了,都說TCP是可靠的,那它是如何保證的呢?
1.5.1 可靠性保證需要關注哪幾方面?

1.5.2 TCP的格式
TCP為了解決上述四個問題,有哪些結構上的保障呢?

1.5.3 緩沖區(qū)
另外在發(fā)送端、接收端都有緩沖區(qū)來支持:

1.5.4 靠譜的機制

1.6 發(fā)送請求
1.6.1 請求格式
連接建立了,保障機制也有了,那我們看一下這個請求里面到底包含了什么?

1.6.2 數(shù)據(jù)傳輸
1.6.2.1 遇到大文件傳輸怎么辦?

1.6.2.2 怎么保證有狀態(tài)的?
http本身是無狀態(tài)的,http怎么保證狀態(tài)流轉呢?

1.6.2.3 提高安全性 https
為了提高安全性,很多網(wǎng)站引入了https 。采用非對稱加密跟對稱加密的組合。

https具體的交互流程 網(wǎng)上隨處可見,這兒就不展開了,列個連接:
https的交互流程: https://www.cnblogs.com/xiohao/p/9054355.html
1.6.2.4 提高傳輸性能 http2


1.6.3 首部字段梳理

1.7 響應處理
1.7.1 響應格式

1.7.2 狀態(tài)碼

1.8 斷開連接
1.8.1 四次揮手

1.8.2 TCP狀態(tài)機

2 網(wǎng)絡不通了,我們怎么確認下是哪兒出了問題?
網(wǎng)絡不通,ping一下看看。ping是ICMP 互聯(lián)網(wǎng)傳輸控制協(xié)議的一種。
另外,ICMP還包含了差錯報文控制協(xié)議。

3 傳統(tǒng)C/S要變了,我們需要去中心
3.1 對等網(wǎng)絡 P 2 P

3.2 算法 KAD
3.2.1 節(jié)點角色

一個節(jié)點,提供了兩個角色:
一個是通過UDP協(xié)議組建的節(jié)點網(wǎng)絡;
另外一個是啟動一個TCPserver,用于上傳和下載。
3.2.2 DHT算法的規(guī)定

3.2.3 核心流程
相近或者相似 的哈希,在KAD算法中,是通過異或來計算的。
3.2.3.1 新 node 下載某文件(比如文件1)的過程

3.2.3.2 DHT網(wǎng)絡中的多節(jié)點關系是怎么維護的?

3.2.3.3 一個節(jié)點是如何查找另外一個節(jié)點的?

3.2.3.4 節(jié)點間溝通?

3.2.3.5 DHT網(wǎng)絡節(jié)點更新?

4 socket編程 了解一下?
4.1 概述

4.2 基于TCP的socket編程

一旦connect之后,握手成功,服務端的accept就會返回另外一個socket . 就是監(jiān)聽socket跟真正用來傳數(shù)據(jù)的socket 是兩個。
socket在Linux中,就是一個文件,這個文件指向socket在內(nèi)核中的結構。這個結構里面有另兩個隊列,發(fā)送隊列和接收隊列。
4.3 基于UDP的socket編程

4.4 服務器如何處理更多的任務?

5 再說一下UDP?

6 速度再快一點-CDN

7 參考文獻
同一局域網(wǎng)ARP : https://zhuanlan.zhihu.com/p/28771785
跨局域網(wǎng)ARP: https://zhidao.baidu.com/question/2009765406663037188.html?qbl=relate_question_2
《趣談網(wǎng)絡協(xié)議》
整理筆記xmind文件: https://pan.baidu.com/s/1RTD5JtwzJIIaNfSzzSlUtA
8 其他
本文是基礎知識系列-網(wǎng)絡,如果有疑問,可以直接留言,也可以關注公眾號 “鏈人成長chainerup” 提問留言,或者加入知識星球“鏈人成長” 與我深度鏈接~