湖科大 《計算機網路》 超詳細重點筆記 適合沒時間看課想快速掌握知識點 或者 課後梳理複習
基礎概念
路由器
是實現分組交換的關鍵構建 是最重要的分組交換機
任務是將網路互聯起來,並對接收到的分組進行轉發
不稱其為主機
報文
表示一條訊息的整個01串
三種交換方式
電路交換
報文交換
分組交換(分組的長度固定 ----->>> 緩衝區的大小便於控制)
過程
先把報文分成小的資料段 在每一個資料段前面 加上一些由必要的控制資訊組成的首部以後 就構成了一個分組 簡稱為包 首部稱為 包頭
分組交換機收到這個包以後 先暫時儲存下來 再檢查首部 根據首部中的目的地址進行查錶轉發 找到合適的轉發介面 透過這個介面將分組轉發給下一個分組交換機。。。。。一次次轉發就到了目的主機 再去掉首部 將各資料段連線還原
衡量網路效能的一些指標
先記一下資料量的單位
再記一下速率的單位
這兩者直接有一一對應的約等於關係
比如: 2^10 = 10^3 2^20 = 10^6 2^30 = 10^9
標250GB實際是多少呢?
廠家給的GB是10^9 bit 但是作業系統中的是 2^30 bit
所以
速率的計算
頻寬
單位時間內能傳輸的資料量
吞吐量
時延
處理時延 知道有就行了
傳送時延
計算公式: 分組長度 / 傳送速率
傳送速率由上面的部分共同決定
計算
傳播時延
時延頻寬積
往返時間 RTT
網路利用率
丟包率
OSI體系結構
TCP/IP體系結構
五層體系結構
重新把網路介面層劃分為物理層和資料鏈路層
每層解決的問題
如果在多個網路中 該如何標識各個網路和各個網路的主機呢 這就引入了網路層
當主機收到了來自伺服器的分組 那麼這些分組應該交給主機中的哪個程序來處理呢? 運輸出現錯誤該怎麼解決呢?
在此基礎上 制定相應的協議 並且按照協議編寫相應的應用程式 透過應用程序間的互動來完成相應的網路應用 這些就是應用層來解決的問題
基於網路的程序間通訊的具體流程描述
應用層按照http協議, 構建一個http請求報文, 把它交給運輸層處理, 運輸層給http報文新增一個tcp首部,讓他成為一個tcp報文段, 之後交給網路層, 網路層給它新增一個ip首部, 讓他成為一個ip資料包, 之後交給資料鏈路層處理, 資料鏈路層給他新增一個首部和尾部, 讓他成為幀, 之後交給物理層, 物理層把幀看成bit流, 如果是乙太網, 物理層就還會給位元流前面新增前導碼, 為了讓目的主機做好接收幀的準備, 之後物理層把這個位元流變換成相應的訊號傳送到傳輸媒體。
訊號透過傳輸媒體到達路由器, 路由器的物理層將訊號再變回位元流, 去掉前導碼後交給資料鏈路層, 去掉幀的首部和尾部, 交給網路層, 是IP資料包, 網路層解析首部, 從中提取出目的網路的地址, 查詢自身的路由表, 確定轉發的埠再一步步重新給到自己的物理層傳送出去。
。。。。。。。 之後就是後半部分一樣的處理了
實體
協議
注意:
邏輯通訊並不存在
是為了讓我們在研究某一層的時候不用考慮其它層 方便研究的一種手段
協議的三要素
每層之間協議的關係
資料鏈路層
是什麼
封裝成幀
把上層交付的協議資料單元封裝成幀
- 幀頭和幀尾中包含有重要的控制資訊
- 幀頭和幀尾的作用之一就是幀定界 (比如ppp幀前後的那一個位元組) 方便接收方的資料鏈路層從物理層的Bit流中把一個個的幀提取出來(mac幀是物理層新增了前導碼,所以沒有幀定界標識)
**透明傳輸: **
會產生的問題:
幀定界標誌是一個特殊的字元,如果在上層交付的協議資料單元中,恰好也包含了這個字元,就會出現問題。影響接收方的接收,這種情況下,資料鏈路層就會採取一些措施,保證接收方能正常接收。
問題的解決:
位元組填充就是傳送之前先掃描一遍,遇到了幀定界符,就在前面加一個跳脫字元,和真正的幀定界符進行去區分
位元填充法就是傳送之前掃描一遍,遇到了和幀定界的這個位元組的位元完全一樣的,就在這個位元組裡面某個固定的位置填充上0
差錯檢測
是什麼:
傳送方將檢錯碼封裝在幀尾, 接收方主機收到幀後, 透過檢錯碼和檢錯演算法, 判斷幀在傳輸過程中是否出現了誤碼 這就是差錯檢測
上面圖中幀尾那四個位元組的 FCS就是檢錯碼
奇偶校驗(很容易出錯)
迴圈冗餘校驗CRC
具體計算:
注意 : 進行的是異或運算
總結:
可靠傳輸
概念: 誤碼是不能避免的,但是 只要能實現傳送方傳送什麼,接收方就接收到什麼,就稱為可靠傳輸
提供的兩種型別:
另外 : 每一層都可以選擇實現可靠傳輸
舉例一些協議 的要求(要求可靠還是不可靠)
實現可靠傳輸的具體協議(協議是資料鏈路層的協議,但是這三種協議的基本原理並不侷限於資料鏈路層,可以用到計算機網路體系的各層協議)
停止等待協議SW
但是如果接收方傳送的確認分組也丟失了怎麼辦呢???
那麼傳送方就會超時重傳一個重複的分組, 這個時候接收方就得判斷這是不是一個重複的分組
帶個序號就可以了
如果接收方發現重複了
就丟棄掉
再給傳送方傳送一個確認分組
既然資料分組需要編號
那麼確認分組也需要編號 這樣就可以解決重複確認的問題(資料鏈路層一般不會出現丟失的問題,所以一般不用編號)
通道利用率
具體計算
回退N幀協議GBN
好處: 採用累計確認的方法 即使確認分組丟失 也有可能是不必重傳的 比如一開始的ack1丟失了 但是ack4傳過去了, 這就說明前五個分組都是正確接收的 所以ack1也就沒必要重傳了
有差錯時: 比如傳送視窗這次傳送來的是56701 但是5就丟失了,那麼後續就會依次丟棄6701,每丟棄一個,就傳送一個ack4的確認資訊給傳送方(上一次接收到的資訊 因為上一次傳送過來的是01234 所以最後一個接收到的是4) 傳送方接收到重複的確認,就知道之前傳送的資料分組出現了差錯,不用等到超時計時器超時就立刻重傳 (這也就是回退N幀)
為什麼傳送視窗的尺寸不能超過上線?
在上面圖中的例子中,假設傳送視窗是8,正好超過上限,第一次傳送八個分組,接收方正確接收了,傳送ACK7給傳送方,但是這個確認分組丟失了,傳送分組再重發前八個分組,因為序號還是0 ~ 7 , 所以沒有辦法分辨是新的分組還是舊的分組。
總結:
當通訊線路質量不好的時候,他的通道利用率不比停等協議高
選擇重傳協議
必須對每個收到的分組逐一確認 不能再多個分組才確認一次
遇到序號不匹配的, 接收方的滑動視窗就不能向前滑動
舉個例子:
比如這個例子 2是錯誤的,所以2被丟棄了, 3進來,但是序號不匹配了,視窗就只會移動兩個位置,並且傳送兩個確認訊號,傳送方收到01兩個確認分組後,向前移動兩個位置 傳送45。傳送方沒收到2號確認分組 直接收到了3號確認分組 2號超時重傳 接收方的滑動視窗收到這個2號以後 才會繼續向前滑動
點對點ppp協議
幀格式
如何解決透明傳輸問題?
方法一: 位元組填充法
方法二: 位元填充法
差錯檢測
計算範圍如下
迴圈冗餘校驗CRC
工作狀態
ppp鏈路的開始和結束都是靜止狀態 不存在物理層連線
當檢測到調變解調器的載波訊號 並建立物理層連線之後 ppp進入鏈路的建立狀態
現在鏈路控制協議LCP 開始協商一些配置選項
協商成功 則進入鑑別狀態
協商失敗 則退回到靜止狀態
若無需鑑別 或 鑑別成功 則進入網路狀態
若鑑別失敗 則 進入終止狀態
NCP配置後 進入開啟狀態
MAC地址 IP地址 ARP協議
但是因為三者關係緊密 所以放在一起了
MAC地址
使用點對點通道的資料鏈路層不需要使用地址 因為整條線路上就他們兩個
使用廣播通道的資料鏈路層必須使用地址來區分各主機
MAC地址格式
第一位元組的b0位取0 代表是單播地址 取1代表是多播地址
第一位元組的b1位取0 代表全球管理 取1代表本地管理
MAC地址的傳送順序
單播MAC地址作用 : 傳送的主機在源地址填上自己的mac地址,在目的地址填上要傳送給的那個主機的mac地址 再加上幀首部的其它欄位 資料載荷以及 幀尾部等 構成了單播幀 。 之後傳送出去,收到這個幀的主機,去目的地址檢查一下,和自己的地址是不是匹配,不匹配就直接丟棄
廣播mac地址作用 : 目的地址欄位直接寫廣播地址就行了FF-FF-FF-FF-FF-FF 其它不變 所有主機都會接收並處理
多播mac地址作用 :
先判斷一下這個地址是不是多播地址 直接換成二級制 完後看看最後一位是0還是1
發現有兩個主機都包含了這個多播地址
傳送的時候在目的地址的位置填上這個多播地址 這兩臺主機就都能收到這個多播幀了
IP地址 (屬於網路層) 在這裡只介紹ip地址的作用 詳細的還是在網路層
從網路體系結構看ip地址和mac地址
資料包轉發過程中IP地址和MAC地址的變化情況 本例只關注網路層和資料鏈路層
(路由器的最高層為網路層 沒有運輸層和應用層)
H1想傳送資料給H2
這種轉發需要透過IP地址找到MAC地址
由此引出了ARP協議
地址解析協議ARP
每臺主機都會有一個ARP快取記憶體表
本圖中 他之前獲取到的A的IP和MAC的關係就被存在了快取記憶體表裡面
當主機B要給主機C傳送資料包的時候
先在快取表中查詢有沒有主機C的IP MAC(他只知道C的IP 並不知道MAC 所以需要知道MAC才能傳送)
這個時候主機B傳送一個ARP請求報文 獲得主機C的MAC地址
其它主機接收到後 將幀交付上層處理 上層的ARP程序解析ARP請求報文
如果發現詢問的IP地址不是自己的IP 就不予理會
如果發現是自己的IP地址 就進行響應
響應步驟如下
之後B就可以正常給C傳送資料包了
結束
注意:
ARP只能逐段鏈路使用
不能跨好幾個鏈路使用
集線器與交換機的區別
集線器
使用集線器HUB在物理層擴充套件乙太網
下面是三個使用集線器連線的相互獨立的乙太網 一二三系 ,是三個獨立的碰撞域, 也就是說 如果一系中的某臺主機傳送了資料幀,訊號會傳給一系中的全部主機。
為了使各系的乙太網能相互通訊,可以再使用一個集線器把他們互聯起來,這樣三個乙太網就互聯成了一個更大的乙太網,三個碰撞域就合併成了一個更大的碰撞域, 形成了一個更大的匯流排型乙太網,
乙太網交換機
假如都傳送了一個單播幀,集線器會發給匯流排上的全部主機,但是交換機會根據自身的幀交換表直接轉發給目的主機
假設都傳送了一個廣播幀 沒啥區別
假設都同時給一個主機傳送單播幀 集線器會碰撞 交換機會先快取起來再逐個發給這個主機 不會產生碰撞
詳細對比如下
交換機
全雙工: 傳送幀和接收幀可以同時進行
概念
直通交換是 不必把整個幀先快取再進行處理 在接收幀的同時,就立即按照幀的目的MAC地址 決定該幀的轉發介面 但是他不檢查幀是否有差錯就直接轉發
乙太網交換機自學習和轉發幀的流程
詳細流程(假設各主機知道網路中其它各主機的MAC地址 也就是無需進行ARP):
假設主機A給主機B傳送幀 , 從交換機1的介面1進入交換機1,交換機1首先進行登記工作,將MAC地址A記錄到自己的幀交換表中,將進入的介面1這個介面號也相應的記錄到自己的幀交換表中,這個登記工作就是交換機的自學習。之後進行轉發,在幀交換表中查詢B,發現找不到,於是對該幀進行盲目轉發,也稱為泛洪,也就是向除了這個介面外的所有介面轉發該幀,主機B的網路卡收到這個幀後,根據幀的目的MAC地址知道這個是傳送給自己的幀,接收。該幀從交換機2的介面2進入交換機2,交換機2也進行自學習,進行相同步驟的轉發。。。
之後主機B給主機A傳送上述幀,先自學習B,之後查詢A,發現能找到,直接轉發到介面1.
大致意思就是這樣,剩下的看下面的圖片就行了
另外還有丟棄的情況,就是多加了一個G的這種,不會轉發到進入的介面,所以就丟棄該幀了
乙太網交換機的生成樹協議STP
廣播風暴: 廣播幀會在這個環路中不停的迴圈轉發。。
現在的乙太網的問題,如果某條線路斷了,如果某個交換機只依賴這一條線路,就會直接在乙太網中斷聯了,安全性很低
解決辦法:
雖然有環路,但是會根據STP來阻塞自己的一些介面,避免出現網路環路
虛擬區域網VLAN
先說路由器
路由器工作在網路層
路由器預設情況下不對廣播資料包進行轉發
所以它可以隔離廣播域
但是成本高
所以就需要VLAN了
概念
原本三個網段中的所有主機屬於一個廣播域,但是分割成VLAN1和VLAN2後,廣播將只在內部進行,也就是VLAN1中某主機傳送的廣播,VLAN2中的主機不會收到
實現機制
是在交換機上實現的。交換機需要有兩個功能 , 一個是能處理帶有VLAN標記的幀,一個是交換機的各埠可以支援不同的埠型別(不同型別的埠對幀的處理方式有所不同)
特殊幀
交換機的埠型別
交換機的預設VLAN ID(PVID)是交換機埠在沒有特定配置時的預設VLAN標識
例如,當一個資料幀進入交換機埠時,如果該埠配置了特定的PVID,且資料幀的VLAN資訊與埠的PVID匹配,那麼該資料幀將不帶VLAN標籤直接傳送出去;如果不匹配,則資料幀將被打上埠的PVID標籤後傳送。這種機制確保了資料幀在交換機內部的正確路由和傳輸
交換機的每個埠有且只有一個PVID
思科交換機在未配置VLAN時,所有埠都預設屬於VLAN1
華為交換機上稱為PVID
下面都採用PVID來描述
型別
Access埠
下圖中的交換機初始化時,各介面預設PVID=1,埠型別預設是A,也就是Access介面
一般用於連線使用者交換機
一個廣播幀從埠1進來,因為PVID = 1,所以給他打標籤,VID = 1,之後去檢查其它埠的PVID,一樣就去標籤轉發
下面,我們想讓主機AB劃分為VLAN2 CD劃分為VLAN3 可以如圖所示進行改變
假如一個廣播幀從埠1進入交換機,VID=2,就只會轉發給埠2了,也就實現了VLAN的劃分
Trunk埠
一般用於交換機之間 或者 交換機與路由器之間互聯
想如圖把兩個交換機互聯的網路劃分為VLAN1和VLAN2
可以如圖配置
記得把交換埠 也就是埠5的埠型別改為T
轉發流程:
從埠1進來的廣播幀,因為VID=1,和埠5的PVID相等 所以可以轉發到交換機2
如果VID != PVID那麼就會直接轉發 不會進行去標籤
接收的時候也是直接接收
網路層
概述
各個網路之間由路由器互聯
路由選擇: 路由器收到資料包後怎麼知道應該轉發到哪個路由器呢?
所以這邊介紹的是網際層
兩種服務
面向連線的虛電路服務
是邏輯連線 並不是真的有一條線路
無連線的資料包服務(因特網)
IPV4地址
概述
表示方法
計算方法
到商0的時候結束,將從下到上組合位元串就行了
但是一般就是背住了湊就行了
分類編址的IPV4地址
一共有五類 紅色數字是最高位固定的數字
注意事項
A類地址(最高位固定為0)
B類地址(最高位固定為10)
C類地址(最高位固定為110)
分配網路號
劃分子網的IPV4地址
現在想把一個網路劃分為幾個子網 借用原來網路的主機號的一些位,來充當網路號,用來標識不同的子網
由此就有了下面的問題
所以就引出了一個劃分子網的工具 ------>>>>> 子網掩碼
看完例子再回去看上圖就明白了
子網掩碼中的255.255.255 對應網路號部分
128對應的是有多少位被借用
將128轉化為二進位制,發現只有一個1,所以只有1位是從主機號部分借用來充當子網號
現在的主機號還剩七位 也就是隻有七位來標識主機了 所以可分配的地址數量是2^7,但是還要去掉主機號為全0的網路地址和全1的廣播地址
分析一下
這是沒有劃分子網時候 該網路地址的細節
劃分子網後就是下面這樣了
可以再看個例題
預設子網掩碼
無分類編址的IPV4地址
概念
就是採用了全新的一套 不用ABC分類了 也沒子網的概念了
看一下例子:
地址掩碼是 255.255.240.0
路由聚合(構造超網)
一個路由器想把自己的路由資訊告訴另一個路由器時,可以採用這種方式將很多條記錄合併為一條,以此來節約空間。
找到共同字首 下面例子中,他們的前兩個位元組都一樣,從第三個位元組開始不一樣,所以把第三個位元組轉化為二進位制形式,其它的不變。這樣就可以找到共同字首。
聚合地址塊格式為 共同字首(保持不變) + 剩下的bit全部取0 / 共同字首的長度
看個例題:
目的地址是4.3 也就是是一個廣播地址,所有主機都能收到 一共就兩個可以分配的IP 也就是隻有兩個主機
IPV4地址的應用規劃
給定一個IPV4的地址塊,如何將其劃分為幾個更小的地址塊,並將這些地址塊分配給網際網路中的不同網路,進而可以給各網路中的主機和路由器介面分配IPV4地址。 一般有下面的兩種方法
定長子網掩碼劃分舉例:
先分析每個網路的IP地址需求
由此,需要劃分為五個子網 , 每個子網可分配的IP都不能少於自身的需求
分析一下,借用三個位元正好可以滿足要求。在子網掩碼中,所有對應網路號的都是1,對應主機號的都是0
把後面的八個位元改寫成10進位制
具體劃分情況如下圖
最後隨便選五個子網分給N1到N5就可以了
總結 : 採用定長的子網劃分 只能劃分出2^n個子網 n 是借用的用來作為子網號的位元數量
採用變長的子網掩碼劃分
和上面的劃分需求相同
可以每個子網單獨分析需要的網路字首和標識的主機的位數
總結一下需求:
現在就要給這5個子網來分配子塊
IP資料包的傳送和轉發過程
注意
包括下面兩個部分
直接交付和間接交付
那麼源主機如何知道自己和目的主機是否在同一個網路中?
假設主機C要給主機F傳送IP資料包
C先用自己的IP和自己的子網掩碼相與 得到自己的網路地址
再用F的IP地址和自己的子網掩碼相與 得到目的主機的網路地址
發現不一樣 --->>> 不在同一網路中
通訊屬於間接交付
那麼主機C如何知道應該把資料交給哪個路由器來轉發呢?
使用者指定一個預設的路由器 也就是預設閘道器
路由器如何轉發?
將目的地址和地址掩碼相與 如果發現和目的網路不匹配 這條就不滿足
廣播
如果傳送的地址是本網路中的廣播地址 就只能在本網路中傳播 路由器不會轉發
如果傳送地址是對面的廣播地址 也不會轉發
靜態路由配置及其可能產生的環路問題
是什麼
當想轉發的時候 , 查一下路由表 , 路由表沒有的話自己配置一下,就是靜態路由配置
預設路由:
對於具有相同下一跳的不同目的網路的路由條目,可以用一條預設路由條目來替代
預設路由條目中的目的網路地址為 0.0.0.0 地址掩碼也是0.0.0.0 CIDR形式 0.0.0.0/0
特定主機路由: 地址掩碼全1才能確定一個特定的主機
路由環路:
解決方法1
解決方法2(解決聚合了不存在網路的問題) 新增黑洞路由
路由選擇協議
因特網採用的路由選擇協議的主要特點:
自治系統內部和自治系統外部可以採用不同類別的協議
EGP和IGP只是路由選擇協議的分類名稱 不是具體的路由選擇協議
常見的路由選擇協議
路由器的基本結構
流程: 訊號從某個埠進入 物理層將訊號轉換成位元流 資料鏈路層從位元流中識別出幀 去掉幀頭和幀尾後送交網路層處理
如果送交網路層的是普通的資料分組 就去查錶轉發 查不到就丟棄
轉發後再一步步封裝 傳送出去
如果送交網路層的是交換路由資訊的路由報文 就把這個分組送交路由選擇處理機
處理機根據分組的內容更新自己的路由表
還有緩衝區
**路由表和轉發表 ** 後續課程不嚴格區分
路由資訊協議RIP
基本概念
**基本工作流程: ** 看 下面圖右邊 的 1 2 3 就是流程
路由條目更新規則 兩個路由器之間透過封裝有路由資訊的RIP更新報文來交換
D收到C的路由表後 先進行改造
舉例都增加1 下一跳全部改成C
下面透過改造好的路由表對自己的路由表進行更新 有不同的更新理由
要注意16就是不可達了
問題
R1到N1的線路故障了 但是還沒來得及把新的路由資訊傳送給R2 就接收到了R2原來的資訊 導致R1被誤導了
開放最短路徑優先OSPF
一些基本概念
分組型別
工作過程
R1收到R2發來的資料庫描述分組後,如果發現自己的資料庫中缺少了資訊,就會傳送LSR分組 ,R2會回應LSU分組
當鏈路狀態發生改變或者到了指定的時間 就會傳送鏈路狀態更新分組 收到該分組的路由器會洪泛轉發該分組
在多點接入網路中建立鄰居關係後,如何減少問候分組傳送的數量?
劃分割槽域 --->>> 把利用洪泛法交換鏈路狀態資訊的範圍 侷限於每一個區域 而不是 整個自治系統
邊界閘道器協議BGP
不能以 代價來作為標準尋找最佳路由
具體情況比較複雜 儘量選擇一條能到的比較好的就可以了
基本工作原理
BGP報文型別
封裝關係
IPV4資料包的首部格式
為了簡單起見,將IPV4資料包簡稱為IP資料包
某些IP資料包的首部 除了包含20位元組外 還包含一些可選的欄位 來 增加IP資料包的功能
每一行32Bit 也就是4個位元組
IP資料包的首部長度一定是四位元組的整數倍
由於首部中可選欄位的長度從1位元組到40位元組不等
所以當長度不是四位元組的整數倍的時候
就要用到填充欄位了
總長度欄位和首部長度欄位的關係
首部長度是以4位元組為單位的
總長度直接以位元組為單位
二者相減就得到了資料載荷的長度
標識 標誌 片偏移欄位
這三個欄位共同用於IP資料包分片
為什麼要分片?
舉例說明IP資料包如何進行分片
將3800位元組的資料載荷部分分片為三個單獨的IP資料包 給每個資料包都新增上首部
分片1資料載荷部分的第一個位元組就是原資料包資料載荷部分的第一個位元組
所以片偏移為 0 / 8 (因為片偏移欄位以8為單位)
填表如下
若還需再次分片
生存時間
可以防止IP資料包在網路中永久兜圈
協議欄位
注意: 片偏移量必須為整數 如果計算出來不是整數 就得換一種分片方式了
網際控制報文協議ICMP
分類
終點不可達
源點抑制(讓源點發的慢點)
時間超過
引數問題
改變路由
在什麼情況下不傳送差錯報告報文
ICMP詢問報文
應用
Ping命令就是第一個應用 用來測試主機或路由器間的連通性
tracert命令的原理:
H1給H2傳送TTL=1的回送請求報文
到達R1的時候超時
R1丟棄該資料包 並給源主機傳送ICMP差錯報告
之後H1給H2傳送TTL=2的回送請求報文
。。。。。。
以此類推
虛擬專用網VPN與網路地址轉換NAT
虛擬專用網VPN
這三個是無需分配的專用地址
專用地址 只能用於一個機構的內部通訊
內部使用專用網路的兩個透過因特網相互通訊的部門
具體通訊流程如下
雖然要要經過多個網路和路由器
但是從邏輯上看
好像是點對點的一樣
所以也稱為IP隧道技術
內聯網VPN和外聯網VPN
網路地址轉換NAT
用來緩解IPV4地址即將被耗盡的問題
NAT路由器
假如使用私有地址的主機要給因特網上使用全球IP地址的另一臺主機傳送IP資料包
該主機先將ip資料包傳送給NAT路由器
首部中源地址欄位的值為該主機的私有地址
目的地址為另一臺主機的全球地址
NAT路由器從自己的全球IP地址池中
給這個私有地址分配一個臨時的全球IP地址
交換期間使用的全都是全球IP地址
當這臺主機給源主機發回資料包後
NAT路由器會檢查NAT轉換表
之後把目的地址再修改為私有地址 並進行轉發
產生的問題
解決
其實就是多加了個埠號
注意: 外網主機不能主動發起通訊
運輸層
概述
之前的幾層實現了主機到主機的通訊
但是通訊的實體是位於通訊兩端主機中的程序
應用程序 到 應用程序
通訊過程如下
埠號
運輸層使用埠號來區分不同的應用程序
埠號的基本概念
傳送方的複用和接收方的分用
在運輸層使用UDP協議封裝 稱為UDP複用
在運輸層使用TCP協議封裝 稱為TCP複用
在網路層使用IP協議封裝成IP資料包 稱為IP複用
IP資料包首部中協議欄位的值 用來表明IP資料包的資料載荷部分封裝的是何種資料單元
取值為6 TCP
取值為17 UDP
接受方的網路層接收到IP資料包後進行IP分用
如果協議欄位17 把資料載荷上交運輸層的UDP
運輸層進行分用
也就是根據埠號
將他們交付給上層相應的使用者程序
如下圖所示流程
TCP/IP體系的 應用層常用協議 所使用的 運輸層熟知埠號
DNS伺服器端程序所使用的熟知埠號是53
舉例:
透過域名訪問WEB伺服器時候, 先向DNS伺服器傳送一個DNS查詢請求
在運輸層採用UDP協議 封裝成UDP使用者資料包
之後將UDP使用者資料包 封裝在IP資料包中
透過乙太網傳送給DNS伺服器
DNS伺服器接收到這個報文後
從中解封出UDP使用者資料包
UDP首部中的目的埠號為53
所以把資料載荷部分交給DNS伺服器
源埠是 使用者PC中的DNS服務(DNS客戶端)程序埠號
TCP和UDP的對比
UDP支援 一對一 一對多 一對全部的通訊
TCP僅支援 一對一通訊
這兩個協議對應用報文的處理
UDP對應用程序交下來的報文既不合並也不拆分 而是 保留這些報文的邊界 UDP是面向應用報文的
TCP把應用程序交下來的資料塊 僅僅看作一連串的 無結構的位元組流
TCP把他們放到傳送快取中,根據傳送策略, 從傳送快取中提取一定數量的位元組,構建TCP報文段併傳送
接收方的TCP一方面從所接收到的TCP報文段中 取出資料載荷部分儲存在接收快取中 一方面將接收快取中的一些位元組交付給應用程序 而且假如傳送方發了10個資料塊 接收方可能只用了4個資料塊就把這些位元組交付給應用程序了 所以應用程序要自己能還原出來這些資訊 TCP是全雙工通訊
TCP是面向位元組流的
可靠不可靠的對比
雖然網際層使用的是IP資料包 向上層提供不可靠的傳輸服務 但只要運輸層使用TCP協議 就可向上層提供面向連線的可靠的傳輸服務
首部對比
TCP的流量控制
讓傳送方別發的太快,要讓接收方來得及接收
舉例:
A給B傳送資料 B對A進行流量控制
假設A的TCP報文段一次可以傳送100位元組資料
建立連線時
B告知A 視窗的大小是400
A也將傳送視窗設定為400
大寫ACK是TCP報文段首部中的標誌位
小寫ack是TCP報文段首部中的確認號欄位 取值201說明序號201之前的資料全部正確接收了
rwnd是視窗欄位
具體流程如下:
就是透過調整自己的接收視窗來對主機A進行流量控制
出現的問題
如果主機B又想讓主機A傳送資料了
重新調整接收視窗大小為300
但是調整報文在途中丟失了
就會產生死鎖
解決 啟用計時器 + 傳送零視窗探測報文
TCP規定 即使接收視窗為0 也必須接收零視窗探測報文
TCP的擁塞控制
基本概念
四種擁塞控制演算法
擁塞視窗 / 慢開始門限
慢開始演算法
一個傳輸輪次 就是一個 往返時間
往返時間並不是恆定的數值
使用傳輸輪次作為橫座標是為了強調
已經把擁塞視窗所允許傳送的報文段都連續傳送出去 並收到了對已傳送的最後一個報文段的確認
開始時擁塞視窗的值為1 慢開始門限的初始值為16
在執行慢開始演算法的時候
傳送方每收到一個對新報文段的確認時
就把擁塞視窗 大小翻倍
然後開始下一輪的傳輸
當擁塞視窗的值增長到慢開始門限值的時候
就改為執行擁塞避免演算法
擁塞視窗是幾 就能傳送幾個資料包文段
改為執行擁塞避免演算法後
收到了一批確認報文後
只能給 擁塞視窗的大小 +1
如果有部分報文段在傳輸過程中丟失了一部分
這樣就會使傳送方超時重傳
傳送方以此判斷網路很可能出現了擁塞
需要進行下圖工作:
整體傳輸過程如下圖:
注意:
但是這兩種演算法有些問題
另外兩種演算法:
快重傳演算法
過程如下:
確認M6 代表前6個報文段都被正確接收了
快恢復演算法
包含全部四種演算法的整個控制擁塞的流程如下圖:
發生了超時重傳的話 就進行前兩種演算法的擁塞控制辦法
當傳送方收到三個重複確認的時候
就進行快重傳和快恢復
來個例題:
TCP超時重傳時間選擇
縱座標是時間
超時重傳時間RTO 應略大於 往返時間RTT
因為TCP下層是很複雜的網路環境
資料包的轉發路由也有可能不同
所以每次的往返時間也有很大差別
所以這個超時重傳時間RTO還是很難選擇
如上圖 可能RTT1 > RTT0 那我們一開始設定的略大於往返時間的RTO就不在合適了
所以選擇的規則如下
RFC6298給出的計算RTO的公式如下:
當測量到第一個RTT1的時候 RTTD1的值取為該樣本的一半
往返時間RTT的測量
會出現上圖的情況
針對出現超時重傳時無法準確測量RTT的情況
解決方法如下:
計算舉例:
沒出現超時重傳就按公式算就可以了
出現了超時重傳就不看公式了 直接變成之前的兩倍
TCP可靠傳輸的實現
TCP基於以位元組為單位的滑動視窗來實現可靠傳輸
ack=31 說明接收方希望收到的下一個資料的序號是31 且 30號及以前的資料都被正確的接收了
本例中傳送視窗的尺寸大小是20
傳送視窗的情況 包括前沿 後沿的情況
現在31~41已經傳送 但是還沒收到確認 42~50是可以傳送但是沒傳送的狀態
如何描述傳送視窗的狀態呢?
接收方只能對按序收到的資料中的最高序號給出確認
如果收到了 32 33 但是沒收到31 那麼會把32 33 放在快取中 同時傳送一個確認資訊 仍然是ack=31
傳送方收到三個重複確認後就會進行快重傳
補充說明
來個例題:
TCP連線的建立
概述
連線的建立要解決下面三個問題
三報文握手建立連線的過程
一臺主機中的某個程序主動發起TCP連線建立,稱為TCP客戶,另一臺主機中被動等待TCP連線建立的應用程序稱為TCP伺服器。 將TCP連線建立的過程比喻為握手
一開始,TCP伺服器程序首先建立傳輸控制塊, 用來儲存TCP連線中的一些重要資訊。之後,TCP伺服器程序進入監聽狀態,等待TCP客戶程序的連線請求,稱為被動開啟連線。
TCP客戶程序也是首先建立傳輸控制塊,在打算建立連線的時候,向TCP伺服器程序傳送TCP連線請求報文段,並進入同步已傳送狀態。 稱為主動開啟連線。 SYN=1 說明是連線請求報文段 SYN=1的報文段不能攜帶資料
服務端傳送連線請求確認報文段 , 並進入同步已接收狀態。報文段也不能攜帶資料
客戶請求收到後 , 再傳送一個普通的TCP確認報文段,並進入連線已建立狀態 可以攜帶資料 但是不攜帶資料就可以不消耗序號
伺服器程序收到這個確認後 也進入連線已建立狀態
為什麼最後還要再傳送一個普通的確認報文段呢?
下面舉例說明:
TCP客戶程序傳送了一個TCP連線請求報文段,但是該報文在某些網路結點長時間滯留了,這會導致該報文段的超時重傳,如果重傳的報文段被TCP服務正確接收,TCP伺服器給TCP客戶程序傳送一個TCP連線請求的確認報文段,並進入連線已建立狀態(現在已經改成了兩報文握手,所以直接進入了連線已建立狀態,而不是像三報文握手那樣進入同步已接收狀態),現在TCP連線的雙方都進入了連線已建立狀態。
但是,一段時間過後,剛才滯留的請求報文又到達了TCP伺服器程序,就會被誤認為是又發起了一個新的TCP連線請求。這樣會浪費主機很多資源。
TCP連線的釋放
透過四報文揮手來釋放連線
下面來舉例說明:
FIN是該報文段首部的終止位
TCP連線釋放報文段(同時對之前收到的報文段進行確認,序號seq欄位的值設定為u,等於客戶程序之前已經傳送過的最後一個位元組的序號 + 1,FIN=1的報文段即使不攜帶資料,也要消耗掉一個序號.ack等於之前客戶程序之前已收到的,資料的最後一個位元組的序號 + 1)
伺服器收到後,傳送一個普通的TCP確認報文段並進入關閉等待狀態。通知高層應用程序客戶端程序要斷開連線了。 TCP客戶程序到服務程序這個連線就釋放了 , 現在的TCP連線屬於半關閉狀態(如果伺服器程序仍有資料要傳送,客戶程序依然要接收)
客戶端程序收到普通確認報文段後,進入終止等待2狀態,等待TCP服務端程序發出的TCP連線釋放報文段
服務端傳送連線釋放報文段 進入最後確認狀態
客戶端收到後傳送確認報文段 進入時間等待狀態
服務端收到後 進入關閉狀態
客戶端經過2MSL後進入關閉狀態(確保TCP伺服器程序收到最後一個TCP確認報文段並進入關閉狀態)
保活計時器
TCP報文段的首部格式
首部格式如圖
該欄位以4位元組為單位
0101的話 十進位制是5 以4位元組為單位 所以首部的長度就是 20位元組
1111的話 十進位制是15 以4位元組為單位 所以首部長度就是 60位元組
傳送視窗大小應該選擇 擁塞視窗和接收視窗中的較小者
擴充套件首部
應用層
常見的應用
客戶/伺服器(C/S)方式 和 對等(P2P)方式
CS方式
對等方式
動態主機配置協議DHCP(TCP/IP體系應用層的協議)
DHCP報文在運輸層被封裝成UDP使用者資料包
需要給主機手動配置 IP地址 子網掩碼 預設閘道器 DNS伺服器等 才能使使用者主機正確訪問Web伺服器
但是手工配置的工作量較大
所以可以在網路中設定一臺DHCP伺服器,網路開機後自動啟動DHCP程式,向DHCP伺服器請求自己的網路配置資訊,這樣就可以自動獲取網路配置資訊了,不需要手動設定了
DHCP的工作過程
現在網路中有兩臺DHCP伺服器和一臺主機
DHCP伺服器使用CS方式,在DHCP伺服器上執行DHCP伺服器程序 ,簡稱為DHCP伺服器(使用的UDP埠是67)
使用者主機上執行DHCP客戶端進行,簡稱為客戶(使用的UDP埠是68)
先傳送一個DHCP發現報文
封裝有 事務ID DHCP客戶端的MAC地址 等
源IP地址是 0.0.0.0
目的IP地址是: 255.255.255.255
伺服器根據MAC地址查詢自己的資料庫 查詢有無這個MAC地址對應的配置資訊(也要用ARP確保IP地址沒被佔用)
有的話就用這個配置資訊構建併傳送DHCP提供報文
沒有的話就用預設配置資訊來構建併傳送DHCP提供報文(目的地址也是廣播地址)
DHCP客戶根據事務ID來判斷是不是自己請求的發現報文(和自己封裝的事務ID相等就是自己請求的報文)
兩臺伺服器各會傳送一個,客戶選擇先到的那個就可以了(現在就挑選好了DHCP伺服器)
下面傳送請求報文,也就是要徵得DHCP伺服器的同意
請求報文包含以下內容
伺服器同意,給客戶傳送確認報文
客戶收到這個確認報文後,就可以開始使用所租用的IP地址了
不過在使用前還會先看看是不是被網路中的其它主機佔用了
當租期已經過去一半時,客戶會給伺服器傳送更新請求報文
同意 則發回確認報文
不同意 則發回否認報文 客戶收到後必須立即停止使用的IP地址並重新傳送DHCP發現報文 重新開始申請IP地址
無響應 則當租期過去87.5%時,必須重新傳送更新請求報文
。。。
另外伺服器可以隨時提前終止DHCP伺服器所提供的租用期
傳送釋放報文段即可
完整流程圖如下:
DHCP中繼代理
路由器不會轉發DHCP發現報文 因為是廣播
解決方法:
給該伺服器配置DHCP伺服器的IP地址
並使之稱為DHCP中繼代理
域名系統DNS
工作流程:
在瀏覽器輸入域名後,使用者主機會現在自己的DNS快取記憶體中查詢該域名對應的IP地址,沒有找到的話,就會向網路中的某臺DNS伺服器查詢(DNS伺服器中有域名和IP地址對映關係的資料庫),DNS伺服器收到DNS查詢報文後,在其資料庫中進行查詢,之後將查詢結果傳送給使用者主機。 使用者主機的瀏覽器透過IP地址對這個伺服器進行訪問。
層次樹狀結構的域名結構
形成了下面這種樹形結構
DNS是分散式系統
域名解析的過程
遞迴查詢
迭代查詢
在查詢時就可以利用上快取記憶體了
不光在本地域名伺服器中需要快取記憶體
在使用者主機中也很需要
檔案傳送協議FTP
FTP客戶計算機可以將各種檔案上傳到FTP伺服器
也可以從FTP伺服器下載檔案
建立FTP伺服器後 會有一個IP地址
客戶在瀏覽器中可以透過這個地址訪問FTP伺服器
工作原理
一開始建立的連線 是來傳送命令的 是命令通道
後面建立的才是資料通道
主動模式
被動模式
埠號不一樣 伺服器是被動等待客戶連線的
電子郵件
郵件伺服器中有很多郵箱
有用來轉發待傳送郵件的快取
使用者代理 其實就是電子郵件的客戶端軟體 比如Gmail 之類的
郵件傳送和接收過程
SMTP的基本工作原理
發現有待轉發的郵件 就建立TCP連線
基於命令和應答
具體流程如下圖
220是應答程式碼 可能跟有描述資訊
注意:
電子郵件的資訊格式
傳送
如果有非ASCII碼資料 要轉化為MIME進行傳送
為了實現這種轉換
下面介紹有關郵件讀取的相關內容
常用的郵件讀取協議
基於全球資訊網的電子郵件
用的都是HTTP協議
很方便
全球資訊網
是執行在因特網上的一個分散式應用
瀏覽器
全球資訊網的文件
這些文件都部署在伺服器端
需要從伺服器傳送給瀏覽器進行解析和渲染
TCP/IP體系中應用層非常重要的協議
HTTP超文字傳輸協議
舉例:
HTTP/1.0
在第三次握手,也就是最後一個報文的資料載荷部分攜帶了HTTP請求
HTTP/1.1
HTTP的報文格式
HTTP請求報文的格式
url 統一資源定位符 /index.htm:伺服器上資源的路徑(例如一個網頁)
這個HTTP報文沒有主體實體
支援以下方法
HTTP響應報文的格式
短語是對狀態碼的簡單描述
常見的狀態碼
Cookie
後續每次客戶端請求伺服器的時候,都會把cookie放在首部行中
具體流程如下:
全球資訊網快取與代理伺服器
代理伺服器沒有請求的資料才會向因特網上的原始伺服器傳送請求
如果Web快取的命中率高,就可以大大減少該鏈路上的通訊量 降低網路時延