⑴ tcp协议的三次握手
三次握手-简介所谓的“三握手”:对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据 量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP 在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP 总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。 TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 三次握手协议 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念: 未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。 Backlog参数:表示未连接队列的最大容纳数目。 SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。 半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。 [1] * SYN:同步标志 同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。 *ACK:确认标志 确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。 *RST:复位标志 复位标志有效。用于复位相应的TCP连接。 *URG:紧急标志 紧急(The urgent pointer) 标志有效。紧急标志置位, *PSH:推标志 该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。 *FIN:结束标志 带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。 [编辑本段]三次握手协议-工作原理 由于TCP 需要时刻跟踪,这需要额外开销,使得TCP 的格式有些显得复杂。下面就让我们看一个TCP 的 三次握手协议 经典案例,这是后来被称为MITNICK 攻击中KEVIN 开创了两种攻击技术: TCP 会话劫持和SYN FLOOD(同步洪流) 在这里我们讨论的是TCP 会话劫持的问题。 先让我们明白TCP 建立连接的基本简单的过程。为了建设一个小型的模仿环境我们假设有3 台接入互联网的机器。A 为攻击者操纵的攻击机。B 为中介跳板机器(受信任的服务器)。C 为受害者使用的机器(多是服务器),这里把C 机器锁定为目标机器。A 机器向B机器发送SYN 包,请求建立连接,这时已经响应请求的B 机器会向A 机器回应SYN/ACK表明同意建立连接,当A 机器接受到B 机器发送的SYN/ACK 回应时,发送应答ACK 建立 A 机器与B 机器的网络连接。这样一个两台机器之间的TCP 通话信道就建立成功了。B 终端受信任的服务器向C 机器发起TCP 连接,A 机器对服务器发起SYN 信息,使C 机器不能响应B 机器。在同时A 机器也向B 机器发送虚假的C 机器回应的SYN 数据包,接收到SYN 数据包的B 机器(被C 机器信任)开始发送应答连接建立的SYN/ACK 数据包,这时C 机器正在忙于响应以前发送的SYN 数据而无暇回应B 机器,而A 机器的攻击者预测出B 机器包的序列号(现在的TCP 序列号预测难度有所加大)假冒C 机器向B 机器发送应答ACK 这时攻击者骗取B 机器的信任,假冒C 机器与B 机器建立起TCP 协议的对话连接。这个时候的C 机器还是在响应攻击者A 机器发送的SYN 数据。 TCP 协议栈的弱点:TCP 连接的资源消耗,其中包括:数据包信息、条件状态、序列号等。通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽。通过攻击者有意的不完成建立连接所需要的三次握手的全过程,从而造成了C 机器的资源耗尽。序列号的可预测性,目标主机应答连接请求时返回的SYN/ACK 的序列号是可预测的。
⑵ 计算机网络——TCP三次握手四次挥手
用户进程和服务器进程需要完成一次通信都需要完成 三个阶段 : 连接建立、数据传送、连接释放
参考:三次握手和四次挥手
首先先明确几个概念:
序列号seq(4B) :用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号, 序列号seq就是这个报文段中的第一个字节的数据编号 。
确认号ack(4B) : 期待收到对方下一个报文段的第一个数据字节的序号 ,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号+1即是确认号。
确认ACK(1bit) :仅当ACK=1,确认号字段才有效。ACK=0,确认号无效。
同步SYN : 连接建立时 用于同步序号。SYN=1表示这是一个连接请求,或连接接收报文,SYN这个标志位只有在TCP建立连接才会被置为1,握手完成后SYN标志位被置为0.当SYN=1,ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用SYN=1,ACK=1
终止FIN :用来释放一个连接。
B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。若有,则作出响应。
1)第一次握手:A首先向B发一个SYN (Synchronize) 标记的包,告诉B请求建立连接,一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources), SYN=1的报文段不能携带数据 ,但要 消耗掉一个序号, 此时TCP客户进程进入SYN-SENT(同步已发送)状态。
2)第二次握手:B收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包。在确认报文段中,测试TCP服务器进程进入SYN-RCVD(同步收到)状态;
3)第三次握手:TCP客户进程收到B的确认后,要向B给出确认报文段,ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,A进入ESTABLISHED(已建立连接)。
当B收到A的确认后,也进入建立连接状态。
序列号和确认号的关系:
第一次握手序列号seq=x;
第二次握手序列号seq=y,确认号ack=x+1;
第三次握手序列号seq=x+1,确认号ack=y+1;
序列号seq是上一次的确认号,而确认号是上一次的序列号+1;这是因为SYN=1的报文段不能携带数据,但要消耗掉一个序号,所以下一个报文段要+1;
为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失,而是因为某些未知的原因在某个网络节点上发生滞留,导致延迟到连接释放以后的某个时间才到达另一端(server)B。本来这是一个早已失效的报文段,但是B收到此失效的报文之后,会误认为是A再次发出的一个新的连接请求,于是B端就向A又发出确认报文,表示同意建立连接。如果不采用“三次握手”,那么只要B端发出确认报文就会认为新的连接已经建立了,但是A端并没有发出建立连接的请求,因此不会去向B端发送数据,B端没有收到数据就会一直等待,这样B端就会白白浪费掉很多资源。如果采用“三次握手”的话就不会出现这种情况,B端收到一个过时失效的报文段之后,向A端发出确认,此时A并没有要求建立连接,所以就不会向B端发送确认,这个时候B端也能够知道连接没有建立。(知乎上对上面的解释的评论:这个解答不是问题的本质,这个课本很多知识比较片面。问题的核心在于保证信道数据传输的可靠性,避免资源浪费仅仅是一个小的弱原因,不重要。)
从客户端到服务端释放连接的过程中,需要四次报文传输。
TCP四次挥手过程
1)A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
2)B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
3)A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
4)B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
5)A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。
大概就是A和B:
A:“我不和你说话了”
B:“知道了”
此时A单方面不和B说话,当B也没有话对A说的时候
B:“我也不和你说话了”
A:“好的”
两个人互相不说话了
TCP四次挥手总结
客户端发送FIN后,进入终止等待状态,服务器收到客户端连接释放报文段后,就立即给客户端发送确认,服务器就进入CLOSE_WAIT状态,此时TCP服务器进程就通知高层应用进程,因而从客户端到服务器的连接就释放了。此时是“半关闭状态”,即客户端不可以发送给服务器,服务器可以发送给客户端。
此时,如果服务器没有数据报发送给客户端,其应用程序就通知TCP释放连接,然后发送给客户端连接释放数据报,并等待确认。客户端发送确认后,进入TIME_WAIT状态,但是此时TCP连接还没有释放,然后经过等待计时器设置的2MSL后,才进入到CLOSE状态。
⑶ 计算机网络中的“三次握手”是什么
TCP握手协议
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(SynchronizeSequenceNumbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:
未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
Backlog参数:表示未连接队列的最大容纳数目。
SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
⑷ TCP三次握手与四次挥手
为了更好的理解TCP建立连接与释放连接的过程,我们不妨先了解TCP报文结构。
TCP报文包含 首部 和 数据部分 :
重点认识一下 TCP首部 结构:
1、源端口与目的端口:
各占两个字节,共4个字节。用来告知主机该报文的源与目的。
2、序号(seq number)
由于TCP是面向流的有序可靠连接,在一个TCP连接中传输的字节流中的每个字节都需要按顺序编号。
序号字段指的是本报文段所发送的数据的 第一个字节 的序号。
3、确认号(ack number)
表示 期望收到对方下一个报文段的序号值 ,同时表示前面的序号值都已经 成功接收 ,体现 累积确认机制 。
4、确认ACK
当ACK=1时,确认号有效。
5、同步SYN
当SYN=1时,表明这是一个请求连接报文段。
6、终止FIN
当FIN=1时,表示此报文段的发送方的数据已发送完毕,要求释放TCP连接。
7、 窗口大小(window size)
流量控制 中的滑动窗口大小,根据接收方的接收缓冲区剩余大小设置。
TCP 的整个交流过程可以总结为:建立连接,传输数据,释放连接。
TCP连接的建立采用客户端-服务器模式,我们将主动方成为客户端(Client),被动方成为服务器(Server)。
1、 第一次握手 :Client主动打开连接,发送TCP报文( SYN = 1,seq = i ),进行第一次握手,进入 SYN_SEND 状态;
2、 第二次握手 : Server收到了SYN报文,发送返回报文( ACK = 1,SYN = 1,ack = i+1, seq = j ),进行第二次握手,进入 SYN_RCVD 状态;
3、 第三次握手 : Client收到来自Server的报文,返回ACK报文( ACK = 1, ack = j+1,seq = i+1 ),进行第三次握手,进入 ESTABLISHED 状态; 另外, 第三次握手一般已经可以携带数据了 。
TCP有一个特别的概念叫做 半关闭 ,这个概念是说,TCP连接时全双工的连接,因此在关闭连接的时候,必须关闭传送和接收两个方向上的连接。
1、 第一次挥手 : Client发送关闭连接报文段( FIN= 1, seq = n ),进入 FIN_WAIT_1 状态;
2、 第二次挥手 : Server收到来自Client的FIN之后,立即返回一个 ACK=1 报文段(ack = n+1),进入 CLOSE_WAIT 状态;
此时Server还是可以发送数据给Client。
3、 第三次挥手 : 当Server确定所有数据都发送完毕之后,发送 FIN=1 报文段(seq = m),进入 LAST_ACK 状态;
4、 第四次挥手 : Client收到之后,返回 ACK=1 报文段(ack = m+1),进入 TIME_WAIT 状态;
Client等待2MSL(MSL,最长报文段寿命)之后进入CLOSED状态,Server收到最后一个ACK之后,也进入CLOSED状态。
在三次握手过程中,Server发送第二次握手报文之后,收到Client的ACk之前的状态称为 半连接 状态。在半连接状态的Server会为其认为即将完成连接的Client分配资源。
而SYN Flood攻击就是,在短时间内伪造大量不存在的IP地址,向Server不断发送SYN包,Server为这些伪造的Client分配资源,并返回SYN+ACK报文段,由于IP地址无效,所以Server不会收到第三次握手的ACK,需要不断发送直至超时,这些伪造的Client长时间占用未连接队列与Server预分配的资源,造成Server崩溃,无法响应正常的SYN包。
1、SYN cookies技术:先不分配数据区,而根据SYN计算一个cookies值,当收到Client的ACk之后,再进行对比,分配资源。
2、增大最大半连接和缩短超时时间。
1、TIME_WAIT状态能确保Server正常进入CLOSE状态:
TIME_WAIT状态是在Client发完最后一个ACK之后进入的状态,如果这个ACK丢失,则Server不能确认进入CLOSE状态,超时后,Server会重新发送FIN报文段,此时处于TIME_WAIT状态的Client就能收到FIN,重发ACK,确保四次挥手完成。
2、TIME_WAIT状态有 净空 的效果:
防止已经失效的连接请求出现在下次连接中。经过TIME_WAIT状态,可以使本连接内的所有请求都在网络中消失(从而起到净空的效果,不会赢下下一次连接)。
1、 只有主动close一方才会出现TIME_WAIT状态,只有TCP连接为 短连接 情况下才有可能出现大龄的TIME_WAIT状态。
2、 服务器使用短连接,每次客户端请求后,服务器都会主动发送FIN关闭连接。最后进入TIME_WAIT状态。由此,如果访问量过大的Web Server,会存在大量的TIME_WAIT状态。
可以通过修改内核参数,快速回收TIME_WAIT资源。
3、如果一直存在大量TIME_WAIT状态,回收不及时的话,会占用大量服务器资源,可能造成该无法提供服务的问题。
【参考】
[1] 理解TCP 和 UDP
[2] 《计算机网络》
⑸ 简述TCP协议的三次握手过程,以及序列号和确认号的作用
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收
⑹ 计算机三级网络技术关于Tcp三次握手的问题。标志着握手成功的到底是哪一行,如下图,图一答案给的是8
个人感觉是7,第三次握手就发送了握手完成的标号
⑺ 正常的TCP连接建立过程是一个所谓“三次握手”过程
在第一步中,客户端向服务端提出连接请求。这时TCPSYN标志置位。客户端告诉服务端序列号区域合法,需要检查。客户端在TCP报头的序列号区中插入自己的ISN。服务端收到该TCP分段。
在第二步以自己的ISN回应(SYN标志置位),同时确认收到客户端的第一个TCP分段(ACK标志置位)。在第三步中,客户端确认收到服务端的ISN(ACK标志置位)。到此为止建立完整的TCP连接,开始全双工模式的数据传输过程。
⑻ 动画图解TCP三次握手
TCP 三次握手过程不管是对于本科计算机网络学习还是考研考计网的同学来说都是必考的一个,所以要掌握 TCP 整个握手的过程显得尤为重要。
一、TCP 是什么?
TCP是Transmission Control Protocol(传输控制协议) 的简称,它提供一种面向连接的、可靠的、基于字节流的传输层通信协议。
在学习 TCP 握手过程之前,我们首先要了解 TCP 报文头部的一些标志信息,因为在 TCP 握手的过程中,要用到TCP报文头部的一些信息。
TCP头部
1.1 源端口和目的端口
对于端口,我们可以这么理解:我们可以想象发送方很多的窗户,接收方也有很多的窗户,这些窗口都标有不同的端口号,源端口号和目的端口号就分别代表从哪个规定的串口发送到对方接收的窗口。不同的应用程序都有着不同的端口,比如HTTP端口80,SMTP端口25等。
1.2 序号
TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。接收端根据这个编号进行确认,保证分割的数据段在原始数据包的位置。
通俗一点的讲,每个字段在传送中用序列号来标记自己位置的,而这个字段就是用来完成双方传输中确保字段原始位置是按照传输顺序的。(发送方是数据是怎样一个顺序,到了接受方也要确保是这个顺序)
1.3 确认号
确认号是期望收到对方下一个报文段的第一个字节的序号。确认号 = N,则表示到序号N-1为止的所有数据都已经正确收到。例如:B正确收到了A发送过来的一个报文段,其序号字段值为500,而数据字段长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据,因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
1.4 标志位
TCP首部中有 6 个标志比特,它们中的多个可同时被设置为 1,主要是用于操控 TCP 的状态机的,依次为URG,ACK,PSH,RST,SYN,FIN。今天我们只介绍我们用到的三个。
1.4.1 确认ACK
这个标志位可以理解为发送端发送数据到接收端,发送的时候 ACK置 为 0,一旦接收端接收数据之后,就将 ACK 置为 1,发送端接收到之后,就知道了接收端已经接收了数据。需要注意的一点是:当且仅当ACK = 1时,确认号字段才有效。TCP规定,在连接建立后,所有传送的报文段 都将ACK置为1。
1.4.2 同步SYN
SYN是同步序列号,在建立TCP连接时用来同步序号。当SYN=1,ACK=0时,表明这是一个连接请求报文段。若对方同意建立连接,则应在响应的报文段中使SYN=1,ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
1.4.3 终止FIN
当发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送方FIN标志位置为1后,表示此报文段的发送方数据发送完毕,请求释放连接。
二 T CP三次握手过程
TCP 三次握手的过程解决以下三个问题
1.要是每一方都能确知对方的存在
2.要允许双方协商一些参数(如窗口最大值,是否使用窗口扩大选项以及时间戳选项等)
3.能够对运输实体资源(如缓冲大小、连接表中的项目等)进行分配
掌握了这些,TCP 的三次握手就简单多了。下面我们就以动画形式进行拆解三次握手过程。
初始状态 :客户端处于closed(关闭)状态,服务器处于listen(监听)状态
第一次握手 :客户端发送请求报文将SYN = 1同步序列号和初始化序列号seq = x发送给服务端,发送完之后客户端处于SYN_Send状态。
第二次握手 :服务端受到SYN请求报文之后,如果同意连接,会以自己的同步序列号SYN(服务端) = 1、初始化序列号seq = y和确认序列号(期望下次收到的数据包)ack = x+ 1以及确认号ACK = 1报文作为应答,服务器为SYN_Receive状态。
第三次握手 : 客户端接收到服务端的SYN + ACK之后,知道可以下次可以发送了下一序列的数据包了,然后发送同步序列号ack = y + 1和数据包的序列号seq = x + 1以及确认号ACK = 1确认包作为应答,客户端转为established状态。
三、为什么不能是一次、二次握手,而必须是三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常情况:A发出连接请求,但因连接请求报文丢失而未收到确认。于是A在重传一次连接请求,后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。在此过程中,A一共发送了两个连接请求报文段,其中一个丢失,第二个到达了B。没有已经失效的报文段。
但现在出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以至延误到连接释放以后的某个时间才到达B。本来这是一个早已经失效的报文段,但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据,但B却以为新的运输连接已经建立了,并一直等待A发来数据。B的许多资源就这样白白浪费了。
采用三次握手的办法可以防止上述现象的发生,例如在刚才的情况下,A不会向B的确认发出确认。B由于收不到确认,就知道A并没有要求建立连接。