<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Tcpcopy on kamuszhou&#39;s blog</title>
    <link>https://ykyi.net/tags/tcpcopy/</link>
    <description>Recent content in Tcpcopy on kamuszhou&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 20 Nov 2013 02:48:59 +0000</lastBuildDate>
    <atom:link href="https://ykyi.net/tags/tcpcopy/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>昨天解决了tcpcopy的一个小却很重要的bug.</title>
      <link>https://ykyi.net/?p=1041/</link>
      <pubDate>Wed, 20 Nov 2013 02:48:59 +0000</pubDate>
      <guid>https://ykyi.net/?p=1041/</guid>
      <description>&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;tcpcopy的基础函数有个bug，流量比较大的时候，内核buffer满了。send系统调用发不完用户缓冲中的数据才会出现。然后加入了tcpcopy的QQ群，和作者稍稍讨论了一点时间。问了关于写论文和tc_session.c过于复杂的问题。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:16px;&#34;&gt;(wangb) 10:00:55 &lt;br /&gt; &lt;a href=&#34;https://github.com//tcpcopy/pull/162&#34;&gt;https://github.com//tcpcopy/pull/162&lt;/a&gt;&lt;br /&gt; (wangb) 10:01:04 &lt;br /&gt; The bug arises when send system call returns with part of data transfered&lt;br /&gt; and part of data still need to be sent again.&lt;br /&gt; (wangb) 10:01:13 &lt;br /&gt; 常见于压力比较大的场合&lt;br /&gt; (wangb) 10:02:14 &lt;br /&gt; 当然如果系统参数设置好的话，这样的情况不常见。这也是为啥我这边无法重现的原因所在&lt;br /&gt; (wangb) 10:02:46 &lt;br /&gt; 当然昨天在开发gryphon，貌似遇到过一次&lt;br /&gt; (wangb) 10:03:06 &lt;br /&gt; gryphon给的压力，有时候真不是一般快和大&lt;br /&gt; siu1ooooooo(16236914) 10:03:14 &lt;br /&gt; 我在tcpcopy上作二次开发。碰到了个bug，最后追踪到了 tc_socket_send函数。&lt;br /&gt; siu1ooooooo(16236914) 10:03:52 &lt;br /&gt; 流量比较大的时候，内核buffer满了。send系统调用发不完用户缓冲中的数据才会出现。&lt;br /&gt; siu1ooooooo(16236914) 10:05:21 &lt;br /&gt; 希望能贡献更多代码的。。但是tc_session.c这个模拟tcp状态机的代码太难看懂了。&lt;br /&gt; (wangb) 10:05:49 &lt;br /&gt; 有些bug，程序员自身很难发现，往往需要依赖于用户的反馈，当然有上面的bug提出，就更好了&lt;br /&gt; tc_session.c这个模拟tcp状态机，其实不仅模拟tcp状态机，而为复杂的是模拟上层应用交互&lt;br /&gt; 光模拟tcp状态机，是远远不够的&lt;br /&gt; siu1ooooooo(16236914) 10:07:27 &lt;br /&gt; 有个想法， 把TCP的11个标准状态加入到tc_session中。可不可以做的。.&lt;br /&gt; (wangb) 10:09:13 &lt;br /&gt; 数据是死的，但测试服务器是活的。应该可以吧，但加入可能会更复杂。tc_session.c这个会进一步改进的，代码需简化和功能需独立，使其易懂&lt;br /&gt; siu1ooooooo(16236914) 10:09:31 &lt;br /&gt; 🙂&lt;br /&gt; (wangb) 10:10:33 &lt;br /&gt; 2010～2012.5月，初步探索阶段；2012.5～2014.5，为进一步探索阶段 2014.5～以后，进一步优化&lt;br /&gt; 因为tcpcopy刚开始，开发人员是无法知道复杂的互联网的各种应用的特性的，只有积累到一定程度，才能进一步优化。与其说是开发，不如说是探索&lt;br /&gt; siu1ooooooo(16236914) 10:12:10 &lt;br /&gt; 期待工程paper  &lt;br /&gt; siu1ooooooo(16236914) 10:12:43 &lt;br /&gt; tcpcopy稳定到了一个版本。先别加功能了。写paper吧  &lt;br /&gt; siu1ooooooo(16236914) 10:13:01 &lt;br /&gt; 投中EI应该问题不大。&lt;br /&gt; siu1ooooooo(16236914) 10:13:55 &lt;br /&gt; 中了paper，贡献者会迅速增多。&lt;br /&gt; wangb() 10:15:43 &lt;br /&gt; 其实写过sigcomm论文，但被拒，说应该投USENIX ATC&lt;br /&gt; wangb() 10:16:18 &lt;br /&gt; I don&amp;rsquo;t think that the research contribution of the paper is a good match for Sigcomm. Perhaps it would be a better match for &lt;br /&gt; a more practice-oriented conference like USENIX ATC. &lt;br /&gt; siu1ooooooo(16236914) 10:16:50 &lt;br /&gt; 后来呢&lt;br /&gt; wangb() 10:17:05 &lt;br /&gt; 确实，tcpcopy是基于实践的，从实践中摸索爬行的。后来我就先不写论文了&lt;br /&gt; siu1ooooooo(16236914) 10:17:22 &lt;br /&gt; 嗯。这是个工程实践性很强的探索啊&lt;br /&gt; wangb() 10:17:27 &lt;br /&gt; 要写论文，必须要有条件&lt;br /&gt; siu1ooooooo(16236914) 10:17:45 &lt;br /&gt; 喔。&lt;br /&gt; wangb() 10:18:06 &lt;br /&gt; 从交换机或者其它设备。镜像过来，这样测试系统和在线系统就没有关联，这样的论文是能够中USENIX ATC&lt;br /&gt; 的&lt;br /&gt; wangb() 10:19:13 &lt;br /&gt; tcpcopy最高端的应用，就是在交换机，利用分光镜或者其它镜像设备，利用高性能硬件，把用户的请求数据包复制给测试系统，可惜我没有这样的条件&lt;br /&gt; wangb() 10:19:38 &lt;br /&gt; 要是有这样的条件，我肯定要写论文了&lt;br /&gt; siu1ooooooo(16236914) 10:19:55 &lt;br /&gt; 呃。。没怎么看懂  &lt;br /&gt; siu1ooooooo(16236914) 10:21:49 &lt;br /&gt; 是说复制的流量要非常非常大才能中论文么&lt;br /&gt; siu1ooooooo(16236914) 10:21:59 &lt;br /&gt; 而非常大的流量需求硬件支持&lt;br /&gt; wangb() 10:22:02 &lt;br /&gt; twitter梦想的测试环境，其实完全可以用我们的tcpcopy来实现。交换机上面不是有来来往往的数据包吗？在那上面把请求数据包镜像到测试系统，测试系统搭一个跟在线类似的完整系统，这样测试系统跟在线系统承受类似的压力&lt;br /&gt; wangb() 10:22:17 &lt;br /&gt; 高端大气，才能中论文&lt;br /&gt; wangb() 10:22:48 &lt;br /&gt; 屌丝环境，写论文，还不被批啊&lt;br /&gt; siu1ooooooo(16236914) 10:23:14 &lt;br /&gt; 呃。是 。。。明白了。。想起以前学校的事情，懂了。&lt;br /&gt; wangb() 10:24:38 &lt;br /&gt; 总之，tcpcopy值得你去研究，期望有更多接班人把思想传承下去，代码可以推掉重来&lt;br /&gt; wangb() 10:25:10 &lt;br /&gt; 只要tcp协议还存在，这个思想，应该是最先进的，无法再先进了&lt;br /&gt; siu1ooooooo(16236914) 10:26:11 &lt;br /&gt; 需要好多的开发时间啊。..嗯。先上班了啊。多谢wangbin….&lt;br /&gt; wangb() 10:27:16 &lt;br /&gt; 慢慢来，这方面反正国外没有人做&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>tcpcopy在视频广告组的二次开发</title>
      <link>https://ykyi.net/?p=1022/</link>
      <pubDate>Wed, 16 Oct 2013 09:01:05 +0000</pubDate>
      <guid>https://ykyi.net/?p=1022/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;流量筛选中的 “只导入某频道的流量”功能已经实现了。&lt;/p&gt;
