owned this note
owned this note
Published
Linked with GitHub
###### tags: `LSA2` `網路`
# Network TCP/IP
[TOC]
## OSI 與 TCP/IP 差別?
> OSI 通常給做 network device 的人用,TCP/IP 主要給做 O.S. 的人使用 [name=BT補充]
- 像 switch 就有分好幾的不同 layer 的 switch ,做網路方面的工作需要訂定比較明確(我的理解)。
> OSI 出現的時候沒有 TCP/IP,所以那些人就是把覺得需要的都訂出來(理想),但理想跟現實總有落差,有些東西實務上是可以合併的[name=感謝俊甫大大補充]
>
## TCP/IP 四層架構

- 網路通訊協定是一種層級式的結構,每一層都呼叫它的下一層所提供的服務,來完成自己的需求。
- 每一層架構會建立在低一層提供的服務上,並且為高一層提供服務。
---
| 層級 | 資料型態 | 負責事項 | 常見協定 | 傳送依據 |
| -------- | -------- | -------- | -------|---|
| Application | message | 定義應用程式如何提供服務。 | HTTP, FTP, DNS, SMTP, SSH |
| Transport | segment | 負責傳輸過程的流量控制、錯誤處理、資料重送等工作。 | TCP, UDP, RTP, SCTP |port
| Internet | packet | 決定資料如何傳送到目的地。 | IP, ICMP |IP Address
| link | frame | 負責網路對硬體的溝通。 | Ethernet, Wi-Fi, MPLS | MAC Address
---
## Header
下層協定無須理會上層如何進行封裝,一律加上自己層級的標頭 (Header) 後傳給下一層協定。

:::info
- ### 小明傳送一封 email 給小美 ( 資料封裝 ):
1. Application 層的 email 會把訊息傳給 Transport 層
- ==( 訊息內容 )==
2. Transport 層將資料加上連接埠資訊後傳給 Internet 層
- 加上連接埠資訊
- ==[ 連接埠資訊 ( 訊息內容 ) ]==
3. Internet 層將帶有訊息及連接埠的資料傳給 Link 層
- 加上 IP 位置資訊
- =={ IP位置資訊 [ 連接埠資訊 ( 訊息內容 ) ] }==
4. Link 層將以上資料加上 MAC Address 資訊後傳出
- 加上 MAC Address
- ==< MAC Address 資訊 { IP位置資訊 [ 連接埠資訊 ( 訊息內容 ) ] } >==
- 利用傳輸媒體傳到遠端主機
---
- ### 小美接收小明傳來的email ( 資料解封裝 ):
- ==< MAC Address 資訊 { IP位置資訊 [ 連接埠資訊 ( 訊息內容 ) ] } >==
1. Link 層接收到資料後將其表頭拿掉往 Internet 層傳送。
- =={ IP位置資訊 [ 連接埠資訊 ( 訊息內容 ) ] }==
3. Internet 層接收到資料後將其表頭拿掉往 Transport 層傳送。
- ==[ 連接埠資訊 ( 訊息內容 ) ]==
5. Transport 層接收到資料後將其表頭拿掉往 Application 層傳送。
- ==( 訊息內容 )==
7. Application 層接收到小明的 Email 內容。
:::

## Link 層

### 乙太網路 vs Wi-Fi
網路| 標準 | 功能 | 傳輸媒介 | 碰撞處理
|---------| -------- | -------- | -------- | ---------- |
|乙太網路| 802.3 | 區域網路連線上的通信協定 | 雙絞線 | CSMA/CD
|Wi-Fi | 802.11 | 無線區域網路的電腦通訊標準 | 5GHz / 2.4GHz 無線電波 | CSMA/CA
#### 乙太網路
- IEEE 組織的 IEEE 802.3 標準制定了乙太網路的技術標準,它規定了包括實體層的連線、電子訊號和媒介存取控制的內容。
- 乙太網路為目前區域網路中最廣為使用的網路。
- 利用八芯四對雙絞線 RJ-45 線連接主機。

- 理論上 Link 層的 MAC Address 是唯一的,但實際上會有重複的情況。
- 因為 MAC Address 的數量有限,跟 IP 一樣會有耗盡的問題。
- 因為在網際網路上通訊時是用 IP 位址來路由,在區網內才是利用 MAC Address 來定址傳輸,因此同區網內不要有相同 MAC Address 即可。
- 如果同網段有相同 MAC Address,先開機的主機先贏。
- 因為 MAC Address 已經不足了,所以現在其實是可以自我更改 MAC Address 的。
- ifconfig: 查詢 MAC Address。
> 需要先安裝 net-tools: `sudo apt install net-tools`
- 
- 乙太網路採廣播的機制,網路卡間傳輸訊息時需藉由 CSMA/CD 來避免碰撞發生。
:::info
#### CSMA/CD - Carrier Sense Multiple Access with Collision Detection

