2018年10月27日 星期六

bash PARAMETERS

bash 或其它 shell 的參數 (parameter),是一個儲存值的地方,可以是
  • 變數 (variable),名稱 (name) 非數字開頭由英文字母、數字及「_」組成的字,有一個值,並有屬性 (attribute) 可由內建指令 declare 指定。陣列。Shell 有內動的變數。
  • 一個數字
  • 一個特殊字元
參數經過指定或空字串 (沒) 產生。
參數=[]
透過內建指令 unset 移除。

所有值會經歷 tilde 擴展、參數和變數擴展、指令取代、算術擴展、及 quote 移除 (見 EXPANSION)。如果變數的屬性為整數 (integer),即使沒 $((...)) 也會以[算術表示式](見 bash Arithmetic Expansion) evaluated。除了「$@」外,不進行 Word splitting。不進行 Pathname expansion。變數指定亦可放在內建指令 alias、declare、typeset、export、readonly、及 local (declaration 指令) 的引數。
當用在 posix 模式,這些內建指令 may appear in a command after one or more instances of the command builtin and retain these assignment statement properties。

使用 += 運算指定一個值給 shell 變數或 array index 可進行 append 或加法運算,包括前面接受變數指定作為引數的內建指令。:
  • 整數變數:加法運算加上目前的值。
  • 使用 compound assignment 應用在陣列:indexed 陣列最後會多加一個值,associative 陣列新增 key-value 對。
  • 字串變數:值擴展後附加到字串後面。

Positional Parameters 位置參數

位置參數是從 1 開始的數字,由執行時的引數依序指定,不能由指定 statement 指定,可由內建指令 set 重新指定。執行 shell 函數時,位置參數暫時由函數引數取代。

當位置參數是多位數字時,需要用 braces 括起來。

註:$0 不算是位置參數。

Special Parameters 特殊參數

只能讀,不能指定。
*從 1 開始的所有位置參數,每個位置參數擴展為個別的字。依據進行的 context,可能會進行進一步 word splitting 和 pathname expansion。如果在雙引號裡面 ("$*"),擴展為一個字。位置參數間由特殊變數 IFS 第一個字元連接起來的。如果 IFS 沒設,則用 space 連接。如果 IFS 是 null,則不插入字元直接連接。
@從 1 開始的所有位置參數。如果在雙引號裡面 ("$@"),每個位置參數擴展為個別的字,相當於 "$1" "$2" ...  If the double-quoted expansion occurs  within  a word,  the  expansion of the first parameter is joined with the beginning part of the original word, and the expansion  of  the last  parameter  is  joined  with the last part of the original word.
#位置參數的數目。
?最後前景執行 pipeline 的 exit statu。
-目前 option flags。
$shell 的 process ID。在 ()  subshell,是 current shell 的 process ID,不是 subshell 的。
!最後背景執行的 process ID。
0shell 或 shell script 的名稱。
_shell 一開始時,設為 the absolute pathname used  to  invoke the shell or shell script being executed as passed in the environment or argument list.  Subsequently, expands  to  the  last argument to the previous command, after expansion.  Also set to the full pathname used to  invoke  each  command  executed  and placed  in  the  environment  exported  to  that command.  When checking mail, this parameter holds the name of the  mail  file currently being checked.

Shell Variables

下列變數由 shell 設定:
BASH:執行的完整檔名。
BASHOPTS
BASHPID
BASH_ARGC
BASH_ARGV
BASH_CMDS
BASH_COMMAND
BASH_EXECUTION_STRING
BASH_LINENO