&lt;p&gt;技术层面上，实际上是通过指定正则式的方法匹配HTTP请求中的GET方法中的URL来达到过滤的目的。&lt;/p&gt;
&lt;p&gt;所以，也可以用ty，ad_type, pf, coverid, oadid, v，plugin等出现在GET方法中的参数编写正则式来过滤流量。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;流量筛选中的“地域纬度筛选”暂时没有实现。&lt;/p&gt;
&lt;p&gt;因为地域纬度的信息不是以参数形式出现在GET方法的URL中，需要通过IP地址或者cookie的中QQ号信息来判断。&lt;/p&gt;
&lt;p&gt;还没最终决定是否实现这个功能。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;tcpcopy官方版本主要的应用场景是复制实时流量。所以部署的时候至少两台机器，一台线上机，另一台测试用机。为了方便压力测试，还引入了至少三台机器的高级模式。&lt;/p&gt;
&lt;p&gt;部署起来比较麻烦。&lt;/p&gt;
&lt;p&gt;如果“视频CPM广告的模拟投放，以及订单效果预估“只是从磁盘中读入以往的流量，针对这种场景，可以探索tcpcopy的单机离线模式，做到方便部署和使用。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;部分同学有一个误解.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;ldquo;将线上的实际访问流量，复制一份保存到本地服务器，用于后续使用&amp;rdquo;&lt;/p&gt;
&lt;p&gt;目前，tcpcopy的官方的版本没有把流量保存下来的功能，保存流量这个目前是用tcpdump的-w选项来做的。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;另外，技术上，tcpdump只能在IP层和TCP层指定过滤条件，不能用业务的逻辑过滤流量。第1点提到的流量筛选工作在tcpcopy读入实时流量时，或者从tcpdump存下的文件中读入流量时，在应用层指定过滤条件。&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color: rgb(0, 0, 0); font-family: Verdana, Geneva, sans-serif; font-size: 16px; line-height: 22px;&#34;&gt;copyright ykyi.net&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>用线上机测试tcpcopy基本通过。支持旧模式，Advanced模式失败</title>
      <link>https://ykyi.net/?p=999/</link>
      <pubDate>Mon, 09 Sep 2013 01:54:06 +0000</pubDate>
      <guid>https://ykyi.net/?p=999/</guid>
      <description>&lt;p class=&#34;p0&#34;&gt;
  &lt;b&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;测试结果介绍：&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体;color:blue&#34;&gt;在编译期配置成使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;NFQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体;color:blue&#34;&gt;模式，用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;Raw Socket&lt;/span&gt;&lt;span style=&#34;font-family:宋体;&lt;br /&gt;&lt;br /&gt;