Hub: 網路共享媒體,同一時間僅允許一部主機使用。
- **Carrier Sense**: 監聽媒體使用情況,當 A 主機要發送網路封包時,要先監聽網路媒體,若無人使用才能發出 frame。
- **Mutiple Access**: A 主機所發送的資料 Hub 都會複製一份,並傳給所有連線主機,但若不是傳送目標都會將其 frame 資料丟棄。
- **Collision Detection**: frame 有偵測碰撞能力,如果 A 主機與 B 主機剛好同時發 frame 時,2 方資料撞在一起,這 frame 即會損毀,此時 A 與 B 會各自等一段隨機時間,再次發送 frame 資料。
- CSMA/CD 傳送流程

:::
#### Wi - Fi
- IEEE 802.11 標準的無線區域網路技術。
- Wi-Fi 架構:

> [來源](https://www.fireflynetworks.co.in/blog/wifi-technology)
- Station(工作站):具有無線網路接入功能的電子裝置(筆記本,手持裝置等)。
- Access Point(無線存取點):Wi-Fi 基地台,提供網路設備以無線的方式存取網路。
- Distribution System(傳輸系統):無線存取點連接到後面的網路(由 switch, router 等組成的網路系統)。
- 無線電波:
- | 頻率 | 傳輸距離 | 速度 | 障礙物干擾| 其他設備干擾
| -------- | -------- | -------- |---| ---|
| 5GHz | 較短 | 較快 | 波長短,繞射程度低,較不容易穿越 | 較不容易|
| 2.4GHz | 較長 | 較慢 | 比較容易穿越 | 較容易 |
- 除了無線路由器會使用2.4 GHz頻帶,藍芽、家用無線電話都在使用,部分家用電器如日光燈、微波爐、電冰箱都可能會在這個頻帶內,進而產生對無線頻道的干擾。
- 因為 Wi-Fi 使用無電電波傳輸,不易準確偵測是否有碰撞發生,碰撞處理使用 CSMA/CA 主動避免碰撞發生。
:::info
#### CSMA/CA - Carrier Sense Multiple Access with Collision Avoidance

> [來源](http://www.tsnien.idv.tw/Network_WebBook/chap15/15-4%20IEEE%20802_11%20MAC%20%E5%8D%94%E5%AE%9A.html)
1. 發送端會去偵測網路是否有訊號傳輸。
2. 假如頻道中沒有其他訊號傳遞時,發送端會再等待一段隨機時間 (IFS, 一個訊框間隔時間),在這段時間過後,如果還是沒有偵測到任何信號在傳遞,發送端就會將封包傳送出去。
- 假如一開始就偵測到有訊號使用了這個頻道,發送端會等到頻道淨空之後、再等待一個隨機的後退(Backoff)時間,才重新發送。
- RTS/CTS 傳送機制:

[來源](http://www.tsnien.idv.tw/Network_WebBook/chap15/15-4%20IEEE%20802_11%20MAC%20%E5%8D%94%E5%AE%9A.html)
- 工作站首先利用較小的訊框(RTS 訊框)來測試網路是否空閒,如果可以收到對方的回應訊框(CTS 訊框),那表示網路是真正的空閒。
- 每個工作站內都會有網路配置向量(Net Allocation Vector, NAV),可以藉由他人的 RTS/CTS 得知目前在傳輸的訊號會維持多久並填入 NAV 內,這段期間就不會進行偵側。
#### CSMA/CD vs CSMA/CA
| | 傳送方式 | 概念 |
| -------- | -------- | -------- |
| CSMA/CD | 直接傳送 | 被動偵測碰撞發生 |
| CSMA/CA | 等待一段 IFS 時間後傳送 | 主動避免碰撞發生 |
:::
### MAC frame


- A、C 連接在不同 switch/hub ,若 A 要傳送資料給 C 可以藉由更改目的位置與來源位置來傳送。
### Switch 交換器

- Switch 不是共享媒體,與所有連接主機皆有獨立的port,且有獨立頻寬。
- hub 與其所有連接設備為一個碰撞網域,而 switch 每個連接埠都是一個獨立碰撞網域,所以並不會有碰撞問題。
- Switch 內有一記憶體可以紀錄每個 Switch port 連接的 PC 的 MAC Address。
- 轉送表 (fowarding table):
- 
- 在 table 中的資料並不是永久儲存,過一段時間後就會自動刪除。
- 學習 (learning):
- 表格最初是空的,每當有 frame 送進 switch 中,就記錄其來源位址與連接埠。
- 泛洪(flooding):
- 如果轉送表中找不到對應的 MAC ,就會向所有 port 廣播出去,有符合目標 MAC Address 就會回傳給發送方一個確認包,switch 接收到後就知道此 MAC Address 是位於哪個 port 進而將他學習進 table 中。
- 克服封包碰撞問題。
## Internet 層

- ==負責如何將封包送到達目標位置==
---
### IP (IP Addrerss) 版本
==Internet Protocol 中的 IP Address (簡稱 IP)==
1. IPv4: IP address 以 32bits 表示,為目前主流。
- IP 位置枯竭: 現在在網路上的主機數已經多過 IPv4 32 位元可以表示的數量( 總數為 42 億多 )。
- 1993年,推出網路位址轉換(NAT)與無類別域間路由(CIDR),來減緩 IP 位置枯竭的問題,但未來最終的解決方案還是需要轉換到 IPv6。
:::info
**NAT(Network Address Translation): 將私有 IP 位置轉成公開 IP 位置**:

- 網站伺服器無法定位私有 IP,在電腦送 Request 出去時,Router 就會把來源的 IP 位置改成 public IP(Router 同時有兩個 IP 位置,區網內的私有 IP 位置,以及 ISP 指派的公開 IP 位置)。
- Router 在更改 IP 位置時,會將私有 IP 與 request 目標的 IP 記錄下來,當 request 的 server 回應時,從記錄中就可以知道要傳回哪個私有 IP。
- **因為可以多個主機共用一個公有 IP ,所以暫時解決 IP 不足的問題**。
| | 處理事項 |
| -------- | -------- |
| router | 只轉送,不會記下封包連接狀態 |
| NAT | 轉送外,可以做 IP 轉換,並記下來源 IP /目的 IP |
| bridge | 連接兩個不同網段,可以是相同類型或不同類型的網路。|
> [資料來源1](https://networkengineering.stackexchange.com/questions/58027/is-a-gateway-both-a-router-and-a-nat) [資料來源2](https://giboss.pixnet.net/blog/post/26798642)
:::
2. IPv6: IP address 以 128bits 表示,未來趨勢,可以多出許多 IP 位址,供新裝置使用。
---
### IP 位置表示:
- 以二進位表示
- 00000000.00000000.00000000.00000000 => 0.0.0.0
- 11111111.11111111.1111111.11111111 => 255.255.255.255
- 分為 Net_ID, Host_ID
- Net_ID: 網路編號。
- Host_ID: 主機編號。
- Host_ID 不可全 0 或全 1:
- 全0: 表示網段的位置。
- 全1: 表示廣播位置。
---
### 網域 (此部分在 iptable 會有比較詳細的介紹)
- 連線方式:
- 同網域:可以直接透過 CSMA/CD 傳遞資料,網卡對網卡 (MAC frame ) 。
- 不同網域:需要借由 Router 將不同網域連接。
---
### IP 種類
- 有 A, B, C, D, E 五種 IP Class ( classful addressing ,現在幾乎不會用這種。 )

[圖片來源](https://www.eventhelix.com/networking/ip-routing/)
- A, B, C 為主要使用:
- A Class: 0 開頭,網域少,主機多,適合大型企業。
- B Class: 10 開頭,適合中型企業。
- C Class: 110 開頭,適合家庭、小型企業。
- D, E 為特殊用途:
- D Class: 1110 開頭,群播用途,對另一個網段的所有主機做廣播。
- E Class: 11110 開頭,目前為保留,沒有定義用途。
- 有 Public IP / Prtvate IP
- Public IP: INTERNIC 所統一規劃的 IP,有這種 IP 才可以連上 Internet
> INTERNIC: 負責登記網域名稱與網路協定位址,並散播有關網際網路資訊的組織。
- Private IP:
- 私有 IP 無法連上 Internet,但可以內部互相連線。
- 如果要將私有 IP 連上 Internet,可以利用 NAT 將 IP 進行轉換(偽裝),如此一來也可以使私有 IP 電腦連上去。
- 其中 A、B、C 三個 Class 當中又各保留一段作為 Private IP 網段,分別是:
- Class A:10.0.0.0 - 10.255.255.255
- Class B:172.16.0.0 - 172.31.255.255
- Class C:192.168.0.0 - 192.168.255.255
- 由於這三段 Class 的 IP 是預留使用的,所以不能直接作為連接 Internet 之用,適合一些尚未具有 Public IP 的企業內部用來規劃其網路設定。
---
### 子網路
- 公用: 可以將網路切割成不同區塊,方便管理並可以快速定位 (tree),也可以避免浪費沒有用到的 Host_ID 。
- 切割網段 => 先決定想要分配的主機數:
- Class C 網路為例:
- 網路遮罩: 11111111.11111111.11111111.**00000000** => 255.255.255.0
- 粗體為可變動位置。
- 8 位元: 2**8 - 3 = 253 台主機
- 網路遮罩: 用來計算在哪個網段 (利用 IP 與網路遮罩做 AND 可以得到此 IP 的網段)。
- 若要切割一網路區段為 192.168.3.0 ~ 192.168.3.255
- `Netmask`: 255.255.255.0 => 11111111.11111111.11111111.00000000
- `Network`: 192.168.3.0 => 此段網路第一個 IP,代表此區段網路
- `Broadcast`: 192.168.3.255 => 最後一個 IP,廣播用途
- 若要將以上網段(192.168.3.0/24)再切分成 2 個子網路:
- Netmask: 255.255.255.128 => 11111111.11111111.11111111.1**0000000** (遮罩多 1bit) => 主機數少一半
| 子網路 | Network | Broadcast | Netmask |
| -------- | -------- | -------- | ------ |
| 第一個 | 192.168.3.0 | 192.168.3.127 | 255.255.255.128 |
| 第二個 | 192.168.3.128 | 192.168.3.255 | 255.255.255.128 |
- 另一表示方法: 192.168.0.0/24 (子網路遮罩前 24bits 為 1)
- 請問 192.168.10.100/25 與 192.168.10.200/25 是否在同一個網域內?
:::info
不同,根據上面例子來計算
1. 192.168.10.100/25
- IP :11000000.10101000.00001010.01100100
- mask: 11111111.11111111.11111111.10000000
2. 192.168.10.200/25
- IP :11000000.10101000.00001010.11001000
- mask: 11111111.11111111.11111111.10000000
192.168.10.100/25 在 192.168.10.0 的網域內
192.168.10.200/25 在 192.168.10.128 的網域內
:::
- 無類別域間路由 (Classless Inter-Domain Routing,CIDR):
- 因為 class A、B、C 的主機數量最少是 class C 的 254 台 (Host_ID 8 bits),在來就是 class B 的 65534 台 (Host_ID 16 bits),一般公司中可能超過 254 台所以需要用到 class B 的 IP位置,但沒有 65534 台那麼多,因此浪費許多空間。
- 所以 CIDR 基於可變子網路遮罩來達到任意分配 Net_ID 與 Host_ID 位元數,來分配最適當的 IP 位置配置,避免浪費 IP 位置,讓 IP 位置枯竭可以緩解。
---
### IP Header

- **當傳輸訊息過大時,無法將全部訊息放入同包封包內傳輸,此時就需要將封包進行切割,傳送到目的地時重組,但切割後的封包不一定是循序傳送過去,也不一定走相同的路徑,因此需要:**
- `Identification`: 如果 IP 封包太大被切成不同包,此欄位可以識別是不是來自同個封包。
- `Flags`: 這個地方的內容為『0DM』,其意義為:
- D:若為 0 表示可以分段,若為 1 表示不可分段
- M:若為 0 表示此 IP 為最後分段,若為 1 表示非最後分段。
- `Fragment Offset`: 目前這 IP 分段原始 IP 封包中的位置。
- ==利用 Identification, Flags, Fragment Offset 即可組成將分段 IP 組成完整 IP 封包。==
- `Protocol`: 協定代碼。
- EX: TCP, UDP
- `Time To Live`: IP 封包通過一路由器會 -1
- `checksum`: 是為了保證 header 或 data 不被破壞而發展出來的機制(檢查此封包是否正確)。
- `Source Address` : 來源地址。
- `Destination Address`: 目標地址。
==TTL, Source Address, Destination Address 可以知道此封包如何傳送。==
---
### 路由

- Network A(192.168.0.0/24) 與 Network B(192.168.1.0/24) 屬於兩個不同區網
- 路由時會先查看 route table (每部主機皆有自己的路由表)。
- 若 PC01 要傳資料給 PC11 時:
1. 看封包目標 IP 位置。
2. 查看自己主機的 Net_ID 是否與封包的相同(屬於同區網),若相同可以直接傳給目的主機。
3. 若不同,查詢 default gateway( 此為 Server A ) 並傳給它。
4. 不理會封包流向,default gateway 會執行上述動作繼續往目的地傳送。

- `route` 指令:
> 需要先安裝 net-tools: `sudo apt-get install -y net-tools`
- `-n`: 主機名稱以 IP 顯示
- 
- - route table 與 iptables 差異:
- route table:
- 只處理封包流向,決定下一步往哪邊走。
- iptables:
- 過濾系統(防火牆),能夠更明確的定義每個封包是否可以進出、如何轉發。
- 
- iptables 由 Tables 組成,每個 Table 處理不同的功能,三個內定的 Table:
- Filter table: 負責過濾進入主機或離開主機、還有經過主機做forward的封包。
- NAT table: 負責進行NAT,也就是更改source IP/port或destination IP/port。
- MANGLE table:
1. 用於以各種方式更改封包的 IP 標頭。
- 例如: 可以調整封包的 TTL 值,延長或縮短封包可以維持的有效網絡躍點數。其他 IP 標頭可以以類似的方式更改。
2. 根據規則修封包的一些標誌,以便其他規則或程式可以利用這種標誌對封包進行過濾或路由。
- Table 由 Chains 組成, Chain 裡面定義規則,是否放行封包通過主要就是透過這些規則,以 Filter table 為例:
- INPUT chain: 依規則決定封包是否可以進入。
- OUTPUT chain: 依規則決定封包是否可以出去。
- Forward chain: 依規則決定封包是否可以轉發(目的地不是本機)。
- 舉例: 封殺某一網段的所有封包
- `$sudo iptables -t Filter -A INPUT -s 140.113.235.151 -d "你自己的IP" -j REJECTED`
- `-t Filter` :指定 Filter 這張 table。
- `-A INPUT`: 在 INPUT chain 中新增規則。
- `-s 140.113.235.151`: 來源為 140.113.235.151 的封包。
- `-d "自己的 IP"` 目的為我自己的 IP。
- `-j REJECTED` 拒絕。
---
### IP -> MAC (Link 層的 ARP, RARP)
- ARP : Address Resolution Protocol
- RARP : Reverse Address Resolution Protocol
- 傳遞資料時透過 IP 知道 MAC Address
1. 向整個區網發出 ARP 封包
2. 對方回傳 MAC Address
3. 開始傳資料
4. 將該筆 IP/MAC 寫入 ARP Table 中(保持 20 分鐘)
- `arp` 指令:
> 需要先安裝 net-tools: `sudo apt-get install -y net-tools`
- `-n` 主機名稱以 IP 型態顯示
- `-d` 將某筆 IP 從 ARP Table 刪除
- `-s` 將某筆 IP/MAC 寫入 ARP Table 中
- 
:::info
arp spoofing
:::
---
### ICMP 網際網路控制訊息協定
==IP 在發送封包時,我們不知道是否可以抵達目的地,傳送失敗時,也想要知道發生什麼錯誤。IP 封包本身並不會回報封包傳送的狀況,因此需要一個回報狀態的機制 => ICMP==
- ICMP 封包無法直接傳送到網路上,必須如同 TCP 封包一樣被嵌入 IP 封包內,以 IP 方式傳送,包裝在 IP 內的封包格式。
- 
- `Type`: ICMP的類型。
- `Code`: 進一步劃分ICMP的類型,該欄位用來尋找產生錯誤的原因。
- Ex: Type3 目標不可到達又分成好幾種類型。
- 
- `Checksum`: 同 IP header 檢查此封包是否有遭破壞。
- `Data`: 內容根據ICMP類型和代碼而回傳對應資訊。
- ==EX: traceroute -> TTL 在傳輸中過期回報不可到達(Type 11)。==
- **概念**:
- ttl = 1 : 經過 1 個 router => ttl =0 返回。
- ttl = 2 : 經過 2 個 router => ttl =0 返回。
- 依此類推
- 
- 每個 ttl 會有三個探針,如果超時還沒回覆 ICMP 訊息就會顯示 `*`
- **注意**: 路由器或交換機也可被修改組態變為不返回 ICMP 。因此 Traceroute 不一定能拿全所有的沿途 router 位址。
- 註:有些 OS 可能是用 UDP/TCP 包。 [name= 學長補充]
- EX: ping 是用ICMP的"Echo request"和"Echo reply" 來回應原發送 ping 的主機 (Type 8 / Type 0) 。
- 當 A ping B 時, A 會發出 Echo request 的封包, B 會回應 Echo reply 的封包。
- `Data` 欄位會存放 Sequence Number (Echo reply 時會針對對應的 Sequence Number 回應), request 與 reply 的 sequence number 相同(配對)。
- 因為 IP 本身是不可靠的傳輸方式,所以不一定哪個封包先到達,回應時針對要回應的那個封包回應。
- 
- icmp_seq 表示ping序列,從1開始;如果數字不是按順序遞增也就意味著丟包了。
## transport 層

- ==負責封包會不會被接收、正確地接收==
---
#### `通訊埠口`
- 接收方與傳送方皆需要 port (連線通道)來傳遞資料。
- 舉例: IP 為門牌號碼, port 為哪個窗口(每個窗口執行不同業務)。
- https: 443, www: 80
- 為 TCP Header 的 Source Port 與 Destination 。
#### `固定配置埠口`
- IANA - 網際網路號碼分配局 所定義的 port。
> 一家網際網路位址指派機構,管理國際網際網路中使用的IP位址、域名和許多其它參數的機構。
- 已經固定好的 port (一些知名服務軟體)。
- 通常小於 1024。
- 啟動需要是超級使用者身份。
- 其他服務也可以佔用這些 port , 但一個 port 無法同時被兩個服務使用,所以先開啟的服務先使用。
|port 號| 服務|
|---|---|
20 |FTP-data,檔案傳輸協定所使用的主動資料傳輸埠口
21 |FTP,檔案傳輸協定的命令通道
22 |SSH,較為安全的遠端連線伺服器
23 |Telnet,早期的遠端連線伺服器軟體
25 |SMTP,簡單郵件傳遞協定,用在作為 mail server 的埠口
53 |DNS,用在作為名稱解析的領域名稱伺服器
80 |WWW,全球資訊網伺服器
110 |POP3,郵件收信協定
443 |https,有安全加密機制的 WWW 伺服器
- 各種服務與 port 在 /etc/services 內
- 
---
### UDP - User Datagram Protocol, 用戶資料流協定
- 為不可靠的傳輸模式 => 不需要回傳 ACK 確認。
- 因為不用三向交握,所以傳送較快。
- 在乎即時的資料傳送
- EX: 網路攝影機傳送即時影像。
> 
> [圖片來源](https://commons.wikimedia.org/wiki/File:UDP_header.png)
### TCP
#### `TCP Header`

- `Source Port`: 來源 Port 號。
- EX: https(443)
- `Destination`: 目標 Port 號。
- `Sequence Number`: 若 TCP 資料過大,需切割放進不同封包,紀錄封包序號,以便重組 TCP 資料。
- `Acknowledgement Number`: 若接收端有收到會用這個確認碼告知 client 端封包被正確收下了。
> 補充 : Sequence Number 跟 Acknowledgement Number 需補充 (怎麼來的 誰設定的 設定甚麼)
- `Code`: 1 為啟動
- `URG`: 1 代表是緊急封包,接收端立即處理。
- 不必經過正常的排隊程序,立即處理。
- 例如傳送端送出 Ctrl-C 的中斷訊息,當此訊息到達目的端後,目的端
將會以最快速度處理此命令。
- `ACK`: 1 為回應封包。
- `PSH`: 要求對方立即將緩衝區資料交給應用層(不用等緩衝區滿)。
- 因為 TCP 在等待緩衝區滿時再交付資料會造成延遲,某些特殊情況會使用 PSH
- 例如:像 Telnet 的協定,在使用端,每打一個字元,即使使用者尚未輸入 [ENTER] 鍵,就會立即傳送至接收端,就必須將 PSH 的位元設定為1
- `RST`: 1 為連線強制結束(無確認手續,送方立即斷線)。
- TCP 正常關閉連線是用四次揮手,但有些異常狀況可能無法做到,需要 RST 機制。
1. 於對方連接時,對方的 port 不可用。
2. 對方程式突然崩潰了,當 client 繼續傳訊息時,對方就會回應 RST。
3. iptables 設定規則為 `reject` 時,也會回應 RST
- `SYN`: 1 為希望與對方線進行同步處理(建立連線)。
- `FIN`: 1 為通知對方結束連線(等對方確認)。
- `Window`: 控制封包流量,Window=0 代表緩衝區滿了,應停止傳送。
- 接收端回覆傳送端緩衝區的空間還有多少。
- 在緩衝區的資料需要等上層消化後釋出空間。
- 
- window size: 11 - 4 = 7
- sliding window:
- **因為 TCP 傳送封包時需要對方回應 ACK ,但若一次傳送一個封包就要等待一個 ACK 後才傳送下一個封包效率太差,因此利用 sliding window 解決。**
- 
1. 接收端接收到一個封包後回傳對應 ACK ,並且接收視窗往右移。
2. 傳送端收到一個 ACK 後傳送視窗右移,可以繼續傳送下一個封包。
- 如果封包不是照順序到達:
- 
- 若封包前面還有其他封包未到達,會先記錄下來,但 sliding window 並不會往右移。
- 如果有遺失封包的情形:
- 
- 接收端在接受封包 1,2 時,接收視窗往右移兩格,但回傳兩個 ACK 封包遺失了。
- 傳送端雖然沒收到 ACK 1,2 ,但在收到 ACK3 時就會認為前面封包都已經收到,因此傳送視窗會往右移兩格。 => 封包具有「累積性」
- 選擇確認性 (SACK) => 非預設,需雙方說好要使用:
- 
- 封包 1,2 在過程中遺失,3,4,5 成功送達。
- 但因為 1,2 沒有收到所以不會會傳 ACK ,timeout 後傳送方重新傳送 1~5 的封包,造成浪費流量的情況。
- 利用選擇確認性回傳 ACK 3,4,5
- `Checksum`: 接收者對此進行驗證,與原發送方相同才會接收,否則視為毀損,要求重送。
---
#### `TCP 三向交握`
- ==TCP 之所以可靠的原因==
- 建立連線前,需要經過三的確認的流程稱為**三向交握**。

1. 發送方發一個帶有 SYN=1 的封包,並發送一個 sequence number = 10001 給收方
2. 收方確認後回覆:
1. ACK=1 與 ack=10001 (剛剛接收到的 sequence) +1
2. SYN=1 與 sequence=20001 (收方也要回傳要求連線)
3. 發送方回傳:
1. ACK=1 與 sequence=20001+1
4. 確定連線,開始傳送資料。
- 情境:打電話
1. A:「喂?有聽到嗎?」
2. B:「有聽到喔,你那邊聽得到我聲音嗎?」
3. A:「可以喔。」
:::info
##### sequence & ack number
**為什麼要 sequence**?
讓對方回應時可以針對這個 sequence 發送對應 ack ,確認封包是否已被接收。
- seq 號由 TCP 客戶端發送,表示為會話發送了多少數據。
- TCP服務器發送ack號,表示已經接收到累積數據,準備好下一個區段。

[圖片來源](https://madpackets.com/2018/04/25/tcp-sequence-and-acknowledgement-numbers-explained/)
1. 客戶端發送第一個 seq=1 的段,段的長度為 669。服務器以 ack=670 回應,告訴客戶端下一個預期段的序列號為 670。
2. 客戶端發送的下一個段有 seq=670 並且 len 現在是 1460 。反過來,服務器以 ack=2130 (670 + 1460) 回應。
:::
#### `TCP 四次揮手`
- ==因為 TCP 的半關閉( half close )特性造成:==
- 
- TCP 提供了連線的一端在結束它的傳送後還能接收來自另一端資料的能力 ( close-wait 狀態) 。
- 任何一方都可以在資料傳送結束後發出連線釋放的通知,待對方確認後進入半關閉狀態。當另一方也沒有資料再傳送的時候,則發出連線釋放通知,對方確認後就完全關閉了TCP連線。
- 斷線之所以複雜是因為 TCP 的連線可靠,所以要在雙方都得知的情況下完成斷線
- 情境:結束通話
1. A:「我沒什麼要說的了,要掛囉?」
2. B:「喔,你要結束通話啦?」
3. B:「嗯我要跟你說的都說完了,就掛吧。」
4. A:「那掛囉,BYE。」
---
TCP vs UDP
| 協定 | 連線 / 斷線要求 | 流量控制 | 錯誤檢查 / 修正 | 速度 | 可靠度 | 適用範圍 |
| -------- | -------- | -------- | -------- | -------- | ------- | ------ |
| TCP | 有 | 有 | 有 | 慢 | 可靠 | 要求可靠傳輸的服務。 例如:電子郵件、網頁瀏覽
| UDP | 無 | 無 | 只有檢查碼 | 快 | 不可靠 | 即時服務。例如:串流媒體、網路遊戲、VoIP |
- 大部分是應用在串流媒體的部分,對封包遺失容忍度較高的服務:
- 例如:線上遊戲、線上影音串流等。這也是為什麼有時候網路連線品質不好的時候,會容易有掉幀(LAG)的情況。
---
## Application 層

應用層中的應用軟體,並沒有一定的工作類別。
有的只是偵測網路資訊的簡單工具,有的提供一些網路的服務,如FTP、DNS服務等等。
### DNS server
- ==因為人類記不起來 IP , 因此可以幫 IP 取一個別名方便記憶==
EX: www.google.com (domain name) => 172.217.160.68 (IP)
- ping domain name 時,會用 domain name 去 DNS server 找 IP

- 當在瀏覽器輸入網址時,瀏覽器就會將的個網址傳送到最近的 DNS Server 找到對應的 IP 並回傳。
- 查找流程:
- 分散式資料庫儲存。
- 
- 
- `nslookup`
- 查詢 domain name 對應的 IP 位置。
- 
- DNS 是使用 TCP or UDP ?
一般情況皆使用 UDP , 因為在查找網址時較講求速度,就算掉包了再重送就好了。
==注意! DNS 可能會同時使用 TCP 與 UDP 兩種協定:==
1. UDP 封包大小較小,資料大小超過 512 位元組的限制時會被截斷,如果使用者沒有從 DNS 得到回應,3~5 秒後會使用 TCP 重送。
2. DNS 區域轉送 (Zone Transfer), DNS 要確保資料庫(主 DNS 與副 DNS)資料相同,當有變動時,會用區域轉送來保持資料一致,此時會用 TCP 傳送。
## OSI 模型 - Open System Interconnection Model

[圖片來源](https://ithelp.ithome.com.tw/articles/10246127)
| 層級 | 負責事項 |
| -------- | -------- |
| Application | 與應用程式作溝通,使User可以使用網路資源 |
| Presentation | 資料格式轉換、加解密、壓縮 ||
| Session | 為傳輸雙方建立連線,並協調傳輸時所要遵循的規則
| Transport | 端點對端點(End-to-End)連線技術、流量控制、偵錯處理 |
| Internet | 邏輯定址 (IP) 、路由路線選擇
| Data-Link | 定義如何將傳輸資料分裝成資料封包格式的規格| |
| Physical | 定義網路系統中實際的連線 ||

[圖片來源](https://momodogtw.pixnet.net/blog/post/18417631-osi-%E7%B6%B2%E8%B7%AF%E6%A8%A1%E5%9E%8B)
## 參考資料
- http://dns2.asia.edu.tw/~wzyang/slides/wlan/sup-1-ch03.pdf
- https://ithelp.ithome.com.tw/articles/10267704?sc=iThomeR
- https://linux.vbird.org/linux_server/centos6/0110network_basic.php#ps6
- https://linux.vbird.org/linux_server/centos6/0120intranet.php
- https://www.pcnet.idv.tw/pcnet/network/network_ip_addr.htm
- http://opencourse.ncyu.edu.tw/ncyu/file.php/15/week03/%E4%B9%99%E5%A4%AA%E7%B6%B2%E8%B7%AF.pdf
- https://notfalse.net/66/repeater-hub-bridge-switch#-Switch
- https://bbs.pigoo.com/thread-40833-1-1.html
- https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2
- https://zh.wikipedia.org/wiki/%E6%97%A0%E7%B1%BB%E5%88%AB%E5%9F%9F%E9%97%B4%E8%B7%AF%E7%94%B1
- https://ithelp.ithome.com.tw/articles/10272546?sc=iThomeR
- http://kevin.hwai.edu.tw/~kevin/material/EAssistant/IP_Class.htm
- https://zh.wikipedia.org/wiki/Traceroute
- https://en.wikibooks.org/wiki/Communication_Networks/IP_Tables
- https://blog.aronyang.com/2021/07/iptables.html
- http://dns2.asia.edu.tw/~wzyang/slides/info_net/info_B/CH10TCP.pdf
- https://notfalse.net/24/tcp-flow-control
- https://iter01.com/586318.html
- https://zh.wikipedia.org/wiki/%E8%BD%BD%E6%B3%A2%E4%BE%A6%E5%90%AC%E5%A4%9A%E8%B7%AF%E8%AE%BF%E9%97%AE
- http://www.tsnien.idv.tw/Network_WebBook/chap15/15-4%20IEEE%20802_11%20MAC%20%E5%8D%94%E5%AE%9A.html
- https://ithelp.ithome.com.tw/articles/10280652