三次握手与四次挥手

首先,回顾一下计算机网络的分层,计算机网络为什么要分层呢?先看下计算机网络的分层-OSI七层模型与TCP/IP五层模型

三次握手是在TCP协议种采用的策略,按层次分,TCP 位于传输层,提供可靠的字节流服务。(注:TCP连接是双向传输的对等模式(即双方都可以同时向对方发送/接受数据),当有一方要关闭连接时,会发生FIN告知对方,对方回一个ACK则一个方向上的连接关闭了)
TCP 协议采用了三次握手
传输层:为了方便传输,将大的数据分割成报文段,

为了更好的了解三次握手的具体过程,我们先来了解一下TCP的六个控制位:

紧急位URG:URG的特点就是让数据插队,URG=1的就会在缓存中被提前到第一个传输

确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都有必须把ACK设置为1

推送位PSH:就是接收端的URG,当PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满宰相上交付

复位RST:RST=1时候,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输连接。 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段

同步位SYN:SYN=1时表示建立连接
举例:A和B主机要建立连接,就A先发一个报文,其中SYN=1
B收到之后也回复一个SYN=1的报文,代表接受连接

三次握手:(确认建立连接的过程)

在这里插入图片描述
简单解释一下:
发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,
回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发
送端再回传一个带 ACK 标志的数据包,代表“握手”结束。
若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发
送相同的数据包。

在这里插入图片描述
注释:
1、客户端向服务端发送请求连接的报文段

SYN=1:(A)要建立连接了!
seq=x(随机):因为还没有数据,所以写什么都无所谓

2、服务端回复客户端的连接请求

SYN=1:我(B)同意你(A)建立连接!
ACK=1:连接建立了,之后的ACK必须都置为1
seq=y(随机):因为还没有数据,所以写什么都无所谓
ack=x+1:之前发送方(A)说发送的是第x位数据(虽然发送方是瞎说的),所以我(B)要的是x+1位数据

3、客户端位该TCP连接分配缓存和变量,向服务器端返回确认。

SYN=0:SYN只有在建立连接时才为1,其他时候均设为0
ACK=1:连接建立了,之后的ACK必须都置为1
seq=x+1:我(A)发送的报文段的第一个字节就是x+1
ack=y+1:之前接收方(B)说发送的是第y位数据(虽然接收方是瞎说的),所以我(A)要的是y+1位数据

注意一下,TCP是双向的,所以不存在绝对不变的发送方接收方,这里的两台主机都同时是发送方和接收方

四次挥手(释放连接)

刚才在三次握手我们建立了连接的过程,现在需要断开上面的连接,该怎么办呢?

首先,前面说到TCP协议是双向传输的对等模式,说白了,就是通信双方都可以同时收/发数据。四次挥手,是为了释放连接,为什么是次呢?
连需要四次挥手才能断开连接是因为:TCP是双向对等传输,故有两个方向的连接,需要两个FIN才能断开

1、当服务端收到客户端发送过来的FIN断开请求时,回复ACK后只是断开了(客户端)client -> (服务端)server方向的连接,服务端还可以继续向客户端发送数据(若数据没有发送完)。
2、数据发送完后,服务端也发送一个FIN,客户端回复ACK,则连接全部断开了。
下面通过图示和文字进一步解释;
在这里插入图片描述

断开连接符号:    FIN=1:代表请求断开TCP连接	

1、客户端向服务器端发送断开TCP连接的请求报文

FIN=1:(A)要释放连接了!
seq=u:发了好多数据,这里只是用u指代一下,这里u是有确定值的

2、服务端回复客户端的断开请求

ACK=1:连接建立了,之后的ACK必须都置为1
seq=v:发了好多数据,这里只是用v指代一下,这里v是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(尽管此时A已经决定释放连接了)

3、服务端服务端在第一次回复之后不会马上就断开TCP连接,而是会先确保断开前,所传输的数据是否已经传输完成了

FIN=1:(B)要释放连接了!
ACK=1:连接建立了,之后的ACK必须都置为1
seq=w:发了好多数据,这里只是用w指代一下,这里w是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(因为A直接不发数据了,所以第二段第三段的ack都是u+1)确认完毕后再回复一个报文

4、客户端再回送一个确认报文段,确认最终断开了

ACK=1:连接建立了,之后的ACK必须都置为1
seq=u+1:之前发的数据时第u位数据,B也要第u+1位数据,所以我发第u+1位数据
ack=w+1:之前发送方(B)说发送的是第w位数据,所以我(A)要的是w+1位数据

为什么需要等待计时2MSL?
因为这样可以保证B可以收到A的终止报文段进而进入关闭状态
比如说如果A的第四段报文丢失,那么等待一个MSL之后B就会重传第三段报文,花费小于1MSL之后A就会再收到第三段报文,之后就可以再次向B发送第四段报文提示B关闭连接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值