color:blue&#34;&gt;抓包。线上机的流量被成功复制并导向测试机。经改动的&lt;span lang=&#34;EN-US&#34;&gt;tcpd&lt;/span&gt;初期工作正常。&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;改动版的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpd(&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;实际上是一个&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;echo&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;服务器&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。测试机上的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpd&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;把收到的报文被打印到日志文件。但日志文件到&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;6M&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;大小的时候，就停止打印。目前还没有查到原因，可能是改动后的&lt;span lang=&#34;EN-US&#34;&gt;tcpd&lt;/span&gt;的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;Bug&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。此时，&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpdump&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;仍然抓到大量从线上机复制来的真实流量到达测试机。&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;应该是工作正常的。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体;color:blue&#34;&gt;tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体;color:blue&#34;&gt;被编译成使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体;color:blue&#34;&gt;抓包时&lt;/span&gt;&lt;span style=&#34;font-family:宋体;color:red&#34;&gt;不能&lt;/span&gt;&lt;span style=&#34;font-family:宋体;&lt;br /&gt;&lt;br /&gt;
color:blue&#34;&gt;在线上机上正常工作。&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;tcpdump&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;没有抓到预期从线上机复制到测试机的报文。原因是：线上机&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;10.130.68.100&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;上的真实流量从网络接口&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tunl0:0&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;进入，从网络接口&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;eth1&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;发出。分析&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpd&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;的日志发现，&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpd&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;只拿到&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tunl0&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;IP&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;，没有发现&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tunl0:0&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;IP&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。需要了解&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;IP&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;隧道，和&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;库的相关知识，有可能解决这个问题。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体;color:blue&#34;&gt;编译成使用&lt;span lang=&#34;EN-US&#34;&gt;Raw Socket&lt;/span&gt;抓包，和&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;Advanced&lt;/span&gt;&lt;span style=&#34;font-family:宋体;color:blue&#34;&gt;模式时，&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;启动失败，错误日志显示&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;Advanced&lt;/span&gt;&lt;span style=&#34;font-family:宋体;&lt;br /&gt;&lt;br /&gt;
color:blue&#34;&gt;模式只能使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体;color:blue&#34;&gt;库抓包。&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;因此，只有在解决&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;正确识别&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tunl0:0&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;网络接口后，才能在线上机上运行&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;b&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;预备知识：&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;Tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;可以编译成用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;抓包或者使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;Raw Socket&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;抓包。&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;Libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;库是&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpdump&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;使用的抓包库，&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;Raw Socket&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;是操作系统内建的功能。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;官方文档建议用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;抓包，以获得更高性能和较低丢包率。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;Tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;在编译期指定工作模式。&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;目前有两种工作模式，一种使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;IPQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;技术或者&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;NFQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;技术。&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;NFQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;技术是用来替代&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;IPQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;技术的。我们目前使用的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tlinux&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;，内建了&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;NFQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;内核模块，没有开启&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;IPQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;模块。因为&lt;span lang=&#34;EN-US&#34;&gt;NFQueue&lt;/span&gt;是内建的即&lt;span lang=&#34;EN-US&#34;&gt;CONF_XXXXXX = y&lt;/span&gt;，而不是编译成模块，即&lt;span lang=&#34;EN-US&#34;&gt;CONF_XXXXX = m, &lt;/span&gt;所以我们在环境中不需要使用&lt;span lang=&#34;EN-US&#34;&gt;modprobe &lt;/span&gt;加载&lt;span lang=&#34;EN-US&#34;&gt;IPQueue&lt;/span&gt;或者&lt;span lang=&#34;EN-US&#34;&gt;NFQueue&lt;/span&gt;模块。忽略官方文档中提到的&lt;span lang=&#34;EN-US&#34;&gt;modprobe ip_queue&lt;/span&gt;。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;b&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;测试步骤：&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;使用&lt;span lang=&#34;EN-US&#34;&gt;NFQueue&lt;/span&gt;模式：&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;线上机：&lt;span lang=&#34;EN-US&#34;&gt;10.130.68.100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;编译&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;时指定使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;NFQueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。&lt;span style=&#34;color:blue&#34;&gt;不要指定 &lt;/span&gt;&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;color:blue&#34;&gt;&amp;#8211;enable-pcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;，则默认使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;raw socket&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;抓包。用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;pcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;抓包时识别不到网络接口&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tunl0:0&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;，而&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tunl0:0&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;是真实流量的入口。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;# ./configure &amp;#8211;enable-nfqueue &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;#./make&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;生成的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;在 &lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;src/tcpcopy &lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;目录下。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;运行&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;命令，把流量复制到测试机：&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;# ./tcpcopy -x 80-10.213.243.156 &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;测试机：&lt;span lang=&#34;EN-US&#34;&gt;10.213.243.156&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;编译&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tcpcopy&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;时同样指定&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;&amp;#8211;enable-nfqueue&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;，不要指定&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;&amp;#8211;enable-pcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。然后运行&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;intercept&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;# ./intercept&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;&amp;nbsp;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;使用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;Advanced&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;模式：&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span style=&#34;font-family:宋体&#34;&gt;因为暂时未能解决用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;libpcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;识别到网络设备&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;tunel0:0&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;的问题，实际上&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;Advanced&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;模式暂时不能工作。根据以前的使用经验，用&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;Advanced&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;模式时需要注意两点：&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;1. &lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;在&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;./configure&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;时指定 &lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;&amp;#8211;enable-advaned &lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;和 &lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;&amp;#8211;enable-pcap&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;2. Advanced&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;模式需要两台测试机，需要设成一条路由把复制后的真实流量导向测试机。需要更改默认路由：删掉当前的默认路由，新的默认路由从正确的网卡指向测试机&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;的&lt;/span&gt;&lt;span lang=&#34;EN-US&#34;&gt;IP&lt;/span&gt;&lt;span style=&#34;font-family:宋体&#34;&gt;。&lt;span lang=&#34;EN-US&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;# route del default&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;# route add default gw 10.213.243.156 dev eth1&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&#34;p0&#34;&gt;
  &lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style=&#34;color: rgb(0, 0, 0); font-family: Verdana, Geneva, sans-serif; font-size: 16px; line-height: 22px;&#34;&gt;copyright ykyi.net&lt;/span&gt;&lt;span lang=&#34;EN-US&#34; style=&#34;font-family:宋体&#34;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;
