計算機網路基礎
計算機網路是獨立自主的計算機互聯而成的系統總稱,組建計算機網路最主要的目的是實現多台計算機之間的通訊和資源共享。
TCP / IP 模型
網路通訊的基礎是網路通訊協議,所謂'協議'就是通訊計算機雙方必須共同遵守的約定。
網路協議的三要素是:語法,語義和時序構成我們今天使用的互聯網的基礎的是 TCP / IP 協議族,所謂'協議族'就是一系列的協議及其構成的通訊模型,我們通常也把這套東西稱為 TCP / IP 模型。
與國際標準化組織發布的 OSI / RM 這個七層模型不同,TCP / IP 是一個四層模型,自底向上依次是:連結層,網路層,傳輸層和應用層,如下圖所示。
IP 通常被翻譯為網際協議,服務於網路層,主要是尋址和路由的功能。接入網路的每一台主機都需要有自己的 IP 位址,IP 位址是主機在計算機網路上的身份標識。
由於 IPv4 的位址的匱乏,我們平常在家裡、辦公室以及其他可以接入網路的公共區域上網時獲得的 IP 地址並不是全球唯一的 IP 位址,一個而是區域網 (LAN) 中的內部 IP 位址,通過網路位址轉換 (NAT) 使得可以實現對網路的訪問。
計算機網絡上有大量的被我們稱為'路由器'的網路中繼設備,它們會存儲轉發我們發送到網路上的數據分組,讓從源頭發出的數據最終能夠找到傳送到目的地通路,這項功能就是所謂的路由。
TCP 全稱傳輸控制協議,它是基於 IP 提供的尋址和路由服務而建立起來的負責實現端到端可靠傳輸的協議,之所以將TCP 稱為可靠的傳輸協議是因為:
網路應用模式
HTTP(超文本傳輸協議)
HTTP 是超文本傳輸協議 (Hyper-Text Transfer Proctol) 的簡稱,超文本傳輸協議是一種用於分發,協作式和超媒體訊息系統的應用層協議,它是全球數據通訊的基礎,設計 HTTP 最初的目的是為了提供一種發布和接收 HTML 頁面的方法,通過 HTTP 或 HTTPS(超文本傳輸安全協議)請求的資源由 URI 來標識。通過 HTTP 可以獲取網路上的資源,開發中經常會用到的網路 API(也稱之為網路數據接口)就是基於 HTTP 來實現數據傳輸的。
JSON格式
JSON (JavaScript Object Notation) 是一種輕量級的數據交換語言,該語言以易於讓人閱讀的文字為基礎,用來傳輸由屬性值或序列性的值組成的數據對象。很多程式語言都支持 JSON 格式數據的生成和解析,由於 JSON 是純文本,它和 XML 一樣都適用於異構系統之間的數據交換。
下面是表達同樣訊息的 XML 和 JSON。
XML的例子:
<?xml version="1.0" encoding="UTF-8"?>
<message>
<from>Alice</from>
<to>Bob</to>
<content>Will you marry me?</content>
</message>
JSON的例子:
{
"from": "Alice",
"to": "Bob",
"content": "Will you marry me?"
}
requests 庫
requests 是一個基於 HTTP 協議來使用網路的第三庫,使用 requests 庫可以非常方便的使用 HTTP。
可以先透過 pip 安裝 requests 及其依賴庫。pip install requests
可以直接在程式碼中書寫 import requests
。
套接字 (socket) 就是一套用 C 語言寫成的應用程序開發庫,主要用於實現行程 (process) 間通訊和網路編程,在網絡應用開發中被廣泛使用。在 Python 中也可以基於套接字 (socket) 來使用傳輸層提供的傳輸服務,並基於此開發自己的網路應用。實際開發中使用的套接字 (socket) 可以分為三類:流套接字(TCP套接字),數據報套接字和原始套接字。
TCP 套接字 (socket)
所謂 TCP 套接字就是使用 TCP 協議提供的傳輸服務來實現網路通訊的編程接口。在 Python 中可以通過創建套接字 物件並指定類型屬性為 SOCK_STREAM 來使用 TCP 套接字。由於一台主機可能擁有多個 IP 地址,而且很有可能會配置多個不同的服務,所以作為服務器端的程序,需要在創建套接字物件後將其綁定到指定的 IP 位址和端口上。端口並不是物理設備而是對 IP 位址的擴展,用於區分不同的服務,例如我們通常將 HTTP 服務跟 80 端口綁定,而 MySQL 的數據庫服務默認綁定在 3306 端口,這樣當服務器收到用戶請求時就可以根據端口號來確定到底用戶請求的是 HTTP 服務器還是數據庫服務器提供的服務。端口的取值範圍是 0 ~ 65535 ,而 1024 以下的端口我們通常稱之為'著名端口',自定義的服務通常不用這些端口,除非自定義的是 HTTP 或 FTP 這樣的著名服務。
文中實作一個提供時間日期的服務器,但是因為我連不上他提供的 IP 位址,所以就不再這邊多寫了,如果有興趣的人也可以直接到網站看看。
UDP 套接字 (socket)
傳輸層除了有可靠的傳輸協議 TCP 之外,還有一種傳輸協議叫做用戶數據報協議,簡稱 UDP。TCP 和 UDP 都是提供端到端傳輸服務的協議,後者不對傳輸的可靠性和可達性做出任何承諾,所以在強調性能而不是數據完整性的情況下,UDP 可能是更好的選擇。
這部分範例我不再這邊多寫。如果有興趣的人也可以直接到網站看看。
發送電子郵件
發送郵件要使用 SMTP(簡單郵件傳輸協議),SMTP 也是一個建立在 TCP 提供的可靠數據傳輸服務的基礎上的應用級協議,它規定了郵件的發送者如何跟發送郵件的服務器進行通信的細節,而 Python 中的的 smtplib 模組將這些操作簡化成了幾個簡單的函數。
發送短信
發送短信也是項目中常見的功能,網站的註冊碼,驗證碼,營銷訊息基本上都是通過短信來發送給用戶的。