协议整体参考解析:
1 921协议中的计数变量
Q921协议中有vs ,va, ns, nr, vr, 其基本含义如下:
1. 发送序列号NS
只有I帧包含N(S),即本I帧的发送序列号。在指定用于传输的序列I帧时,N(S) = V(S)。
2. 接收序列号NR
所有I帧和supervisory帧都包含N(R),即下一个对端预期接收到的发送序列号。 在指定上述类型的帧用于发送时,N(R)= V(R)。 N(R)表示前面N(R)-1个I帧都已经正确接收到。
3. 接收状态变量VR
当使用I帧命令和supervisory帧命令/响应时,每个点对点数据链路连接端点应具有相关的V(R)。 V(R)表示本端期望接收的下一个顺序I帧的序列号。 V(R)可以取0到n-1的值。 V(R)的值在接收到I 帧时递增1。
4. 发送状态变量VS
在使用I帧命令时,每个点对点数据链路连接端点应该具有一个相关联的V(S)。 V(S)表示本端下一个要发送的I帧的序号。V(S)可以取从0到n - 1的值, 且不应超过V(A),或超过k的最大值(K为允许暂存的I帧个数)。 V(S)的值在本端发送完I帧之后,递增1。 k的值的范围可能在 1≤k≤127。
5. 确认状态变量VA
当使用I帧命令和supervisory帧命令/响应时,每个点对点数据链路连接端点应该具有一个关联的V(A)。 V(A)表示最后被确认的I帧 (V(A)-1 即最后被确认I帧的N(S)值)。 V(A)可以取从0到n - 1的值。V(A)的值根据对端发过来frame的N(R)的值进行更新(见3.5.2.6)。 一个有效的N (R)值是在V (A)≤N (R)≤V (S)。
2 log解析示例
[L2L1(trac) ]@@: IN: itf:0, sapi:0, cmd_resp:0, tei:0, frame:
/******************************************************************************
//=======1. PBX发过来SETUP, ns为8表示本frame的序列号是8;nr为9,表示PBX端希望接收的frame序列号为9
*******************************************************************************/
[L2L1(trac) ]==== I Frame ====, ns:8, nr:9, pf:0
[L2L1(trac) ]0x41688508: 2e 00 04 00 00 01 10 12 08 02 7f 0e 05 a1 04 03
[L2L1(trac) ]0x41688518: 80 90 a3 18 03 a9 83 8e 6c 0d 20 80 31 33 32 38
[L2L1(trac) ]0x41688528: 38 36 31 33 39 30 31 70 09 80 38 38 36 31 33 39
[L2L1(trac) ]0x41688538: 30 32
[L2L1(trac) ][L2L3(trac) ]checkL2Entity, UP 0, TEI 0, admStatus_ enabled, l1Status_ active
[L2L3(trac) ]**UP: LD_DATA_MESSAGE, itf:0, sapi:0, tei:0
##Q931,cr:32526,itf:0,ie len:37,msg:[L2L3(trac) ]++++ SETUP ++++
[L2L3(trac) ]* SENDING COMPLETE IE
* BEARER CAP IE, length:3, content[0x]:80 90 a3
[L2L3(trac) ]* CHANNEL ID IE, length:3, content[0x]:a9 83 8e
[L2L3(trac) ]* CALLING PARTY NUMBER IE, length:13, content[0x]:20 80 31 33 32 38 38 36 31 33 39 30 31
[L2L3(trac) ]* CALLED PARTY NUMBER IE, length:9, content[0x]:80 38 38 36 31 33 39 30 32
[L2L3(trac) ][L2L3(trac) ]0x598984f4: 3b 34 00 00 00 00 00 00 4a 00 00 07 41 02 00 03
[L2L3(trac) ]0x59898504: 01 01 02 02 01 01 04 00 2a 08 02 7f 0e 05 a1 04
[L2L3(trac) ]0x59898514: 03 80 90 a3 18 03 a9 83 8e 6c 0d 20 80 31 33 32
[L2L3(trac) ]0x59898524: 38 38 36 31 33 39 30 31 70 09 80 38 38 36 31 33
[L2L3(trac) ]0x59898534: 39 30 32
[L2L3(trac) ]
[L2L1(trac) ]@@: OUT: itf:0, sapi:0, cmd_resp:0, tei:0, frame:
[L2L1(trac) ]==== RR ====, nr:9, pf:0
[L2L1(trac) ]0x416882f8: 04 00 00 00 00 01 01 12
/******************************************************************************
//=======2. 此时vr自增1变为9, vs在发送I frame之前仍为原来的值9, va=nr=9
*******************************************************************************/
[L2L1(trac) ][L2L1(trac) ]ifId = 0, state = 3, timerRecovery = 0, peerReceiverBusy = 0, maxK = 128, vs = 9, va = 9, k_ = 7,
[L2L1(trac) ]stopT200, itf:0, tei:0, state:3 rc:0 t200run_m:0.
[L2L3(trac) ]**DOWN: Q931_DATA_REQ_MESSAGE, itf:0, sapi:0, tei:0
##Q931,cr:32526,itf:0,ie len:5,msg:[L2L3(trac) ]++++ CALL PROC ++++
* CHANNEL ID IE, length:3, content[0x]:a9 83 8e
[L2L3(trac) ][L2L3(trac) ]0x598ff3cc: 1b 34 00 00 00 00 00 00 4a 00 00 0c 41 02 00 03
[L2L3(trac) ]0x598ff3dc: 01 01 02 02 01 01 04 00 0a 08 02 ff 0e 02 18 03
[L2L3(trac) ]0x598ff3ec: a9 83 8e
[L2L3(trac) ][L2L3(trac) ]checkL2Entity, UP 0, TEI 0, admStatus_ enabled, l1Status_ active
[L2L1(trac) ]ifId = 0, state = 3, timerRecovery = 0, peerReceiverBusy = 0, maxK = 128, vs = 9, va = 9, k_ = 7,
/******************************************************************************
//=======3. 此时vr是9,nr=vr=9, ns=vs, 表示本端发的第9个I frame.
*******************************************************************************/
[L2L1(trac) ]@@: OUT: itf:0, sapi:0, cmd_resp:1, tei:0, frame:
[L2L1(trac) ]==== I Frame ====, ns:9, nr:9, pf:0
[L2L1(trac) ]0x41688718: 0e 00 00 00 02 01 12 12 08 02 ff 0e 02 18 03 a9
[L2L1(trac) ]0x41688728: 83 8e
[L2L1(trac) ]L2IACS::sendQueuedFrames, send I frame: ifId:0 vs:9, va:9[L2L1(trac) ]startT200, itf:0, tei:0, state:3, timeout:1000 rc:0 t200run_m:0.
[L2L1(trac) ]@@: IN: itf:0, sapi:0, cmd_resp:1, tei:0, frame:
[L2L1(trac) ]==== RR ====, nr:10, pf:0
[L2L1(trac) ]0x41688928: 04 00 04 00 02 01 01 14
[L2L1(trac) ][L2L3(trac) ]checkL2Entity, UP 0, TEI 0, admStatus_ enabled, l1Status_ active
[L2L1(trac) ]multiframeMode, itf: 0, va: 9 has been verfied
/******************************************************************************
//=======4. vs在发送I frame之后自增为10, 这里收到RR,va=nr=10
*******************************************************************************/
[L2L1(trac) ]ifId = 0, state = 3, timerRecovery = 0, peerReceiverBusy = 0, maxK = 128, vs = 10, va = 10, k_ = 7,
[L2L1(trac) ]stopT200, itf:0, tei:0, state:3 rc:0 t200run_m:1.
[L2L3(trac) ]**DOWN: Q931_DATA_REQ_MESSAGE, itf:0, sapi:0, tei:0
##Q931,cr:240,itf:0,ie len:48,msg:[L2L3(trac) ]++++ SETUP ++++
[L2L3(trac) ]* SENDING COMPLETE IE
* BEARER CAP IE, length:3, content[0x]:80 90 a3
[L2L3(trac) ]* CHANNEL ID IE, length:3, content[0x]:a1 83 81
[L2L3(trac) ]* PROGRESS IND IE, length:2, content[0x]:80 81
[L2L3(trac) ]* CALLING PARTY NUMBER IE, length:15, content[0x]:01 81 30 30 31 33 32 38 38 36 31 33 39 30 31
[L2L3(trac) ]* CALLED PARTY NUMBER IE, length:14, content[0x]:81 30 30 31 33 32 38 38 36 31 33 39 30 32
[L2L3(trac) ][L2L3(trac) ]0x598fed30: 46 34 00 00 00 00 00 00 4a 00 00 0c 41 02 00 03
[L2L3(trac) ]0x598fed40: 01 01 02 02 01 01 04 00 35 08 02 00 f0 05 a1 04
[L2L3(trac) ]0x598fed50: 03 80 90 a3 18 03 a1 83 81 1e 02 80 81 6c 0f 01
[L2L3(trac) ]0x598fed60: 81 30 30 31 33 32 38 38 36 31 33 39 30 31 70 0e
[L2L3(trac) ]0x598fed70: 81 30 30 31 33 32 38 38 36 31 33 39 30 32
[L2L3(trac) ][L2L3(trac) ]checkL2Entity, UP 0, TEI 0, admStatus_ enabled, l1Status_ active
[L2L1(trac) ]ifId = 0, state = 3, timerRecovery = 0, peerReceiverBusy = 0, maxK = 128, vs = 10, va = 10, k_ = 7,
/******************************************************************************
//=======5. 此时vr还是9(因为没收到PBX发的I frame),nr=vr=9, ns=vs,表示本端发的第10个I frame.
*******************************************************************************/
[L2L1(trac) ]@@: OUT: itf:0, sapi:0, cmd_resp:1, tei:0, frame:
[L2L1(trac) ]==== I Frame ====, ns:10, nr:9, pf:0
[L2L1(trac) ]0x41688f58: 39 00 00 00 02 01 14 12 08 02 00 f0 05 a1 04 03
[L2L1(trac) ]0x41688f68: 80 90 a3 18 03 a1 83 81 1e 02 80 81 6c 0f 01 81
[L2L1(trac) ]0x41688f78: 30 30 31 33 32 38 38 36 31 33 39 30 31 70 0e 81
[L2L1(trac) ]0x41688f88: 30 30 31 33 32 38 38 36 31 33 39 30 32
[L2L1(trac) ]L2IACS::sendQueuedFrames, send I frame: ifId:0 vs:10, va:10[L2L1(trac) ]startT200, itf:0, tei:0, state:3, timeout:1000 rc:0 t200run_m:0.
[L2L1(trac) ]@@: IN: itf:0, sapi:0, cmd_resp:1, tei:0, frame:
[L2L1(trac) ]==== RR ====, nr:11, pf:0
[L2L1(trac) ]0x41689168: 04 00 04 00 02 01 01 16
[L2L1(trac) ][L2L3(trac) ]checkL2Entity, UP 0, TEI 0, admStatus_ enabled, l1Status_ active
/******************************************************************************
//=======6. vs在发送I frame之后自增为11, 这里收到RR,va=nr=11
*******************************************************************************/
[L2L1(trac) ]multiframeMode, itf: 0, va: 10 has been verfied
[L2L1(trac) ]ifId = 0, state = 3, timerRecovery = 0, peerReceiverBusy = 0, maxK = 128, vs = 11, va = 11, k_ = 7,
[L2L1(trac) ]stopT200, itf:0, tei:0, state:3 rc:0 t200run_m:1.