---
# System prepended metadata

title: 網路課筆記
tags: [網路課tcp/ip]

---

---
title: 網路課筆記
tags: 網路課tcp/ip
---

# 網路課(tcp/ip)筆記

[toc]


---

課外補充 及 報告

1. [python 套件介紹 pyautogui, selenium, tesseract](https://hackmd.io/@yAywlvh8QrOW-y_aYbMdCQ/ryrSLtdgs)
2. [透過Python socket 解析封包 和 製作簡易聊天室](https://hackmd.io/@yAywlvh8QrOW-y_aYbMdCQ/SytMvEBms)

---

# Week 1
[課外補充 - Windows cmd](https://hackmd.io/@yAywlvh8QrOW-y_aYbMdCQ/HkvdJ1Fxj)

---

# Week 2
[程式分析封包 bilibili教學](http://b23.tv/YWeVden)
![](https://i.imgur.com/vkJ8yMW.png)

### ipv4 分為 ABC類
網路位置(192.168.1.0) 廣播位置(192.168.1.255) 不能給主機用
我果是有連網的網路 內定路由器位置(通常是192.168.1.1 or 192.168.1.254) 也不能給一般的電腦使用

D類 給群播(multicast)用
E類 保留位址


### 以可不可以連上網路分類
可以連到網際的稱為public ip address, 反之稱為private ip address
#### private ip address 
class A 10.0.0.0/8 (10.0.0.0 ~ 10.255.255.255) 保留下來作私有網路的ip使用的
class B 172.16.0.0/12  (172.16.0.0 ~ 172.31.255.255)
class C 192.168.0.0/16 (192.168.0.0 ~ 192.168.255.255)

A類的第一個網域 0.0.0.0
1. 本網域 ex: 通訊的位置為0.0.0.123 要與相同網路的123節點進行通訊
2. 電腦剛開機需要向DHCP伺服器請求一個可用的IP 以0.0.0.0代表尚未取得IP
3. 代表機器上任一個介面的位置(常用)

**判斷是 公有 還是 私有 IP**
172.31.1.1 私有(B類)
172.32.1.1 公有


### windows下 本地端查看電腦開啟了那些埠號
使用`findstr` 來過濾
> netstat -an | findstr TCP | LISTENING
> netstat -an | findstr ESTABLISHED


### linux下 查看 (以TCP為例)
> netstat -tulnp
t : tcp, u : udp, l : listen, n : 不解析, p : 程式的process id

---

### NAT(Network Acess Translation)
DNAT
![](https://i.imgur.com/UW3Rvnx.jpg)

----

SNAT - 1->1(紅色、綠色)
    只有改變IP
SNAT - NAPT(藍色、黑色)
    改變IP和Port, 只需要一個對外的IP 節省IP的應用比較容易
![](https://i.imgur.com/vXvLaOF.jpg)

---

### 迴路回測(Loop Back Test)
每台電腦都有Loop Back的virtual interface通常稱為LO
保留127.0.0.1給Loop Back使用
IPv4下
> ping 127.0.0.1
若失敗代表 OS裡的TCP/IP協定層出現問題
IPv6下 
> ping -6 ::1 

LO可以有很多個

RTT(round trip time) 封包來回時間
是測量網路效能重要的指標

若PTT過長 可能原因
1. 網路壅塞
2. 伺服器繁忙

OWD(one way delay) 送出封包到接收到的時間差
也是測量網路效能重要的指標
1. OWD短RTT長 伺服器忙碌
2. OWD長RTT長 網路壅塞

---

### 區域廣播(Local Broadcast)
位置 255.255.255.255

---

### DHCP(Dynamic Host Configuration Protocol)動態主機設定協定
使用時機:網路自動化設定
DHCP 也是客戶端伺服器端的模型
客戶端使用68埠
伺服器端使用67埠

DHCP伺服器必需要提供客戶以下資訊才能聯絡
1. IP
2. Mask (判斷對方是否在同個網路, 相同的話直接傳 不同的話使用內定路由器傳)
3. default-router (內定路由器傳)
4. DNS server

可提供tftp server
用處:重灌電腦教室的多台電腦
1. 在BIOS選用網路開機
2. 先去DHCP server取得上述4種資訊 
3. 發現本地端沒有開機的資訊 
4. 到tftp server OS抓回去 搭配腳本自動安裝

運作的原則
DORA
![](https://i.imgur.com/f98pUE7.jpg)

在windows上查看DHCP server資訊
> ipconfig/all

---

### DNS(Domain Name System)
正向解析 domain name 跟 IP 轉換
反向解析 IP 跟 domain name 轉換 (可用來查看 看我的網站的人 在哪個國家)

**使用UDP(53埠) 快 但是 不安全**

最常受到 DDOS(分散式阻斷攻擊) 

應用
CDN(Content delivery network)
傳統上使用IP做資料存取 有些時候較沒效率
CDN是以內容進行傳輸作為導向的網路
原理:DNS的高級設定 透過不同的IP給予不同的回答

windows下hosts.txt位置
> $ C:\Windows\System32\drivers\etc\hosts.

linux下
> $ \etc\hosts

```
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host
# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost




0.0.0.1	mssplus.mcafee.com
```

若要進行解析(步驟如下)
1. hosts.txt
2. cache `$ ipconfig/displaydns`
如果要清除cache 使用`$ ipconfig/flushdns`
4. DNS server

---

### FQDN(Fully Qualified Domain Name)
網域完整的名字
規則:
1. 以 . 間隔層級
2. 最多 5 個層級 (重要)
3. 每一級最少2個字元, 小於63格字元
4. 總長 < 253字元 (重要)
5. 可用英文、數字、破折號、中文...

FQDN 包含:
1. Host Name
2. Domain Name
3. 根網域 .
ex: www.flag.com.tw.

![](https://i.imgur.com/WJ6dBJW.png)


---

# Week 3
### 統籌負責
#### DNS IP 都是由 **ICANN** 負責
在台灣由 TWNIC(Taiwan Network Information Center) 負責

### 網域名申請
edu.tw 由教育部負責
gov.tw 由行政院負責

### DNS Domain Name Server
為客戶端伺服器端模型
> 複習 P2P: peer 指的是同時具有Client端Server端功能的
使用**UDP**到Server端查詢 因為希望越快越好
**Server端使用53 port**

**常見的DNS server**
8.8.8.8
9.9.9.9
8.8.4.4

#### DNS伺服器 設定
Linux : /etc/resolv.conf

#### 網路有問題 流程
1. ping 127.0.0.1 檢查TCP/IP 協議堆疊 有沒有問題
2. ping 自己的IP   檢查實體的網路卡
3. ping 內定路由器  檢查 路由器 網路線
4. ping 8.8.8.8 知名IP
5. ping tw.yahoo.com 知名伺服器
若4.可以5.不行 代表 DNS有問題

### DNS 伺服器的管理區塊(zone)
可以把DNS的管轄權交給下級去管
![](https://i.imgur.com/mM2wmGT.png)

### 根伺服器
全世界有14台
若拒絕某國家的請求 則該國只能使用IP連線

1. 查詢host.txt有沒有靜態的網域名稱跟IP的綁定
2. 到本地端的快取查看之前的紀錄有沒有
3. 1、2都沒有的話 發送請求到伺服器查詢
情況1 伺服器本身可以解析網域名稱跟IP的對應(是它的管轄範圍 或是有 快取(之前有請求過))
情況2 

`$ nslookup` (Name Service查詢) 查詢DNS和IP的轉換
![](https://i.imgur.com/wO4utgu.png)
> 出現未經授權的回答表示是從 cache 取得
> Address不同是因為 從 內網 及 外網 連線的差別

如果採用自動取得DNS server，則需要透過ipconfig/all得知得到的DNS server IP

遞迴查詢(Recursive Query) 
反覆查詢(Iterative Query)
**重要**
![](https://i.imgur.com/cReWDao.jpg)

查詢本地端DNS的快取`$ ipconfig /displaydns`
清除本地端DNS的快取`$ ipconfig /flushdns`

### DDNS Dynamic DNS
給予 浮動的、不固定的IP 一個 固定的Domain Name
不適合郵件伺服器

## IP協定
目的:定址、路由(尋找路徑)
IPv4 標頭20byte(無選擇項,不固定->效能差一點) 總長度32bit
IPv6 標頭40byte 總長度128bit

![](https://i.imgur.com/Nj1vdV2.png)


### Ver version
0100 IPv4
0110 IPv6

### IHL Ip Header Length
長度:4bit
IHL >= 5個單位(20byte)
一個單位4個byte
>5 代表有選擇項
IP標頭 長度是4的倍數 不足用Padding補

### TOS Type Of Service

傳統路由器只會實作兩種機制
1. DropTail 柱列管理機制(Queue Management Buffer Management)
   柱列(快)滿了 會丟棄最後的封包
   DropFront 丟最前面的 (原理:最前面的已經經過很久才到這裡 所以可能快失效了)
   RandomDrop 隨機丟
   
2. FIFO 先進先出
Scheduling 決定封包誰會先送出去

**網際網路目前只提供一種服務 Best Effort Service 盡最大可能服務**



### TL Total Length
長度:16bit (所以最長為65535 byte (沒有選擇項))

# Week4

![](https://i.imgur.com/zbhCouD.png)


### TTL
1. 限制封包可以傳多遠
    每經過一個路由器就-1
    直到TTL=0 還沒送達就丟棄 送一個ICMP封包(功用:1.控制2.錯誤回報)
2. 防止故障
    網路發生錯誤時，避免封包一直存活在網路上
    
不同OS送的封包TTL可能不同 所以可以由封包TTL回推 傳送方的OS




### Header Checksum (檢查標頭有沒有發生錯誤)


1. 第一欄Ver Version(4 bits) 0100(ipv4) 0110(ipv6)
2. 第二欄IHL Internet Header Length(5個單位= 20 byte) 一個單位是4個byte 若大於5個單位 代表有選擇項  若<5個單位 代表是錯誤的
    正常來說:
    IPv4 header:20 byte
    TCP  header:20 byte
    UDP  header:8  byte
    
3. 第三欄TOS Type Of Service 封包送出去希望有甚麼服務
    Precedence 3 Bits 優先權(最小0~最大7)
    1. D Delay 封包送出去到接收到的時間差
        若D設為1 代表 不希望Delay ex:即時通訊 (Delay sentitive)
        若D設為0 代表 不需要即時性 ex:備份
        
        **應用程式通常分4類**
        
            1. 語音類型 重視 延遲時間 資料量小(PCM編碼 每秒取樣8000次 每個sample 8個bit) 所以所需頻寬為 64kbps 壓縮後可能只需2~3kbps
            2. 影音類型
                影像(ex:看youtube或直播)對延遲要求不高 因為可以透過Buffering(緩衝)吸收網路的抖動 但是對頻寬的要求比較高 (720p 1080p 4K...所需頻寬漸高)
                聲音 對延遲的要求 希望從 接收到>編碼>壓縮>傳送>解壓縮>還原 控制在 100 minisec ~ 200minisec
            3. 一般資料傳輸 ex:網頁 不重視延遲 重視完整性
            4. 背景資料 ex:備份 不需要講求速度 慢慢傳就可以
    **吞吐量** 單位時間的傳送/接收量 
     >throughput OSI第2、3層 封包接收量 ex:mac ip tcp (有header)
     >good put 應用層封包接收量 不用考慮header 所以通常good put <= through put
    而且底層throughput也會計算到傳送失敗丟失的封包(封包可能會重複發送) 而在應用層只會收到底層 成功傳送的封包(每個封包只會算到一次 不重複)
    通常傳送檔案看到的速率就是goodput 而throughput則是實際真正的流量
    影像、一般資料傳輸　對throughput要求比較高

    2. R reliability 可靠度
        若R設為1 代表 需要高可靠度、完整 ex: data類型(網頁)
        若R設為0 代表 不需要很高的可靠性 ex: video voice 丟失一點點沒關係
    3. C cost 成本
        光纖 無線網路 同軸電纜 材質特性不同 可以標記要走快速通道或節省通道等
        若C設為1 代表 以最小成本路徑傳輸
        若C設為0 代表 以一般成本路徑傳輸
    4. 最後一個位元 保留欄位
        設為0 表示未做定義
        
### DS Differentiated Service 差異式服務 
講求差異 (DSCP 就是把資料分類 只要某一類比另外一類好 就好了)
### IS Integrated Service 整合式服務 
講求絕對 精準型QoS(ex:要求1M傳輸通道 只有我可以透過這條專屬通道傳輸 但是成本高 太多人用會造成負荷量過高 所以只會在實驗中實作)

### ECN Explicit Congestion Notification
1. 當TCP封包送出後，若成功送達會傳回ACK 而網路過於壅塞時便會在傳回的封包中加入ECN的資訊代表網路壅塞 需要降低傳輸速率
2. Hacker可以偽裝成路由器 傳ECN給其他使用者騙它網路發生壅塞 降低網速 Hacker便可以利用網路資源

### TL Total Length
<pre>
       v IHL     v TL-IHL
     __________________
    |  IP  |  payload  |
     ------------------
           ^ TL

payload的長度為 TL-IHL
</pre>

#### 封包的分割與重組
IPv4 允許封包在傳輸過程切割
IPv6 只能在來源端切割  傳送前先尋找Path MTU(最大的傳輸單元)
1. ID 識別代碼
    封包切割完後 ID會相同    (重組只在接收端進行)
2. Flags 旗標
    DF (Don't Fragment) 不切割
        0:可以切　（一般封包）
        1:不可以切 (對完整性(安全性)有要求的封包）　若設為１　但封包太大　便會丟棄封包回傳ICMP
    MF (More Fragment)
        1: 後面一個封包也是被切割的
        0: 後面一個封包不是被切割的
3. FO (Fragment Offset) 分片位移
用來記錄重組回去的位置
位移量是以 8byte 為單位
![](https://i.imgur.com/I1FOoMD.jpg)




### PROT Protocol

#### 識別項
<pre>
 1  : ICMP
 6  : TCP
17  : UDP
</pre>
![](https://i.imgur.com/AdzJda2.jpg)


#### 安全補丁 (在IP層做的)
50   ESP 內容加密 完整性
51   AH  驗證身分

HC Header Checksum 傳輸過中 檢查 header 有沒有發生錯誤
SA 來源IP 32bits
DA 目的IP 32bits

### OPT option 長度不定
1. Source Route 來源端路徑
    `$ route print` 查看路由表
    ![](https://i.imgur.com/KUPrOJh.png)
    目的IP和遮罩做ADD運算後等於路由表上網路目的地的 取遮罩1最多的作為轉發的選擇 並且從 該介面送出
    若遮罩數相同 挑計量小的送
    在封包傳送過程中 明確指出 要經過哪些站(測試 除錯)
2. Route Record 路徑紀錄
    記錄封包經過哪些路由器
3. Time Stamp 時間標記
    經過某路由器的時間點
    可以推算經過兩個路由器的時間差(檢查壅塞)
4. Security Label 安全標誌

### PAD padding 填充
IP header 一定要是4的倍數 若不足就在PAD補0
    
#### Strict Source Routing 嚴格源路行徑
明確指定哪一站要經過哪些節點

#### Loose Source Routing鬆散源路行徑
會經過指定的節點但中間可插入其他中間節點
    


### **IPv6 vs IPv4**
<pre>
位置長度:   128bit                32bit
安全性　:   安全性設計在協定中       只有安全補丁
效能   :   (封包大小固定40byte)    大小不固定 需要計算大小->引響效能
IP 設定:   基本上使用自動          可以自動也可以手動
</pre>

IPv6適合應用在 物聯網IoT Internet of Things


### IPv6的傳播方式
1.單播 Unicast
2.群播 Multicast
3.任播 Anycast (路由器在使用的)

---

# Week 5

## IPv6

### 傳輸型態
1. 單播
2. 群播
3. 任播(只能用在路由器介面 不能用在主機上)


### 位址表示法
1. 128 bit
2. 分8個區塊 一個區塊16 bit 區塊間以 : 間隔
EX: 2002:8C6E:C7FA:00A1:0000:0000:0000:09E3

3. 連續的0可以縮寫 ex: :00A1:0000: -> :A1:0:
4. 連續的 :0:0:0 可以縮寫成:: 但只能縮寫一次 否則無法回推


### 格式
1. IPv4
分兩塊:network ID, host ID
2. IPv6
分三塊:Prefix, Subnet, IID

####  1.格式首碼(Format Prefix)
辨識種類 ex:看到首碼就可以知道 它是全球1對1或是本地、內定網路用的
> 就像是IPv4:
> 140.1.1.2->class B public
192.168.x.x -> private

![](https://i.imgur.com/BJxIsWu.jpg)
若首碼為001 從IP來看就是2X:或3X:開頭的

![](https://i.imgur.com/znrkJu9.jpg)



**區域連結單點傳播位址** 首碼1111 1110 10
> FE: 開頭
`ipconfig /all`
```
乙太網路卡 乙太網路 4:

   連線特定 DNS 尾碼 . . . . . . . . :
   描述 . . . . . . . . . . . . . . .: VirtualBox Host-Only Ethernet Adapter
   實體位址 . . . . . . . . . . . . .: 0A-00-27-00-00-06
   DHCP 已啟用 . . . . . . . . . . . : 否
   自動設定啟用 . . . . . . . . . . .: 是
                                      v  為fe開頭
   連結-本機 IPv6 位址 . . . . . . . : fe80::24e6:1a51:e8d0:b0ee%6(偏好選項)

   IPv4 位址 . . . . . . . . . . . . : 192.168.56.1(偏好選項)
   子網路遮罩 . . . . . . . . . . . .: 255.255.255.0
   預設閘道 . . . . . . . . . . . . .:
   DHCPv6 IAID . . . . . . . . . . . : 805961767
   DHCPv6 用戶端 DUID. . . . . . . . : 00-01-00-01-28-96-57-B8-7C-10-C9-AF-1B-33
   NetBIOS over Tcpip . . . . . . . .: 啟用
```


#### 2.子網路辨識碼(Subnet ID)
劃分網路 ex:透過Subnet ID可知 是中華電信或是遠傳...等的

#### IPv6位址網域範圍表示
ex: FE80:3600::/8 表示是有 8個位元 首碼的IPv6區塊

#### 3.介面辨識碼(IID; Interface ID)
辨識子網路內唯一的介面
1. 用隨機的亂碼產生
2. (常用)由網路卡卡號(6個byte 48個bit)變形 變成64個bit
3. 手動設定

**EUI-64轉換 (網路卡卡號 -> IID)**
![EUI-64轉換](https://i.imgur.com/NmiMhfm.jpg)

### IPv6 特殊位置

1. :: (0:0:0:0:0:0:0:0)
類似IPv4 0.0.0.0
剛開機尚未設定IP時的位置
伺服器上任意介面的位置

2. ::1 (0:0:0:0:0:0:0:1)
迴路位置
類似IPv4 127.0.0.1

3. 使IPv4位只能與IPv6環境的節點互相通訊
IPv4相容位址
![](https://i.imgur.com/mpwt6In.jpg)
6to4位置
ex:首碼2002 + 32bit IPv4位址 + 子網路欄位 + 64bit IID
可以取出 32bit IPv4位址 來與IPv4的網路通訊

### IPv6 標頭
固定大小 40 byte (處理更單純->提升效能)
IPv4 20 byte(no options)

原本IPv4的選擇項 放到 延伸標頭
IPv6標頭 : 主標頭 + 延伸標頭

IPv6 不允許在傳輸過程進行切割 只能在來源端切割
![](https://i.imgur.com/8ldOXFX.png)


1. Ver(4)
0110 -> 6
2. Traffic Class(8)、Flow Label(20)
類似IPv4的ToS 差異式服務
Traffic Class 根據應用程式需求的不同進行分類
Flow Label 特定幾個應用程式的需求(ex:可靠或快速)都是相同的 用一個標籤來表示 就不用每次都要去檢查 來源IP 目的IP 來源Port 目的Port 傳輸協定等資訊
Flow 可以用數個欄位來定義 例如(來源IP 目的IP 來源Port 目的Port 傳輸協定)如果這些欄位都相同 就可以稱為是相同的Flow
3. Payload Length(16)
IPv6 標頭長度固定
IPv4 標頭長度不固定 所以用Total Length
4. Next Header(8)
由IPv4 Protocol改名
Next Header 有可能是延伸標頭
IPv6 延伸表頭
![](https://i.imgur.com/1rrSieB.png)
網際網路上大部分都是使用 OSPF 路由協定
5. Hop Limit(8)
由IPv4 TTL改名
6. Source IPv6 Address(128)
7. Destination IPv6 Address(128)

> AAA伺服器 (Authentication Authorization Audit 驗證 授權 審計)
> IPv6 沒有ARP 併入ICMPv6
> ARP: 透過廣播詢問某IP位址的網路卡卡號

#### 在IPv6上配置ip
1. 手動
2. stateless (路由器發送prefix,然後host可以用手動,隨機,EUI-64,搭配prefix,形成128 bits
3. DHCPv6 (stateful)

---

## 傳輸層協定


> 複習
實體層 實體的連線 將資料轉換成0、1
資料鏈結層 負責1跳之間的傳輸品質
網路層 路由 定址
傳輸層 傳送端到目的端的傳輸品質


問題:
1. 封包遺失packet lost
路由器緩衝空間有限 緩衝滿了封包就可能被丟棄
2. 封包錯誤packet error
無線網路易受外在干擾
3. 失序out-of-order
封包有可能 先傳的後到 後傳的先到 所以TCP要處理這個問題
> 解法:在標頭放入SN(序號) 傳輸失敗就可以針對序號重傳
4. flow-control 
> 考量網路狀態、接收端的緩衝

---

**TCP**
1. FTP檔案傳輸 server用 21埠控制、20埠傳送資料
控制、傳輸通道分離 : out-of-band
2. Telnet遠端控制(不加密) 23埠
控制、傳輸通道相同 : in-band
ssh遠端控制(加密) 22埠
3. SMTP (Simple Mail Transfer Protocol) 寄信 25埠
![](https://i.imgur.com/Sn7FEbh.jpg)
4. POP3 收信 110埠(未加密) 995埠(加密)
![](https://i.imgur.com/GUsZSOK.jpg)
5. HTTP 80埠
6. HTTPS 443埠


**UDP**
1. DNS 網域名->IP 53
2. SNMP (Simple Network Management Protocol)簡單網路管理協定
    MID (Management Information Base)類似小型資料庫 查詢網路設備在做甚麼?速度? 設定
3. NFS (Network File System) linux系統的資源分享 類似Windows的網路磁碟機
4. BOOTP DHCP的前身 (不重要)
5. tftp (Trivial File Transfer Protocol)更新韌體
6. syslog 紀錄伺服器 系統的紀錄檔



>ntp 解決時間同步的問題

>SQL 3306埠
redis 6379埠 也是一種資料庫 存在記憶體
![](https://i.imgur.com/OD0HTyp.jpg)
類似的應用 memcached


#### TCP 是連線導向式的傳輸協定
建立連線:三項交握(three way handshake)
![](https://i.imgur.com/Qoy9QBU.jpg)

關閉連線:half-close
![](https://i.imgur.com/xV1fhd2.jpg)

#### **Port Number**
傳輸層定址 port number
> mac層 網路卡卡號
> IP層 IP位址
> 傳輸層(TCP/UDP) port number

IANA 管轄埠號
埠號分3種
1. 公認埠 0~1023
2. 註冊埠 1024~49151 MySQL、redis
3. 動態埠 49152~65535

![](https://i.imgur.com/3bOAyni.png)


其他的查表 etc/services




# Week 6

## UDP 協定
1. 非連線導向式(傳資料之前不需建立連線)
2. 講求快速 但是封包發生任何事UDP一概不管
3. UDP標頭 8 Byte
> IP標頭 20 Byte (no options)
 TCP標頭 20 Byte (no options)
 IPv6標頭 40 Byte

![](https://i.imgur.com/oJwY1If.png)

### 埠號
16 bit -> 最大65536 (一台主機跑的應用程式最多65536個)

### 訊息長度
訊息長度 = UDP標頭 + Payload
<pre>
      ＜--   這塊   --＞
 _____________________
| IP | UDP | Payload  |
 ---------------------
</pre>

### 檢驗和
可以做 也可以不做
封包傳輸過程發生問題 有做的話 就會去校驗
主要保護 UDP標頭 + Payload

> IP CheckSum 只保護Header的部分

### Checksum值運算
標頭、資料、虛擬標頭(Pseudo Header)
虛擬標頭 包括 網路層的來源IP 目的IP 等相關欄位

如果校驗和只保護 (第4層)來源Port、目的Port  範圍太大 不夠精準
所以 第三層 來源IP 目的IP 通訊協定 UDP訊息長度 都會加進來一起計算
![](https://i.imgur.com/fDFOhOH.png)

> TCP 的校驗和也是如此

> ![](https://i.imgur.com/69BPr4N.jpg)

乙太網路層(上圖) 標尾 FCS(Frame check sequence):Checksum
IP層 Header Checksum
UDP 也有 Checksum
> Q:為甚麼要做這麼多次Checksum?
因為網路是分層分工的
ex 1:沒辦法確保底層永遠都走乙太網路 有可能走WiFi或其他網路 說不定資料鏈結層沒有實作Checksum
ex 2:傳輸層不一定走的是有實作Checksum的TCP、UDP，可能選擇沒有做Checksum的其他協定

---

`netstat -a` linux下查看系統開了哪些服務 哪些是已連線或被監聽的
顯示的是被解析過的結果 
0.0.0.0:DNS
0.0.0.0:http
若加入參數-n (不解析)`netstat -an` 或是 `netstat -na` `netstat -n -a` `netstat -a -n` 
0.0.0.0:53
0.0.0.0:80
方便做資料的統計

`sed -i "/^$/d" test.txt` 將test.txt的空白行刪除
<pre>
sed: stream editor 一種命令式的文字編輯器
-i: 操作完後直接寫到原本的檔案 不用的話只會顯示結果不會更動檔案
^: 以...為開頭
$: 以...為結尾
^$: 空白行
/d: delete
</pre>

---

## TCP 協定

### TCP協定序列號碼(SN:Sequence Number)
幫資料編號 當資料遺失時就可以透過編號來檢查
封包遺失定義:data不見(封包沒有送到目的端)或ack不見(封包有送到目的端但傳回的ack遺失)
當傳送端送出封包時Timer開始計時 若超過設定的時間沒有收到ack就會判定為封包遺失 並重送
RTO(Retransmission TimeOut) [課外補充](https://www.796t.com/content/1548844041.html)

TCP(連線導向)建立在IP(非連線導向)上 可能會造成失序
透過SN就可以把順序調整回來

![](https://i.imgur.com/TyY7JzJ.jpg)
> 實際上起始序號是隨機產生的 並不一定從0開始
> 目的是提高安全性(若序號都從0開始 駭客就可以知道想竊聽封包的序號 進而對封包動手腳)
> 序號的大小可以到非常大 讓駭客不容易猜到正在傳輸封包的序號
> 最初TCP序號以"封包數"累積，目前則以"位元組數"累積

考題(?的地方挖空)
![雙向資料傳輸](https://i.imgur.com/2uwIFH7.jpg)


### 滑動視窗(Sliding Window)

![](https://i.imgur.com/9h5uWuH.jpg)


目的:flow control(流量控制) 允許傳送端最多可以送個封包(只要有收到Ack視窗就會滑動(空間變大)當空間足夠就可以再送下一個封包)
1. 送太快 路由器緩衝區會過載 並丟棄封包
2. 接收端緩衝區若滿了 也會丟棄封包

最簡單的方法
stop and wait
送出封包 等待收到Ack 再送下一個 
缺點:太保守 閒置時間長 無法有效利用網路的資源
![](https://i.imgur.com/OpP6HCZ.jpg)
上圖 中間的(第二個)改良 是緩衝區的運用

delayed ack 計算
![](https://i.imgur.com/vkHtWNA.png)

> 實際上網路的狀態(壅塞程度)不斷變化 所以視窗的大小並不會固定 (由接收端緩衝區大小及網路狀態決定)

![](https://i.imgur.com/useQXSX.png)

# Week7

#### queue management 佇列管理機制
buffer在甚麼時候要丟封包

#### 網際網路最常用的是drop tail
佇列滿的時候丟棄新進的封包

[複習第三周筆記-TOS](https://hackmd.io/q-kAqlqzTuKfrD38jqHimA?view#:~:text=Type%20Of%20Service-,%E5%82%B3%E7%B5%B1%E8%B7%AF%E7%94%B1%E5%99%A8%E5%8F%AA%E6%9C%83%E5%AF%A6%E4%BD%9C%E5%85%A9%E7%A8%AE%E6%A9%9F%E5%88%B6,-DropTail%20%E6%9F%B1%E5%88%97)

---

## TCP global synchronization problem (全局同步問題) [參考資料](http://csie.nqu.edu.tw/smallko/ns2_old/gs.htm)
傳送端送出封包的速度是一樣的，當傳送端一起送出封包時，會造成佇列一下就滿了，滿了後新進封包全部都被丟棄，傳送端速度全部都降下來，導致佇列為空並產生閒置產能，網路利用率下降又稱為鏈路使用率(Link Utilization)低落。

解決方法:設計不同的佇列管理機制
1. RED(random early detection) [延伸閱讀](https://jit.ndhu.edu.tw/article/download/1734/1742)
    原理:錯開drop tail丟棄新進封包的順序
    ![](https://i.imgur.com/ICYgwye.jpg)
    min max P 以往都需要人工去設定 需要參數設得好才能有效提升效率
    近年來人工智慧發展迅速，若可以透過AI去設定參數便可能有效提升效率

---

### TCP header
![](https://i.imgur.com/uhhOOvI.png)

長度:20 bytes 沒有選擇項


#### Source Port 、 Destination Port
最大65535 (16 bits)

#### Sequence Number
給予每個資料一個序號 對應到它在資料流中的位置

#### Acknowledge Number
接收端收到資料後回傳Ack 
告訴傳送端 我已經接收到哪一個資料 及 希望下一筆送來的資料序號為何

#### Header Length
一個單位4個byte
理論值為5 代表沒有選擇項 (= 20 bytes)
大於5 代表有選擇項(> 20 bytes)

#### 0000 為 reserve保留

#### C E U A P R S F 旗標

### S (Syn) 建立連線 收到Syn時 旗標S會被設定

### F (Fin) 關閉連線 收到Fin時 旗標S會被設定
![](https://i.imgur.com/pc5zZub.jpg)

### R (reset) 重新斷開連線 當SN與預期收到(Ack)不同時 設定R
只要傳輸時一方收到的SN不如預期(覺得可疑)便會關閉連線 並需要重新建立三項交握

### A 代表Acknowledge Number有生效
![](https://i.imgur.com/GOZ8q6P.jpg)

### U (Urgent) 對應到 Urgent Pointer(16)
ex:當TCP的應用程式被強制中斷時，優先處理"結束"的訊息，前面其他資料則跳過，不處理
Urgent Pointer 則是指到 "結束" 訊息的位置
不一定是使用在 結束程式 還有其他應用

### Window
通知對方 我的緩衝區還有多少空間
TCP連線是雙向的 所以兩邊"都有"緩衝區(傳送緩衝區、接收緩衝區)

### Checksum [複習](https://hackmd.io/qwmN-3miRTGPrQQW0EpCaA?view#:~:text=Header%E7%9A%84%E9%83%A8%E5%88%86-,Checksum%E5%80%BC%E9%81%8B%E7%AE%97,-%E6%A8%99%E9%A0%AD%E3%80%81%E8%B3%87%E6%96%99)
TCP 重視可靠度 強制執行CheckSum
有虛擬標頭

---

# Week8

### C (Congestion Window Reduced)
### Ｅ　(ECN Echo 明確壅塞通知回聲)

當路由器的buffer快滿時 將E設為1 通知來源端發生壅塞 來源端會將Window縮小降低傳送速度 並把C設為1
![](https://i.imgur.com/6PYoRQS.jpg)

#### TCP 的流量控制主要分為主動跟被動
1. 主動:路由器告訴來源端壅塞 來源端降低速度
2. 被動:路由器過於壅塞時丟棄封包 來源端沒收到Ack便降低傳送速度

### P (Push 推進)
傳統:當資料在buffer累積到一定的量才會往應用層送
若設定P為1則會直接往上層送



## TCP Option
長度固定 4 bytes
TCP Header Length 必為4的倍數20、24、28、32...


格式:
<pre>
 ____________________________
| Kind(8) | Length(8) | Data |
 ----------------------------
</pre>
![](https://i.imgur.com/P9meP4Q.jpg)
### 1. 最大資料片段大小 (MSS: Maximum Segment Size)
Kind: 2, Length: 4, Data: MSS (ex: ethernet: 1460)

<pre>
乙太網路
             MTU 
       <-- 最大長度 -->
 -----|--------------|
| eth | IP | payload |
 --------------------
 訊框 最小64 最大1518
</pre>

 MTU = 1518 - 14(eth) -4(FCS) = **1500** bytes
 MSS = 1500 - 20(IP) - 20(TCP) = **1460** bytes


![](https://i.imgur.com/SRnEiHG.jpg)


#### MSS 存在的意義

封包最大長度由 IP header 的 Total Lengh (16bytes) 控制
最大長度約為65536 若需要更長的傳送單位 可以由TCP的選擇項(MSS)設定
應用: 衛星通訊 (傳送延遲時間長 傳送較大的封包對網路使用率較佳)

### 2. 無操作選擇項(No-operation)
**一般來說**若有選擇項 且大小不是4的倍數 則在**選擇項後**補上padding
但對於**TCP**而言, No-operation(padding)是補在選擇項**前**

### 3. 選擇項結尾(End of Option List)
Kind: 0, Length:無, Data:無
只佔一個 Byte

### 選擇性回應允許 SACK Permitted (Selective ACKnowledgment)
傳統上,當發生TimeOut時,會將Window中所有封包重送 包括Window中已成功送達的封包
SACK解決了 TimeOut時再次重新發送已送達的封包的問題

SACK機制: 標註有收到的範圍, 發送TimeOut時只要重送沒有被標記的封包就好
![](https://i.imgur.com/LT1tv7p.png)


## ARP RARP ICMP

> 在IPv6環境下 ARP的功能被併入ICMPv6了

## ARP (位址解析協定 Address Resolution Protocol)
通訊時 完整的封包需要: IP位置、網路卡卡號(依照傳送端與來源端是否在同個區域網路而定)、埠號

>判斷 傳送端 和 目的端 是否在同個區域網路
傳送端IP和遮罩做AND運算 和 目的端IP和遮罩做AND運算 相同代表是在同個區域網路,反之不同

來源和目的主機在同一區域網路下,ARP得到的是真正目的端的網路卡卡號
若是在不同網路環境下,ARP得到的是default router的網路卡卡號

![](https://i.imgur.com/1BRuyQ3.jpg)

#### ARP設計時並沒有考慮資安的因素
ARP 以廣播的方式 詢問所有裝置 IP對應的mac, 對方(只有一個)收到後就會以單播回應
但是若有hacker不斷地放出 假的資訊 ARP則會相信hacker給的資訊 因為ARP並不會在意是誰回應的 只關注回應的訊息
![](https://i.imgur.com/NIHFE1R.jpg)

#### netcut (網路剪刀手)
hacker 可以使用netcut這個工具 透過不斷發送封包讓目標主機ARP table記錄錯誤來達成斷線目的

要怎麼知道自己是否中了netcut的攻擊?
* <法一> 透過程式觀察"行為" 若裝置發送ARP封包的頻率過於頻繁則這個裝置很有可能是hacker
* <法二> 檢查ARP cache table中 是否有 IP對應的mac 不同 且mac有重複 有重複就表示 table中被攻擊方的IP對應的mac被改成別人的mac了 
* arpspoof (dsniff) 可以做到跟一般機器傳送ARP封包的頻率一樣且同時做到竄改其他人ARP cache table的目的 所以arpspoof就無法透過<法一>偵測出
原理:
1. 先把被攻擊方(機器1)的ARP cache table對應的路由器mac改成攻擊方(機器3)的mac
2. 攻擊方(機器3)會收到被攻擊方(機器1)傳給路由器的請求 再把請求傳給真正的路由器
3. 欺騙路由器 被攻擊方(機器1)的IP 對應的mac 是攻擊方(機器3), 機器3收到後再傳給機器1

這麼一來 被攻擊方(機器1) 發送/接收 的所有封包都會先經過 攻擊方(機器3), 便能操弄其封包
![](https://i.imgur.com/7rREPLN.jpg)


運作過程(由對方IP取得對方mac):
1. 檢查Cache ARP對照表 有沒有對方IP對應的mac
windows：`arp -a`
linux：`arp -n` 
![](https://i.imgur.com/ik5hxt2.png)
類型分為 靜態、動態
靜態 (自己手動加入的) `arp -s <IP> <mac>`
動態 (送出ARP封包 收到回應後加入的 也就是別人告知的)
靜態的權限大於動態: 設定好靜態的後 即使有回應 也不會更改

2. 若沒有對方IP對應的資料 則 用廣播的方式詢問
![](https://i.imgur.com/wbu2cN1.png)

## RARP (反向位址解析協定 Reversed Address Resolution Protocol)
### 在早期電腦沒有磁碟機(無法儲存IP位址)的環境下設計出的
將mac和IP的對應記錄在RARP伺服器
當電腦一開機 發送請求(包含自己的mac)給 同個區域網路的RARP伺服器，RARP伺服器傳回一個IP 該電腦就能和其他電腦通訊

## ARP vs RARP

![](https://i.imgur.com/ezZ5mmu.png)
### 欄位定義

1. Hardware Type (16) 硬體類型
    ex: 乙太網路(Ethernet): 0001
2. Protocol Type (16) 協定類型
    ex: IPv4: 0800, ARP: 0806
3. HLEN (Hardware Address Length) (8) 硬體位址長度
    ex: 06 (Ethernet address長度為 6 bytes)
4. PLEN (Protocol Address Length) (8) 網路協定位址長度
    ex: 04 (IP address長度為 4 bytes)
5. Operatoin (16) 操作型態
* ARP Request : 1
* ARP Reply : 2
* RARP Request : 3
* RARP Reply : 4

6. Sender HA(Sender Hardware Address) 發送端硬體位址
7. Sender LP(Sender Logical Protocol) 發送端邏輯位址
8. Target HA(Target Hardware Address) 目的端硬體位址
* ARP 請求時
Target HA : 00-00-00-00-00-00 (代表尚未取得)
資料鏈結層目的端位址 : FF-FF-FF-FF-FF-FF

9. Target LP(Target Logical Protocol) 目的端邏輯位址



ARP 和 RARP 都不包含**IP header**, 但ICMP有IP header
![](https://i.imgur.com/eAx41dG.png)
![](https://i.imgur.com/cBhiuzX.jpg)


## ICMP (網際網路控制訊息協定 Internet Control Message Protocol)

> IP層 主要負責 **定址、路由**
有了IP層的功能後才能進行傳送 傳送時可能遇到以下問題:
網路壅塞、主機故障、主機未開機...等
ICMP便是處理這些問題的機制

必須與IP協定標頭搭配 無法單獨運作
![](https://i.imgur.com/59qKdkR.png)

ICMP 最常用的應用 ping、tracert

ICMP 主要的功能 **查詢、錯誤回報**
![](https://i.imgur.com/awnwwjL.png)

---

# Week 10

## ICMP

### Ping

`ping -l 512 8.8.8.8`

![](https://i.imgur.com/W3bFaFS.png)

#### type: 0 回聲回覆 Echo Reply
ICMP 回聲回覆的訊息格式
![](https://i.imgur.com/S4foWXd.png)

#### type: 8 回聲請求 Echo Request
![](https://i.imgur.com/aPzM2ZK.png)


#### type: 3 目的端無法到達 Destination Unreachable
例1: 要和某機器(ex:網頁伺服器)連線, 三向交握時須連線到對應的埠號(ex:80)若對方的埠號被防火牆關閉或是對方根本沒有對應的應用程式(ex:網頁伺服器)則回傳ICMP封包 回報Destination Unreachable
例2: UDP的應用程式(不須建立連線) 經由路由器 發送封包給目的端 路由器需要發送ARP封包詢問目的端mac 若目的端無回應(ex: 未開機) 則回傳ICMP封包 回報Destination Unreachable

> ICMP 透過 type 回報目的端不可達，透過 code 說明細部原因

#### type: 4 來源端抑制 Source Quench
當傳送端傳太快 路由器無法負荷 則回傳Source Quench 要求傳送端壓低傳送速度

#### type: 5 路徑重新導向 Redirect
封包傳送時若有其他可能更好的路徑 則回傳Redirect 告訴傳送端可以選則另外一條更好的路徑

#### type: 11 傳輸逾時 Time Exceeded
例1: 封包經過太多路由器還沒到達目的端TTL為0時, 路由器丟棄封包並回傳 Time Exceeded
例2: 大封包經過切割後 若時間內沒有全部送達(可能遺失) 造成無法重組時, 路由器丟棄封包並回傳 Time Exceeded

#### type: 12 參數問題 Parameter Problem
例: 選擇項設定的值 有問題 或是 路由器看不懂 則回傳Parameter Problem

#### type: 14 時戳回覆 Timestamp Request
要求效能時使用

#### type: 17 位址遮罩請求 Address Mask Request, type: 18 位址遮罩回覆 Address Mask Reply
較少用, 因為此功能已包含在DHCP伺服器, 此功能主要用在早期DHCP未誕生前
> DHCP 回傳 IP、網路遮罩、內定路由器、DNS伺服器

### traceroute(tracert) 追蹤傳輸路徑
![](https://i.imgur.com/xFUkuY3.jpg)

linux中,使用`echo 1 > /proc/sys/net/ipv4/ip_forwarding`把裝置設為router
`echo 0 > /proc/sys/net/ipv4/ip_forwarding` 還原設定


![](https://i.imgur.com/E79HUrv.png)
識別碼、序列碼 可以 回報是第幾次查詢、回覆
![](https://i.imgur.com/06HjZzq.png)
type 說明 錯誤大體的歸類
code 說明 錯誤細部的原因
IP標頭+64位元原始資料 說明 錯誤的位置

> Approximate round trip time 近似往返時間
one-way trip 單程

### code 無法到達目的端的原因
<pre>
原因    說明
0	目的端網路無法連接
1	目的端主機無法連接
2	指定的通訊協定不存在
3	指定的連接埠不存在
4	資料需被分割並設定不可分割位元
5	來源選擇路徑失敗
6	目的端網路無法辨識
7	目的端主機無法辨識
8	來源端機被隔離
9	禁止與目的端網路通訊
10	禁止與目的端主機通訊
11	無法連接此網路服務類型
12	無法連接此主機服務類型
13	被過濾禁止通訊
14	違反主機優先權
15	優先權實行中斷
</pre>


>ARP只存在於IPv4環境中，IPv6沒有此協定(因為沒有廣播)，ARP原本的功能由ICMPv6實作
>
IPv6 設定
1. 手動設定
2. stateless 無狀態式設定
    ![](https://i.imgur.com/Yh8xUeb.jpg)
3. DHCPv6 

---

# Week11

## 尋徑協定
### 靜態尋徑
路徑都是手動設定,不需要維護成本,斷線時無法及時反應



<pre>在windows 加入靜態路由  
route ADD 157.0.0.0 MASK 255.0.0.0  157.55.80.1
          ^目的端         ^遮罩      ^下一跳</pre>


### 動態尋徑
路由器彼此交換資訊 透過演算法計算出傳輸路徑 網路變動時可以再找出新的路徑 但是資訊更新需要維護成本
方法:
1. 距離向量
本身的路由表跟周圍的路由表互相交換 直到整個網路都交換完畢 便可以知道A點到B點要怎麼傳, 維護成本高、收斂速度慢、線路斷線時需要花比較久的時間重新尋徑
ex: RIP
<pre>
 ----------------
| IP | UDP | RIP |  有時候會被歸類在應用層的路由協定
 ----------------
</pre>

2. 連線狀態
透過廣播，將自身的網路狀態(我跟哪些路由器連線)傳給其他節點 直到每個節點都廣播過後 所有節點都知道整個網路的拓樸 再透過演算法計算傳輸路徑, 維護成本低、斷線時恢復速度快
ex: OSPF
<pre>
 -----------
| IP | OSPF | 歸類在網路層
 -----------
</pre>

3. 混和式
結合前面兩種的優點 具有更大的彈性及效率
ex: EIGRP
<pre>
 ------------
| IP | EIGRP | 歸類在網路層
 ------------
</pre>

> 路由器 與 第三層交換機 差別
第三層交換機: 路徑轉發(硬體)
路由器: 路徑轉發(軟體)、簡易防火牆、DHCP伺服器、NAT...


>`$ route print` 查看路由表
    ![](https://i.imgur.com/KUPrOJh.png)
    目的IP和遮罩做ADD運算後等於路由表上網路目的地的 取遮罩1最多的作為轉發的選擇 並且從 該介面送出
    若遮罩數相同 挑計量(成本)小的送
    第一筆(0.0.0.0) 稱為 default route內定路由


### 路徑距離
考量的因素(如下)不同 計算方式不同 結果也不同
(常用)時間延遲 -> 加法
(常用)頻寬 -> 最小
(常用)遺失率 -> 1 - 經過各節點的成功率(相乘)
負載
可靠度
路程計數
相對價格
![](https://i.imgur.com/GkGk7cK.jpg)

---

# Week12

### dijkstra algorithm
透過此演算法 可以得到 任兩節點間的**最低成本路徑**
![](https://i.imgur.com/llHikrw.jpg)

---
從左邊花費最小的節點出發 計算該節點到達周圍節點的成本
若成本較小 則 更新成本 及 上個節點
![](https://i.imgur.com/mgTgtkC.jpg)

---
完成節點到周圍節點的成本計算後 在左邊劃掉(不再重新計算) 
並找下一個 花費最小節點 直到所有節點都計算過
![](https://i.imgur.com/nFlCBJl.jpg)
![](https://i.imgur.com/klGcpFX.jpg)
![](https://i.imgur.com/GWgSn3M.jpg)
若左邊最小成本相同 則由任意一個開始皆可
![](https://i.imgur.com/rbE8gPj.jpg)

即可得到任兩節點間的**最低成本路徑** 圖中(上圖)以 節點1~節點5 為例

---

### 距離向量法 與 連線狀態法 之比較
![期末考](https://i.imgur.com/bknJbNY.png)

### 混合式尋徑節定架構
結合 距離向量法 與 連線狀態法 的優點
距離向量法:建立到目的網路最佳路徑的路徑表
連線狀態法:路徑狀態改變時才更新
常見協定:
OSI: **IS-IS** (Intermediate System-to-Intermediate System)
Cisco: **EIGRP** (Enhanced Interior Gateway Routing Protocol)

> 目前的中大型網路基本上都是用這兩種協定(內部尋徑)

---

路由協定分成兩大類
1. 內部尋徑 ex: RIP, OSPS, IS-IS, EIGRP
2. 外部尋徑 ex: BGP
![](https://i.imgur.com/2nHYAOZ.jpg)
![期末考](https://i.imgur.com/ruvh7Jm.png)

### 尋徑問題及解決方式(針對RIP)
    尋徑問題1: 迴圈問題
![](https://i.imgur.com/dMy6HOU.png)
不斷地覆蓋後 演變成 無窮計數問題

    尋徑問題2: 無窮計數問題
下圖: 路由器A 不斷送出 "網路1不可達", 路由器C 定時更新　覆蓋"網路1不可達"
![](https://i.imgur.com/KZBpfuT.png)
網路1依舊不可達

    解決方式1: 定義最大值
![](https://i.imgur.com/ex8qFfD.png)

    解決方式2: 分離界線
![](https://i.imgur.com/604ZNlh.png)

### 自律系統與尋徑協定
AS; Autonomous System 自律系統
每個網路都有各自的編號AS number
ex:
<pre>
AS        AS number
TANet     1659
政府網路   4782
HiNet     3462
...
</pre>

#### 尋徑資訊協定
#### RIP
最普遍的內部尋徑協定，但現在較少被使用
跳數最大15
每隔30秒 交換一次路徑資訊
* 超過180秒未更新:無效
* 超過270秒未更新:刪除

RIP1.0
使用廣播交換資料
沒有網路遮罩 -> 不支援CIDR(網路切割、合併)
沒有加密
支援IPv4, 不支援IPv6

RIP2.0
使用群播交換資料
有網路遮罩 -> 支援網路切割、合併
支援加密
支援IPv4, 不支援IPv6

RIPng
支援IPv6

#### OSPF(Open Shortest Path First) 
連線狀態、內部尋徑協定
主要考量頻寬
![](https://i.imgur.com/bgPQKOC.jpg)
適合中大型網路 (可以把大型網路切割成小的Area)

#### 外部閘道器尋徑協定(EGP)
較早期的協定 現在已經不用了

#### 邊界閘道器協定(BGP)
改良EGP
外部尋徑協定
透過TCP傳送，使封包不至於遺失


---

# Week13

## 網路安全 (為甚麼要做資訊安全)

資訊安全的目標CIA(必考)
1. 機密性(Confidentiality) 
保護訊息不被(未經授權的使用者)直接查看。(ex: 不以明文直接傳送)
2. 完整性(Integrity)
保持訊息的準確性、完整性和一致性。確保沒有被經過修改。(ex: 同個文件經過雜湊結果應該一致)
3. 可用性(Availability)
訊息對授權用戶的可訪問性。確保訊息在需要時可用且正常運行。(ex: 知道Wi-Fi密碼的人就可以使用，但如果被惡意電波干擾導致無法提供服務 則喪失可用性)

### 防火牆(Firewall)

Intranet 外網
Internet 內網
![](https://i.imgur.com/g1BdQ4j.png)

1. 封包過濾式(Packet Filter) - 第3、4層(含以下)的防火牆
根據來源IP、埠號、TCP/UDP埠號 選擇放行或阻擋
分為 白名單 或 黑名單模式

2. 應用閘道器(Application Gateway) - 應用層的防火牆 又稱 代理伺服器(Proxy)防火牆
經由應用程式或服務來控制網路封包的流入、流出
![](https://i.imgur.com/oxWYdX7.jpg)

代理伺服器 代理客戶端
反向代理伺服器 代理伺服器端 隱藏後面的伺服器及分散流量

---

# Week14

### 加密(Encryption)

#### 資料加密要件 (為甚麼要加密)
1. 私密性(Confidentiality) 對稱式、非對稱式金鑰
2. 完整性(Integrity) 雜湊函數
3. 不可否認性(Non-Repudiation) 電子簽名

* 明文(Plaintext 或 Cleartext)
* 密文(Cryptogram 或 Ciphertext)
* 解密(Decryption)

----

#### 金鑰(Key)
##### 對稱式金鑰(加解密 鑰匙相同)
秘密金鑰(Secret Key)密碼系統
或稱 對稱金鑰密碼系統
速度快 **需要**考慮如何傳送鑰匙給別人
對不同的人通訊需要不同的鑰匙(n個人需要C n取2 = n(n-1)/2 把)
ex: **DES、3DES、AES、FEAL、IDEA、SKIPJACK**

![](https://i.imgur.com/XFIvDR6.jpg)

----

##### 非對稱式金鑰(加解密 鑰匙不同) 
公開金鑰(Public Key)密碼系統
或稱 非對稱金鑰密碼系統
速度慢 **不需**考慮如何傳送鑰匙給別人
每個人只需要1把對方的加密公鑰及1把自己的解密私鑰 所以n個人需要2把
ex: **RSA、DSA、SHA**

![](https://i.imgur.com/9wclOzM.jpg)

##### 比較
若人數 = 10 人
秘密金鑰密碼系統 需要10*9/2 = 45 把鑰匙 每個人需要保管9把鑰匙
公開金鑰密碼系統 需要 20/2 = 10 把鑰匙(10公鑰10私鑰) 每個人只需要保管1把自己的私鑰

先使用**公開金鑰系統**產生一條秘密通道 再把**秘密金鑰**傳送給對方 之後便可使用**對稱式金鑰系統**加密
這樣就能同時解決 安全地傳送鑰匙給對方 及 加解密速度的問題
應用: IPSEC(VPN)

---

### 雜湊函數 又稱(訊息摘要 Message Digest、單向雜湊函數)
鑑別資料是否被修改 -> 真實性、完整性
相同的資料得到的雜奏值相同
若不同的輸入得到相同的雜奏值 稱為 碰撞
好的雜湊函數碰撞率會非常低
常見的演算法: MD4、MD5、SHA
應用:檢查大型檔案下載時的完整性、秒上傳(百度雲盤)

![](https://i.imgur.com/HOCgl54.jpg)
只有保證訊息的完整性 沒有隱密性 (訊息M、M' 都是明文)

# Week15

### 認證(Authentication)
如何認證: 金鑰系統、數位簽章、數位憑證
金鑰系統(非對稱式): 拿私鑰(只有1把)來簽名、再用公鑰驗證

個人 跟 網站 通常都需要互相證明真實性
個人 使用 數位簽章(用自己的私鑰加密)
機構、網站 使用 數位憑證

#### AAA
認證 Authentication
授權 Authorization
稽核 Audit

#### 數位簽章
給個人使用
雜湊函數與公開金鑰系統一起配合
先以雜湊函數計算訊息雜湊值，發送者再以自己的私鑰對該雜湊值加密
![](https://i.imgur.com/ZgI3iFZ.jpg)
只對固定長度的雜湊值加密 運算簡單
接收端再以發送者公鑰驗證 數位簽章的真實性
![](https://i.imgur.com/90AiMGW.jpg)

#### 數位憑證
給公司使用
類似 網路上的營利事業登記證 or 網路身分證
需由 簽發憑證機構(CA: Certification Authority) 頒發 
內容包含:序號、使用者、使用者公鑰、有效日期、發證者、憑證簽章、演算法
![數位憑證](https://i.imgur.com/1dtsSsx.png)

應用1. 檢查網站的真實性
![](https://i.imgur.com/mPlZAxq.png)
應用2. 使用公鑰加密 達到私密性
![](https://i.imgur.com/88jzAKg.png)

### 入侵偵測系統(IDS: Intrusion Detection System)
只有事件紀錄功能 僅適合事後檢討用(被動型)
入侵防禦系統(IPS: Intrusion Prevention System)
偵測到入侵後可以聯合防火牆阻擋攻擊(主動型)

IDS 需要建立已知的攻擊模式資料庫、資料庫越完整，偵測效率越高，但耗用資源也越大

#### 主機型入侵偵測系統(Host-Based IDS)
安裝在需要保護的主機上
訊息到達主機後解密完再檢查
主要針對系統紀錄檔(Log Files)進行監控
優點: 判斷出攻擊模式的機會較高
缺點: 會消耗主機資源、需要保護的主機都要裝

#### 網路型入侵偵測系統(Network-Based IDS)
安裝在可監聽與主機通訊內容的網路節點上
優點: 不會消耗主機資源、可同時監聽多台主機
缺點: 如果訊息被加密 將會很難判斷是否含有攻擊的pattern

### 駭客入侵方式

1. 惡意程式
    * 病毒(Virus) 
        * 會自我複製
        * 通常**附加**在檔案、程式中，不會獨立存在
        * 有潛伏期、發作期
        * 需要使用者存取檔案才會觸發
    * 蠕蟲(Wrom)
        * 會自我複製
        * 針對系統漏洞設計、入侵便會開始複製
        * 不需附加在其他檔案中 可獨立存在
        * 不需要使用者存取檔案便會觸發
    * 特洛伊木馬(Trojan Horse)
        * 夾帶在正常軟體中
        * 不會自我複製
        * 使用者執行該軟體時 木馬程式才會被觸發
    * 間諜軟體(Spyware)
        * 未經使用者同意逕行執行活動的軟體ex: 發布廣告、側錄鍵盤按鍵輸入
        * 不一定是有害的 取決於使用的方式
2. 密碼破解
    * 字典攻擊法
    * 密碼監聽:鍵盤側錄
    * 記憶體下載
    * 取得密碼檔
3. 封包監聽
    * 網路卡分為 一般模式(先判斷目的mac等於自身的mac才會往下一層傳再判斷目的IP...)、混亂模式(不判斷直接傳給下一層)
        * 開啟混亂模式便可使用Sniffer、Wireshark監聽所有封包
4. 阻斷服務(DoS)
阻斷原本提供服務的主機，使其無法正常運作
    * 啟動溢滿(Syn Flood): 送出大量TCP連線啟動要求來癱瘓目標主機(早期的攻擊方式 現在已無效)
    * 碰撞死結(Ping of Death): 發送含有大量資料的ICMP的Echo Request封包 使目標主機堆疊溢滿(早期的攻擊方式 現在已無效)
    * 分散式阻斷服務 (DDoS): 許多結點同時對同一目標進行攻擊
    * 實體阻斷: 剪斷網路線、電波干擾
5. 網路釣魚 (Phishing = Phone + Fishing)
    * 偽裝電話、金融機構Email、假網站...
6. 網路嫁接
    將正常網站的URL重新導向到另一個偽造的冒牌網站
7. ARP Spoffing
    [參考Week8 筆記](https://hackmd.io/Fc_ym8jHS0qqjTJISo5RLw?both#week15:~:text=%E7%9A%84mac%E4%BA%86-,arpspoof%20(dsniff),-%E5%8F%AF%E4%BB%A5%E5%81%9A%E5%88%B0%E8%B7%9F)
8. 連線劫持
    * 中間人攻擊

---

# 報告

1. [python 套件介紹](/d4GbNYM_Su-7-IhxAziE9Q)

2. [透過Python socket 解析封包 和 製作簡易聊天室](/yhB4z8m9QUK2jPaOm2l-lw)

3. [透過Qlearning在網路拓樸上尋徑](/5dhqzw2QQg-5Kkzed-kWSA) 、 [投影片](https://docs.google.com/presentation/d/1O3VmuFRGZ90QeFEpiHIQZ6Uo4qio3Hcg/edit?usp=sharing&ouid=102723539830727257277&rtpof=true&sd=true)





