2020年9月26日 星期六

SIP CANCEL 取消請求

SIP CANCEL 取消請求:

  • 要取消的那個關聯請求,稱為原始請求。
  • 只是嘗試針對原始請求的 Transaction 進行取消,沿用原始請求的 Via branch 找原始請求的 Transaction:
    • 找不到 Transaction 回 481 Call Leg/Transaction Does Not Exist。
      • 已送成功回應算找不到 Transaction?
      • 已送失敗回應算找不到 Transaction?(也就是 Transaction 狀態不是 Proceeding)
    • 否則回 200 OK。
  • 原始請求:
  • 可能一下子還不會有最後回應的請求才需要,通常會先有暫時回應。馬上 (200ms 以內) 就最後回應的請求不需要暫時回應,送 CANCEL 到對方收到可能已經發出最後回應而造成 race condition。
  • CANCEL 不是 INVITE 專用,但目前只有 RFC3261 的 INVITE 符合,Client 只對 INVITE 發 CANCEL。Server 設計應當對所有請求通用 (除了 CANCEL 和 ACK 以外),以後或許有別的請求可 CANCEL。
  • CANEL 不屬於 Regular Transaction

CANCEL INVITE 讓 UAS 停止處理 (如「停止振鈴」)。re-INVITE 可以 CANCEL 嗎?

註:RFC3261 限制 CANCEL 收到任何回應之後才能發,確保 Server 收到 CANCEL 前收到原始請求。RFC2543 沒此規定,所以 CANCEL 有可能比原始請求先到。

CANCEL 可由 UAC 或 Proxy 產生。CANCEL 屬於「點對點」請求,Stateful Proxy 不是只是轉送,需回應 CANCEL,並對所有關聯 branch 進行 CANCEL。另外,也不能加上 Authorization 要求重送來盤問取得適當的憑證。

 在 RFC2543,CANCEL 和 INVITE 的 Transaction 是混在一起的,UAS 收到 CANCEL 後就不回應原始請求,不會回 487。

Client 行為

建立 CANCEL 請求:
  • 沿用原始請求的 Request-URI、Call-ID、CSeq 的序號、From (含 tag)、和 To (含 tag)。CSeq 的 Method 是 CANCEL。
    • 註:To tag 未必有,含 To tag 也似乎不必要。
  • 只有一個 Via,和原始請求的頂頭 Via 一致,好讓 Server 比對出要取消的 Transaction。
  • 須包含原始請求的 Route,讓 Stateless Proxy 能夠適當地繞 CANCEL。(在 RFC2543 沒清楚定義)
  • 不能有 Require 或 Proxy-Require。(應該被忽略。都要取消了,額外要求也就沒意義。)
傳送 CANCEL
  • 已收到最後回應,送了也沒用,所以不該送。
  • 等到收到任何暫時回應才能送,否則 Server 有可能比原始請求還早收到 CANCEL。但 RFC2543 不用等到收到任何暫時回應。此時可能有 To tag,也可能沒有。
  • 如同一般 Transaction 建立 Client Transaction 附上和原始請求仝款的目的位址、port 和 transport 傳送請求。

處理 CANCEL 回應 (不用理會結果如何)

  • 481 Call Leg/Transaction Does Not Exist:要取消的 Transaction 不存在。(不用取消了?)
  • 200 OK:要取消的 Transaction 存在,但未必表示取消成功。
  • 逾時:
收原始請求的回應 (就跟原本的處置一樣,都會移除原始請求的 Client Transaction)
  • 200 OK:原始請求成功,取消失敗。
  • 487 Request Terminated:取消成功。(註:RFC2543 UAS 不會送 487,只能等逾時)
  • 其它錯誤:原始請求失敗也就不用取消了。
  • 逾時 ( 64*T1 秒):視為已經取消。

註:就 INVITE 而言,UAC 發出 CANCEL 後 dialog 仍 confirmed,只能先 ACK 再 BYE 結束 dialog。early dialog 可嘗試用 CANCEL 結束,也可以用 BYE 結束。被叫端只能收到 ACK 後 BYE

Proxy 轉送最後回應時,必須取消進行中的所有相關 Client Transaction。這之前或當下,原始請求仍可能收到其它 branch 產生的 200 OK。

如果 Proxy 的 Client Transaction (Timer C) 逾時,此時可基於目前狀況 (如使用率) 重設 Timer 動態延長 Transaction 生存時間。或者結束 Client Transaction,此時如果有收到暫時回應,Proxy 必須產生 Transaction 的 CANCEL (等多久?)。
如果沒收到暫時回應,則視為收到 408 Request Timeout。

Server 行為

CANCEL 要求 Server 端 TU,取消符合的 Transaction。註:CANCEL 和 ACK 不能取消。

