三次握手和四次挥手

一,在我们创建套接字(socket )成功过后,进行绑定ip地址,端口号,然后进行监听,有客户端接入我们会有一个三次握手的过程。

一次握手:客户端会发送一个请求报文SYN,并携带初始的序列号为x,并且需要消耗一个序号,此时客户端进入SYN_SENT状态

二次握手:服务端收到来自客户端的SYN报文后,对这个SYN报文确认后,会把自己的SYN报文响应给客户端,此时ACK=1表示确认序列号有效,并且确认号(ack)的值为传来的seq+1,即为x+1,此时初始序号为y。此时服务器进入SYN_RECV状态

三次握手:客户端收到了服务器SYN+ACK的包,此时客户端处于ESTABLISHED状态并且客户端和服务端均表示同意连接,,确认号因此会发送一个ACK报文ack的值仍为序列号+1,即y+1,初始seq值为x,所以第二个报文段seq+1,即x+1。

注:前两次不能携带数据,第三次可以携带数据 

为什么不能两次握手?

此时你和你的对象拨通了电话:
你 :“喂,能听到我说话吗?”
你对象 :“亲爱的,我可以听到!”
此时你突然不说话了…

如果已经建立了连接,但是突然故障了怎么办?

tcp设有一个保活计时器,显然如果出现故障,服务器不会一直等下去,客户端每发送一个消息,计算器就会被复位,一般计算器设置在2个小时,如果2小时,服务器没有收到任何数据,会发送一个探测报文给客户端,一共发10次,每隔75s发一次,若10个报文发送过去,客户端依旧没有反应,服务器就会认为出现故障,就会关闭服务器 。

二、四次挥手(断开连接)

 

 

第一次挥手:客户端打算关闭连接,FIN=1报文给服务端。

第二次挥手:服务端收到以后,向客户端发送ACK应答报文,此时并不是马上就断开,而是告诉客户端我知道你要断开连接了,但是我要把我这边数据处理完成。

第三次挥手:等待服务端处理完数据后,向客户端发送FIN报文。

第四次挥手:客户端接收到FIN报文后回一个ACK应答报文。

服务器收到ACK报文后,进入close状态,服务器完成连接关闭。

为什么连接要3次,断开要4次?

因为第二次挥手并不是马上就断开,而是告诉客户端我知道你要断开连接了,但是我要把我这边数据处理完成在说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No Iverson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值