本系列均來自大神「老錢」的小冊學習rpc (remote procedure call)即遠端過程呼叫,是分布式系統常見的一種通訊方法,已經有 40 多年歷史。當兩個物理分離的子系統需要建立邏輯上的關聯時,rpc 是牽線搭橋的常見技術手段之一。除 rpc 之外,常見的多系統資料互動方案還有分布式訊息佇列、http 請求呼叫、資料庫和分布式快取等。
rpc 是兩個子系統之間進行的直接訊息互動,它使用作業系統提供的套接字來作為訊息的載體,以特定的訊息格式來定義訊息內容和邊界。
rpc 的客戶端通過檔案描述符的讀寫 api (read & write) 來訪問作業系統核心中的網路模組為當前套接字分配的傳送 (send buffer) 和接收 (recv buffer) 快取。…
如上圖所示,左邊的客戶端程序寫 rpc 指令訊息到核心的傳送快取中,核心將傳送快取中的資料傳送到物理硬體 nic,也就是網路介面晶元 (network inte***ce circuit)。nic 負責將翻譯出來的模擬訊號通過網路硬體傳遞到伺服器硬體的 nic。伺服器的 nic 再將模擬訊號轉成位元組資料存放到核心為套接字分配的接收快取中,最終伺服器程序從接收快取中讀取資料即為源客戶端程序傳遞過來的 rpc 指令訊息。
訊息從使用者程序流向物理硬體,又從物理硬體流向使用者程序,中間還經過了一系列的路由網關節點。
上圖呈現的只是 rpc 一次訊息互動的上半場,下半場是乙個逆向的過程,從伺服器程序向客戶端程序返回響應資料。完整的一次 rpc 過程如下圖所示:
下面用 python **來描述上述過程。
# coding: utf-8
# server
import socket
sock = socket.socket(socket.af_inet, socket.sock_stream)
sock.bind(("localhost", 8081))
sock.listen(1) # 監聽客戶端連線
while true:
conn, addr = sock.accept() # 接收乙個客戶端連線
print(conn.recv(1024)) # 從接收緩衝讀訊息 recv buffer
conn.sendall(b"world") # 將響應傳送到傳送緩衝 send buffer
conn.close() # 關閉連線...
break
# coding: utf-8
# client
import socket
sock = socket.socket(socket.af_inet, socket.sock_stream)
sock.connect(("localhost", 8081)) # 連線伺服器
sock.sendall(b"hello") # 將訊息輸出到傳送緩衝 send buffer
print(sock.recv(1024)) # 從接收緩衝 recv buffer 中讀響應
sock.close() # 關閉套接字...
我們可以通過抓包工具檢視互動過程。
乙個練習
客戶端瘋狂傳送請求,但是伺服器不讀不處理,會發生什麼?
答案是:由於接收滑動視窗消耗殆盡,不接收傳送端訊息,傳送端將不斷(時間每次都會遞增)嘗試接收端視窗資訊。
icmp回覆報文 ARP ICMP(報文互動過程)
觀察arp協議 和 icmp協議 ps 最開始的時候主機會檢視自己的arp快取表 表裡沒有的時候 傳送arp請求 這裡注意 主機傳送的arp請求包裡面的 傳送者mac 是全0 然後路由器收到之後會 廣播 這裡注意 主機傳送的arp請求包裡面的 傳送者mac 是全f 獲得總結 1 如果主機的源ip和目...
語音互動裝置 前端訊號處理技術和語音互動過程介紹
一 前端訊號處理 1.語音檢測 vad 語音檢測 英文一般稱為 voice activity detection,vad 的目標是,準確的檢測出音訊訊號的語音段起始位置,從而分離出語音段和非語音段 靜音或雜訊 訊號。由於能夠濾除不相干非語音頻號,高效準確的 vad 不但能減輕後續處理的計算量,提高整...
IJCAI 2019 通過互動提公升機器翻譯質量
自從神經網路模型在機器翻譯任務 machine transoformer,mt 得到了應用,該任務得到了飛速的發展,機器翻譯的質量也在不斷地提高。儘管如此,機器翻譯的質量也難以與人類譯者相提並論。但是,有不少工作證明由人工介入機器翻譯過程對機器翻譯質量有明顯的幫助。本文提出了一種新的互動式機器翻譯模...