TCP三次握手和四次挥手

前言

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,常用于互联网中的数据传输。TCP连接的建立和终止都采用了一些固定的步骤,其中包括了三次握手和四次挥手。

基本概念

SYN是请求建立连接

FIN是  请求断开连接

ACK是确认收到请求

在三次握手和四次挥手之中,主要三个包就是他们。

三次握手

三次握手应用于建立连接,并且只能由客户端发起。

具体流程有三步:

  • 客户端发送一个带有SYN = j 的数据包,并选择一个初始序列号(ISN) 。 此时客户端进入SYN_SEND状态。
  • 服务器发送一个带有ACK = j +1 和SYN = k 的数据包表示接受请求,并且使ISN加1作为自己的初始序列号(ISN),并且也会选择一个序列号作为数据段的序号。(注意初始序列号和序列号)。此时服务器进入SYN_REVC状态
  • 客户端在收到SYN/ACK包后,发送一个ACK = k + 1的数据包,来表示接受请求,建立连接。此时客户端和服务器都进入ESTABLISHED状态

图解

 四次挥手

当客户端和服务器之间的TCP连接需要终止时,就需要进行四次握手(Four-way Handshake)。四次握手确保了双方都知道彼此不再发送数据,并且正式关闭连接。

这个过程可以由双方发起,不只是限于客户端。

具体流程有四步:

  • 客户端发送FIN = M 的数据包,告诉服务器我要结束连接,不在发送数据,但是可以接收数据。此时客户端进入FIN_WAIT_1状态。
  • 服务器接收到包后,发送ACK = M+1 的数据包,表明确认接受请求,但是暂时还不断开连接。此时客户端进入FIN_WAIT_2状态。
  • 服务器接发送FIN = N 的数据包,告诉客户端我现在要结束连接了。此时服务器进入LAST_ACK状态。
  • 客户端接收到包后,发送ACK = N+1 的数据包,表示确认接收到请求,(服务器端接收到ACK数据包后就会断开连接),但是客户端先不断开连接,会进入TIME_WAIT 状态。需要等待2msl 的时间,如果服务器端还未发送请求,证明服务器已经结束连接,那么客户端也断开连接。

msl : 最大报文生存时间

 图解

 为什么建立连接三次而结束连接却四次?

因为在建立连接的第二步,SYN和ACK是一起发送的。

但是在结束连接的第二步中,是先发送ACK确认接受请求,之后再发送FIN数据包。

之所以要分成两步来发,是因为被动结束端,在主动结束段发送FIN数据包的时候,可能还在传数据,所以只能先确认请求,表示我知道了,然后过一段时间再去发送FIN数据包。

具体一点就是

客户端发送FIN关闭报文,但是服务端仍在给他发送数据不能马上停止,服务端先给出ACK报文回应(你的请求我收到了,但要等我发完数据才能关闭哦)。当服务端发送完毕后,再发送FIN报文请求关闭,所以这两个报文不能同时发送,故有了四次挥手。

连接时客户端出现问题怎么解决? 

  • 保活计时器

  • 探测报文段

  • 心跳包

TCP服务器进程每收到一次客户端发起的请求时,保活计时器就会重新计时,一般计时时间为两小时。如果在计时器周期内未收到消息,服务器就会向客户端发送一个探测报文段,每个75s发送一次,连续发送十次,若客户端还没有发送请求,则断开连接。

若没有数据发送,但是又不想断开,那么服务器要发送心跳包,来告诉这个连接是一个长连接。

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值