TCP/IP網路基礎概論
TCP/IP 網路基礎知識
給網路程式設計學習者的完整指南
目錄
網路基本概念
OSI 七層模型
-
實體層 (Physical Layer)
- 處理實體訊號傳輸
- 例如:電壓、光信號、電纜規格
-
資料連結層 (Data Link Layer)
- 處理點對點的資料傳輸
- MAC 位址
- 錯誤檢測與修正
-
網路層 (Network Layer)
- IP 協議
- 路由選擇
- 封包轉發
-
傳輸層 (Transport Layer)
- TCP/UDP 協議
- 端對端連接
- 流量控制
-
會話層 (Session Layer)
- 建立、管理、終止會話
- 同步功能
-
表現層 (Presentation Layer)
- 資料格式轉換
- 加密/解密
-
應用層 (Application Layer)
- HTTP, FTP, SMTP 等協議
- 使用者介面
網路類型
-
LAN (Local Area Network)
- 局部區域網路
- 範圍通常在同一建築物內
- 高速、低延遲
-
WAN (Wide Area Network)
- 廣域網路
- 跨地理區域的網路
- 通常速度較慢、延遲較高
-
Internet
- 全球性網路
- 使用 TCP/IP 協議
- 連接無數個網路
TCP/IP 協議簡介
協議層級
-
網路接取層
- 對應 OSI 的實體層和資料連結層
- 處理硬體層面的通訊
-
網際網路層
- IP 協議
- ICMP 協議
- ARP 協議
-
傳輸層
- TCP 協議
- UDP 協議
-
應用層
- HTTP
- FTP
- SMTP
- DNS
封包結構
+------------------+
| 應用層資料 |
+------------------+
| TCP/UDP 標頭 |
+------------------+
| IP 標頭 |
+------------------+
| 乙太網標頭 |
+------------------+
IP 位址與子網路
IPv4 位址
- 32位元,分為四個位元組
- 範例:192.168.1.1
- 分為網路部分和主機部分
子網路遮罩
- 用來區分網路和主機部分
- 範例:255.255.255.0
- CIDR 表示法:/24
特殊 IP 位址
- 127.0.0.1:localhost
- 192.168.0.0/16:私有網路
- 10.0.0.0/8:私有網路
- 172.16.0.0/12:私有網路
IPv6 位址
- 128位元
- 範例:2001:0db8:85a3:0000:0000:8a2e:0370:7334
- 支援更多裝置
- 更好的安全性
連接埠(Port)概念
連接埠範圍
- 0-65535
- 0-1023:系統保留連接埠
- 1024-49151:註冊連接埠
- 49152-65535:動態連接埠
常用連接埠
- 80:HTTP
- 443:HTTPS
- 22:SSH
- 21:FTP
- 25:SMTP
- 53:DNS
連接埠在程式設計中的應用
# Python 伺服器範例
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8080))
server.listen(5)
TCP vs UDP
TCP 特性
-
連接導向
- 建立連接(三方交握)
- 可靠傳輸
- 順序保證
- 流量控制
-
適用場景
- 網頁瀏覽(HTTP/HTTPS)
- 檔案傳輸(FTP)
- 電子郵件(SMTP)
-
三方交握過程
客戶端 伺服器 | SYN | |------->| |SYN+ACK | |<-------| | ACK | |------->|
UDP 特性
-
非連接導向
- 無連接建立
- 不保證可靠性
- 不保證順序
- 高效能
-
適用場景
- 串流媒體
- 線上遊戲
- DNS 查詢
網路程式設計基礎
Socket 程式設計
# TCP 客戶端範例
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('server_address', 8080))
client.send(b'Hello, Server!')
非同步 I/O
# 非同步伺服器範例
import asyncio
async def handle_client(reader, writer):
data = await reader.read(100)
writer.write(data)
await writer.drain()
writer.close()
錯誤處理
try:
client.connect(('server_address', 8080))
except ConnectionRefusedError:
print("連接被拒絕")
except socket.timeout:
print("連接超時")
常見網路協議
HTTP/HTTPS
-
請求方法
- GET
- POST
- PUT
- DELETE
-
狀態碼
- 2xx:成功
- 3xx:重定向
- 4xx:客戶端錯誤
- 5xx:伺服器錯誤
WebSocket
- 全雙工通訊
- 持久連接
- 低延遲
DNS
- 域名解析
- 層級式結構
- 快取機制
網路安全基礎
常見攻擊
- DDoS 攻擊
- SQL 注入
- XSS 攻擊
- MITM 攻擊
安全實踐
-
輸入驗證
def validate_input(user_input): if not isinstance(user_input, str): raise ValueError("必須是字串") if len(user_input) > 100: raise ValueError("輸入太長")
-
SSL/TLS
import ssl context = ssl.create_default_context()
-
密碼存儲
import hashlib def hash_password(password): return hashlib.sha256(password.encode()).hexdigest()
最佳實踐
- 使用最新的協議版本
- 定期更新安全補丁
- 實施存取控制
- 加密敏感資料
- 記錄系統日誌
調試工具
常用工具
-
Wireshark
- 封包分析
- 協議解析
- 網路除錯
-
tcpdump
- 命令列工具
- 封包擷取
- 過濾功能
-
netstat
- 連接狀態
- 端口使用
- 路由資訊
測試命令
# Ping 測試
ping google.com
# 路由追蹤
traceroute google.com
# 端口掃描
nmap localhost
效能優化
網路效能指標
- 延遲 (Latency)
- 頻寬 (Bandwidth)
- 吞吐量 (Throughput)
- 封包遺失率 (Packet Loss)
優化技巧
- 使用快取
- 壓縮資料
- 負載平衡
- 連接池
- 異步處理
練習專案建議
-
簡單聊天室
# 基本聊天室伺服器 import socket import threading def handle_client(conn, addr): while True: try: message = conn.recv(1024).decode() if not message: break print(f"從 {addr} 收到: {message}") except: break conn.close()
-
檔案傳輸程式
-
網路監控工具
-
Web 爬蟲