TCP三次握手和四次挥手

发布时间:2020-06-17 14:11:43 作者:萨瓦迪迪卡
来源:网络 阅读:212

SYN:1 代表请求创建连接

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

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

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

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

TCP三次握手和四次挥手

TCP三次握手和四次挥手

在创建连接时,

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 : 嗯,听到了

  建立连接,开始聊天!

TCP三次握手和四次挥手

在四次分手时,

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个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

推荐阅读:
  1. TCP三次握手详解和四次挥手
  2. TCP协议的三次握手和四次挥手的理解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

tcp/ip 三次握手 四次挥手

上一篇:java中怎么判断文件是否相同

下一篇:怎样用PHP编写出简洁的代码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》