BASH_REMATCH
由指令 [[ 的 =~ 運算指定的唯讀陣列,其中 index 0 是整個比對符合的字串,index n 是 第 n 個 parenthesized subexpression 比對的結果。
BASH_SOURCE
BASH_SUBSHELL
BASH_VERSINFO
BASH_VERSION
COMP_CWORD
COMP_KEY
COMP_LINE
COMP_POINT
COMP_TYPE
COMP_WORDBREAKS
COMP_WORDS
COPROC
DIRSTACK
EUID
FUNCNAME
GROUPS
HISTCMD
HOSTNAME
HOSTTYPE
LINENO
MACHTYPE
MAPFILE
OLDPWD
OPTARG
OPTIND
OSTYPE
PIPESTATUS
PPID
PWD
RANDOM
READLINE_LINE
READLINE_POINT
REPLY
SECONDS
SHELLOPTS
SHLVL
UID

下列變數 shell 會使用到,有時 bash 會指定預設值:

BASH_COMPAT
BASH_ENV
BASH_XTRACEFD
CDPATH
CHILD_MAX
COLUMNS
COMPREPLY
EMACS
ENV
FCEDIT
FIGNORE
FUNCNEST
GLOBIGNORE
HISTCONTROL
HISTFILE
HISTFILESIZE
HISTIGNORE
HISTSIZE
HISTTIMEFORMAT


HOME
目前使用者的家目錄。作為內建指令 cd 的預設引數及進行 tilde 擴展用。

每個使用者帳戶在 /etc/passwd 會有一行,包含用「:」分隔的 7 個欄位,其中最後第二欄是使用者的家目錄,login 程式用來設 $HOME。
HOSTFILE
IFS
IGNOREEOF
INPUTRC
LANG
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MESSAGES
LC_NUMERIC

LINES
MAIL
MAILCHECK
MAILPATH
OPTERR
PATH
POSIXLY_CORRECT
PROMPT_COMMAND
PROMPT_DIRTRIM
PS1
PS2
PS3
PS4
SHELL
TIMEFORMAT
TMOUT
TMPDIR
auto_resume
histchars

Arrays

nameref 參考變數

變數可使用內建指令 declare 或 local 的 -n 選項設定 nameref 屬性,參照另一個變數,讓變數間接修改,此時除了改變 nameref 屬性外,指定、移除和其它屬性修改都進行在參照的變數。
declare -n ref=$R #建立 nameref 變數 ref
unset ref #移除變數 $R
unset -n ref #移除 nameref ref

nameref 常用在 shell 函數裡參照函數引數。例如在 shell 函數裡:
declare -n ref=$1
建立 nameref 變數 ref 參照第 1 個引數。

如果 for 迴圈的 control variable 有 nameref 屬性, the list of words can be a list of shell variables, and a name reference will be established for each word in the list, in turn,  when the loop is executed.

陣列變數不能指定 nameref 屬性,但 nameref 變數可以參照陣列變數和 subscripted  array variables。

參考

man bash 的 PARAMETERS

2018年10月6日 星期六

bash EXPANSION

bash 指令行切成字後會進行7 種擴展,依下列順序:
  1. brace ({}):
  2. tilde (~):目錄擴展
  3. $ parameter and variable 擴展、arithmetic 擴展、command substitution ($)
  4. word splitting:上面 ($) 類擴展如不在雙引號內,會依據 IFS 進行字切割。
  5. pathname
有些系統還支援額外的 process substitution,在上述順序 2 和 3 同時進行。

最後移除一開始就有的、未 quoted 的 quote 字元。

只有 brace expansion, word splitting, 及 pathname expansion 會改變字的數目,其它擴展擴展一個字為一個字,唯一的例外是 "$@" 及 "${name[@]}" 的擴展 (見 PARAMETERS).

Brace Expansion {}

{} 間一系列以「,」區隔的字串個別擴展為 word,或是兩個數字或兩個單一字元以「..」區隔的序列擴展 {x..y[..incr]}。序列擴展如果是數字的,前面可以加 0 來嘗試強迫產生相同位
數的數字。數字或字元間的序列擴展預設的增減值是 1 或 -1,可以再加「..數字」設定增減值。{} 裡可以有 {} 進行巢狀擴展。

「${」不做 brace 擴展,以免跟 parameter 擴展衝突。

例如
  • 「a{d,c,b}e」會擴展成「ade ace abe」
  • mkdir /usr/local/src/bash/{old,new,dist,bugs}
  • chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
傳統的 sh 沒有 Brace 擴展,要停用 Brace 擴展可以使用 +B 選項。

Tilde Expansion ~

tilde-prefix

Parameter Expansion

$ 字元引入參數擴展、指令取代、或算術擴展。

$參數 或 ${參數} 取代為變數值,參數名稱可用 {} 包起來避免跟緊接著的字元有錯誤連結。名稱是兩位以上數子,必須用 {} 包起來。

間接變數

下面 word 的部份會進行 tilde expansion、參數擴展、指令取代、和算術擴展。


${parameter:-word}
當 parameter unset 或 null 時,使用預設值 word。
${parameter:=word}
當 parameter unset 或 null 時,使用預設值 word 並指定給 parameter。位置參數和特殊參數不能用這種方式指定。
${parameter:?word}
${parameter:+word}
${parameter:offset}
${parameter:offset:length}
${!prefix*}
${!prefix@}
${!name[*]}
${!name[@]}
${#parameter}
參數長度
${parameter#word}
移除字串開頭最短符合 word 的部份。
${parameter##word}
移除字串開頭最長符合 word 的部份。
${parameter%word}
移除字串結尾最短符合 word 的部份。
${parameter%%word}
移除字串結尾最長符合 word 的部份。
${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
???
${parameter^pattern}
${parameter^^pattern}
轉換成大寫。
${parameter,pattern}
${parameter,,pattern}
轉換成小寫。

Command Substitution 指令取代

$(指令) 或 `指令`,取代為指令執行的輸出 (移除最後換行)。

$(cat file) 可以用更快的 $(< file) 取代。

Arithmetic Expansion

$((expression))

Process Substitution

Word Splitting 切割字

Pathname Expansion 路徑擴展

Pattern Matching

Quote Removal

移除所有非上述擴展產生的,unquoted 用的「\」、「'」、及「"」。

參考

  1. man bash 的 EXPANSION 節
  2. http://godleon.blogspot.tw/2007/06/shell-script-linux-pipe.html

2018年9月15日 星期六

compile wireshark

ninja-build
libgcrypt20-dev
qtbase5-dev
qttools5-dev-tools
qtmultimedia5-dev
libqt5svg5-dev
https://www.wireshark.org/docs/wsdg_html_chunked/ChSrcBuildFirstTime.html#_building_on_unix


$ cd run
$ WIRESHARK_RUN_FROM_BUILD_DIRECTORY=1 ./wireshark

參考
wireshark

2018年9月1日 星期六

pcapng file format

一般存放擷取封包的 pcap 檔案有一些限制,所以發展下一代的格式 -- The PCAP Next Generation Dump File Format (pcapng)。

檔案內容分成如下的區塊串接起來,前後有相同的長度欄位 (Block Total Length),限定出每個區塊的範圍,方便往後、或往前跳過不需要或不認得的 Block Type,容易擴展新定義的區塊。
32-bit Block Type
32-bit Block Total Length
Block Body
variable length, padded to 32 bits
32-bit Block Total Length
  • Block Total Length:整個區塊 byte 數。
  • Block Type:決定區塊內容 (Block Body) 的格式,區塊內容都會補齊 32-bit,所以區塊長度也會是 4 的倍數。
  • Block Body:依據 Block Type,除了必要欄位外,可放多個 TLV 選項。都 32-bit 對齊。

區塊雖然是一維線性串起來的,但有邏輯上的階層,最頂層一定是叫 Section Header Block 的區塊,一個檔案可以有多個頂層的 Section Header Block。

例如傳統 pcap 檔案轉成 pcapng 的區塊樹狀階層架構會是這樣:
Section Header Block
+- Interface Description Block
   +- Enhanced Packet Block
   +- Enhanced Packet Block
   +- ...
   +- Enhanced Packet Block

選項表

每個選項有 Type、Length、Value 三個欄位,可依 Length 跳過不需要或不認得的選項。
  • Option Type (2-byte):Option Type 的編碼。Most Significant Bit 為 1 保留為內部使用。
  • Option Length (2-byte):Option Value 不含補齊 32-bit 的實際長度。
  • Option Value (variable length):Option 的值,補到 32-bit 對齊。如果是字串,不能假設是以 0 結束。Option Length 為 0 則無此項。
有些 Option Type 可以重複,有些不行。選項表最後應該要有選項 'End of Option' (opt_endofopt)。

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Option Code              |         Option Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                       Option Value                            /
/              variable length, padded to 32 bits               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                                                               /
/                 . . . other options . . .                     /
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Option Code == opt_endofopt  |  Option Length == 0          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

名稱Code長度可多個?說明
opt_endofopt00no選項表結束。
opt_comment1可變utf-8 編碼的註解,字串沒有結束的 0。換行用「\r\n」或「\n」。
opt_custom
客訂選項
0x0BAC可變utf-8 編碼的字串,沒有結束的 0。複製到新檔案。
0x0BAD可變二進位資料。複製到新檔案。
0x4BAC可變utf-8 編碼的字串,沒有結束的 0。不複製到新檔案。
0x4BAD可變二進位資料。不複製到新檔案。

客訂選項有 4 種,選項值開頭放登記在 IANA 的 32-bit Private Enterprise Number (PEN) 來避免衝突。

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Custom Option Code        |         Option Length         |
+---------------------------------------------------------------+
|                Private Enterprise Number (PEN)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                        Custom Data                            /
/              variable length, padded to 32 bits               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Section Header Block (SHB)

最頂層階層的區塊
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |           Section Header Block Type = 0x0A0D0D0A              |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |                Byte-Order Magic = 0x1A2B3C4D                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 |        Major Version = 1      |       Minor Version = 0       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 |                                                               |
   |                          Section Length                       |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 /                                                               /
   /                      Options (variable)                       /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+
  • Block Type 0x0A0D0D0A (字串 "\n\r\r\n"):無論位元組順序怎樣都一樣都可以辨認到。透過 FTP 或 HTTP 傳送時,用來偵測不適當的 ASCII 轉換。
  • Byte-Order Magic 0x1A2B3C4D:用來偵測位元組順序 (byte order)。
  • Major Version 和 Minor Version:格式版本,目前 1.0。
  • Section Length (signed 64-bit value):不含 Section Header Block 自己的 section 長度。可用來快速跳過 section。-1 代表未知。4 的倍數。
  • Options:選項表。區塊特有選項有擷取機器的機型、作業系統、應用程式等。

Interface Description Block (IDB)

描述擷取封包的界面資訊。處理檔案的工具程式,會將每個 Section 的 IDB,獨立從 0 開始編號,稱為 Interface ID。Section 內其它有 Interface ID 欄位的區塊,就要有對應的 IDB。Simple Packet Block 沒有 Interface ID 欄位隱含 Interface ID 0。

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |                    Block Type = 0x00000001                    |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |           LinkType            |         Reserved = 0          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 |                            SnapLen                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 /                                                               /
   /                      Options (variable)                       /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+
  • LinkType: 跟 pcap 的 header type 一樣。
  • SnapLen:每個封包最多擷取前面的 byte 數。0 表示不限制。
特有的選項有:
Name Code Length 可多個? 說明
if_name 2 Variable no
if_description 3 Variable no
if_IPv4addr 4 8 yes
if_IPv6addr 5 17 yes
if_MACaddr 6 6 no
if_EUIaddr 7 8 no
if_speed 8 8 no
if_tsresol91no時間精度。MSB 0:剩下是 10 的 negative power。MSB 1:剩下是 2 的 negative power。預設是 10-6,跟 pcap 預設的微秒一致。
if_tzone 10 4 no
if_filter 11 variable no
if_os 12 variable no
if_fcslen 13 1 no
if_tsoffset 14 8 no

Enhanced Packet Block (EPB)

標準放封包的區塊。另外封包也可以放在 Simple Packet Block,用來加速擷取檔案的產生。
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |            Enhanced Packet Block Type = 0x00000006            |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |                         Interface ID                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 |                        Timestamp (High)                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16 |                        Timestamp (Low)                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20 |                    Captured Packet Length                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24 |                    Original Packet Length                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28 /                                                               /
   /                          Packet Data                          /
   /              variable length, padded to 32 bits               /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   /                                                               /
   /                      Options (variable)                       /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+
  • Interface ID (32-bit):對應的 IDB。原本 Packet Block 只有 16-bit,另外 16-bit Drops Count 改移到 option。
  • Timestamp (High) and Timestamp (Low): 64-bit 的 epoch 時間,單位在 IDB 的 'if_tsresol' 選項,預設是微秒。在 pcap 是分成 32-bit 秒和 32-bit 微秒。
  • Captured Packet Length:Packet Data 的封包長度,不含補齊。會是 Original Packet Length 和 IDB 的 SnapLen 比較,值較小的。
  • Original Packet Length:在網路實際傳送的封包長度。
  • Packet Data:擷取的封包加上補到 32-bit 對齊。封包格式依據 IDB 的 LinkType 欄位。

Simple Packet Block (SPB)

SPB 簡化 EPB,只保留 Original Packet Length,只有 16-byte overhead,不需要取得 timestamp 和計算,適合有效能或空間瓶頸的情況。EPB 和 SPB 可以交錯使用。
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +---------------------------------------------------------------+
 0 |                Simple Block Type = 0x00000003                 |
   +---------------------------------------------------------------+
 4 |                      Block Total Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 8 |                    Original Packet Length                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
12 /                                                               /
   /                          Packet Data                          /
   /              variable length, padded to 32 bits               /
   /                                                               /
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Total Length                       |
   +---------------------------------------------------------------+
  • Original Packet Length: 在網路實際傳送的封包長度。和 IDB 的 SnapLen 比較,較小的就是實際擷取的封包長度。
  • Packet Data:擷取的封包和 padding。封包格式依據 IDB 的 LinkType 欄位。

其它區塊

有 Name Resolution Block、Interface Statistics Block、Custom Block、及一些實驗性的區塊。 32-bit Block Type 的 Most Significant Bit (MSB) 為 1,保留為內部使用。

參考

  1. https://github.com/pcapng/pcapng

2018年8月25日 星期六

IPv4 與 IPv6 辨識和位址

項目IPv4IPv6說明
EtherType0x08000x86DD
header 版本46
header 長度2040不含 options
位址 bit 數32128
位址 byte 數416
familyAF_INETAF_INET6
data typestruct in_addr
(unsigned long)
struct in6_addr
字串表示逗點隔開的 4 個十進位數字
dotted-decimal
255.255.255.255
分號隔開的 8 組 4 位十六進位數字
 colon-separated hexadecimal
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
IPv6 有簡寫規則
字串最長長度INET_ADDRSTRLEN
16
INET6_ADDRSTRLEN
46 (40)
含結尾 0。IPv6 位址 40-byte,但IPv4 tunneling 有 46-byte。

IPv6 簡寫規則:
  • 每組開頭的 0 可省略,若全為 0 ,則可簡寫為 0
  • 若連續好幾組全為 0,可全省略,只留下「::」,但以一次為限。
IPv4 tunneling (IPv4-mapped IPv6 位址)
  • 文字位址最長 46-byte:ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255
struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

struct sockaddr_in6 {
    sa_family_t     sin6_family;   /* AF_INET6 */
    in_port_t       sin6_port;     /* port number */
    uint32_t        sin6_flowinfo; /* IPv6 flow information */
    struct in6_addr sin6_addr;     /* IPv6 address */
    uint32_t        sin6_scope_id; /* Scope ID */
};

flowinfo 作用?sin6_scope_id 只用在 link-local。

Kamailio 使用的 IP 位址

typedef struct ip_addr {
        unsigned int af;        /* address family: AF_INET6 or AF_INET */
        unsigned int len;       /* address len, 16 or 4 */

        /* 64 bits aligned address */
        union {
                unsigned long  addrl[16/sizeof(long)]; /* long format*/
                unsigned int   addr32[4];
                unsigned short addr16[8];
                unsigned char  addr[16];
        }u;
} ip_addr_t;

IPv4 位址

IPv6 位址

IPv6 位址分成三類
  • unicast:單一網路界面的位址。
  • anycast:多個網路界面共用的位址,只需要送給一個最近的成員。位址格式和 unicast 相同,通常用在 router,例如 gateway。
  • multicast: 群播給所有成員
    • IPv4 的廣播相當於定址給 link-local all-nodes multicast group ff02::1。
IPv6 沒有廣播位址,由 multicast 位址取代。

IPv6 位址 128-bit,一般前面 64-bit 為 Network ID 作 routing 使用,又可分成 Global Routing Prefix 跟 Subnet ID。後面 64-bit 為 Interface ID 用來識別主機界面,可能來自介面卡的 MAC address (使用 modified EUI-64 格式)、DHCPv6 伺服器、亂數產生、或手動指定。
  • ::/128:位址未指定,例如用在來源位址還不知道的時候,實作上或許作為任何位址使用。相當於 IPv4 的 0.0.0.0/32。
  • ::/96:IPv4-compatible address,剩下 32-bit 放 IPv4 位址。(捨棄)
  • ::/0:default route,相當於 IPv4 的 0.0.0.0/0。
  • ::1/128:localhost,相當於 IPv4 的 127.0.0.1/8。
  • ::ffff:0:0/96:IPv4-mapped IPv6 address
    • ::ffff:192.0.2.128
  • ::ffff:0:0:0/96:IPv4-translated address
  • 64:ff9b::/96:IPv4-Embedded IPv6 Address [RFC 6052]
  • 0100::/64:discarding
  • 2001::/32:Teredo tunneling (IPv6 transition mechanism)
  • 2001:2::/48:benchmarking IPv6,相當於 IPv4 的 192.18.0.0/15。
  • 2001:20::/28:ORCHIDv2
  • 2001:db8::/32:文件範例使用,相當於 IPv4 的 192.0.2.0/24、198.51.100.0/24、和 203.0.113.0/24。
  • 2002::/16:6to4
  • fc00::/7:Unique local address,相當於 IPv4 的 private 位址 10.0.0.0/8、172.16.0.0/12、和 192.168.0.0/16。
  • fe80::/64:link-local address,不跨 link 使用。後面 64-bit 通常使用 modified EUI-64 格式的介面卡 MAC 位址。相當於 IPv4 的 169.254.0.0/16。48-bit MAC 轉成 modified EUI-64 是 OUI 後插入 0xfffe,並將 universal/local bit 相反。
    • fe80::1
  • fec0::/10:Site-local address 不跨 site 使用。(捨棄 [RFC3879])
  • ffFS::/16: multicast address
    • F:4-bit 分別為 rRPT
      • r (reserved)
      • R (Rendezvous)
      • P (Prefix)
      • T (Traniet)。T = 1 表示 non-permanently-assigned ("transient"),T = 0 表示 IANA 有登記的 well-known multicast address
    • S (scope):有 14 種 scope
      • 1 = interface-local,不能跨界面,只能作為 multicast 回送,例如 IPC。不像 unicast loopback,可以指定給任何界面。
      • 2 = link-local,不能跨 link。
      • 4 = admin-local
      • 8 = organization-local
      • e = global
    • ff02::1:all link-local nodes
    • ff02::2:all link-local routers
    • ff02::1:ff00:0/104:Solicited-Node multicast address,後面 24-bit 來自 unicast/anycast 位址。
大位址空間
階層式位址配置 (prefix 依據網路拓樸分配,可縮小主幹路由表來提昇效率)

參考

  1. RFC3513 IPv6 Addressing Architecture
  2. IPv6 簡介
  3. IP 協定沿革
  4. RFC4213 Basic Transition Mechanisms for IPv6 Hosts and Routers
  5. https://en.wikipedia.org/wiki/IPv4
  6. RFC8200 IPv6 Specification
  7. RFC4007 IPv6 Scoped Address Architecture
    • 除了「::」,每個 IPv6 位址都隱含 scope 資訊。
    • scope zone
    • 同一種 scope 的 zone 不會重疊。因為非 global 位址會重複使用,所以 node 內部對每種 scope 的 zone 作 index,表示為 address%zone_id。
    • scope global 的 zone 是全世界,只有一個。
    • scope interface-local 的 zone 是每個界面一個。
    • zone 是靜態的,即使因斷線分成多個區塊,仍屬於同一 zone。
  8. link、interface、node、host、router

2018年8月23日 星期四

IP 協定沿革

  • IP 協定出現之前就有 TCP,TCP v1 在 1973 (RFC 675),TCP v2 在 1977。後來 Jon Postel 發現 TCP 同時作為 end to end 協定,以及封包包裝 和路由的協定,違反網路階層原則的發展方向,TCP 跟 IP 才分家,並同時使用版本 v3 (1978)。
  • v4 是第一個 IP 穩定版本。RFC 760 (1980) -> RFC 791 (1981)
  • v5 被 Internet Stream Protocol 用掉
  • v6:RFC 1883 (1995) -> RFC 2460 (1998) -> RFC 8200 (2017)

2018年8月16日 星期四

USB 連接器

USB 規範有幾個面向,其中一個是關於連接器,其它面向有供電傳輸速度類別

USB 連接上游主機到下游週邊,由主機供電並主導傳輸。連接器分 Type A 和 Type B,分別區別角色是主機、還是週邊。主機上放 Type A 插座,週邊放 Type B 插座,中間用 Type A 轉 Type B 的 USB 線連起來。週邊也可以直接提供 Type A 插頭的 USB 線。

小結:有 Type B 插座或 Type A 插頭就是週邊。

  ↓主機↓   Type-A       ↓USB 線↓        Type-B  ↓週邊↓
[Type A 插座]←→[Type A 插頭----Type B 插頭]←→[Type B 插座]
[Type A 插座]←→[Type A 插頭                             ]

標準 USB 有 4 個訊號:VBUS、D-、D+、GND。

隨著手持設備出現,發展出較小的 mini USB 連接器及 micro USB 連接器,各自都有 Type A 和 Type B 兩種 -- mini-A、mini-B、micro-A、micro-B,共四種插座、四種插頭,而之前的就稱為 Standard-A、Standard-B。在主機或週邊的用法沒變,只是連接器較小。
USB 標準1.01.12.02.0 rev
3.03.13.24
最高速 12 Mbps480 Mbps5 Gbps10 Gbps20 Gbps40 Gbps
Type A??Type-A 2.0Type-A SuperSpeedX
Type BType-BType-B SuperSpeedX
Mini-A-Mini-AX
Mini-B-Mini-BX
Mini-AB-Mini-ABX
Micro-A-Micro-AMicro-A SuperSpeedX
Micro-B-Micro-BMirco-B SuperSpeedX
Micro-AB-Micro-ABMicro-AB SuperSpeedX
Type Cbackward 相容Type C

參考:https://en.wikipedia.org/wiki/USB#Connector_type_quick_reference

之後,USB OTG 支援有些裝置有時可以作為週邊,有時可以作為主機,新增另外兩種插座 -- mini-AB 插座和 micro-AB 插座,可以插 Type A 或 Type B 插頭,決定作為主機還是週邊。辨別方式是 mini USB 和 micro USB 界面多了一個 ID 接點,在 Type A 插頭接到 GND 會判斷為主機,Type B 插頭空接會判斷為週邊。後續仍可經由 Host Negotiation Protocol 協調交換彼此的角色。

mini/micro USB 界面有 5 個訊號:VBUS、D-、D+、ID、GND,但在 USB 線內並沒有 ID 訊號線。
訊號線界面接腳描述
Standardmicro/mini
VBUS115V
D-22Data-
D+33Data+
4ID:主機接地、週邊空接
GND45接地
SSTx--6USB 3.0
SSTx+-7USB 3.0
DGND-8USB 3.0
SSRx--9USB 3.0
SSRx+-10USB 3.0

在 USB 3.0,要支援更快的 SuperSpeed 傳輸速度,需要額外多 SSRX-、SSRX+、DGND、SSTX-、SSTX+ 5 個訊號線和接點,相容並擴充 Standard-A、Standard-B、和 mini-B 界面。

大約在 USB 3.1 發表同時期,發表了 USB Type-C 界面,是上下對稱的扁形接口,不用考慮插頭方向,也沒分主機或週邊端,共有 24 的接點。

插座訊號排列:
GNDTX1+TX1-VBUSCC1D+D-SBU1VBUSRX2-RX2+GND
GNDRX1+RX1-VBUSSBU1D-D+CC2VBUSTX2-TX2+GND

插頭可以轉 180° 插,訊號排列跟插座是左右或上下鏡射,CC1 和 CC2 變成 CC 和 VCONN,D+ 和 D- 只有一邊有。

GNDRX2+RX2-VBUSSBU1D-D+CCVBUSTX1-TX1+GND
GNDTX2+TX2-VBUSVCONN

SBU1VBUSRX1-RX1+GND

訊號說明:
  • D+、D-、VBUS、GND:原本 USB 訊號,在 USB-C 線 D+、D- 只有一組。
    • 在類比耳麥模式時,D- 和 D+ 分別變成左音道和右音道,此時 VBUS 和 GND 可提供 5V 500mA。
  • CC1、CC2:Channel Configuation,用來偵測 USB 有接、方向、角色,以及電源、Alternate Mode 溝通。沒有這兩個訊號時,按照 USB 2.0 方式運作。
    • 兩者在主機用 Rp pull-high,在週邊用 Rd pull-low。主機和週邊雙角色則兩種切換。主機端的 Rp 值可用來決定可供電的電流是預設、1.5A、還是 3A。
    • 在 USB 線裡,只有一個 CC 是兩端接在一起,並決定 D+ 和 D- 訊號位置。如果 USB 線需要吃電,另一個 CC 則用 Ra pull-low 變成 VCONN 提供至少 1W 的電。
    • 當主機和週邊接上時,雙方可偵測到 CC1 和 CC2 電壓變化,得知接上和接的方向,決定了 CC 位置。如果有一端是雙角色,也可以得知是哪種角色。如果雙端都是雙角色需要手動設定或自動設定。
    • CC 可進行 Power Delivery 和 Alternate Mode 溝通。Alternate Mode 可以是 DisplayPort、MHL、Thunderbolt、HDMI 等。
    • 類比耳麥模式:此時 CC1 和 CC2 直接接地,D- 和 D+ 分別變成左音道和右音道,SBU 變成 MIC 和類比 GND (需要能自動切換,由於可能反插,且 TRRS 耳麥插頭並沒有一致的標準)。同時可透過 VBUS 和 GND 提供 5V 500mA。
  • TX1+、TX1-、TX2+、TX2-、RX1+、RX1-、RX2+、RX2-:Super Speed/Super Speed+ 訊號,或 Alternate Mode 訊號。
  • SBU1、SBU2:Side Band Use,用在 Alternate Mode。
    • 在類比耳麥模式時,是 MIC 和類比 GND (需要能自動切換,由於可能反插,且 TRRS 耳麥插頭並沒有一致的標準)。
註:文件上的 Downstream Facing Port (DFP) 指只能當主機,Upstream Facing Port (UFP) 指只能當週邊,Dual Role Port (DRP) 可能是 Dual Role Data (DRD) 指資料傳輸角色可當主機或週邊,或 Dual Role Power (DRP) 指供電可當 Source 或 Sink。

參考

  1. https://en.wikipedia.org/wiki/USB_hardware

SIP header Via

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