<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tamkovich.com: Телеком/VoIP блог &#187; t38</title>
	<atom:link href="http://tamkovich.com/tag/t38/feed/" rel="self" type="application/rss+xml" />
	<link>http://tamkovich.com</link>
	<description>Современные технологии: Asterisk, SIP, Kamailio, Linux, Cisco, Linksys</description>
	<lastBuildDate>Mon, 30 Jan 2012 11:42:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Zoiper не отправляет факсы через Asterisk 1.6.2</title>
		<link>http://tamkovich.com/2010/05/zoiper-fax-problem-through-asterisk-162/</link>
		<comments>http://tamkovich.com/2010/05/zoiper-fax-problem-through-asterisk-162/#comments</comments>
		<pubDate>Fri, 14 May 2010 19:50:47 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[t38]]></category>
		<category><![CDATA[Zoiper]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=1271</guid>
		<description><![CDATA[В связи с тем, что поддержка Asterisk 1.6.0 и Asterisk 1.6.1 закончилась 1го мая, внимательно присматриваюсь к Asterisk 1.6.2. В нём есть множество интересных решений, например неблокирующие вызовы sip_rtp_read(), ast_rtp_read(), новый механизм конференций app_confbridge и много другое. Но вот отправить факсы с помощью Zoiper (вплоть до версии 2.27) вы не сможете. При попытке отправить факс [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
В связи с тем, что <a href=http://tamkovich.com/2010/05/asterisk-160-161-end-of-support/ >поддержка Asterisk 1.6.0 и Asterisk 1.6.1 закончилась 1го мая</a>, внимательно присматриваюсь к <a href=http://tamkovich.com/asterisk/ >Asterisk</a> 1.6.2. В нём есть множество интересных решений, например неблокирующие вызовы sip_rtp_read(), ast_rtp_read(), новый механизм конференций app_confbridge и много другое. Но вот отправить факсы с помощью Zoiper (вплоть до версии 2.27) вы не сможете. При попытке отправить факс с помощью Zoiper, вы увидите следующее:
</p>
<pre>
[May 14 14:16:15] WARNING[31798]: chan_sip.c:8749 process_sdp_c: Unable to lookup
RTP Audio host in c= line, 'IN IP4 8000'
[May 14 14:16:15] WARNING[31798]: chan_sip.c:8397 process_sdp: Insufficient information
in SDP (c=)...
</pre>
<p><span id="more-1271"></span></p>
<p align=justify>
Дело в том, что Zoiper нарушает <a href=http://tools.ietf.org/html/rfc4566 >RFC4566 &#8211; SDP: Session Description Protocol</a>. Согласно этому документу, параметр SDP &#8216;c=&#8217; должен быть использован для указания адреса соединения:
</p>
<blockquote><pre>
5.7.  Connection Data ("c=")

      c=&lt;nettype&gt; &lt;addrtype&gt; &lt;connection-address&gt;

   The "c=" field contains connection data.

   A session description MUST contain either at least one "c=" field in
   each media description or a single "c=" field at the session level.
   It MAY contain a single session-level "c=" field and additional "c="
   field(s) per media description, in which case the per-media values
   override the session-level settings for the respective media.

   The first sub-field ("&lt;nettype&gt;") is the network type, which is a
   text string giving the type of network.  Initially, "IN" is defined
   to have the meaning "Internet", but other values MAY be registered in
   the future (see Section 8).

   The second sub-field ("&lt;addrtype&gt;") is the address type.  This allows
   SDP to be used for sessions that are not IP based.  This memo only
   defines IP4 and IP6, but other values MAY be registered in the future
   (see Section 8).

   The third sub-field ("&lt;connection-address&gt;") is the connection
   address.  OPTIONAL sub-fields MAY be added after the connection
   address depending on the value of the &lt;addrtype&gt; field.

   ...
</pre>
</blockquote>
<p align=justify>
В действительности же Zoiper пытается в поле &#8216;c=&#8217; указать порт, не смотря на то, что он уже указан в поле &#8216;m=&#8217;:</p>
<pre>
s=Zoiper_session
c=IN IP4 8000
t=0 0
m=image 8000 udptl t38
</pre>
<p>а вот Linksys SPA2102 (прошивка 5.1.12) заполняет все поля корректно:</p>
<pre>
s=-
c=IN IP4 10.10.10.201
t=0 0
m=image 16474 udptl t38
</pre>
</p>
<p align=justify>
Zoiper заполняет неверно поле &#8216;c=&#8217; только для сообщения re-INVITE, которое должно запустить t38 сессию. Сообщение INVITE, инициирующее голосовое соединение, составляется корректно:</p>
<pre>
s=Zoiper_session
c=IN IP4 10.10.10.202
t=0 0
m=audio 8000 RTP/AVP 8 3 101
</pre>
<p>Самое интересное заключается в том, что <a href=http://tamkovich.com/asterisk/ >Asterisk</a> 1.6.0 отлично передавал факсы отправленные с помощью Zoiper, не смотря на нарушение RFC. Вероятно <a href=http://tamkovich.com/asterisk/ >Asterisk</a> стал чувствительным к ошибке, после внедрения нового алгоритма обработки SDP <a href=http://tamkovich.com/asterisk/ >Asterisk</a> 1.6.2 revision 227760.</p>
]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/05/zoiper-fax-problem-through-asterisk-162/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Почему Asterisk 1.6.0 не подходит для production</title>
		<link>http://tamkovich.com/2010/02/asterisk-1-6-0-not-for-production/</link>
		<comments>http://tamkovich.com/2010/02/asterisk-1-6-0-not-for-production/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 08:32:16 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[Mera]]></category>
		<category><![CDATA[t38]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=929</guid>
		<description><![CDATA[Прошло полтора года, с момента релиза Asterisk 1.6.0, а качество кода до сих пор оставляет желать лучшего. Виной тому, на мой взгляд, эксперименты с политикой релизов, введения 4х значных версий (A.B.C.D) и прочие, подобные наноинновации. Как говорится, &#171;Asterisk уже не тот!&#187; :) Лично для меня, сегодня существует 3 ключевые проблемы в ветке 1.6.0 (срез за [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
Прошло полтора года, с момента релиза <a href=http://tamkovich.com/asterisk/ >Asterisk</a> 1.6.0, а качество кода до сих пор оставляет желать лучшего. Виной тому, на мой взгляд, эксперименты с политикой релизов, введения 4х значных версий (A.B.C.D) и прочие, подобные наноинновации. Как говорится, &laquo;<a href=http://tamkovich.com/asterisk/ >Asterisk</a> уже не тот!&raquo; :)
</p>
<p><span id="more-929"></span></p>
<p align=justify>
Лично для меня, сегодня существует 3 ключевые проблемы в ветке 1.6.0 (срез за декабрь 2009 &#8211; февраль 2010), не позволяющие использовать её промышленно.</p>
<ul>
<li> <a href=https://issues.asterisk.org/view.php?id=16608 >Issue #16608</a> &#8211; Под большой нагрузкой (~150) звонков, <a href=http://tamkovich.com/asterisk/ >Asterisk</a> лочится. Подобное поведение, на мой взгляд, худшая из возможных проблем. Вылавливать подобные ошибки гораздо сложнее сегфолтов, кроме того, их невозможно моментально обнаружить, по этому клиенты испытывают перерывы связи до пары минут.
<li> Несовместимость T.38 с Mera. Во второй половине 2009 года, над стеком T.38 в <a href=http://tamkovich.com/asterisk/ >Asterisk</a> была проделана большая работа, направленная на повышение совместимости, однако результат, на мой взгляд, оказался противоположным. Возможно, виновата сама Mera, т.к. она не шлёт заголовок T38MaxBitRate, тем не менее эта же Mera (Mera DAMOS 1.3.2.20 &#8211; 1.3.2.40) Корректно работает со срезом <a href=http://tamkovich.com/asterisk/ >Asterisk</a> 1.6.0 за февраль &#8211; апрель 2009 года.
<li> Сегфолты на некоторых факсах. Происходят не часто &#8211; пару раз в неделю при большой нагрузке. Вероятней всего сегфолты, это ещё одно следствие перетрубаций со стеком T.38.
</ul>
</p>
<p align=justify>
Таким образом, текущий срез ветки 1.6.0 серьёзно уступает транку времён <a href=http://tamkovich.com/asterisk/ >Asterisk</a> 1.4, тогда можно было смело брать trunk для production. Сейчас надо очень тщательно выбирать даже из версий ветки 1.6.0, что уж говорить про 1.6.1 и 1.6.2. Судя по всему, понимают сложившуюся ситуацию и в Digium, недавно было объявлено, об очередном изменении политики релизов. Но об этом в следующей заметке :)</p>
]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/02/asterisk-1-6-0-not-for-production/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ReceiveFAX, Cisco и ошибка 420 &#171;Bad extension&#187;</title>
		<link>http://tamkovich.com/2010/01/receivefax-cisco-sip-420-bad-extension/</link>
		<comments>http://tamkovich.com/2010/01/receivefax-cisco-sip-420-bad-extension/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 11:58:22 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[fax]]></category>
		<category><![CDATA[SIP]]></category>
		<category><![CDATA[t38]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=870</guid>
		<description><![CDATA[Если вы недавно обновили Asterisk, вы, скорее всего, не можете принять факс с помощью команды ReceiveFAX() :) В ответ на T38 reINVITE, Cisco ответит Вам SIP/2.0 420 Bad Extension. Если всмотреться в ответ внимательнее, то увидим: SIP/2.0 420 Bad Extension Via: SIP/2.0/UDP 10.10.10.207:5060;branch=z9hG4bK514b3ee2;rport From: &#60;SIP:1000@10.10.10.207&#62;;tag=as6951d52f To: &#60;SIP:1010@10.10.10.220&#62;;tag=67D56388-98E Call-ID: B51F13DD-FDDA11DE-8C59D5E5-5043F4E7@10.10.10.220 CSeq: 102 INVITE Unsupported: timer Content-Length: [...]]]></description>
			<content:encoded><![CDATA[<p align=Justify>
Если вы недавно обновили <a href=http://tamkovich.com/asterisk/ >Asterisk</a>, вы, скорее всего, не можете принять факс с помощью команды ReceiveFAX() :) В ответ на T38 reINVITE, <a href=http://tamkovich.com/cisco/ >Cisco</a> ответит Вам <a href=http://tamkovich.com/tag/sip/ >SIP</a>/2.0 420 Bad Extension. Если всмотреться в ответ внимательнее, то увидим:</p>
<pre>
<a href=http://tamkovich.com/tag/sip/ >SIP</a>/2.0 420 Bad Extension
Via: <a href=http://tamkovich.com/tag/sip/ >SIP</a>/2.0/UDP 10.10.10.207:5060;branch=z9hG4bK514b3ee2;rport
From: &lt;<a href=http://tamkovich.com/tag/sip/ >SIP</a>:1000@10.10.10.207&gt;;tag=as6951d52f
To: &lt;<a href=http://tamkovich.com/tag/sip/ >SIP</a>:1010@10.10.10.220&gt;;tag=67D56388-98E
Call-ID: B51F13DD-FDDA11DE-8C59D5E5-5043F4E7@10.10.10.220
CSeq: 102 INVITE
Unsupported: timer
Content-Length: 0
</pre>
<p><a href=http://tamkovich.com/cisco/ >Cisco</a> ругается, на присутствие в ReINVITE заголовка &laquo;Require: timer&raquo;. Лечится это, добавлением  параметра:</p>
<pre>
session-timers=refuse
</pre>
<p>в файл <a href=http://tamkovich.com/tag/sip/ >SIP</a>.conf. Эта директива отключает поддержку таймеров  <a href=http://tamkovich.com/tag/sip/ >SIP</a>- сессий (RFC 4028).
</p>
<p align=Justify>
Дело в том, что в режиме session-timers=accept (по умолчанию), <a href=http://tamkovich.com/asterisk/ >Asterisk</a> работает с таймерми в том случае, если клиент поддерживает их. <a href=http://tamkovich.com/asterisk/ >Asterisk</a> считает, что клиент поддерживает таймеры, если в сообщении INVITE от клиента имеется заголовок Session-Expires или если если клиент ответил 200 OK на INVITE пришедший от <a href=http://tamkovich.com/asterisk/ >Asterisk</a>, который содержал заголовок Session-Expires. <a href=http://tamkovich.com/cisco/ >Cisco</a> (AS5350 IOS 12.3(3b)) не поддерживает таймеры, но и не отклоняет первоначальный INVITE от <a href=http://tamkovich.com/asterisk/ >Asterisk</a> &#8211; отсюда между устройствами возникает недопонимание.</p>
]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2010/01/receivefax-cisco-sip-420-bad-extension/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Кевин Флеминг о факсах в Asterisk</title>
		<link>http://tamkovich.com/2009/12/asterisk-fax-report/</link>
		<comments>http://tamkovich.com/2009/12/asterisk-fax-report/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 11:08:04 +0000</pubDate>
		<dc:creator>Сергей Тамкович</dc:creator>
				<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[fax]]></category>
		<category><![CDATA[t38]]></category>

		<guid isPermaLink="false">http://tamkovich.com/?p=688</guid>
		<description><![CDATA[Ведущий разработчик Asterisk, Kevin Fleming, опубликовал большую статью о текущем состоянии факсов в Asterisk. В ней, Кевин рассказывает о работе, проделанной за последний год. Работа была проделана колоссальная. Подробно описывается развитие, от первой реализации T.38 passthrough только для SIP каналов, до текущей, полноценной поддержки факсов: теперь Asterisk может не только передавать факсы между абонентами, но [...]]]></description>
			<content:encoded><![CDATA[<p align=justify>
Ведущий разработчик <a href=http://tamkovich.com/asterisk/ >Asterisk</a>, Kevin Fleming, опубликовал <a href=http://blogs.asterisk.org/2009/12/03/state-of-fax-primarily-t-38-in-asterisk-trunk-planning-for-1-8-release/ >большую статью</a> о текущем состоянии факсов в <a href=http://tamkovich.com/asterisk/ >Asterisk</a>. В ней, Кевин рассказывает о работе, проделанной за последний год. Работа была проделана колоссальная.
</p>
<p align=justify>
Подробно описывается развитие, от первой реализации T.38 passthrough только для <a href=http://tamkovich.com/tag/sip/ >SIP</a> каналов, до текущей, полноценной поддержки факсов: теперь <a href=http://tamkovich.com/asterisk/ >Asterisk</a> может не только передавать факсы между абонентами, но и самостоятельно принимать и отправлять их с помощью T.38. Во время работы над этим функционалом, возникло большое количество проблем в совместимости различных реализаций T.38. Вот что пишет на этот счёт Кевин:
</p>
<p><span id="more-688"></span></p>
<blockquote><p>
 In addition, the T.38 negotiation process was redesigned to allow <a href=http://tamkovich.com/asterisk/ >Asterisk</a> applications to actually be T.38 endpoints; this resulted in the ability to send and receive FAX over audio *and* T.38 links.</p>
<p>Once this got into the community’s hands, we started seeing large numbers of bug reports because users could not successfully FAX over T.38 with various ATAs and service providers.  I won’t go into the gory details of why this was the case, except to repeat a recent quote from Steve himself on IRC: “The T.38 spec was written after a night of heavy drinking as a joke.”. While that’s not technically true, it is true that compliance with the T.38 recommendation, primarily in the <a href=http://tamkovich.com/tag/sip/ >SIP</a>/SDP negotiations area, is very poor across the industry. Producing a T.38 endpoint that interoperates widely is a complex and difficult process, that can only be achieved through hours and hours (and hours) of testing.
</p></blockquote>
<p align=justify>
Теперь о планах на будущее. Следующий релиз <a href=http://tamkovich.com/asterisk/ >Asterisk</a> будет носить номер 1.8. К моменту выхода 1.8 app_fax будет разделен на 2 части: res_fax и res_fax_spandsp. Модуль res_fax будет содержать приложения для диалплана и функции для согласования параметров T.38 сессии. Второй модуль &#8211; res_fax_spandsp обеспечивает непосредственно работу с факсом (T.30). В данном случае это обертка для библиотеки spandsp. Такое решение обусловлено тем, что Digium с одной стороны стремится оставить открытой максимальную часть кода, а с другой стороны предоставляет коммерческое решение для факсов. Т.е. весь проприетарный код вынесен в отдельный субмодуль &#8211; res_fax_digium. Этот модуль и есть коммерческое <a href=http://www.digium.com/en/products/software/faxforasterisk.php >Fax for Asterisk</a>.
</p>
<p align=justify>
С выходом версии 1.8 начнётся работа над FAX relay &#8211; механизмом способным преобразовывать T.38 в G711 и обратно. Предположительно, FAX relay будет реализован с помощью нового API в res_fax.
</p>
<ul>
<li> <a href=http://blogs.asterisk.org/2009/12/03/state-of-fax-primarily-t-38-in-asterisk-trunk-planning-for-1-8-release/ >State of FAX (primarily T.38) in Asterisk trunk (planning for 1.8 release)</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tamkovich.com/2009/12/asterisk-fax-report/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

