tcp三次握手断了怎么解决(为什么是三次握手)

2025-09-16 07:00:01 :0

tcp三次握手断了怎么解决(为什么是三次握手)

大家好,如果您还对tcp三次握手断了怎么解决不太了解,没有关系,今天就由本站为大家分享tcp三次握手断了怎么解决的知识,包括为什么是三次握手的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

为什么是三次握手

问题一:tcp为什么要三次握手 . TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。
如果采用两次的话,会出现下面这种情况。
比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;
于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。
传完东西后,断开。
结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。
2. 三次握手改成仅需要两次握手,死锁是可能发生
考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁

问题二:TCP为什么要三次握手 TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程:1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。3. .客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1和序号x+1的ACK报文,一个标准的TCP连接完成。TCP 使用类似的握手过程来结束连接。这可确保两个主机均能完成传输并确保所有的数据均得以接收TCP ClientFlagsTCP Server1 Send SYN (seq=x)----SYN---SYN Received2 SYN/ACK Received 问题三:tcp为什么要三次握手,而不能二次握手 tcp三次握手的目的是为了解决“网络中存在延迟的重复分组”的问题。
“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。
本来这是一个早已失效的报文段,但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。
假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送ack包。

问题四:TCP建立连接为什么是三次握手而不是两次握手 《计算机网络》(谢希仁 译)中讲了原因:
1.采用两次握手,那么若Client向Server发起的包A1如果在传输链路上遇到的故障,导致传输到Server的时间相当滞后,在这个时间段由于Client没有收到Server的对于包A1的确认,那么就会重传一个包A2,假设服务器正常收到了A2的包,然后返回确认B2包。由于没有第三次握手,这个时候Client和Server已经建立连接了。再假设A1包随后在链路中传到了Server,这个时候Server又会返回B1包确认,但是由于Client已经清除了A1包,所以Client会丢弃掉这个确认包,但是Server会保持这个相当于“僵尸”的连接。
所以采用两次握手,有可能会浪费Server的网络资源。
形象解释:
1,客户发一个暧昧的消息,给服务员
2,服务员收到,看了消息,很高兴,马上回信(此时客户还不知道服务收到)
3,客户特别高兴收到服务员关系确认的消息,(但是服务员还不知道客户收到了,如果没收到得重发,理论上来说,直到海枯石烂=-=)
4,服务员终于收到了客户关系确认的消息,悬着的心终于放下了5,于是客户跟服务员真正建立了 一条可靠的通道,毕竟两人都知道那是行得通的。。。
所以至少得三次才能确认关系
不用三次的话,server不能确定client是否收到自己的消息
如果没有收到,可能client根本没收到,或者client响应了,但server没收到
如果你用过对讲机你就会明白:
C -》S: 你能听到吗?
S-》C: 听到。你能听到我吗?
C-》S:听到。

问题五:理解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状态,完成三次握手。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。
三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
结果乙带着耳机听歌呢,根本没听到,没反应。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的情况下沟通肯定是失败的。
如果乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。第二次对话:
如果乙听到了甲的话,做出了正确的应答,并且还进行了反问:我吃饭了,你呢?那么第二次握手成功。
通过前两次对话证明了乙能够听懂甲说的话,并且能做出正确的应答。
接下来进行第三次对话。第三次对话:
如果甲也做出了正确的应答:我也吃了。那么第三次对话成功,两人已经建立起了顺畅的沟通渠道,接下来开始持续的聊天。
通过第二次和第三次的对话证明了甲能够听懂乙说的话,并且能做出正确的应答。
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,
为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
------------------------------------------------------------第一次:甲 C 乙,乙反应
第二次:乙反应正确,乙 C 甲,第三次:甲正确反应,成功------------------------------------------------------------

问题六:为什么TCP连接需要三次握手分开需要四次握手 参考下面的图,可以理解一下。不过因为被动断开方可以把FIN和ACK用一个包发送,所以多数教材或资料上也是把断开理解为三次握手。
1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。
2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。
3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。
4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。

