taocoding


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

认识正向代理与反向代理

发表于 2012-09-06 | 分类于 网络通讯 , 转载

原文地址http://zhuzhsh.iteye.com/blog/293437

1.正向代理的概念

正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

2.反向代理的概念

反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

  1. 两者区别

从用途上来讲:

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。

另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

从安全性来讲:

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。

反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。

python之命令行解析和运行外部命令

发表于 2012-09-06 | 分类于 Python

最近在做一个删除日志的脚步过程中用到了python,涉及到了命令行解析,运行外部程序,xml解析等。

Python中的命令行解析有几种方式,比如较古老的getopt,由于个人不太熟悉,选择了使用更方便的optparse.OptionParser,使用上非常像boost.program_option;运行外部程序也有多种方式,有类似system的调用和popen族,前者方便使用,但是不能得到命令运行的输出,后者则没有这个限制,帮助文档上面也比较推荐使用,以下是一个简单的demo,仅仅作为一个备忘吧。

import shlex, subprocess
import optparse

def option_parse():
parser = optparse.OptionParser()
parser.add_option(“-d”, “–duration”, dest=”duration”, default=”30”, help=”the duration need to delete from hadoop”)
parser.add_option(“-f”, “–cfg”, dest=”cfgfile”, default=”server_config.xml”, help=”config file”)
parser.add_option(“-q”, “–quiet”, action=”store_false”, dest=”verbose”, default=True, help=”don’t print status messages to stdout”)

return parser.parse_args()

def run_cmd(cmd):
try:
args = shlex.split(str(cmd))

    #args = shlex.split(cmd)
    print args
    p = subprocess.Popen(args, stdout=subprocess.PIPE)
    (output, err) = p.communicate()
    return output
except Exception,e:
    print e
    return ""

option_parse()
在run_cmd函数中,如果使用注释部分代码,有可能会出现编码方面的问题,具体为什么没有深究,加上str转换就好了。

小议TCP的MSS(最大分段)以及MTU

发表于 2012-08-03 | 分类于 网络通讯 , 转载

原文链接:http://cisco.chinaitlab.com/TCP/37527.html

[背景知识]

MTU: Maxitum Transmission Unit 最大传输单元

MSS: Maxitum Segment Size 最大分段大小(偶是直译,翻译的不好,不要打俺PP)

PPPoE: PPP Over Ethernet(在以太网上承载PPP协议)

[分析过程]

先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC

由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。

(注:小于64Bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生)

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。

当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。

对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是

降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一

个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。

对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。

对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求—不能分片(DF)。

花开两朵,各表一枝,说完MTU的故事我们该讲讲今天的第二个猪脚—PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。

为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入)由于以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,所以就出了这么一个怪胎:PPPoE。(有关PPPoE的详细介绍参见V大以及本站其他成员的一些介绍文章,我就不啰里啰唆的了)

PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。

如果两台主机之间的某段网络使用了PPPoE那么就会导致某些不能分片的应用无法通讯。

这个时候就需要我们调整一下主机的MTU,通过降低主机的MTU,这样我们就能够顺利地进行通讯了。

当然对于TCP应用而言还有另外的解决方案。

马上请出今天第三位猪脚:MSS。

MSS最大传输大小的缩写,是TCP协议里面的一个概念。

MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

介绍完这三位猪脚

我们回过头来看前言里面的那个问题,我们试想一下,如果我们在中间路由器上把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoE的MTU大小1492这样就不会造成无法通讯的问题.所以上面的问题可以通过ip tcp adjust-mss 1452来解决。

Use Vim like an IDE

发表于 2012-07-31 | 分类于 工具 , 转载

刚在新浪微博上面看到的,转下来留个记号,

原文链接http://vim.wikia.com/wiki/Use_Vim_like_an_IDE

I use Vim for all text editing, even software development. At one point I stopped using IDEs. One major reason is that Vim can do all the major things I need from IDEs (tabs, file trees, greping, syntax highlighting, indentation, completion, “quickfix”ing, etc).










## Contents

Vim Plugins

Still Vim needs plugins to do some IDE-like things that aren’t built in. Here are some Vim scripts that make Vim more like an IDE.

Note: You can use pathogen to isolate your plugins and make it easier to experiment with new plugins.

Project/Filetree Browsing

  • NERDTree is a tree explorer plugin for navigating the filesystem.
  • vtreeexplorer is a tree based file explorer.
  • project gives you a “project” view of files, rather than a straight file system view

Buffer/File Browsing

  • bufexplorer lets you navigate through open buffers
  • minibufexpl Elegant buffer explorer; takes very little screen space.
  • lookupfile Lookup files using Vim7 ins-completion
  • Command-T plugin, inspired by the “Go to File” window bound to Command-T in TextMate
  • MRU access recently opened files.

