千家信息网

TCP三次握手和四次挥手

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,SYN:1 代表请求创建连接FIN:1 表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。ACK:代表确认接受,ACK=1,来表示数
千家信息网最后更新 2024年12月12日TCP三次握手和四次挥手

SYN:1 代表请求创建连接

FIN:1 表示请求关闭连接,在四次分手时,我们发现FIN发了两遍。这是因为TCP的连接是双向的,所以一次FIN只能关闭一个方向。

ACK:代表确认接受,ACK=1,来表示数据接收成功。

seq:序列号,当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。初始序列号是随机生成的。

ack:服务端接收到数据包后进行确认的编号,ack是seq+1,

在创建连接时,

1.客户端发送syn包(编号seq=x)到服务器,请求创建连接(SYN=1)。

2.服务端接收到后,确认客户请求(ACK=1,ack=x+1),同时自己发送syn包(seq=y)告诉客户端请求创建连接(SYN=1):我接受到请求并处理了,我也想跟你建立连接,你确认下。

3.客户端收到服务器的SYN+ACK包,确认服务端状态(ACK=1,ack=y+1)。同时向服务器发送syn包( seq=x+1)告诉服务端:我接受到你的确认包了,可以开始通讯了。

三次握手完成!

举个打电话的例子:

  A : 你好我是A,你听得到我在说话吗

  B : 听到了,我是B,你听到我在说话吗

  A : 嗯,听到了

  建立连接,开始聊天!

在四次分手时,

1.首先客户端请发送一个FIN包(编号seq=u),表示要断开连接(FIN=1)。

2.服务端接收到请求后,确认客户请求(ACK=1,ack=u+1),同时发送数据包(seq=v)告知客户端需要确认当前服务端状态。

3.服务端完成状态确认(ACK=1,ack=u+1),向客户端发送FIN包(seq=w)请求关闭连接(FIN=1)。

4.客户端接收到服务器端请求(ACK=1,ack=w+1),同时发送数据包(seq=u+1)至服务器,告知收到请求并确认。
5.客户端等待两秒,确认服务端收到消息,否则重发一次确认消息。

四次分手完成!

四次挥手:
A:"喂,我不说了。"

B:"我知道了。等下,上一句还没说完。Balabala….."
B:"好了,说完了,我也不说了。"

A:"我知道了。"

1.为什么连接的时候是三次握手,关闭的时候却是四次握手?

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

2.如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

0