不同 Server 類型有不同 CANCEL 處理方式:
  • UAS:
    • 如同通用 UAS 方式處理,但由於 CANCEL 是 hop-by-hop 請求,不能加上 Authorization 要求重送來盤問取得適當的憑證。
    • 找不到參照的 Transaction,回  481 Call Leg/Transaction Does Not Exist。
    • 回 200 OK。
  • Stateless UAS:忽略 CANCEL。因為沒紀錄 Transaction,無法針對 Transaction 取消。
  • Stateless Proxy:轉送。
  • Stateful Proxy:
    • 找不到參照的 Transaction,轉送。
    • 回 200 OK,並對所有進行中 branch 產生 CANCEL。
    • INVITE Expire 逾時
  • Redirect Server:回 2xx 並結束參照的 Transaction,自己不產生任何請求。

參考

  1. RFC3261 §9 Canceling a Request§16 Proxy Behavior§8.2.7 Stateless UAS Behavior§8.3 Redirect Servers、。

2020年9月5日 星期六

Linux 下跑 LINE 即時通

有兩種方式
  1. 透過 Chrome 擴充功能 (功能受限)
  2. 透過 wine

參考:https://tedliou.com/archives/howto-install-line-on-ubuntu-20-04/

最後更新:20200906

2020年8月17日 星期一

遞迴呼叫 c-recursion

遞迴呼叫

遞迴是副程式直接或間接呼叫自己。相對於迭代 (iterative)

分治 (Divide and Conquer) 是種運用遞迴的特性來設計演算法的策略。

https://hackmd.io/@sysprog/c-recursion

https://www.facebook.com/groups/system.software2020/permalink/434463677487837/

窮舉與遞迴(enumeration and recursion)

Software Defined Networking

軟體定義網路 (Software-defined networking, SDN) 架構大略分為應用層、控制層以及基礎架構層三層。

應用層
北向 API
控制層
南向 API
基礎架構層

控制層由控制器 (Controller) 負責,集中管理眾多網路設備,讓網路設備專注於封包傳遞,網管人員能以高階軟體的方式調整網路的決策,提升網路資源管控和管理效率。對應用層界面是 Northbound API,對基礎架構層是 Southbound API。基礎架構層 (資料層、Data Layer、Forwarding Layer)由各種網路設備所組成,透過 Southbound API 將設備資訊送到控制器內做整合,並接受控制器的訊息對 flow table 等設備內的設定作調整。控制層內由許許多多模組組成一個可以應付各種需求的控制器。應用層由許多 Forwarding、Firewall 和 Security 等應用所組成,透過 Northbound API 取得整個 SDN 網路的相關資訊去做相對應處理。

例如有個應用想要建立一條從主機 A 到主機 B 的路線,只需要告訴控制器,控制器根據內部現有的網路拓樸計算出最佳的路徑並自動將設定部署到整個網路,不用對每一個交換機做獨立設定。

Controller 備援

參考:
  1. http://www.cc.ntu.edu.tw/chinese/epaper/0029/20140620_2908.html
  2. 可程式網路
  3. 網路功能虛擬化 (Network Virtualization Function,NFV)
  4. https://medium.com/@RiverChan/sdn與nfv的區別和關係-3a15692bb3f6
  5. http://speed.cis.nctu.edu.tw/~ydlin/miscpub/indep_wanghc.pdf:ONOS 有著較好的使用者體驗。測試分散式叢集 (distributed clustering) 功能,Opendaylight 效能較好,ONOS 在穩定性與高可用性上較好。
  6. 控制器:Ryu、NOX/POX、Beacon、Opendaylight、ONOS、...
  7. 北向協定:OpenDayLight 的 REST API,ONOS 的 intent framework API,...
  8. 南向協定:Open Network Foundation (ONF) 的 OpenFlow,SNMP、LISP、XMPP、PCEP、OF-Config、Net-Config、BGP-LS、OPFLEX...
  9. Software Driven Network

2020年8月13日 星期四

SIP Proxy

Proxy 或 Proxy Server 是 Server 和 Client 的合體。首先它是 Server,能接收 SIP 請求。然後又是 Client,轉送 Server 收到的請求或產生請求。

2020年8月7日 星期五

PROCESS GROUPS, SESSIONS, AND JOB CONTROL

一個 job 是一個指令或指令串,形成一個 process group。透過一個控制終端機 (Controlling Terminal) 可以進行多個 job,都屬於同一個 session (譯作「作業階段」),其中一個是 foreground process group,剩下都是 background process group,方便工作控制 (job control)。

建立 session 的 process 是 session leader,其 process ID (PID) 作為 session ID (SID),並連接一個 session 專用的控制終端機並成為其控制 process,讓使用者控制,其中 foreground process group 讀取控制終端機。Signal SIGINT (Ctrl-C)、SIGQUIT (Ctrl-\)、和 SIGSTP (Ctrl-Z) 會送到 foreground process group 中的所有 process。當控制終端機斷線時,控制 process 會收到 SIGHUP。

建立 process group 的 process 是 process group leader,其 PID 作為 process group ID (PGID)。process group 最後一個 process 結束或離開時結束。process group leader 未必是最後一個 process。

新 process 繼承親 process 的 SID、PGID、控制終端機等。檔案 /proc/PID/stat 可看到 PGID、SID、控制終端機的 major:monor ID 和控制 process 的 PID (見 proc(5))。

