TCP/IP的三次握手
2009-07-23 15:03
211 查看
TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后数据传送,最后拆除连接三个过程
并且TCP在建立连接时又分三步走:
第一步是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号;
第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。 然后才开始通信的第二步:数据处理。
这就是所说的TCP三次握手(Three-way Handshake)。
简单的说就是:(C:客户端,S:服务端)
C:SYN到S
S:如成功--返回给C(SYN+ACK)
C:如成功---返回给S(ACK)
以上是正常的建立连接方式,但如下:
假设一个C向S发送了SYN后无故消失了,那么S在发出SYN+ACK应答报文后是无法收到C的ACK报文的(第三次握手无法完成),这种情况下S一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个C出现异常导致S的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,S将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果S的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使S的系统足够强大,S也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟C的正常请求比率非常之小),此时从正常客户的角度看来,S失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。
以上的例子常被称作DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)
注意:其中这儿的C和S都是相对的,对于现在的计算机来讲,只要自己的计算机建立任一服务,在一定情况下都可被称为S
解决办法:在你的计算机上安装防火墙
个人防火墙一般我们可采用学习模式来让防火墙自己来进行分析
有一点得说明,防火墙是无杀毒功能的,同时也无法清除垃圾邮件,简单点讲它只起到一个过滤作用
======================
在TCP三次握手后插入伪造的TCP包
在TCP三次握手后插入伪造的TCP包
一、说明
用Socket的API Connect完成TCP建立连接的三次握手,同时子进程抓包,抓完三次握手的包后,插入第四个包即可,从对端返回的第五个包来看插入成功了,但因为插入了一个TCP包,之后的连接将发生混乱。可以将插入的那个包Data设置为HTTP Request,向WEB服务器提交请求。又如果目标系统的TCP序列号是可预计算的,那么是否可以做带伪源地址的Blind TCP three-time handshakes和插入,值得试验!
二、脚本
1、用到几个模块Net::RawIP Net::Pcap Net::PcapUtils NetPacket;
2、pretty_table()函数是我原来做的,用来在命令行下打印表格(Table);
3、测试环境-Linux、ADSL拨号,抓包的接口是ppp0,帧的结构和Eth帧结构不同,不能使用NetPacket::Ethernet模块中的strip函数处理帧首部,根据ethereal抓包的结构,我使用unpack函数取得了帧中的IP包;
三、源代码
#!/usr/bin/perl
#By i_am_jojo@msn.com, 2005/04
use strict;
use warnings;
use Net::RawIP;
use Net::PcapUtils;
use NetPacket::Ethernet;
use NetPacket::IP;
use NetPacket::TCP;
use Socket;
use Getopt::Std;
use POSIX qw(strftime);
my %opts;
getopts('ht:p:u:n:', /%opts);
print_help() and exit if(defined($opts{'h'}));
print_help() and exit if(not defined($opts{'t'}) or not defined($opts{'p'}));
die "/tInvalid Target Ipaddress!/n"
if(defined($opts{'t'}) and $opts{'t'} !~ m/^/d+./d+./d+./d+$/);
die "/tInvalid Service Port!/n"
if(defined($opts{'p'}) and $opts{'p'} !~ m/^/d+$/);
my $request;
if(defined($opts{'u'})) {
$request = "GET $opts{'u'} HTTP/1.1/r/n";
$request.= "Accept: text/html; text/plain/r/n";
$request.= "/r/n";
} else {
$request = "GET / HTTP/1.1/r/n";
$request.= "Accept: text/html; text/plain/r/n";
$request.= "/r/n";
}
my $child = fork();
if($child == 0) {
#child process
my ($next_packet, %next_header);
my ($frame_hdr, $ip_packet);
my ($ip_obj, $tcp_obj);
my $counter = 0;
my $pkt_descriptor = Net::PcapUtils::open(
FILTER => 'ip',
PROMISC => 0,
DEV => 'ppp0',
#DEV => 'eth0'
);
die "Net::PcapUtils::open returned: $pkt_descriptor/n" if (!ref($pkt_descriptor));
print strftime '%Y/%m/%d %H:%M:%S, ', localtime and print "begin sniffing .../n";
while(($next_packet, %next_header) = Net::PcapUtils::next($pkt_descriptor)) {
($frame_hdr, $ip_packet) = unpack 'H32a*', $next_packet;
$ip_obj = NetPacket::IP->decode($ip_packet);
#$ip_obj = NetPacket::IP->decode(NetPacket::Ethernet::eth_strip($next_packet));
next if ($ip_obj->{'proto'} != 6);
next if (($ip_obj->{'src_ip'} ne $opts{'t'})
and ($ip_obj->{'dest_ip'} ne $opts{'t'}));
$tcp_obj = NetPacket::TCP->decode($ip_obj->{'data'});
next if (($tcp_obj->{'src_port'} ne $opts{'p'})
and ($tcp_obj->{'dest_port'} ne $opts{'p'}));
$counter++;
print "==ID.$counter==", '=' x 60, "/n";
print get_ip_hdr($ip_obj);
print get_tcp_hdr($tcp_obj);
if($tcp_obj->{'data'}) {
my $data;
$data = unpack 'a*', $tcp_obj->{'data'};
$data =~ s/[/r][/n]//g;
print pretty_table('TCP data', [$data]);
}
if($counter == 3) {
my $a = new Net::RawIP;
$a->set({
'ip' => {
'id' => $ip_obj->{'id'} + 1,
'saddr' => $ip_obj->{'src_ip'},
'daddr' => $ip_obj->{'dest_ip'}
},
'tcp' => {
'source' => $tcp_obj->{'src_port'},
'dest' => $tcp_obj->{'dest_port'},
'seq' => $tcp_obj->{'seqnum'},
'ack_seq' => $tcp_obj->{'acknum'},
'window' => $tcp_obj->{'winsize'},
'data' => $request,
'psh' => 1,
'ack' => 1
}
});
$a->send;
}
last if($counter == 5);
}
exit;
} else {
sleep(1);
my $trans_serv = getprotobyname('tcp');
my $dest_sockaddr = sockaddr_in($opts{'p'}, inet_aton($opts{'t'}));
socket(TCP_SOCK, PF_INET, SOCK_STREAM, $trans_serv);
connect(TCP_SOCK, $dest_sockaddr);
sleep(1);
#close TCP_SOCK;
}
exit;
sub print_help {
print <<HELP
%./iamFool.pl [-h] <-t,-p,-u,-n>
-h print help
-t target ipaddr
-p service port
-u requested url
by:i_am_jojo/@msn.com
HELP
}
sub get_ip_hdr {
my $ip_obj = shift;
my @ip_hdr;
push @ip_hdr, [qw(ver tos flags id src_ip proto)];
push @{$ip_hdr[1]}, $ip_obj->{$_} foreach (qw(ver tos flags id src_ip proto));
push @ip_hdr, [qw(hlen len foffset ttl dest_ip cksum)];
push @{$ip_hdr[3]}, $ip_obj->{$_} foreach (qw(hlen len foffset ttl dest_ip cksum));
return pretty_table('IP Header', @ip_hdr);
}
sub get_tcp_hdr {
my $tcp_obj = shift;
my @tcp_hdr;
push @tcp_hdr, [qw(src_port seqnum hlen flags)];
push @{$tcp_hdr[1]}, $tcp_obj->{$_} foreach (qw(src_port seqnum hlen flags));
push @tcp_hdr, [qw(dest_port acknum reserved winsize)];
push @{$tcp_hdr[3]}, $tcp_obj->{$_} foreach (qw(dest_port acknum reserved winsize));
return pretty_table('TCP Header', @tcp_hdr);
}
sub pretty_table {
# prettyTable($aString, @aList); @aList = ( [...], [...] );
# by i_am_jojo@msn.com
my ($title, @data) = @_;
my @temp;
my @max_length;
my $row_length;
my $indent = 4;
my $the_table;
foreach my $col (0..$#{$data[0]}) { push @{$temp[$col]}, $_->[$col] foreach (@data); }
$max_length[$_] = length( (sort{length($b) <=> length($a)} @{$data[$_]} )[0]) + 2 foreach (0..$#data);
$row_length+= $max_length[$_] foreach (0..$#{$temp[0]});
$row_length+= $#data;
$the_table = ' ' x $indent.'+'.'-' x $row_length."+/n";
$the_table.= ' ' x $indent.'| '.$title.' ' x ($row_length - length($title) - 1)."|/n";
foreach my $row (0..$#temp) {
$the_table.= ' ' x $indent;
$the_table.= '+'.'-' x $max_length[$_] foreach (0.. $#{$temp[0]});
$the_table.= "+/n";
$the_table.= ' ' x $indent;
$the_table.= '| '.@{$temp[$row]}[$_].' ' x ($max_length[$_] - length(@{$temp[$row]}[$_]) - 1) foreach (0.. $#{$temp[0]});
$the_table.= "|/n";
}
$the_table.= ' ' x $indent;
$the_table.= '+'.'-' x $max_length[$_] foreach (0.. $#{$temp[0]});
$the_table.= "+/n";
return $the_table;
}
四、结果举例
==Result eXample==
2005/05/02 21:51:23, begin sniffing ...
==ID.1==============================================================
+---------------------------------------------------+
| IP Header |
+--------+---------------+---------+----------------+
| ver | 4 | hlen | 5 |
+--------+---------------+---------+----------------+
| tos | 0 | len | 60 |
+--------+---------------+---------+----------------+
| flags | 2 | foffset | 0 |
+--------+---------------+---------+----------------+
| id | 20682 | ttl | 64 |
+--------+---------------+---------+----------------+
| src_ip | 218.11.149.14 | dest_ip | 64.233.189.104 |
+--------+---------------+---------+----------------+
| proto | 6 | cksum | 31878 |
+--------+---------------+---------+----------------+
+------------------------------------------+
| TCP Header |
+----------+------------+-----------+------+
| src_port | 32851 | dest_port | 80 |
+----------+------------+-----------+------+
| seqnum | 1104143983 | acknum | 0 |
+----------+------------+-----------+------+
| hlen | 10 | reserved | 0 |
+----------+------------+-----------+------+
| flags | 2 | winsize | 5808 |
+----------+------------+-----------+------+
==ID.2==============================================================
+---------------------------------------------------+
| IP Header |
+--------+----------------+---------+---------------+
| ver | 4 | hlen | 5 |
+--------+----------------+---------+---------------+
| tos | 0 | len | 44 |
+--------+----------------+---------+---------------+
| flags | 0 | foffset | 0 |
+--------+----------------+---------+---------------+
| id | 63029 | ttl | 241 |
+--------+----------------+---------+---------------+
| src_ip | 64.233.189.104 | dest_ip | 218.11.149.14 |
+--------+----------------+---------+---------------+
| proto | 6 | cksum | 26154 |
+--------+----------------+---------+---------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 80 | dest_port | 32851 |
+----------+------------+-----------+------------+
| seqnum | 3660731207 | acknum | 1104143984 |
+----------+------------+-----------+------------+
| hlen | 6 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 18 | winsize | 4356 |
+----------+------------+-----------+------------+
==ID.3==============================================================
+---------------------------------------------------+
| IP Header |
+--------+---------------+---------+----------------+
| ver | 4 | hlen | 5 |
+--------+---------------+---------+----------------+
| tos | 0 | len | 40 |
+--------+---------------+---------+----------------+
| flags | 2 | foffset | 0 |
+--------+---------------+---------+----------------+
| id | 20684 | ttl | 64 |
+--------+---------------+---------+----------------+
| src_ip | 218.11.149.14 | dest_ip | 64.233.189.104 |
+--------+---------------+---------+----------------+
| proto | 6 | cksum | 31896 |
+--------+---------------+---------+----------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 32851 | dest_port | 80 |
+----------+------------+-----------+------------+
| seqnum | 1104143984 | acknum | 3660731208 |
+----------+------------+-----------+------------+
| hlen | 5 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 16 | winsize | 5808 |
+----------+------------+-----------+------------+
==ID.4==============================================================
+---------------------------------------------------+
| IP Header |
+--------+---------------+---------+----------------+
| ver | 4 | hlen | 5 |
+--------+---------------+---------+----------------+
| tos | 16 | len | 89 |
+--------+---------------+---------+----------------+
| flags | 2 | foffset | 0 |
+--------+---------------+---------+----------------+
| id | 20685 | ttl | 64 |
+--------+---------------+---------+----------------+
| src_ip | 218.11.149.14 | dest_ip | 64.233.189.104 |
+--------+---------------+---------+----------------+
| proto | 6 | cksum | 31830 |
+--------+---------------+---------+----------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 32851 | dest_port | 80 |
+----------+------------+-----------+------------+
| seqnum | 1104143984 | acknum | 3660731208 |
+----------+------------+-----------+------------+
| hlen | 5 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 24 | winsize | 5808 |
+----------+------------+-----------+------------+
+--------------------------------------------+
| TCP data |
+--------------------------------------------+
| GET / HTTP/1.1Accept: text/html; text/plai |
+--------------------------------------------+
==ID.5==============================================================
+---------------------------------------------------+
| IP Header |
+--------+----------------+---------+---------------+
| ver | 4 | hlen | 5 |
+--------+----------------+---------+---------------+
| tos | 0 | len | 40 |
+--------+----------------+---------+---------------+
| flags | 0 | foffset | 0 |
+--------+----------------+---------+---------------+
| id | 47931 | ttl | 241 |
+--------+----------------+---------+---------------+
| src_ip | 64.233.189.104 | dest_ip | 218.11.149.14 |
+--------+----------------+---------+---------------+
| proto | 6 | cksum | 41256 |
+--------+----------------+---------+---------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 80 | dest_port | 32851 |
+----------+------------+-----------+------------+
| seqnum | 3660731208 | acknum | 1104144033 |
+----------+------------+-----------+------------+
| hlen | 5 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 16 | winsize | 4356 |
+----------+------------+-----------+------------+
===End===
并且TCP在建立连接时又分三步走:
第一步是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号;
第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。 然后才开始通信的第二步:数据处理。
这就是所说的TCP三次握手(Three-way Handshake)。
简单的说就是:(C:客户端,S:服务端)
C:SYN到S
S:如成功--返回给C(SYN+ACK)
C:如成功---返回给S(ACK)
以上是正常的建立连接方式,但如下:
假设一个C向S发送了SYN后无故消失了,那么S在发出SYN+ACK应答报文后是无法收到C的ACK报文的(第三次握手无法完成),这种情况下S一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个C出现异常导致S的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,S将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果S的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使S的系统足够强大,S也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟C的正常请求比率非常之小),此时从正常客户的角度看来,S失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。
以上的例子常被称作DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)
注意:其中这儿的C和S都是相对的,对于现在的计算机来讲,只要自己的计算机建立任一服务,在一定情况下都可被称为S
解决办法:在你的计算机上安装防火墙
个人防火墙一般我们可采用学习模式来让防火墙自己来进行分析
有一点得说明,防火墙是无杀毒功能的,同时也无法清除垃圾邮件,简单点讲它只起到一个过滤作用
======================
在TCP三次握手后插入伪造的TCP包
在TCP三次握手后插入伪造的TCP包
一、说明
用Socket的API Connect完成TCP建立连接的三次握手,同时子进程抓包,抓完三次握手的包后,插入第四个包即可,从对端返回的第五个包来看插入成功了,但因为插入了一个TCP包,之后的连接将发生混乱。可以将插入的那个包Data设置为HTTP Request,向WEB服务器提交请求。又如果目标系统的TCP序列号是可预计算的,那么是否可以做带伪源地址的Blind TCP three-time handshakes和插入,值得试验!
二、脚本
1、用到几个模块Net::RawIP Net::Pcap Net::PcapUtils NetPacket;
2、pretty_table()函数是我原来做的,用来在命令行下打印表格(Table);
3、测试环境-Linux、ADSL拨号,抓包的接口是ppp0,帧的结构和Eth帧结构不同,不能使用NetPacket::Ethernet模块中的strip函数处理帧首部,根据ethereal抓包的结构,我使用unpack函数取得了帧中的IP包;
三、源代码
#!/usr/bin/perl
#By i_am_jojo@msn.com, 2005/04
use strict;
use warnings;
use Net::RawIP;
use Net::PcapUtils;
use NetPacket::Ethernet;
use NetPacket::IP;
use NetPacket::TCP;
use Socket;
use Getopt::Std;
use POSIX qw(strftime);
my %opts;
getopts('ht:p:u:n:', /%opts);
print_help() and exit if(defined($opts{'h'}));
print_help() and exit if(not defined($opts{'t'}) or not defined($opts{'p'}));
die "/tInvalid Target Ipaddress!/n"
if(defined($opts{'t'}) and $opts{'t'} !~ m/^/d+./d+./d+./d+$/);
die "/tInvalid Service Port!/n"
if(defined($opts{'p'}) and $opts{'p'} !~ m/^/d+$/);
my $request;
if(defined($opts{'u'})) {
$request = "GET $opts{'u'} HTTP/1.1/r/n";
$request.= "Accept: text/html; text/plain/r/n";
$request.= "/r/n";
} else {
$request = "GET / HTTP/1.1/r/n";
$request.= "Accept: text/html; text/plain/r/n";
$request.= "/r/n";
}
my $child = fork();
if($child == 0) {
#child process
my ($next_packet, %next_header);
my ($frame_hdr, $ip_packet);
my ($ip_obj, $tcp_obj);
my $counter = 0;
my $pkt_descriptor = Net::PcapUtils::open(
FILTER => 'ip',
PROMISC => 0,
DEV => 'ppp0',
#DEV => 'eth0'
);
die "Net::PcapUtils::open returned: $pkt_descriptor/n" if (!ref($pkt_descriptor));
print strftime '%Y/%m/%d %H:%M:%S, ', localtime and print "begin sniffing .../n";
while(($next_packet, %next_header) = Net::PcapUtils::next($pkt_descriptor)) {
($frame_hdr, $ip_packet) = unpack 'H32a*', $next_packet;
$ip_obj = NetPacket::IP->decode($ip_packet);
#$ip_obj = NetPacket::IP->decode(NetPacket::Ethernet::eth_strip($next_packet));
next if ($ip_obj->{'proto'} != 6);
next if (($ip_obj->{'src_ip'} ne $opts{'t'})
and ($ip_obj->{'dest_ip'} ne $opts{'t'}));
$tcp_obj = NetPacket::TCP->decode($ip_obj->{'data'});
next if (($tcp_obj->{'src_port'} ne $opts{'p'})
and ($tcp_obj->{'dest_port'} ne $opts{'p'}));
$counter++;
print "==ID.$counter==", '=' x 60, "/n";
print get_ip_hdr($ip_obj);
print get_tcp_hdr($tcp_obj);
if($tcp_obj->{'data'}) {
my $data;
$data = unpack 'a*', $tcp_obj->{'data'};
$data =~ s/[/r][/n]//g;
print pretty_table('TCP data', [$data]);
}
if($counter == 3) {
my $a = new Net::RawIP;
$a->set({
'ip' => {
'id' => $ip_obj->{'id'} + 1,
'saddr' => $ip_obj->{'src_ip'},
'daddr' => $ip_obj->{'dest_ip'}
},
'tcp' => {
'source' => $tcp_obj->{'src_port'},
'dest' => $tcp_obj->{'dest_port'},
'seq' => $tcp_obj->{'seqnum'},
'ack_seq' => $tcp_obj->{'acknum'},
'window' => $tcp_obj->{'winsize'},
'data' => $request,
'psh' => 1,
'ack' => 1
}
});
$a->send;
}
last if($counter == 5);
}
exit;
} else {
sleep(1);
my $trans_serv = getprotobyname('tcp');
my $dest_sockaddr = sockaddr_in($opts{'p'}, inet_aton($opts{'t'}));
socket(TCP_SOCK, PF_INET, SOCK_STREAM, $trans_serv);
connect(TCP_SOCK, $dest_sockaddr);
sleep(1);
#close TCP_SOCK;
}
exit;
sub print_help {
print <<HELP
%./iamFool.pl [-h] <-t,-p,-u,-n>
-h print help
-t target ipaddr
-p service port
-u requested url
by:i_am_jojo/@msn.com
HELP
}
sub get_ip_hdr {
my $ip_obj = shift;
my @ip_hdr;
push @ip_hdr, [qw(ver tos flags id src_ip proto)];
push @{$ip_hdr[1]}, $ip_obj->{$_} foreach (qw(ver tos flags id src_ip proto));
push @ip_hdr, [qw(hlen len foffset ttl dest_ip cksum)];
push @{$ip_hdr[3]}, $ip_obj->{$_} foreach (qw(hlen len foffset ttl dest_ip cksum));
return pretty_table('IP Header', @ip_hdr);
}
sub get_tcp_hdr {
my $tcp_obj = shift;
my @tcp_hdr;
push @tcp_hdr, [qw(src_port seqnum hlen flags)];
push @{$tcp_hdr[1]}, $tcp_obj->{$_} foreach (qw(src_port seqnum hlen flags));
push @tcp_hdr, [qw(dest_port acknum reserved winsize)];
push @{$tcp_hdr[3]}, $tcp_obj->{$_} foreach (qw(dest_port acknum reserved winsize));
return pretty_table('TCP Header', @tcp_hdr);
}
sub pretty_table {
# prettyTable($aString, @aList); @aList = ( [...], [...] );
# by i_am_jojo@msn.com
my ($title, @data) = @_;
my @temp;
my @max_length;
my $row_length;
my $indent = 4;
my $the_table;
foreach my $col (0..$#{$data[0]}) { push @{$temp[$col]}, $_->[$col] foreach (@data); }
$max_length[$_] = length( (sort{length($b) <=> length($a)} @{$data[$_]} )[0]) + 2 foreach (0..$#data);
$row_length+= $max_length[$_] foreach (0..$#{$temp[0]});
$row_length+= $#data;
$the_table = ' ' x $indent.'+'.'-' x $row_length."+/n";
$the_table.= ' ' x $indent.'| '.$title.' ' x ($row_length - length($title) - 1)."|/n";
foreach my $row (0..$#temp) {
$the_table.= ' ' x $indent;
$the_table.= '+'.'-' x $max_length[$_] foreach (0.. $#{$temp[0]});
$the_table.= "+/n";
$the_table.= ' ' x $indent;
$the_table.= '| '.@{$temp[$row]}[$_].' ' x ($max_length[$_] - length(@{$temp[$row]}[$_]) - 1) foreach (0.. $#{$temp[0]});
$the_table.= "|/n";
}
$the_table.= ' ' x $indent;
$the_table.= '+'.'-' x $max_length[$_] foreach (0.. $#{$temp[0]});
$the_table.= "+/n";
return $the_table;
}
四、结果举例
==Result eXample==
2005/05/02 21:51:23, begin sniffing ...
==ID.1==============================================================
+---------------------------------------------------+
| IP Header |
+--------+---------------+---------+----------------+
| ver | 4 | hlen | 5 |
+--------+---------------+---------+----------------+
| tos | 0 | len | 60 |
+--------+---------------+---------+----------------+
| flags | 2 | foffset | 0 |
+--------+---------------+---------+----------------+
| id | 20682 | ttl | 64 |
+--------+---------------+---------+----------------+
| src_ip | 218.11.149.14 | dest_ip | 64.233.189.104 |
+--------+---------------+---------+----------------+
| proto | 6 | cksum | 31878 |
+--------+---------------+---------+----------------+
+------------------------------------------+
| TCP Header |
+----------+------------+-----------+------+
| src_port | 32851 | dest_port | 80 |
+----------+------------+-----------+------+
| seqnum | 1104143983 | acknum | 0 |
+----------+------------+-----------+------+
| hlen | 10 | reserved | 0 |
+----------+------------+-----------+------+
| flags | 2 | winsize | 5808 |
+----------+------------+-----------+------+
==ID.2==============================================================
+---------------------------------------------------+
| IP Header |
+--------+----------------+---------+---------------+
| ver | 4 | hlen | 5 |
+--------+----------------+---------+---------------+
| tos | 0 | len | 44 |
+--------+----------------+---------+---------------+
| flags | 0 | foffset | 0 |
+--------+----------------+---------+---------------+
| id | 63029 | ttl | 241 |
+--------+----------------+---------+---------------+
| src_ip | 64.233.189.104 | dest_ip | 218.11.149.14 |
+--------+----------------+---------+---------------+
| proto | 6 | cksum | 26154 |
+--------+----------------+---------+---------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 80 | dest_port | 32851 |
+----------+------------+-----------+------------+
| seqnum | 3660731207 | acknum | 1104143984 |
+----------+------------+-----------+------------+
| hlen | 6 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 18 | winsize | 4356 |
+----------+------------+-----------+------------+
==ID.3==============================================================
+---------------------------------------------------+
| IP Header |
+--------+---------------+---------+----------------+
| ver | 4 | hlen | 5 |
+--------+---------------+---------+----------------+
| tos | 0 | len | 40 |
+--------+---------------+---------+----------------+
| flags | 2 | foffset | 0 |
+--------+---------------+---------+----------------+
| id | 20684 | ttl | 64 |
+--------+---------------+---------+----------------+
| src_ip | 218.11.149.14 | dest_ip | 64.233.189.104 |
+--------+---------------+---------+----------------+
| proto | 6 | cksum | 31896 |
+--------+---------------+---------+----------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 32851 | dest_port | 80 |
+----------+------------+-----------+------------+
| seqnum | 1104143984 | acknum | 3660731208 |
+----------+------------+-----------+------------+
| hlen | 5 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 16 | winsize | 5808 |
+----------+------------+-----------+------------+
==ID.4==============================================================
+---------------------------------------------------+
| IP Header |
+--------+---------------+---------+----------------+
| ver | 4 | hlen | 5 |
+--------+---------------+---------+----------------+
| tos | 16 | len | 89 |
+--------+---------------+---------+----------------+
| flags | 2 | foffset | 0 |
+--------+---------------+---------+----------------+
| id | 20685 | ttl | 64 |
+--------+---------------+---------+----------------+
| src_ip | 218.11.149.14 | dest_ip | 64.233.189.104 |
+--------+---------------+---------+----------------+
| proto | 6 | cksum | 31830 |
+--------+---------------+---------+----------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 32851 | dest_port | 80 |
+----------+------------+-----------+------------+
| seqnum | 1104143984 | acknum | 3660731208 |
+----------+------------+-----------+------------+
| hlen | 5 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 24 | winsize | 5808 |
+----------+------------+-----------+------------+
+--------------------------------------------+
| TCP data |
+--------------------------------------------+
| GET / HTTP/1.1Accept: text/html; text/plai |
+--------------------------------------------+
==ID.5==============================================================
+---------------------------------------------------+
| IP Header |
+--------+----------------+---------+---------------+
| ver | 4 | hlen | 5 |
+--------+----------------+---------+---------------+
| tos | 0 | len | 40 |
+--------+----------------+---------+---------------+
| flags | 0 | foffset | 0 |
+--------+----------------+---------+---------------+
| id | 47931 | ttl | 241 |
+--------+----------------+---------+---------------+
| src_ip | 64.233.189.104 | dest_ip | 218.11.149.14 |
+--------+----------------+---------+---------------+
| proto | 6 | cksum | 41256 |
+--------+----------------+---------+---------------+
+------------------------------------------------+
| TCP Header |
+----------+------------+-----------+------------+
| src_port | 80 | dest_port | 32851 |
+----------+------------+-----------+------------+
| seqnum | 3660731208 | acknum | 1104144033 |
+----------+------------+-----------+------------+
| hlen | 5 | reserved | 0 |
+----------+------------+-----------+------------+
| flags | 16 | winsize | 4356 |
+----------+------------+-----------+------------+
===End===
相关文章推荐
- TCP/IP链接的三次握手与四次挥手
- TCP/IP 三次握手过程
- TCP/IP三次握手详解——计算机网络
- TCP/IP三次握手原理
- TCP/IP 协议三次握手与四次挥手
- 网络 TCP/IP SOCKET 三次握手
- TCP/IP三次握手及四次挥手
- TCP/IP 三次握手
- TCP/IP(三次握手和四次断开)与UDP
- TCP/IP连接为什么要三次握手,而不是两次
- 腾讯面试题01. TCP/IP 三次握手,??攻击
- tcp/ip三次握手
- TCP/IP三次握手和四次挥手
- 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
- TCP/IP的三次握手与四次挥手详解
- TCP/IP 三次握手协议过程
- TCP/IP 三次握手、四次挥手原理
- 简述Socket,IP,TCP三次握手,HTTP协议
- TCP/IP三次握手代码