Code Browsing

  • taglist gives you an outline of the source you’re viewing
  • Tagbar similar to taglist but can order tags by scope. Recommend for programming languages with classes, e.g. C++, Java, Python.
  • Indexer generates tags for all files in project automatically and keeps tags up-to-date. Using ctags. Works well with project plugin or independently.
  • CCTree is a Call-Tree Explorer, Cscope based source-code browser, and code flow analyzer.
  • exUtility global search, symbol search, tag track…(Like IDE/Source Insight).
  • ShowMarks visually shows the location of marks.
    See also Browsing programs with tags and Cscope.

Writing Code

  • A plethora of code snippet/template plugins are available, many offering TextMate-like snippet features.
  • AutoComplPop gives you code completion as you type.
  • CRefVim A C-reference manual especially designed for Vim.
    See also Omni completion and Make Vim completion popup menu work just like in an IDE.

Vim Functionality

  • matchit improves % matching
  • bufkill allows you to delete a buffer without actually closing the window.
  • gundo visualizes your undo tree.
  • surround makes it easier to delete/change/add parentheses/quotes/XML-tags/much more.

IDE integration

You may want to use your IDE for some tasks like debugging, so some integration between Vim and the IDE can be helpful.

  • Integrate gvim with Visual Studio
  • Eclim brings Eclipse functionality to the Vim editor.

Source Control Integration

There are many Vim plugins for different source control management systems. Here are a few.

  • vcscommand.vim - CVS/SVN/SVK/git/hg/bzr integration plugin
  • fugitive - git integration
  • perforce - perforce integration
    See also Category:VersionControl

Debugging

There are several projects to add debugging functionality to vim

  • Clewn implements full gdb support in the vim editor: breakpoints, watch variables, gdb command completion, assembly windows, etc.
  • vim-debug, which creates an integrated debugging environment in VIM.
  • gdbvim plugin: Watch in vim what you debug in gdb. And more.

Refactoring

  • Vim as a refactoring tool and some examples in C sharp
  • refactor plugin
  • renamec plugin

Comments

When using Visual Studio, see ViEmu.


Code navigation in vi offers much more than a standard IDE, because of the ability to execute the desired combination of commands. Generate an index much more rapidly than an IDE with a heavy GUI interface:

For example, one can take advantage of the tag stack:

For C++, follow the instructions: on using OmniCpp Define a custom .ctags file

–c++-kinds=+p
–fields=+iaS
–extra=+q
–language-force=C++
From a console (the exclude options may vary) generate the tags file as follows:

ctags --exclude=.svn --exclude=target -R .

C++会提供标准的网络库?

发表于 2012-07-20 | 分类于 C++

2005年即提出的TR2中有提到下面几个议题:

  • Unicode
  • XML and HTML
  • Networking
  • Usability for novices and occasional programmers
    后来在05年和07年分别有两个Networking Library Proposal for TR2,参加以下链接

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1925.pdf
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2175.pdf(其实就是asio)

去年C++11终于发布,TR1中很多库也是顺利进入标准,今年年初asio作者又搞了报告

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3360.pdf

不知道最终asio是否会进入标准库。

从http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3374.htm可以了解到,今年10月会在波兰搞个网络相关统一议案,不知道那时C++网络库会不会有个大致的轮廓,坐等吧。

SCons基本概念

发表于 2012-07-08 | 分类于 工具

SCons环境当SCons开始构建工程,它会创建一个自己的环境,这个环境包括工程依赖关系树,帮助函数,创建者和一些其他的工具。这个环境一部分在内存中创建,另外一些存储到磁盘以便下次构建时加速。这个是SCons的环境,不同于使用Makefile的用户理解的系统环境。

系统环境是一个类似操作系统的环境容器,包括PATH,HOME等变量。通常可以通过os.environ在Python中获取,因此在SCons也是如此。SCons没有隐式导入任何系统环境设置(例如编译器选项,工具路径等),因为它被设计为行为可预见的跨平台工具。这也是为什么如果依赖一些系统环境变量,你必须自己通过SCons脚本隐式获取。

SConsturc是SCons执行的主脚本名,处理即从它开始。

SConscript也是SCons执行的脚本,只不过是放到工程的子目录。这些文件主要是为了进行分层级的编译,通过放在工程根目录的SConstruct包含。

Builder是一个SCons对象,你可以显式调用它在一系列源文件中指定编译依赖目标。SCons的威力是依赖关系会自动的被跟踪,当源文件更改后,系统会自动探测哪些目标需要重新构建。

SCanner另外一个SCons对象。它可以扫描额外依赖的源文件,这些依赖的文件不会被作为Builder的源文件编译。

