基于tcpdump实例讲解

前言

虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲解客户端和服务端的TCP/IP交互细节。

TCP/IP协议

IP头和TCP头格式如下:

111

333

单单看这些头会比较枯燥,后面会根据一个简单的客户端和服务端的TCP/IP报文交互实例讲解这些报文头的格式和含义

阅读全文…

JVM之垃圾回收机制

一. 收集器

JVM通过GC来回收堆和方法区中的内存,通常采用收集器的方式实现GC,主要的收集器有引用计数收集器和跟踪收集器。

1、 引用计数收集器

引用计数收集器采用分散式的管理方式,通过计数器记录对象是否被引用。

引用计数收集器需要在每次对象赋值时进行引用计数器的增减,有一定消耗;此外,引用计数收集器对于循环引用的场景无法实现回收。因此,Sun JDK在实现GC时未采用此种方式。

2、 跟踪计数器

跟踪计数器采用集中式的管理方式,全局记录数据的引用状态。主要有复制(Copying)、标记-清除(Mark-Sweep)和标记-压缩(Mark-Compact)三种实现算法:

    1) 复制(Copying)

    复制从根集合中扫描出存活的对象,并将找到的存活对象复制到一块新的未完全使用的空间中。

   2) 标记-清除(Mark-Sweep)

    标记-清除从根集合开始扫描,对存活的对象进行标记,扫描完毕后,再扫描整个空间中未标记的对象,并进行回收。

    3) 标记-压缩(Mark-Compact)

    标记-压缩采用和标记-清除一样的方式对存活对象进行标记,但在清除时有所不同。在回收不存活对象所占用的内存空间后,会将其他所有存活对象都往左端空闲的空间进行移动,并更新引用其对象的指针。

二、Sun JDK中可用的GC

Sun JDK中可用的GC方式如下图所示:

untitled

阅读全文…

java 内存区域

java虚拟机栈

      虚拟机栈描述的是java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧的虚拟机中从入栈的过程。

java堆

      java堆(java heap)是java虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都存这里分配内存。这一点在java虚拟机规范的中的描述是:所有的对象实例以级数组都要在堆上分配,但是随JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有对象都分配在堆上也渐渐变得不是那么“绝对”了。

      java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间和To Survivor空间。

 

346836_201201120933431TUz9

阅读全文…

iptables 应用初探(nat+三层访问控制)

iptables是一个Linux下优秀的nat+防火墙工具,我使用该工具以较低配置的传统pc配置了一个灵活强劲的防火墙+nat系统,小有心得,看了网上也有很多这方面的文章,但是似乎要么说的比较少,要么就是比较偏,内容不全,容易误导,我研究了一段时间的iptables同时也用了很久,有点滴经验,写来供大家参考,同时也备日后自己翻阅。

首先要说明的是,iptables操作的是2.4以上内核的netfilter.所以需要linux的内核在2.4以上。其功能与安全性远远比其前辈 ipfwadm,ipchains强大,iptables大致是工作在OSI七层的二、三、四层,其前辈ipchains不能单独实现对tcp/udp port以及对mac地址的的定义与操作,所以我想ipchains应该是仅仅工作在三层上的。

我们先简单介绍一下netfilter的大致工作流程,也就是一个数据包(或者叫分组、packet,我个人习惯叫包)在到达linux的网络接口的时候(网卡)如何处理这个包,然后再介绍一下如何用iptables改变或者说控制对这个数据包进行操作。

netfilter内部分为三个表,分别是 filter,nat,mangle,每个表又有不同的操作链(Chains)。

filter表:

在filter(过滤)表中,也就是他的防火墙功能的这个表,定义了三个 Chain。分别是INPUT,FORWARD,OUTPUT。也就是对包的入、转发、出进行定义的三个过滤链。对于这个filter表的操作和控制也是我们实现防火墙功能的一个重要手段。

nat表:

在nat(Network Address Translation、网络地址翻译)表中,也就是我们用以实现地址转换和端口转发功能的这个表,定义了PREROUTING, POSTROUTING,OUTPUT三个链,下面我们会对这三个链作详细的说明。

mangle表:

mangle表则是一个自定义表,里面包括上面的filter以及nat表中的各种chains,它可以让我们进行一些自定义的操作,同时这个mangle表中的chains在netfilter对包的处理流程中处在一个比较优先的位置,下面有一张图清晰的描绘了netfilter对包的处理流程,一般情况下,我们用不到这个mangle表,在这里我们就不做介绍了。

阅读全文…

ROS 5.X PPPOE Server账号到期web提醒

实现目得:当用户到期后不自动停止用户上网帐号而是把用户跳转到一个指定的网页提醒用户续费。

实现原理:通过判断ROS中的 comment 备注把用户pppoe帐号的profiles指定到一个特定的地址池再通过NAT把特定地址池指向到一个IP地址上。

PPPOE用户comment 格式如下:

QQ截图20120408205230

第一步:设置PPPOE的地址池

设置2个,一个是正常的,另外一个就是已经到期停止的

比如 正常的设置 10.1.11-10.1.1.254 名字叫做 pool

到期的地址池叫 pool1 地址为 172.19.1.10-172.19.1.250

加入针对以上172网段的一个NAT 强制跳转到 172.19.1.2 的80端口

/ip firewall nat add chain=dstnat src-address=172.19.1.0/24 src-address-list=!notify protocol=tcp action=dst-nat to-addresses=172.19.1.2

第二步:增加一个PPP Profiles

阅读全文…

基础知识路由协议与路由器原理

