三次握手ThreewayHandshake

时间:2024年09月18日

/

来源:北落狮门

/

编辑:本站小编

收藏本文

下载本文

下面是小编帮大家整理的三次握手ThreewayHandshake,本文共4篇,希望对大家带来帮助,欢迎大家分享。本文原稿由网友“北落狮门”提供。

篇1:三次握手ThreewayHandshake

一个虚拟连接的建立是通过三次握手来实现的

1. (Client) –>[SYN] –>(Server)

假如Client和Server通讯. 当Client要和Server通信时,Client首先向Server发一个SYN(Synchronize) 标记的包,告诉Server请求建立连接.

注意: 一个 SYN包就是仅SYN标记设为1的TCP包. 认识到这点很重要,只有当Server收到Client发来的SYN包,才可建立连接,除此之外别无他法,因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不 能让外部任何主机主动建立连接。

如下图红框,三次握手的首次SYN,Source为我的教学平台所在的IP:192.168.102.64 Destination为平台的IP:192.168.102.241

2. (Client) <– [SYN/ACK] <–(Server)

接着,Server收到来自Client发来的SYN包后,会发一个对SYN包的确认包(SYN/ACK)给Client,表示对第一个SYN包的确认,并继续握手操作.

注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

如下图红框,三次握手的服务端给客户端的响应SYN,ACK,Source为平台的IP:192.168.102.241,Destination为我的教学平台所在的IP:192.168.102.64

3. (Client) –>[ACK] –>(Server)

Client收到来自Server的SYN/ACK 包,Client会再向Server发一个确认包(ACK),通知Server连接已建立。至此,三次握手完成,一个TCP连接完成。

Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位。

如下图红框,三次握手的最后确认ACK,Source为我的教学平台所在的IP:192.168.102.64 Destination为平台的IP:192.168.102.241

到此为止,客户端完成了与服务端进行数据传输的准备工作,类似人们见面后先进行握手后,接下来就进行正题交流了。

四次握手Four-way Handshake

四次握手用来关闭已建立的TCP连接,当客户端和服务端完成了数据包的传输后,又客户端或者服务端主动发起握手,

来进行连接的断开。

1. (Client) –>ACK/FIN –>(Server)

2. (Client) <– ACK <–(Server)

3. (Client) <– ACK/FIN <–(Server)

4. (Client) –>ACK –>(Server)

如下图蓝框为四次握手,首先的发起放时为平台,IP:192.168.102.241,Destination为我的教学平台所在的IP:192.168.102.64。接下来客户端进行了ACK响应 ,紧接着自己也发了一个结束包。服务端对结束包进行响应。

注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的。

连接复位Resetting a connection

四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记

到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG(Urgent)标记.

最常见的非法组合是SYN/FIN 包. 注意:由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击.

由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,你的网络肯定受到攻击了。

别的已知的非法包有FIN (无ACK标记)和”NULL”包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有ACK 标记。”NULL”包就是没有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。

到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。

抓报分析问题实例:

篇2:三次握手详解

1、建立连接协议(三次握手)

(1)客户端发送一个带SYN标志的TCP报文到服务器,这是三次握手过程中的报文1。

(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。

(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。

2、连接终止协议(四次挥手)

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。 收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。

(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。

(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

CLOSED: 这个没什么好说的了,表示初始状态。

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文,

ESTABLISHED:这个容易理解了,表示连接已经建立了。

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了

篇3:笔试题tcp三次握手

笔试题(tcp三次握手)

笔试题:tcp三次握手的过程,accept发生在三次握手哪个阶段?

分析:

accept发生在三次握手之后,

第一次握手:客户端发送syn包(syn=j)到服务器。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。

三次握手完成后,客户端和服务器就建立了tcp连接,

这时可以调用accept函数获得此连接。

笔试题:用UDP协议通讯时怎样得知目标机是否获得了数据包

用UDP协议通讯时怎样得知目标机是否获得了数据包?

分析:

可以在每个数据包中插入一个唯一的.ID,比如timestamp或者递增的int。

发送方在发送数据时将此ID和发送时间记录在本地。

接收方在收到数据后将ID再发给发送方作为回应。

发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。

篇4:在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 <

%./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===

男士握手礼仪

握手四年级作文

握手高中作文

第一次“握手”的教案

女生握手礼仪

下载三次握手ThreewayHandshake(整理4篇)
三次握手ThreewayHandshake.doc
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
点击下载本文文档