&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tcpcopy初体验.</title>
      <link>https://ykyi.net/?p=984/</link>
      <pubDate>Mon, 26 Aug 2013 03:28:13 +0000</pubDate>
      <guid>https://ykyi.net/?p=984/</guid>
      <description>&lt;p&gt;Tcpcopy 初体验&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Tcpcopy是一个模拟真实流量的测试工具。它的工作基本思想是，从已经上线的服务器复制一份真实流量到测试服务器。Tcpcopy的代码开源，代码仓库放在&lt;a href=&#34;https://github.com/wangbin579/tcpcopy&#34;&gt;https://github.com/wangbin579/tcpcopy&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;经过初步学习，已成功在公司的测试机器上部署tcpcopy，并用简单的DEMO程序测试达到预期目的。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;**1.**&lt;strong&gt;安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因为作者写的安装介绍只提到最基本的信息，而测试环境各不一样，在我用的测试机的实际安装过程中碰到一些问题。这时问题在这里列出，以供后来者参考，以节省时间。测试机：10.12.194.199 ； 10.12.194.212 ； 10.12.194.214 。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.1&lt;/strong&gt; &lt;strong&gt;需要额外安装的库：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;需要在网站 &lt;a href=&#34;http://www.netfilter.org&#34;&gt;www.netfilter.org&lt;/a&gt; 下载 libmnl， libnfnetlink， libnetfilter_queue 三个工程并安装。 安装顺序为 libmnl， libnfnetlink, libnetfilter_queue，因为第三个依赖第二个，第二个依赖第一个。安装方法是GNU工具的传统三板斧方式： ./configure ; make; make install。这三个工程生成三个.so库放置到/usr/local/lib，而我们用的操作系统环境并没有把该目录列在默认查找库文件的目录列表中，因此要编辑 /etc/ld.so.conf 文件，把目录/usr/local/lib 加入，再运行 ldconfig 更新ld链接程序使用的cache。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.2 IP_Queue****和NFQueue内核模块：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这两个内核模块给在用户空间编写处理内核空间中传递网络数据包提供接口。它们的区别是IP_Queue是旧的实现，仅支持IPv4，NFQueue是新的实现。Tcpcopy工程依赖这两个模块之一。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Tcpcopy官方文档中多次提到tcpcopy在内核版本小于3.5时默认使用IP_Queue，并在使用例子中有一步操作：&lt;/p&gt;