互動式登入時,登入的途徑是控制終端機,登入的 shell 成為 session leader 及控制行程,也是唯一 process group 的唯一成員。然後,從 shell 啟動的每個指令或指令串,都會建立一個或多個 process,全部收納在一個新的 process group。如果指令或指令串以 & 符號結束時,這個 process group 會在背景執行。這些都在同一個 session 下。

在視窗環境,控制終端機是 pseudoterminal,每個終端機視窗有獨立的 session,視窗起始的 shell 是 session leader。

除了 job 控制,process 群組偶而也用在別的地方,因為群組有兩個有用的特點:parent process 可以等候特定群組的任一個 children (TLPI §26.1.2),和 signal 可以送給一個群組的全部成員 (TLPI §20.5)。

範例

$ echo $$                       # Display the PID of the shell
400
$ find / 2> /dev/null | wc -l & # Create 2 processes in background group
[1] 659
$ sort < longlist | uniq -c     # Create 2 processes in foreground group
此時,shell bashfindwcsort、和 uniq 都在執行,全部屬於同一 session,session leader 是 bash,同時也是控制 process,其它 process 都是 bash 產生。session 全部分成三個群組,前景執行的群組是 sortuniqsort 是群組 leader。另外兩個群組背景執行,一個是 bash,另一個是 findwcfind 是群組 leader。
$ echo $$                       # Display the PID of the shell
4056
$ find / 2> /dev/null | wc -l & # Create 2 processes in background group
[1] 5781
$ ps -s 4056 -o comm,pid,sess,tt,pgrp,ppid,tpgid,state
COMMAND           PID  SESS TT        PGRP  PPID TPGID S
bash             4056  4056 pts/2     4056  1579  5782 S
find             5780  4056 pts/2     5780  4056  5782 R
wc               5781  4056 pts/2     5780  4056  5782 S
ps               5782  4056 pts/2     5782  4056  5782 R

用 ps 可看出各自指令的資訊,其中一開始的 shell 是 bash,PID 4056。SID (SESS) 等於 PID,所以是 session leader,連接終端機 pts/2。PGID (PGRP) 等於 PID,是群組 leader。沒其它 process 的 PGID 為 4056,是群組中唯一 process。parent PID (PPID) 是其它 process,但其它 process 都是 4056,也就是都是其產生。TPGID 可看出前景執行的群組是 5782,也就是 ps 指令,其它群組 4056 和 5780 都背景執行。5780 群組的指令包含 find 和 wc 兩個 process。

pid_t getpgrp(void); // 取得 PGID,如果和 PID 一致則是 process group leader

int setpgrp(pid_t pid, pid_t pgid); // 將 pid 的 porcess group 設為 pgid。pid 可以是自己或子 process (不能是 SID)。pgid ...

參考來源

TLPI §34.1

34.2 Process Groups
34.3 Sessions
34.4 Controlling Terminals and Controlling Processes
34.5 Foreground and Background Process Groups
34.6 The SIGHUP Signal
34.6.1 Handling of SIGHUP by the Shell
34.6.2 SIGHUP and Termination of the Controlling Process
34.7 Job Control
34.7.1 Using Job Control Within the Shell
34.7.2 Implementing Job Control
34.7.3 Handling Job-Control Signals
34.7.4 Orphaned Process Groups (and SIGHUP Revisited)
34.8 Summary
34.9 Exercises

2020年7月23日 星期四

Raspberry Pi

1A+
1B+
2B (2016/02)
3A+
3B
  • Quad Core 1.2GHz Broadcom BCM2837 64bit CPU
  • 1GB RAM
  • BCM43438 wireless LAN and Bluetooth Low Energy (BLE) on board
  • 100 Base Ethernet
  • 40-pin extended GPIO
  • 4 USB 2 ports
  • 4 Pole stereo output and composite video port
  • Full size HDMI
  • CSI camera port for connecting a Raspberry Pi camera
  • DSI display port for connecting a Raspberry Pi touchscreen display
  • Micro SD port for loading your operating system and storing data
  • Upgraded switched Micro USB power source up to 2.5A
3B+
  • Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz
  • 1GB LPDDR2 SDRAM
  • 2.4GHz and 5GHz IEEE 802.11.b/g/n/ac wireless LAN, Bluetooth 4.2, BLE
  • Gigabit Ethernet over USB 2.0 (maximum throughput 300 Mbps)
  • Extended 40-pin GPIO header
  • Full-size HDMI
  • 4 USB 2.0 ports
  • CSI camera port for connecting a Raspberry Pi camera
  • DSI display port for connecting a Raspberry Pi touchscreen display
  • 4-pole stereo output and composite video port
  • Micro SD port for loading your operating system and storing data
  • 5V/2.5A DC power input
  • Power-over-Ethernet (PoE) support (requires separate PoE HAT)
CM3+
4B
CM4:將會搭載 PCIe Gen2x1 介面,並支援 NVMe 通訊協定。[參考來源]
Zero
Zero W

Pico

  • 處理器 RP2040:双核心 Cortex-M0+,內建 264KB RAM,支援最大 16MB 外部 Flash。支援 I2C、SPI、Programmable I/O (PIO)。

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...