首页 > 编程知识 正文

tcp协议,tcp连接过程

时间:2023-05-05 06:32:27 阅读:15553 作者:680

TCP头部:其中,ACK SYN编号的三个部分用于: 那些介绍也在下面。

暂时需要的信息如下

ACK: TCP协议规定,仅在ACK=1的情况下有效,规定建立连接后发送的所有消息的ACK必须为1

同步化(syn ) :用于在建立连接时同步序列号。 如果SYN=1,ACK=0,则表示这是连接请求消息。 如果对方同意建立连接,则在响应消息中必须SYN=1和ACK=1。 因此,SYN设置为1表示这是连接请求或连接接受消息。

fin(finis )是结束、结束的意思,用于释放一个连接。 FIN=1时,表示该段的发送源的数据已发送,请求释放连接。

三次握手的过程:

首先,客户端请求连接时,SYN=1 ACK=0。 请参阅标头字段的说明。 在TCP中,如果SYN=1,则不能携带数据,但会消耗序列号,因此声明自己的序列号为seq=x

然后,服务器进行SYN=1 ACK=1 seq=y、ack=x 1这样回复确认,

之后,客户端再次进行确认,但不使用SYN。 在这种情况下,ACK=1、seq=x 1、ack=y 1。

然后连接建立,为什么要握手三次呢? (确认两次)。

要断开连接,请执行以下操作:

当客户端a没有发送任何内容时,释放a端的连接。 a发送信息(无数据)。 其中,FIN设定为1。 Web服务器收到后,向APP应用程序发送一封信。 此时,a侧的连接被关闭。 也就是说,a不再发送消息。 但是,你可以收到信息。 a收到b的确认后进入等待状态,等待b请求释放连接。 b的数据发送完成后,请求a释放连接。 这也用FIN=1表示,用ack=u 1表示。 (图),a收到并返回确认消息,进入TIME_WAIT状态,等待2MSL时间。

为什么要等?

为此,b向a发送了FIN=1的解除连接请求,但该信息已丢失。 A不发送确认信息。 B超时后重新发送。 此时,a可以在WAIT_TIME上接收该请求。 此时,再返回一个确认就可以了。 (a收到FIN=1的请求后WAIT_TIME重新记住时) ) ) ) ) ) ) )。

le="background-color:rgb(255,255,255);">

另外服务器B存在一个保活状态,即如果A突然故障死机了,那B那边的连接资源什么时候能释放呢?  就是保活时间到了后,B会发送探测信息, 以决定是否释放连接。

【注意】中断连接端可以是Client端,也可以是Server端。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

整个过程Client端所经历的状态如下:


而Server端所经历的过程如下:


【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。