问题七:简述TCP三次握手过程,并说明为什么要3次握手 A、B使用TCP作为传输层传输方式传递数据,流程大致概括如下:
A向B打一个招呼,说:你好,我想跟你建立一个tcp的连接,可以吗?B接收到A的招呼,如果愿意建立连接,会说:你好,可以的。A给B发的连接就建立成功了。
B在向A回答的时候,也会同时向A提出建立连接的申请(因为TCP是全双工的,双向的):
B会向A说:你好,我也想跟你建立一个TCP的连接,可以吗?
A除了之前接收到B给自己的确认,还会接收到B发过来的申请,A收到这个申请后,会向B发出一个确认。
这时,B与A的连接也建立成功了。
这个过程叫做“TCP三次握手”,当双方都确认建立这个连接之后,就开始传递数据了。。这是一种可靠的传输方式。

问题八:TCP连接建立过程中为什么需要“三次握手” 第一次握手做什么?
请求端(客户端)会向服务端(被请求端)发送一个tcp报文,申请打开某一个端口。因为没有数据,所以这个报文仅包含一个tcp头。其中:
SYN=1;当建立一个新的连接时, SYN标志变1。
序号;序号用来标识从客户端向服务端发送的数据字节流。
此时客户端进入SYN_SENT状态。

第二次握手做什么?
服务端收到客户端的SYN包,也会发一个只包含tcp头的报文给客户端。
ACK=1;服务端确认收到信息
确认序号;客户端序号+1,作为应答
SYN=1;因为tcp的连接是双向的,服务端作为应答的同时请求建立连接。
此时服务端进入SYN_RECV状态

第三次握手做什么?
ACK=1;客户端确认收到信息
确认序号;服务端序号+1,作为应答
此时客户端进入ESTABLISHED状态,服务端收到ACK后也会进入此状态

可见,客户端和服务端都保留了对方的序号,这三次握手缺少任何一步都无法实现这一目标。在三次握手过程中,出现了一些中间状态。

问题九:为什么建立连接协议是三次握手,而关闭连接却是四次握手 为了安全保护。
TCP(Tran *** ission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

问题十:TCP为何采用三次握手来建立连接,若采用二次握手可以吗? 三次握手是为了防止已失效的连接请求再次传送到服务器端。 二次握手不可行,因为:如果由于网络不稳定,虽然客户端以前发送的连接请求以到达服务方,但服务方的同意连接的应答未能到达客户端。则客户方要重新发送连接请求,若采用二次握手,服务方收到重传的请求连接后,会以为是新的请求,就会发送同意连接报文,并新开进程提供服务,这样会造成服务方资源的无谓浪费。
采纳哦

三次握手,为什么断开TCP连接需要四次握手

TCP建立连接要进行3次握手,而断开连接要进行4次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(
即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭.
关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接.当一端收到一个FIN,它必须
通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果.

一文搞懂TCP的三次握手和四次挥手

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。

三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

四次挥手:即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。

TCP三次握手、四次挥手时序图

TCP协议位于传输层,作用是提供可靠的字节流服务,为了准确无误地将数据送达目的地,TCP协议采纳三次握手策略。

三次握手原理:

第1次握手:客户端发送一个带有SYN(synchronize)标志的数据包给服务端;

第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了;

第3次握手:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束。

其中:SYN标志位数置1,表示建立TCP连接;ACK标志表示验证字段。

可通过以下趣味图解理解三次握手:

三次握手过程详细说明:

1、客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值);

2、服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接;

3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)。

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

四次挥手原理:

第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态;

第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态;

第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;

第4次挥手:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。

其中:FIN标志位数置1,表示断开TCP连接。

可通过以下趣味图解理解四次挥手:

四次挥手过程详细说明:

1、客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成);

2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成);

3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成);

4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)

至此TCP断开的4次挥手过程完毕。

LISTEN:等待从任何远端TCP 和端口的连接请求。

SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。

SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。

ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。

FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。

FIN_WAIT_2:等待远端TCP 的连接终止请求。

CLOSE_WAIT:等待本地用户的连接终止请求。

CLOSING:等待远端TCP 的连接终止请求确认。

LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)

TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。

TIME_WAIT 两个存在的理由:

          1.可靠的实现tcp全双工连接的终止;

          2.允许老的重复分节在网络中消逝。

CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)。

关于tcp三次握手问题