本文通过阐述TCP/IP网络中路由器的基本工作原理,介绍了IP路由器的几大功能,给出了静态路由协议和动态路由协议,以及内部网关协议和外部网关协议的概念,同时简要介绍了目前最常见的RIP、OSPF、BGP和BGP-4这几种路由协议,然后描述了路由算法的设计目标和种类,着重介绍了链路状态法和距离向量法。在文章的最后,扼要讲述了新一代路由器的特征。

——近十年来,随着计算机网络规模的不断扩大,大型互联网络(如Internet)的迅猛发展,路由技术在网络技术中已逐渐成为关键部分,路由器也随之成为最重要的网络设备。用户的需求推动着路由技术的发展和路由器的普及,人们已经不满足于仅在本地网络上共享信息,而希望最大限度地利用全球各个地区、各种类型的网络资源。而在目前的情况下,任何一个有一定规模的计算机网络(如企业网、校园网、智能大厦等),无论采用的是快速以大网技术、FDDI技术,还是ATM技术,都离不开路由器,否则就无法正常运作和管理。

1 网络互连

——把自己的网络同其它的网络互连起来,从网络中获取更多的信息和向网络发布自己的消息,是网络互连的最主要的动力。网络的互连有多种方式,其中使用最多的是网桥互连和路由器互连。

1.1 网桥互连的网络

——网桥工作在OSI模型中的第二层,即链路层。完成数据帧(frame)的转发,主要目的是在连接的网络间提供透明的通信。网桥的转发是依据数据帧中的源地址和目的地址来判断一个帧是否应转发和转发到哪个端口。帧中的地址称为“MAC”地址或“硬件”地址,一般就是网卡所带的地址。

——网桥的作用是把两个或多个网络互连起来,提供透明的通信。网络上的设备看不到网桥的存在,设备之间的通信就如同在一个网上一样方便。由于网桥是在数据帧上进行转发的,因此只能连接相同或相似的网络(相同或相似结构的数据帧),如以太网之间、以太网与令牌环(token ring)之间的互连,对于不同类型的网络(数据帧结构不同),如以太网与X.25之间,网桥就无能为力了。

——网桥扩大了网络的规模,提高了网络的性能,给网络应用带来了方便,在以前的网络中,网桥的应用较为广泛。但网桥互连也带来了不少问题:一个是广播风暴,网桥不阻挡网络中广播消息,当网络的规模较大时(几个网桥,多个以太网段),有可能引起广播风暴(broadcasting storm),导致整个网络全被广播信息充满,直至完全瘫痪。第二个问题是,当与外部网络互连时,网桥会把内部和外部网络合二为一,成为一个网,双方都自动向对方完全开放自己的网络资源。这种互连方式在与外部网络互连时显然是难以接受的。问题的主要根源是网桥只是最大限度地把网络沟通,而不管传送的信息是什么。

阅读全文…

IP分片和TCP分片 MTU和MSS

1,MTU(Maximum Transmission Unit,MTU),最大传输单元

(1)以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492个字节。链路层的这个特性称作MTU。不同类型的网络大多数都有一个上限。如果IP层有一个数据要传,且数据的长度比链路层的MTU还大,那么IP层就要进行分片(fragmentation),把数据报分成若干片,这样每一个分片都小于MTU。

(2)把一份IP数据报进行分片以后,由到达目的端的IP层来进行重新组装,其目的是使分片和重新组装过程对运输层(TCP/UDP)是透明的。由于每一分片都是一个独立的包,当这些数据报的片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。

(3)尽管IP分片过程看起来透明的,但有一点让人不想使用它:即使只丢失一片数据也要重新传整个数据报。why?因为IP层本身没有超时重传机制——由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(而不是一个分片),没有办法只重传数据报中的一个数据分片。

(4)使用UDP很容易导致IP分片,TCP试图避免IP分片。那么TCP是如何试图避免IP分片的呢?其实说白了,采用TCP协议进行数据传输是不会造成IP分片的,因为一旦TCP数据过大,超过了MSS,则在传输层会对TCP包进行分段(如何分,见下文!),自然到了IP层的数据报肯定不会超过MTU,当然也就不用分片了。而对于UDP数据报,如果UDP组成的IP数据报长度超过了1500,那么IP数据报显然就要进行分片,因为UDP不能像TCP一样自己进行分段。总结:UDP不会分段,就由我IP来分。TCP会分段,当然也就不用我IP来分了!

2,MSS(Maxitum Segment Size)最大分段大小的缩写,是TCP协议里面的一个概念

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

(2)相信看到这里,还有最后一个问题:TCP是如何实现分段的呢?其实TCP无所谓分段,因为每个TCP数据报在组成前其大小就已经被MSS限制了,所以TCP数据报的长度是不可能大于MSS的,当然由它形成的IP包的长度也就不会大于MTU,自然也就不用IP分片了。

备份Linux的方法(dd命令与cpio命令)

使用dd命令备份

dd命令可以读取磁盘设备的内容(几乎是直接读取扇区),然后将整个设备备份成一个文件。

# dd if="input file" of="output file" bs="block size" count="number"

if:input file,也可以是设备

of:output file,也可以使设备

bs:规划的一个block的大小,若不指定,默认是512bytes(一个扇区的大小)

count:多少个bs的意思

# dd if=/etc/passwd of=/tmp/passwd.back

/etc/passwd/tmp/passwd.back中去

# dd if=/dev/hdc of=/tmp/mbr.back bs=512 count=1

将自己磁盘上第一个扇区备份下来

找出系统最小的分区,并备份

# df -h

# dd if=/dev/hdc1 of=/tmp/boot.whole.disk 若想还原,就反向回去

dd命令可以创建大型文件:

# dd if=/dev/zero of=test.img bs=1M count=512

创建一个512M大小的文件test.img

其实这个也可以理解成为备份,只不过是一个全部被0填充的文件。

/dev/zero是已知输出0的设备

阅读全文…