Tool是任何扩展Builders,Scanners,和其他有助于SCons环境的外部组件,SCons通过扫描一些目标位置来寻找工具,这些工具可以是工程特定,也可以通过自己安装来扩展核心功能的。

原文为http://www.scons.org/wiki/BasicConcepts

准备把csdn文章导出了

发表于 2012-06-22 | 分类于 生活轨迹

终于整了个主机玩玩,拖了这么久,不容易啊。

折腾了2个小时,终于把以前在csdn的所有文章都搬过来了,第一次搞这些玩意,不容易啊,O(∩_∩)O哈哈~,以后又可以瞎写点东西了。多谢了http://nick.luckygarden.org/?p=250这篇博文,有空整理下搬迁过程,睡觉,明天还得去刷钱,端午节快乐。

 

ORM-Object-Relational Mapping

发表于 2011-08-07 | 分类于 未分类

记得去年初的时候,想研究下如何处理好数据库操作代码,当时看到过这个词,不过那会没有深入研究下去,刚刚闲逛中发现两款开源项目,留个记号。

http://sourceforge.net/apps/trac/litesql

http://www.codesynthesis.com/products/odb/

还有个依赖Qt的QxOrm,CodeProject上面有介绍。

 

C++对象内存结构之虚指针

发表于 2011-07-20 | 分类于 C++

虚函数对于C++进行OO的作用毋庸置疑,下面通过一个简单的实例对虚指针进行深入讲解

#include <cstring>
class VirtualClass
{
public:
virtual void foo()
{
}
};

class NoVirtualClass
{
public:
void foo()
{
}
};

int main(int, char [])
{
NoVirtualClass
pObjA = new NoVirtualClass;
VirtualClassobj;
VirtualClass*pObjB = new VirtualClass;

size_t nNoVirtual = sizeof(NoVirtualClass);
size_t nVirtual = sizeof(VirtualClass);

std::memset( pObjA, 0, nNoVirtual );
std::memset( &amp;obj, 0, nVirtual );
std::memset( pObjB, 0, nVirtual );

pObjA-&gt;foo();
obj.foo();
pObjB-&gt;foo();

return 0;

}
类NoVirtualClass的大小为1,《深度搜索C++对象模型》有解释,类VirtualClass大小为4,因为对于有virtual函数的C++类,每个对象都有个叫做vfptr的指针,在VS2008中调试上述代码可以看到如下信息:

-__vfptr0x00415740 const VirtualClass::`vftable’
[0]0x00411104 VirtualClass::foo(void)

上面的三个memset分别进行如下操作:

30行那个将pObjA所指的内存区域置0,也就是将其所指的那一个字节清零。

31和32行都是将__vfptr置空。

下面三个函数调用,就很有意思了,尤其是第三个调用,直接出现内存违例。

大家可以把上述代码放到VS中调试跟踪一把,肯定会让自己对C++内存对象模型以及虚函数指针有一个更深的理解。

 

C++版大数相加:字符串实现

发表于 2011-06-01 | 分类于 C++

所以大数即,一般的整数类型无法直接表示,通常即通过字符串表示,下面是用c++字符串实现相加,比较粗糙,但大致原理应该是表述清楚了:

std::string stringAdd( const std::string& strLeft, const std::string& strRight )
{
    //结果最长为较长数字加1
    int nLeftLength = strLeft.length();
    int nRigthLength = strRight.length();
    int nLargeLength = nLeftLength >= nRigthLength ? nLeftLength : nRigthLength;
    std::string strResult( nLargeLength+1, '0' );
    int nCount = 0;
    while( nLargeLength )
    {
        char nTempLeft;
        if( nLeftLength )
        {
            nTempLeft = strLeft[--nLeftLength];
        }
        else
        {
            nTempLeft = '0';
        }
        cout << "tempLeft:" << nTempLeft << std::endl;
        char nTempRigth;
        if( nRigthLength )
        {
            nTempRigth = strRight[--nRigthLength];
        }
        else
        {
            nTempRigth = '0';
        }
        cout << "tempRight:" << nTempRigth << std::endl;
        //计算当前位的值
        int nTemp = nTempLeft-'0' + nTempRigth-'0' + strResult[nLargeLength]-'0';
        cout << "temp:" << nTemp << std::endl;
        strResult[nLargeLength] = (nTemp%10)+'0';
        cout << "nLargeLength:" << nLargeLength << std::endl;
        //如果超过了10则应进1
        if( nTemp >= 10 )
        {
            strResult[nLargeLength-1] = 1+'0';
        }
        nLargeLength--;
    }
    return strResult;
}

 

1…456…16

billowqiu

157 日志
33 分类
10 标签
GitHub E-Mail
© 2020 billowqiu
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.3