TCP或者UDP中都有一个伪首部里面包含的源和目的地址,所以TCP或者UDP的校验和其实校验了超出他们数据本身的范围。防止了路由选择错误的数据段被接受。
RFC793 的15.16页。
虽然不是规定在建立握手时候要检测IP地址,但是在验证路由有无选路错误的同时也有你说的作用。
骗过UDP 和TCP,你有两种办法。
1.修改IP包头的同时,还要去修改重新计算TCP UDP的校验和,
2.或者把校验和的两个字接置0,这样TCP UDP就不会检测校验和了。
请采纳答案,支持我一下。

tcp连接的断开

TCP的断开就是经过四次挥手:

这是正常的情况,客户端主动tcp连接断开的过程。客户端先是发送一个FIN为一的报文,然后进入FIN_WAIT_1的状态。
服务器收到FIN报文后,发送一个ACK报文,然后进入CLOSED_WAIT状态。
客户端收到服务器的ACK报文进入FIN_WAIT_2状态。
等到服务器觉得他数据处理好了,可以关闭的时候,会发送一个FIN报文,然后进入LAST_ACK。等待最后一个应答。
让客户端收到服务器FIN报文,就进入TIME_WAIT状态了,随后发送最后一个ACK报文,然后close。
客户端再等待2msl后也自己主动关闭。而只有主动关闭的情况下,才会有TIME_WAIT。

那么为什么四次挥手需要四次呢?
三次握手其实就是在第二次把ACK和SYN两个报文合并成一个发,但是断开的过程可能还有一方需要处理下数据,需要延长点时间,等处理好再发FIN,所以就比三次握手多了一次。

这里还有一个问题,为什么需要TIME_WAIT,然后到close需要2msl的时间呢?

先说下什么是MSL,也就是报文的最长生存时间,超过这个时间的报文就要被丢弃掉。tcp是基于ip的,ip上有个生存时间TTL,是ip报文可以经过的最大路由数量,每经过一个路由就减1,减到0,ip报文就丢弃掉,然后通过ICMP通知源主机,我们的ping也算是经过这个。当然msl和ttl还是有区别的,msl是时间,ttl是路由数量,msl也是大于等于ttl的。在linux中,2msl默认是60秒。

前文也说了,只有主动发起断开连接的进程才会有time wait状态。time wait+2msl有两个原因:
1.防止旧连接的数据包

像这个seq 301的包,如果因为网络的原因被延迟了,而没有time wait或者很短,那么连接断开后,又建立新的连接,这个时候这个包到了,可能就导致数据紊乱了。而2msl可以保证两个方向的包在断开前丢弃掉。

2.保证正确的断开连接
2msl的时间也是保证第四个报文的ack可以被被动关闭方接收到。

如图,假设time wait比较短或者没有,当最后的ack报文丢失的时候。客户端已经close了,而服务器一直处于last ack的状态。这样连接就不能正常断开了。而如果有time wait +2msl这个情况就可以避免。假设服务器没有收到最后一个ack报文,服务器会重发FIN等待客户端的ack。
这样就可以保证不会出现一端断开,另外一端没有断开的情况了。

有时候我们在服务器上会看到很多time wait。time wait一般就是服务器主动发起的断开请求才会产生的状态。所以time wait过多,第一个是系统资源会大量消耗,还有是端口如果占的太多,会导致没办法创建新连接。这个时候可以把linux的net.ipv4.tcp_tw_reuse开启,置为1,可以复用time wait超过1秒的连接。

这边再说说tcp的保活机制。也就是怎么长期维持客户端和服务端的连接。
在一个时间段内,如果没有连接等相关活动,tcp的保活机制会定期发探测报文,如果连续几个探测报文就没有回应,就将错误信息报告给系统,系统通知上层应用。

在 Linux 内核可以有对应的参数可以设置保活时间、保活探测的次数、保活探测的时间间隔,以下都为
默认值:
tcp_keepalive_time=7200:表示保活时间是 7200 秒(2⼩时),也就 2 小时内如果没有任何连接
相关的活动,则会启动保活机制
tcp_keepalive_intvl=75:表示每次检测间隔 75 秒;
tcp_keepalive_probes=9:表示检测 9 次无响应,认为对⽅方是不不可达的,从⽽而中断本次的连接。
也就是说在 Linux 系统中,最少需要经过 2 小时 11 分 15 秒才可以发现一个「死亡」连接。
当然这个时间也可以自己配置。

为什么tcp连接的时候是三次握手,关闭的时候是四次握手

