VoIP動作検証

## 概要
VoIPの勉強のため「基礎からわかるTCP/IP SIPによるVoIPプログラミング」のサンプルコードを動作させる。

※注意）サンプルプログラムの詳細は「基礎からわかるTCP/IP SIPによるVoIPプログラミング」を参照。

なお、オーディオデバイスの設定はできていない。alsaをインストールすれば/dev/dspファイルは作成するがopenに失敗していた。

## 環境
* osx上でmultipassで仮想マシン（Ubuntu20.04）を複数起動し構築する。
* SIPバーサはsiproxdを用いる

## 端末間の直接通信
### 作成環境
![名称未設定ファイル.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/37ca15e7-a94b-7803-4846-9025418fd505.png)

### SIPクライアントの設定
* ソースコードをビルドする。
<pre>gcc -o ./sipua -D_POSIX_PTHREAD_SEMANTICS -pthread rtp_ctrl.c stack_if.c stk_main.c sip_ctrl.c sdp.c sound.c codec.c sip_message.c</pre>

* sip.confの設定

クライアントA
<pre>rtp_port = 10000
user_name = user1
reg_svr = 192.168.2.100
use_svr = off</pre>
クライアントB
<pre>rtp_port = 10000
user_name = user2
reg_svr = 192.168.2.100
use_svr = off</pre>

* /etc/hostname
クライアントA：ua1.voip.org
クライアントB：ua2.voip.org

* /etc/nssswitch.conf
hostsにdnsを書いておくと、files(/etc/hosts)で解決できても DNSパケット送信することがあるのでdnsは無効化。
<pre>hosts:          files
# dns</pre>
* /etc/hosts
以下を追加する。なぜかサンプルプログラムがua1でドメイン名解決する処理があったのでua1も記載しておく。

<pre>192.168.64.19 ua1.voip.org ua1
192.168.64.20 ua2.voip.org ua2</pre>

* 動作結果
以下はクライアントA(user1)からクライアントB(user2)へ着信した場合の例。SIPプロトコルによるシーケンスが動作することを確認。なお、オーディオデバイスの設定はできていないが、RTPパケットは送信されていた（以下の記載からは割愛）。
<pre>No.     Time           Source                Destination           Protocol Length sport  Info
      7 55.672520      192.168.64.19         192.168.64.20         SIP/SDP  540    46488  Request: INVITE sip:user2@ua2.voip.org | 
      8 55.673621      192.168.64.20         192.168.64.19         SIP      321    38564  Status: 100 Trying | 
      9 55.673779      192.168.64.20         192.168.64.19         SIP      322    47324  Status: 180 Ringing | 
     10 60.442988      192.168.64.20         192.168.64.19         SIP/SDP  528    36473  Status: 200 OK | 
     11 60.444425      192.168.64.19         192.168.64.20         SIP      334    57753  Request: ACK sip:user2@ua2.voip.org | 
 294753 74.204702      192.168.64.19         192.168.64.20         SIP      369    41012  Request: BYE sip:user2@ua2.voip.org | 
 294755 74.206524      192.168.64.20         192.168.64.19         SIP      314    35579  Status: 200 OK | 
</pre>


## SIPサーバを経由させた通信
### 作成環境
![voipsrv.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/496fa277-9ed4-2ad0-475d-f1464d996362.png)

### SIPサーバインストール
* SIPサーバをインストールする。
<pre>sudo apt-get update
sudo apt-get install libosip2-dev
sudo apt-get install siproxd</pre>

* siproxd.conf を修正する
inbound,outboundのインタフェースを環境に合わせて修正する。
以下修正前後のconfのdiffコマンド。
<pre>20,21c20,21
< if_inbound  = enp0s2
< if_outbound = enp0s2
---
> if_inbound  = eth0
> if_outbound = ppp0
49,50c49,50
< hosts_allow_reg = 192.168.64.0/24
< hosts_allow_sip = 192.168.64.0/24
---
> #hosts_allow_reg = 192.168.1.8/24
> #hosts_allow_sip = 123.45.0.0/16,123.46.0.0/16
</pre>

* sip.confの設定

クライアントA
<pre>rtp_port = 10000
user_name = user1
reg_svr = 192.168.64.21
use_svr = on</pre>
クライアントB
<pre>rtp_port = 10000
user_name = user2
reg_svr = 192.168.64.21
use_svr = on</pre>

* クライアントの/etc/hosts
SIPサーバのドメインを記載する。
直接通信できないように対向クライアントの定義は無効化する。

<pre>192.168.64.19 ua1.voip.org ua1
#192.168.64.20 ua2.voip.org ua2
192.168.64.21 svr.voip.org</pre>

<pre>#192.168.64.19 ua1.voip.org ua1
192.168.64.20 ua2.voip.org ua2
192.168.64.21 svr.voip.org</pre>

* SIPサーバの/etc/hosts
<pre>192.168.64.19 ua1.voip.org ua1
192.168.64.20 ua2.voip.org ua2
192.168.64.21 svr.voip.org svr</pre>

* SIPサーバの起動
<pre>siproxd -c /etc/siproxd.conf </pre>

* 動作結果
以下はクライアントA(user1)でパケットキャプチャした場合の例。SIPサーバ経由でクライアントB(user2)と通信している。

<pre>No.     Time           Source                Destination           Protocol Length sport 
      1 0.000000       192.168.64.19         192.168.64.21         SIP      378    54963  Request: REGISTER sip:svr.voip.org  (1 binding) | 
      2 0.000976       192.168.64.21         192.168.64.19         SIP      341    5060   Status: 200 OK  (1 binding) | 
      9 54.653315      192.168.64.19         192.168.64.21         SIP/SDP  539    44627  Request: INVITE sip:user2@ua2.voip.org | 
     10 54.656013      192.168.64.21         192.168.64.19         SIP      320    5060   Status: 100 Trying | 
     11 54.656095      192.168.64.21         192.168.64.19         SIP      321    5060   Status: 180 Ringing | 
     12 59.075057      192.168.64.21         192.168.64.19         SIP/SDP  528    5060   Status: 200 OK | 
     13 59.075662      192.168.64.19         192.168.64.21         SIP      333    43864  Request: ACK sip:user2@ua2.voip.org | 
 271442 86.282511      192.168.64.21         192.168.64.19         SIP      452    5060   Request: BYE sip:user1@ua1.voip.org | 
 271443 86.283572      192.168.64.19         192.168.64.21         SIP      397    53241  Status: 200 OK | 
 271448 92.064110      192.168.64.19         192.168.64.21         SIP      374    47229  Request: REGISTER sip:svr.voip.org  (remove 1 binding) | 
 271449 92.065197      192.168.64.21         192.168.64.19         SIP      337    5060   Status: 200 OK  (removed 1 binding) | 
</pre>

## 参考
https://www.ohmsha.co.jp/book/9784274065590/

http://www.ne.jp/asahi/it/life/it/voip/sip/sip_programming.html