&lt;p&gt;# modprobe ip_queue&lt;/p&gt;
&lt;p&gt;这个操作是确保加载ip_queue模块到内核。&lt;/p&gt;
&lt;p&gt;我们的测试环境的内核版本号是2.6.32，按照官方文档介绍，内核版本小于3.5，于是使用#modprobe ip_queue命令，结果报错显示我们使用的内核没有启用动态模块加载。&lt;/p&gt;
&lt;p&gt;于是再用 # zcat /proc/config.gz 检查当前内核的配置，发现CONFIG_IP_NF_QUEUE is not set, 说明IP_Queue模块没有被buit-in，再查找NFQueue的配置项发现 CONFIG_NETFILTER_NETLINK_QUEUE=y。&lt;/p&gt;
&lt;p&gt;所以，在我们的环境中，应该忽略官方文档中# modprobe ip_queue，我们的内核已经内建了比IPQueue更新的&lt;strong&gt;NFQueue****。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.3&lt;/strong&gt; &lt;strong&gt;编译安装tcpcopy&lt;/strong&gt;**：**&lt;/p&gt;
&lt;p&gt;官方文档中把已经正常运行业务的服务器称为在线服务器(online server)，把运行待测试用的服务器称为目标服务器(target server)。&lt;/p&gt;
&lt;p&gt;在在线服务器端运行配置命令时务必指定 –enable-nfqueue，这是因为我们用的内核中只有NFQueue，如果不指定这个选项，编译出的tcpcopy不会运行成功，会在日志文件中报错：please make sure ip queue is running.&lt;/p&gt;
&lt;p&gt;# ./configure –enable-nfqueue –enable-pcap&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
