<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[RPC超时重传机制浅析]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sun, 29 Aug 2010 06:51:10 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	SUN RPC是对socket的封装，其底层适用TCP或是UDP协议来传输数据，本文讨论SUN RPC使用的超时和重传策略。<br/><br/>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总超时值：一个客户端等待其服务器的应答的总时间量。TCP和UDP都是用该值；<br/>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重试超时：只用于UDP, 是一个客户等待其服务器的应答期间每次重传请求的间隔时间； <br/><br/>注：因TCP是可靠的面向连接的协议，有自己的一套机制来保证端到端的传输可靠性，故使用TCP建立的应用不需要考虑超时重传等问题。<br/> <br/><br/>默认的超时时间可以通过clnt_control函数获取，<br/><br/><div class="code">clnt = clnt_create (host, square_prog, square_vers, &quot;udp&quot;);&nbsp;&nbsp;<br/><br/>struct timeval tv;<br/>clnt_control(clnt, CLGET_TIMEOUT, (char *)&amp;tv);<br/>printf(&quot;timeout = %d : timout = %d&#92;n&quot;, tv.tv_sec, tv.tv_usec);<br/>clnt_control(clnt, CLGET_RETRY_TIMEOUT, (char *)&amp;tv);</div><br/>printf(&quot;timeout = %d : timeout = %d&#92;n&quot;, tv.tv_sec, tv.tv_usec);<br/> <br/><br/>其中，UDP的默认总超时值为-1，重传超时值为5s（unp书上说是15s）;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCP的默认总超时值为0（unp书上说是30s）；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;跟书上不同的地方应该是由于RPC的版本不同吧。<br/>为了对这些数据进行验证，以square程序为例，通过改变clnt_call传递的TIMEOUT值及服务器端处理请求前的睡眠时间值，我做了几个实验：（超时值还可以通过clnt_control来指定，此时rpc_call忽略参数timeout）<br/>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIMEOUT = &#123;2，0&#125;，服务器端睡眠10s，使用tcp协议；<br/>现象：客户端2s后提示call failed: rpc: time out，服务器接收到一次请求。<br/>&nbsp;&nbsp; 分析： 与期望相吻合，应用请求超过总的超时值时返回。&nbsp;&nbsp;<br/><br/>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIMEOUT = &#123;2, 0&#125;, 服务器端睡眠10s，使用udp协议；<br/><br/>现象：客户端5s后提示call failed: rpc: time out，服务器接收到一次请求。<br/><br/>分析：不明白，不是2s就提示超时么。<br/>于是，我猜测是不是使用udp时，总的超时值不能小于重传时间呢?&nbsp;&nbsp;<br/>做如下试验：通过clnt_control将UDP的重试时间改成10s，TIMEOUT值不变，仍为2s。<br/>现象：客户端10s后提示call failed: rpc: time out，服务器接收到一次请求。&nbsp;&nbsp;<br/>分析：我的猜测可能是正确的，RPC在实现时将总的超时值设为重传值和TIMEOUT中的较大值，不过这仅仅是猜测，没有看过SUN RPC实现的代码，不敢往下断言。<br/>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIMEOUT = &#123;25, 0&#125;, 服务器睡眠10s，使用tcp协议；<br/>现象：客户端10s后收到应答，服务器收到一次请求。<br/>分析：与期望相符合，整个请求没有超出总的超时值。<br/>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TIMEOUT = &#123;25, 0&#125;, 服务器睡眠10s，使用udp协议；<br/>现象：客户端在快到11s时收到一个回复，而服务器收到三次请求。<br/>分析： <br/>l&nbsp;&nbsp;0s时，客户端启动后发送请求，服务器端接受该请求，处理时睡眠10s；<br/>l&nbsp;&nbsp; 5s时，客户端重发请求，服务器端接受该请求，等待第一个请求处理完后。<br/>l&nbsp;&nbsp;10s时，客户端再次发送请求，服务器端接受该请求，等待前两次请求处理完. <br/>不到1s后，客户端收到回复，这是服务器对第一个请求的应答，程序结束。<br/>l&nbsp;&nbsp;20s后，服务器端处理完第二个请求；<br/>l&nbsp;&nbsp;20s后，服务器端处理完第三个请求；<br/>服务器睡眠10s就返回结果，为什么客户端会发出第三次请求？<br/>因为网络延时，服务器从收到第一个请求，到睡眠10s，处理数据，返回结果时已经是10s之后的事情了，而客户端在10s时就发送了第三次请求，并马上收到了服务器对第一次请求的应答数据。<br/>以上是我对SUN RPC超时和重传机制的一点理解，望不吝赐教！<br/><br/><br/>来源：http://blog.chinaunix.net/u2/87570/showart_2201021.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] RPC超时重传机制浅析]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>