TCP的三次握手和四次断开
TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象,每一次完整的数据传输都必须经过建
立连接,数据传输和终止连接3个过程,TCP建立连接的过程称为三次握手,下面看一下三次握手的具本过程
TCP三次握手过程
1 主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,
主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我.
2 主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:
我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我
3 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了
这样3次握手就完成了,主机A和主机B 就可以传输数据了.
3次握手的特点
没有应用层的数据
SYN这个标志位只有在TCP建产连接时才会被置1
握手完成后SYN标志位被置0
4次断开
1 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求
2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
3 由B 端再提出反方向的关闭请求,将FIN置1
4 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.
由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端
和接收端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础
名词解释
ACK TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段
都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.
SYN 同步序列号,TCP建立连接时将这个位置1
FIN 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1
解释原因:
TCP建立连接要进行3次握手,而断开连接要进行4次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(
即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭.
关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接.当一端收到一个FIN,它必须
通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果.
另一种解释:
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
为什么不能两次握手能进行连接?
我们知道,3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

动画图解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并没有要求建立连接。

为什么是三次握手的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于为什么是三次握手、为什么是三次握手的信息别忘了在本站进行查找哦。

tcp三次握手断了怎么解决(为什么是三次握手)

本文编辑:admin

更多文章:


内存按什么编址(按字节编址什么意思)

内存按什么编址(按字节编址什么意思)

大家好,内存按什么编址相信很多的网友都不是很明白,包括按字节编址什么意思也是一样,不过没有关系,接下来就来为大家分享关于内存按什么编址和按字节编址什么意思的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录按字节编址

2025年10月27日 17:00

recycling翻译(recycling泛读原文及翻译)

recycling翻译(recycling泛读原文及翻译)

各位老铁们好,相信很多人对recycling翻译都不是特别的了解,因此呢,今天就来为大家分享下关于recycling翻译以及recycling泛读原文及翻译的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录recy

2026年3月3日 10:45

illustrator举例说明(illustrator选择工具和直接选择工具有什么不同啊)

illustrator举例说明(illustrator选择工具和直接选择工具有什么不同啊)

各位老铁们好,相信很多人对illustrator举例说明都不是特别的了解,因此呢,今天就来为大家分享下关于illustrator举例说明以及illustrator选择工具和直接选择工具有什么不同啊的问题知识,还望可以帮助大家,解决大家的一些

2026年4月3日 07:30

property域名(在tomcat中配置CAS)

property域名(在tomcat中配置CAS)

“property域名”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看property域名(在tomcat中配置CAS)!本文目录在tomcat中配置CASIP是什么Permission denied to access p

2026年5月4日 19:15

结构体类型名称是什么(什么是结构体类型C语言中结构体类型占几个字节)

结构体类型名称是什么(什么是结构体类型C语言中结构体类型占几个字节)

大家好,结构体类型名称是什么相信很多的网友都不是很明白,包括什么是结构体类型C语言中结构体类型占几个字节也是一样,不过没有关系,接下来就来为大家分享关于结构体类型名称是什么和什么是结构体类型C语言中结构体类型占几个字节的一些知识点,大家可以

2026年1月27日 07:15

uml工具是什么(UML是什么)

uml工具是什么(UML是什么)

其实uml工具是什么的问题并不复杂,但是又很多的朋友都不太了解UML是什么,因此呢,今天小编就来为大家分享uml工具是什么的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录UML是什么iOS开发文档里的uml图是用

2026年1月17日 09:15

air源码自助站(自助建站系统到底好不好用)

air源码自助站(自助建站系统到底好不好用)

大家好,air源码自助站相信很多的网友都不是很明白,包括自助建站系统到底好不好用也是一样,不过没有关系,接下来就来为大家分享关于air源码自助站和自助建站系统到底好不好用的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本

2025年11月5日 04:45

css高度自适应(CSS3如何固定图片宽度使图片高度按图片比例自适应)

css高度自适应(CSS3如何固定图片宽度使图片高度按图片比例自适应)

各位老铁们好,相信很多人对css高度自适应都不是特别的了解,因此呢,今天就来为大家分享下关于css高度自适应以及CSS3如何固定图片宽度使图片高度按图片比例自适应的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录C

2025年9月3日 02:45

mapreduce的实现原理(Hadoop技术内幕的内容介绍)

mapreduce的实现原理(Hadoop技术内幕的内容介绍)

今天给各位分享Hadoop技术内幕的内容介绍的知识,其中也会对Hadoop技术内幕的内容介绍进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录Hadoop技术内幕的内容介绍是否所有的mapreduce程序都需要经

2025年11月16日 03:30

culture shock阅读理解(你好,完形填空I understand culture shock, i’ve been答案你有了吗)

culture shock阅读理解(你好,完形填空I understand culture shock, i’ve been答案你有了吗)

各位老铁们好,相信很多人对culture shock阅读理解都不是特别的了解,因此呢,今天就来为大家分享下关于culture shock阅读理解以及你好,完形填空I understand culture shock, i’ve been答案

2025年10月15日 21:45

private owner(求一篇 关于国外二手车交易现状的英文文章)

private owner(求一篇 关于国外二手车交易现状的英文文章)

今天给各位分享求一篇 关于国外二手车交易现状的英文文章的知识,其中也会对求一篇 关于国外二手车交易现状的英文文章进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录求一篇 关于国外二手车交易现状的英文文章翻译 th

2025年6月10日 08:15

bool类型几个字节(C++定义bool类型的最小存储空间是多大)

bool类型几个字节(C++定义bool类型的最小存储空间是多大)

本篇文章给大家谈谈bool类型几个字节,以及C++定义bool类型的最小存储空间是多大对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录C++

2025年7月5日 02:15

matlab曲线拟合(matlab拟合曲线的方法有几种)

matlab曲线拟合(matlab拟合曲线的方法有几种)

各位老铁们好,相信很多人对matlab曲线拟合都不是特别的了解,因此呢,今天就来为大家分享下关于matlab曲线拟合以及matlab拟合曲线的方法有几种的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录matlab

2025年7月13日 09:00

手机号码的正则表达式(求国际手机号码完整正则表达式,哪位大侠有)

手机号码的正则表达式(求国际手机号码完整正则表达式,哪位大侠有)

这篇文章给大家聊聊关于手机号码的正则表达式,以及求国际手机号码完整正则表达式,哪位大侠有对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录求国际手机号码完整正则表达式,哪位大侠有手机号和身份证号的正则表达式怎么写求JS手机号的正

2026年6月1日 11:30

illustrator怎么记住(illustrator中释放到图层和粘贴时记住图层是什么意思)

illustrator怎么记住(illustrator中释放到图层和粘贴时记住图层是什么意思)

大家好,关于illustrator怎么记住很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于illustrator中释放到图层和粘贴时记住图层是什么意思的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,

2026年1月16日 13:15

网站设计过程(网站设计的基本步骤)

网站设计过程(网站设计的基本步骤)

其实网站设计过程的问题并不复杂,但是又很多的朋友都不太了解网站设计的基本步骤,因此呢,今天小编就来为大家分享网站设计过程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录网站设计的基本步骤网站设计的基本步骤有哪些企

2025年9月2日 17:15

commit中文翻译(求翻译:I’m committed to working with members of both parties to cut our deficits and debt)

commit中文翻译(求翻译:I’m committed to working with members of both parties to cut our deficits and debt)

今天给各位分享求翻译:I’m committed to working with members of both parties to cut our deficits and debt的知识,其中也会对求翻译:I’m committed

2025年12月21日 06:30

知己棋牌源码(杭州有啥遇知己的蹦迪地方)

知己棋牌源码(杭州有啥遇知己的蹦迪地方)

这篇文章给大家聊聊关于知己棋牌源码,以及杭州有啥遇知己的蹦迪地方对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录杭州有啥遇知己的蹦迪地方在棋牌领域,人类是不是被人工智能全面超越了异性知己最高境界不能说的话爱上有妇之夫又不想破坏

2025年5月25日 09:45

offset属性(offsetheight 的属性是什么)

offset属性(offsetheight 的属性是什么)

今天给各位分享offsetheight 的属性是什么的知识,其中也会对offsetheight 的属性是什么进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录offsetheight 的属性是什么JS中的offs

2026年7月14日 23:15

align命令怎么用(cad对齐怎么用)

align命令怎么用(cad对齐怎么用)

大家好,关于align命令怎么用很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于cad对齐怎么用的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录cad对

2025年11月7日 04:45

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索