---
tags: LSA
---
[**ncnu-opensource 共筆**](https://hackmd.io/@ncnu-opensource/By4H6JLNW)
- Book mode https://hackmd.io/@ncnu-opensource/By4H6JLNW
[TOC]
---
# 網路安全規劃 - 效能
:::info
你的網站很慢!
要怎麼抓問題?
客戶最容易感受到的是延遲不是頻寬
:::
## 硬體
### 乙太網路線
---
| 型號 | 描述 |
| -------- | -------- |
| Cat-5 | 提供 100MHz 的頻寬。一般家用常見 |
| Cat-5e | 提供 125MHz 的頻寬。一般家用常見 |
| Cat-6 | 提供 250MHz 的頻寬,並加強抗干擾。一般家用常見 |
| Cat-6A | 提供 500MHz 的頻寬,使用在萬兆乙太網(10 Gbit/s)中。 般家用不那麼常見,機房較常見 |
| Cat-7 | 提供 1000MHz 的頻寬,並加強抗干擾。機房常見 |
| Cat-8 | 提供 2000MHz 的頻寬,並加強抗干擾。機房常見 |
---
#### ANSI 訂定之關於網路線搭配標準

---
:::info
==頻寬和網速==
通訊時不能只使用一個「頻率」,必須使用一個「頻率範圍」,這個頻率範圍稱為「頻寬(Bandwidth)」。
一般說的網速,單位為 Mb/s 或 Gb/s,意指每秒能傳輸多少 bit 的資料
頻寬和網速的關係是什麼?
就像是水管粗度和水流速度的關係
如果水管不粗,大家都要水的話那水流就很小很慢
:::
---
### 光纖網路線
---
是由很多玻璃或塑膠製的纖維組成,用全內反射原理來傳導光線。
與一般網路線最大的不同,就是它用光線來代替電流傳輸訊號,一次就可以傳送大量的資料,強度衰減的速度也比較慢,更可避免被其它電磁波干擾,所以傳輸的質與量都極佳,用來上網自然可以提供更高的頻寬。
---
- 缺點:
- 價格比一般乙太網路線貴很多
- 維護不易
- 轉彎的角度不能太大(轉彎時,其轉彎半徑要大於光纜自身直徑的 15-20 倍。),原因主要有兩個
- 為了避免光訊號在光線內的反射角超過臨界值而透出光纖
- 避免折斷光纖
---
- 光纖有分單模跟多模兩種
1.多模光纖使用波長 850 ~ 1300 nm。
- 中心玻璃芯較粗( 50 或 62.5μm ),可傳多種模式的光。
- 傳輸距離較短
2.單模光纖使用波長 1300 ~ 1550 nm。
- 中心玻璃芯很細(芯徑一般為 9 或 10μm),只能傳一種模式的光。
- 傳輸距離較長
:::info
**造成單模多模傳輸距離差異的原因**
由於光在光纖內傳遞的時候,會在光纖內壁反射向前。
多模的光纖較粗,使光反射的距離較長,因此訊號衰減的速度較快,造成傳輸訊號的距離降低。
單模由於光纖較細,光反射的距離較短,幾乎是直接向前跑,故訊號能傳輸的距離較遠
:::

>圖片來源:[How to Realize Multimode to Single-Mode Fiber Conversion?](https://community.fs.com/blog/how-to-realize-multimode-to-single-mode-fiber-conversion.html)

>圖片來源:維基百科
---
#### 乙太與光纖的比較
| 比較 | 乙太網路線 | 光纖網路線 |
| ------- | ------- | ------- |
| 速度 | 40Gb/s(cat 8) | 1Tb/s(理論極限速度) |
| 距離 | 100m(理論限制,cat8 更短) | 公里以上(多模與單模不同) |
| 成本 | 較低(幾百~幾千) | 萬元以上 |
---
:::info
<span class="bt"> BT 說 </span>
在一些現行的機房中,伺服器到機櫃上的 switch 接乙太網路線
機櫃到 core switch 用光纖線
伺服器都是 10G 網卡,使用的是 cat 6a 的線
如此配置的理由是:
光纖成本較高,維護不易,因此伺服器到機櫃的連接還是用乙太網路線
但選用規格等級較高的乙太網路線
:::
---
### 什麼時候用乙太網路線 什麼時候用光纖
- 乙太網路線
- 預算不高
- 距離短
- 速度需求低
- 拉線路線曲折(老舊房子暗管)
- Ex: 一般家用、電腦、WiFi 分享器、機房
- 光纖網路線
- 預算不是問題
- 距離長
- 速度需求及穩定性高
- Ex: 跨海通訊、機房、數據中心
---
:::info
**有的插一條光纖就好有的插兩條?**
這要看光纖介面的設定
一條是半雙工
兩條是全雙工
單模一次只支援一個方向
因為速度非常快所以半雙工也可以應付一般需求
[**參照**](https://www.quora.com/Are-fibre-optics-full-duplex-or-half-duplex)
:::
:::info
**infiniband 無限頻寬**
用於高效能計算的電腦網路通信標準,具有極高的吞吐量和極低的延遲,用於電腦與電腦之間的資料互連。
InfiniBand 也用作伺服器與儲存系統之間的互連,以及儲存系統之間的互連。
:::
:::info
**光纖傳遞方式**
數位或類比訊號進入傳送器之驅動器,將訊號調到某一波長的頻率,再經過光源轉換成光波訊號,經由光纖傳導到接收端,經由光偵測器轉換回原來的電流訊號,再經由接收器調回原來數位或類比訊號。在整個傳輸過程中,建立通道所需的元件可區分為光訊號產生器、光纖和光訊號接收器等三個主要部分

>圖片來源:[翻轉工作室](http://www.tsnien.idv.tw/Network_WebBook/chap2/2-12%20%E5%85%89%E7%BA%96%E9%80%9A%E8%A8%8A.html)
光訊號接收器關鍵字 : SFP、SFP+、XFP
:::
:::info
**佈線需求超過 100m 要怎麼辦**
Ex: 跨棟間的連線
- 加 hub
- 加 switch
- 訊號延伸器
- 換光纖
:::
### 無線網路
- WiFi
- 透過 WiFi 分享器連結網路
- 常見頻率: 2.4Ghz 5Ghz
- 行動網路
- 藉由 Sim 卡透過電信業者基地台連結網際網路
---
:::info
**Power Over Ethernet, POE**
一種可以在乙太網路中透過雙絞線來傳輸電力與資料到裝置上的技術。
POE 可使包括網路電話、無線基地台、網路攝影機、集線器、電腦等裝置都能採用 POE 技術供電,由於能藉由乙太網路獲得供電的電子裝置無需額外的電源插座就可使用,所以同時能省去布置電源線的時間與金錢,使整個裝置系統的成本相對降低。
然而由於訊號傳輸限制在約 100m 的距離,因此 POE 的距離也被限制在此,如果要再延伸,中間就必須搭配延伸器。
但若單是以乙太網路線供電,那距離是遠遠高於此的。
POE的優點:
1. 網路設備的建置更具彈性。
2. 低建置、營運與維護成本。
3. 安全保護機制。IEEE802.3af/IEEE802.3at 能提供短路保護、過低電壓保護、過電流保護等。
4. 易於安裝,特別在於一些困難特殊的環境,EX: 屋頂、樹上和公共場所等。
5. 中央監控。有些遠端的網路設備需要備伺服器或中央控制器,如 POE 時鐘、POE 電子看板、POE 電子顯示器等。
:::
---
### 連接硬體
- hub
- 沒什麼特別的,就是都通在一起
- switch
- 紀錄 mac address
- port 獨立
- router
- 紀錄 ip
- routing table
- 跨網段
---
:::info
"馬路拓寬了,車子本身跑不快也沒用"
造成網路效能不佳的原因,其實有很多是軟體而非硬體
:::
---
## 軟體
### 先說到通訊協定
- UDP
- 第四層傳輸層
- TCP
- 第四層傳輸層
- TCP 3 個 control(flow congstion error)
- 封包如何重組
- 透過 header 中的序列號來重組
- 
- 圖片來源:[TCP header](https://www.gatevidyalay.com/transmission-control-protocol-tcp-header/)
- SNMP
- 第七層應用層
- 基於 UDP 通訊協定
- HTTP/1.0
- 第七層應用層
- 預設沒有 Keepalive
- 要 server 回傳 keepalive 的 header
- server 會回傳 connection close 的 header
- HTTP/1.1
- 第七層應用層
- 預設有 Keepalive,可直接重用連線
- http pipelining
- 會有隊頭阻塞的問題
- HTTP/2.0(multiplexing)
- 第七層應用層
- 解決隊頭阻塞的問題
- 把 request 切成很多 stream
- 把 response 一次傳回來
- HTTP/3.0(QUIC)
- 第七層應用層
- 快速 UDP 網路連接
- Google 開發
- IETF
- 應用層加速
- 發封包到得到回應要多久(TCP)?
- 少說 250ms
- 使用者能忍受的等待最多 350ms
- 把雜七雜八的 control 搬到應用層,為了盡快讓 application 處裡封包
:::info
Round-Trip Time, RTT (來回通訊延遲)
在雙方通訊中,發訊方的訊號到收訊方的時間,加上收訊方回傳訊息到發訊方的時間之和
:::
:::info
**在 nginx 啟動 HTTP2 和 HTTP3**
- 啟動 2
- nginx enable h2
- 啟動 3
- 想開 3 要直接下載 code 自己編(Make)
:::
:::info
**HTTP/1.1 vs HTTP/2.0**
{%youtube jhqrRT4fvOA%}
:::

---
### Anycast
>Anycast is a network addressing and routing method in which incoming requests can be routed to a variety of different locations or “nodes.” In the context of a CDN, Anycast typically routes incoming traffic to the nearest data center with the capacity to process the request efficiently. Selective routing allows an Anycast network to be resilient in the face of high traffic volume, network congestion, and DDoS attacks.
>[name=cloudflare]
由於使用者發的 request 可能會被引導到很多不同的地點或網路節點,而 anycast 就是一種網路定址和路由的方法,
在 CDN 的情境下,anycast 通常會把流量引導至離使用者最近的、能有效率處裡需求的資料中心。
選擇性的路由可以讓 anycast 網路在面對高流量、阻塞、DDOS 時能更有彈性。
---
Anycast 是網路供應商才能提供的功能
透過在全世界各地設 BGP server
並廣播可以轉送封包到某個地方(Ex: 1.1.1.1)
使各地都可以快速地連線到 server 並得到回應

圖片來源:自己畫
---
:::info
**Border Gateway Protocol, BGP (邊界閘道器協定)**
沒有一台 switch 可以記住全世界每一個 mac addr 或一個網路微小的變動
BGP 說白話一點就是在畫大餅,說自己可以幫你把封包轉送到某個目的地
例如 :
學校有兩條線路,一條連中興,一條連成大,那要怎麼連到國外?
因此每一個組織或自治單位,都會有一個對外的 Router,透過申請取得一個 as number 告訴周圍的 Router ,他可以處裡送往某個網段的封包,充滿了互相信任
因此 BGP 非常不安全,如果你偽造或不小心打錯 as number,就可能導致整個世界的網路 GG
>[name=本課程第七週共筆]
:::
---
### Protocol Data Unit, PDU (協定資料單元)
- [協定資料單元 — 區段 (Segment)、資料包 (Datagram)、訊框 (Frame)](https://notfalse.net/22/network-encapsulation)
網路協定 (networking protocol) 由許多 層級 (Layer) 組成,
每一層所使用的資料結構則統稱為 協定資料單元 (PDU)。
其中包含了控制與位址資訊的 表頭/標頭 (header),與實際乘載的 資料 (data)。
在 OSI 架構裡,PDU 和最底下四層相關。
第七層最常見的是 request
第五層或以上為 data
Transport Layer 傳輸層(四層) PDU 指的是 Segment(TCP UDP-> datagram)
Network Layer 網路層(三層) PDU 指的是 Packet
Data Link Layer 資料鏈結層(二層) PDU 指的是 Frame
Physical Layer 實體層(一層) PDU 指的是 Bit
>分析 log 可以看用詞(哪個 PDU)從而判斷問題出在哪
>Ex: Request Timeout -> request -> 第七層
---
### MTU 最大傳輸單元
- [MTU - 最大傳輸單元](https://notfalse.net/23/mtu)
標準乙太網路訊框 FRAME 所能傳送的資料量最大可以到達 1500 bytes , 這個數值就被我們稱為 MTU (Maximum Transmission Unit, 最大傳輸單位)。
>要注意的是,每種網路介面的 MTU 都不相同,因此有的時候在某些網路文章上面會看到不同的 MTU。不過,在乙太網路上,標準的定義就是 1500 bytes。
>[name=鳥哥]
---
#### Frame(訊框)
鏈路層將一個 Bit Stream 資訊傳送給實體層,實體層再依序將每個位元轉換成訊號發送到傳輸媒介,在傳輸媒介上產生一段連續的訊號,因此這個 Bit Stream 就稱之為 Frame,而它的長度直接影響傳輸媒介的傳輸效率。
- 每個封包在路由時都要耗費以下的時間,所以封包數越少越好:
- Propagation Delay
- Transmission Delay
- Processing Delay
- Queuing Delay
---
#### Frame 要多大比較好?能不能修改?
網路(Gigabit)媒體有支援 Jumbo Frame 的話,那麼就能夠將 Frame 的大小調大
---
#### Jumbo Frame(巨型訊框/巨型封包)
訊框的大小,會影響 MTU 的大小,那如果 MTU 能夠大一些的話,封包的拆解情況就會降低,等待時間也會減少,就能提高網路效能了
為了這個目的,才有了 Jumbo Frame 的概念。
Jumbo Frame 一般都定義到 9000bytes。
那既然如此,MTU 能不能改成 9000bytes 呢?
在 Linux 系統上是可以更改 MTU 的。但是並不建議修改這個數值。
---
- 不建議調整的原因
- 通路上的支援度
- 目的地的支援度
不論你的網路媒體支援 MTU 到多大,你必須要考量到你的封包需要傳到目的地時,所需要經過的所有網路媒體,然後再來決定你的 MTU 設定才行。
---
#### But! BT 說
如果都是機器跟機器之間傳
也都是用 1G 以上的網路,開就對了
機房都建議開到 9K
>Yes. 某公有雲的 VPC default MTU 就是 9000
>[name=小盛大大]
:::info
**為什麼常常看到有 MTU 是 1492?**
因為 PPPoE Server 的 MTU 是 1492
而 PPPoE Server 會如此設定的原因是
PPPoE 的封包會有占用 8 bytes 的 header
因此要從 mtu 中先扣掉
:::
#### 查看 MTU
指令 `netstat -i`

:::info
補充 : 調 MTU
`sudo ip link set <網卡名稱> mtu <要改多少>`
:warning:
如果有調要記得調回來
:::
#### Maximum Segment Size, MSS(最大區段長度)
- 在連線建立時決定
- 連線運作期間不會改變
- 若其中一方未定義,則使用預設值: 536 bytes。
:warning:
它定義的是所能接收 『資料』的最大長度,而非區段!
(即不包含 TCP 表頭 + 選項)
---
### TCP 流量控制
[TCP 流量控制](https://notfalse.net/24/tcp-flow-control)
TCP 流量控制 (Flow Control),
用於平衡 傳送端 與 接收端的流量,
避免 高速傳送端 癱瘓了 低速接收端。
發送端如何知道接收端的接收狀況?
- 接收端會直接把 window 大小回傳給發送端

圖片來源:[TCP header](https://www.gatevidyalay.com/transmission-control-protocol-tcp-header/)
- 怎麼知道要送多少流量給接收端?
- Slow Start
- 先送 10 segment 再慢慢加大
- 直到掉包為止(沒有收到 ACK)
- 最後傳送的流量會等於 receive window
---
#### Buffers
- 接收緩衝區 (Receiving Buffers)
- 由於 發送者 (Sender) 與 接收者 (Recipient) 傳輸、讀取的速率不相等,接收端會將資料暫存在接收緩衝區 (Receiving Buffers),並等待 應用層讀取後 (消化),再從接收緩衝區中清除。
- 發送緩衝區 (Sending Buffers)
- 發送者 將欲傳送的資料,置於 ==發送緩衝區== (Sending Buffers) 並送出。
- ==發送緩衝區== (Sending Buffers) 送出資料後,會等到 接收者 回覆: 確認 (acknowledgment) 收到,才將資料由 ==發送緩衝區== 中清除。
:::info
**調整 Buffer**
/proc/sys/net/core
`rmem_default` socket 的預設==接收== buffer size
`rmem_max` socket 的最大接收 buffer size
`wmem_default` socket 的預設==傳送== buffer size
`wmem_max` socket 的最大傳送 buffer size

調整方式
更改`/etc/sysctl.conf`
ex: 修改最大 buffer size 值至 32MB
`net.core.rmem_max= 33554432`
`net.core.wmem_max= 33554432`

不一定要 reboot
可以用 sysctl -p
調整後

:::
---
#### Window
- 接收視窗 (Receive Window)
- 
- 圖片來源:[TCP 流量控制 ](https://notfalse.net/24/tcp-flow-control)
- 1、2,為應用層已讀取,並從 ==接收緩衝區== 清除之位元組。
- 3、4、5、6 為已接收 並 ==確認== (acknowledged) 收到,應用層尚未讀取 (消化) 之位元組。
- 在 ==接收視窗== 內的 7、8、9、10、11 為等待接收資料的 空的緩衝區,3、4、5、6、7、8、9、10、11 合計就是 ==已用接收緩衝區大小== !
- 超出 ==接收視窗大小== (Receive Window Size, rwnd) 的部分則無法接收。
- 發送視窗 (Send Window)
- 
- 圖片來源:[TCP 流量控制 ](https://notfalse.net/24/tcp-flow-control)
- 1、2 ,為 ==已傳送== 並 ==收到接收端確認== (acknowledgment),並從 ==發送緩衝區== 清除之位元組。
- 在 ==發送視窗== 內的 3、4、5、6 為 ==已傳送== 但 ==未被確認== (unacknowledged),待 ==接收者 回覆確認== 之位元組。
- 在 ==發送視窗== 內的 7、8、9、10、11 為準備傳送的位元組。
- 超出 ==發送視窗== 外的 12、13、14,為等待置放欲傳送資料的 ==空的緩衝區==,3、4、5、6、7、8、9、10、11、12、13、14 合計就是 發送緩衝區大小 !
:warning: 當 Window 滿了的話,再過來的封包就會被 Drop 掉
---
### Silly Window Syndrome, SWS (TCP 糊塗窗口綜合症)
[TCP 糊塗窗口綜合症](https://notfalse.net/25/tcp-sws)
發送端很慢 或 接收端消化很慢,造成 window 阻塞,使可傳送的的空間減少甚至使窗口縮小到「愚蠢」的值,常見解決辦法有 Nagle's Algorithm 與 Delayed ACK
**Nagle's Algorithm**
用來減少產生大量小封包被傳送,避免造成網路壅塞
- 情況
TCP 與 IP Header 最小總計 40 Bytes,如果每次傳遞資料過少,資料使用率過低效率差
EX: 該次傳遞 1 Byte,資料使用率: 1 / 41 < 2.5 %
並且同一時間網路上有大量小封包,會占去網路頻寬,可能會造成網路擁塞
- 作法
除了第一筆資料,其他封包傳送要符合下列其中一個條件(同段時間內最多只會傳一個小封包出去)
1. packet 達到 MSS (maximum segment size) --> 提高效率
2. 收到前一個送出 packet 的 ACK --> 表示資料成功送達, 不送頻寬也是空著
```shell=
if there is new data to send /* 有資料要送 */
if the window size >= MSS and available data is >= MSS
send complete MSS segment now /* 會累績到 MSS 的量才送*/
else
if there is unconfirmed data still in the pipe
enqueue data in the buffer until an acknowledge is received
else /* 或者等到 ACK 回應 */
send data immediately
end if
end if
end if
```
**Delayed ACK**
接收端不會每次收到封包都立即發 ACK
延遲發送 ACK 等下次需要送資料再順便帶上,省去小封包 (ACK 也是小封包)
通常最多延遲 200ms
RFC (Request for Comments, 由網際網路工程任務組 (IETF) 發布的一系列備忘錄 ) 規定不能超過 500ms
---
### TCP 壅塞控制 (Congestion Control)
[TCP 壅塞控制 (Congestion Control)](https://notfalse.net/28/tcp-congestion-control)
Congestion 壅塞是指 當主機接收的封包量增加,大於消化的量,此時會被暫存於 Buffer 當中,但如果封包量填滿了 Buffer,就會遺失部分封包,網路也開始壅擠。
避免壅塞的方式有幾種
1. 慢啟動( slow-start )
- 初始啟動時設定窗口值(cwnd)為少量 MSS。
- 以收到的封包表頭中的 Window size 欄位判斷是否有出現壅塞
- 是 -> 窗口就再減少一些
- 否 -> 每經過一個傳輸輪次, cwnd 就加倍
2. 擁塞避免( congestion avoidance )
- 讓 cwnd 緩慢增大,每經過一個 RTT 就把發送方的窗口 cwnd 加 1,而不是加倍。

>圖片來源:[如何理性的調整「rwnd」和「cwnd」的大小](https://www.itread01.com/content/1548818118.html)
:heavy_exclamation_mark: 只要發送方判斷網絡出現擁塞
- 把慢啟動門檻 ( ssthresh ) 設置為出現擁塞時的發送方窗口值的一半(但不能小於2)。
- 把 cwnd 重新設置為 1,執行慢啟動。
- 目的 : 迅速減少主機發送到網路中的封包,使得發生擁塞的路由器有足夠時間把 queue 中累積的封包處理完畢。
3. 快速重送( fast retransmit )
- 接收端 :
- 某區段遺失,代表後續接收的區段 順序錯誤
- 不應使用延遲確認 (Delayed ACK),而是立即確認 (immediate ACK)
- 傳送端 :
- 當 接收到 3 個 重複的確認 (duplicate ACK),則立即重送該區段,而非等到重送計時器逾時。
- 補充:為甚麼需要收到三個呢?
- 傳送端一開始並不清楚「重複的確認」的原因 (可能有多種網路問題)
- 若收到 1 ~ 2 個重複確認,傳送端會假設是網路對區段的重新排序所引起
- 而收到 3 個或更多的重複確認,則明顯地指示區段已遺失
- 例子

>圖片來源[TCP 壅塞控制 (Congestion Control)](https://notfalse.net/28/tcp-congestion-control)
- RTO : retransmission timeout
- ( 原本 ) ACK + 3 ACK ( 重複的 ) = 4 個相同的 確認號 (acknowledgment number)
-> 區段重送之後,計時器會重新啟動
:::info
**Bottleneck Bandwidth and RTT, BBR**
BBR 主要是估計頻寬和延遲狀況,透過不斷偵測封包傳輸的錯誤率,根據總傳輸量和錯誤量的比例來決定要以多大的頻寬傳輸,降低緩衝區堵塞的狀況,進而提高傳輸速度。
BBR 改進的一點是,不是把網路慢的人放優先,是把網路好的人放優先,因此綜合效能比較好
:::
---
## Linux
### 網路相關指令
- `sudo tcpdump`
- 可用來擷取通過某網路介面的封包
- `-n`:以數字顯示,不對 IP 作反解,但仍顯示服務名稱。
- `-i` : 指定要監控的網卡,如 eth0、lo、any 等。
- `-f` : 指定 ip 或 protocol

- `ipsumdump`
- 讀取封包後,以 ASCII 的編碼顯示出資訊給使用者看
- 較易理解
- 需要下載 github 的 code 安裝(checkinstall, just like makeinstall)
- 搭配 fake root
- `ngrep`
- 用正規式過濾封包的指令
- 安裝
- `sudo apt install ngrep`
- 使用
- `ngrep <參數> <規則> <封包類型>`
- `tshark`
- command line 版本的 wireshark
- 習慣把封包撈出來後丟到 wireshark 看
---
### 網路診斷工具
- `ping`
- 用 `icmp` echo request 的封包等對方回
- `traceroute`
- 追蹤封包經過的路由。
- 例如當發現瀏覽一個網站很慢, 使用 traceroute 檢查時, 可以顯示經過的每一個網路節點, 以及每個節點返回的時間。
- traceroute 會對經過的網路設備送出封包 3 次, 測試所需的時間, 而返回的時間單位是 ms。
- 預設會對每個網路設備測試 3 次, 要改變測試次數, 用 -q 參數加上測試次數, 例如:
- 範例
- `traceroute -q 5 google.com`
- 可以自己決定用什麼協議發封包

:::info
**traceroute 原理**
Time To Live, TTL(存活時間)
Time Exceed 逾時
每當封包經過一個路由器,其 TTL (存活時間)就會減 1。當存活時間是 0 時,主機便取消封包,並傳送一個 ICMP 的逾時 (Time Exceed) 封包給原封包的發出者。
traceroute 就是計算這個封包的回傳時間。
程式首先發出 TTL=1 的封包,第一個路由器將 TTL 減 1 得 0 後就不再繼續轉發此封包,而是回傳一個 ICMP 逾時封包,程式從該封包中即可提取出封包所經過的第一個路由器位址。然後又發出一個 TTL=2 的封包,可獲得第二個路由器位址,依次遞增 TTL 便獲取了沿途所有路由器位址。
:::
:::success
如果看到最後一個 node 的延遲很小,那就沒事
為何中間的延遲會變多?
因為轉發和直接回應的時間不同
如果某節點開始延遲遞增
路由肯定有問題
如果第某個節點有多個 ip 是正常的
:::
- `mtr`
- MTR 是一個跨平台、簡單易用的命令列網路檢測工具,其結合了 ping 與 traceroute 兩個指令的功能,並提供了更詳細的資訊,讓管理者在使用上更為方便。
- 安裝
- `sudo apt install mtr`
- 使用
- `mtr <要查的 domain 或 ip>`
- 範例
- `mtr www.google.com.tw`
- `mtr -n www.google.com.tw #以 ip 表示節點`
:::info
**MTR 原理**
MTR 在一開始會針對指定的主機,以 traceroute 找出中間的每一個網路節點,然後使用 ping 去檢查每一個節點的網路連線狀況,即時更新在輸出的報表中。
:::
---
### Socket
Socket 是應用層與 TCP/IP 通訊的中間軟體抽象(層),它是一組介面。在設計模式中,Socket 其實就是一個介面,它把複雜的 TCP/IP 協議隱藏在 Socket 後面,對使用者來說,一組簡單的介面就是全部,讓 Socket 去組織資料,以符合指定的協議。
- 顯示目前電腦中啟動的 socket
- `sudo netstat -npxl`

:::info
補充
- `netstat -s`
- kernel 會記錄這台機器的封包紀錄(會有掉包狀況)
:::
:::info
在 UNIX 系統中,所有的東西都可以被視為檔案
Socket 其實也是檔案,當使用 socket 的時候,就是在使用所謂的 socket file,這是一種資料 FIFO 的檔案
:::
---
### Netfilter
Linux Kernel 中的一個軟體框架,用於管理網路封包。不僅具有 NAT 的功能,也具備封包內容修改、以及封包過濾等防火牆功能。
iptables、ebtables 和 arptables 等,都會用到 Netfilter
:::success
iptables state 紀錄在 nf_conntrack module 裡面
iptables 用這個模組來 tracking connection
conntrack table 如果滿了就會掉包
google it
:::

圖片來源[Tech黑手 - 工作雜記](http://chunchaichang.blogspot.com/2011/01/ebtablesiptables-interaction-on-linux.html)
---
### Network protocols?
Linux supports many different networking protocols:
- TCP/IP
- TCP/IP version 6
- IPX/SPX
- AppleTalk Protocol Suite
- WAN Networking: X.25, Frame-relay, etc...
- ISDN
- PPP, SLIP, PLIP
- Amateur Radio
- ATM
>好棒棒,什麼都有
---
### Linux kernel Packet Scheduler
#### Traffic Control
Traffic Control
TC 是 Linux 內建的模組,用於 Linux 核心的流量控制
- 實現方式: 建立 Queue 處理封包,並定義 Queue 中封包被傳送的方式
- 名詞介紹
- Qdisc (queueing discipline):當 kernel 想要透過 network interface 發送 package 時,會先全部被放在 queue 上面,預設是 pfifo。
- Class : 有些 qdisc 可以定義 Class,Class 主要用於做流量的管制
- Filter : 決定 package 要送往哪個 class,每個 filter 是綁定在 qdisc 上。
- 種類
- `CLASSLESS QDISC` 進入網路裝置的流量並不進行分類
- FIFO
- SFQ
- TBF
- `CLASSFUL QDISC` 進入網路裝置的流量會根據需求送到特定類中(分類, 過濾器)
- CBQ
- HTB
- PRIO
- 流量控制方式
- SHAPING(限制 )
- SCHEDULING(排程)
- POLICING(策略)
- DROPPING(丟棄)
### SHAPING(限制)
#### Leaky Bucket

圖片來源[Networking Essentials: Rate Limiting and Traffic Shaping](https://dev.to/swyx/networking-essentials-rate-limiting-and-traffic-shaping-43ii)
- 輸入速率可以變化,但輸出速率保持恆定
- 像有一個漏洞的桶,桶的尺寸與出口的最大流速固定
#### Token Bucket

圖片來源[rate limiting 之 token bucket](https://mozillazg.com/2019/01/rate-limiting-intro-token-bucket.html)
- 若使用者配置的平均傳送速率為 r ,每隔 1/r 秒向 bucket 中增加一個 token。
- 桶子內改存放 Token,如果桶子滿了就不再放 Token
- 如果此時有 packet 要發送,就必須從桶子中消耗一個 Token,如果沒有 Token 則 packet 不能發送。
#### 比較
- Leaky Bucket 桶子滿了會開始丟封包,而 Token Bucket 則是丟棄 Token
- 當流量低時,Token Bucket 有機會可以累積 Token,等到高峰時一次性使用掉,而 Leaky Bucket 無法做資源的保留
### SCHEDULING(排程)
通過排程資料包的傳輸,可以在頻寬範圍內,按照優先順序分配頻寬。SCHEDULING(排程)也只適用於向外的流量。
#### SFQ (Stochastic Fair Queuing)

圖片來源[Classless Queuing Disciplines](http://linux-ip.net/articles/Traffic-Control-HOWTO/classless-qdiscs.html)
- 由多個動態分配的 queues 組成﹐一個 queue 負責一個 conversation
- discipline 則以 round-robin 的形式執行﹐每次從一個 FIFO 中送出一個封包
- 公平地分配封包到 Queue
- CPU 和記憶體所需少
#### TBF ( Token Bucket Filter )

圖片來源[Classless Queuing Disciplines](http://linux-ip.net/articles/Traffic-Control-HOWTO/classless-qdiscs.html)
- 一個緩衝區 (bucket) 構成,存放 tokens 。
- 使用者配置的發送速率為 r,則每隔 1/r 秒一個 token 被加入到桶中。
- 目的:限制 packet 從特定 interface dequeue 的速度,將傳輸的流量減慢到指定的速率
- 僅在有足夠的 token 可用時才發送封包。
#### CBQ ( Class Based Queueing )

圖片來源[CBQ](https://www.researchgate.net/figure/Class-Based-Weighted-Fair-Queue-9_fig2_281740679)
- 網路排程的一種排隊規則,它允許流量在按 class 分組後平均共享頻寬。
- 這些 class 可以基於各種參數,例如優先序,port 或原始程序。
#### HTB ( Hierarchy Token Bucket )

圖片來源[TC 實踐](http://perthcharles.github.io/2015/06/12/tc-tutorial/)
- 保證每個類別的頻寬,但也允許**特定的類別可以突破頻寬上限**,佔用別的類的頻寬。
- Token Bucket + class -> 更精細的控制
- 允許用戶定義所使用的 TOKEN 和存儲桶的特性,並允許使用者以任意方式嵌套這些 Bucket
- 與分類方案結合使用時,可以非常精細的方式控制流量
### POLICING(策略)
在特定 queue 中測量和限制流量。
- 對超出限制的流量如何處理呢?
- Dropping 丟棄流量(苛刻)
- 重新分類
:::info
**Default Network Scheduler**
以前: pfifo
現在: fq_codel
[**參閱**](https://www.networxsecurity.org/members-area/glossary/n/network-scheduler.html)
:::
<style>
.bt {
background-color: black;
color: orange;
font-size: 20px;
font-weight: bolder;
border-radius: 20%;
padding: 4px 2px 4px 2px;
}
</style>