TCP协议中的三次握手和四次挥手

首先要知道一个报文的内部结构

在这里插入图片描述其中在请求连接和断开的过程中要关注的是序列号和确认号,还有几个标志位ACK\SYN和FIN
序列号:一般由系统自动生成,用来标识报文的身份
确认号:确认号一般由是序列号+1,用来恢复确定建立连接。
ACK表示判断当前报文是接收确认的报文,主要用于当接收端接收报文之后,发送给发送端的确认标志,只有标志位为1是,确认号才是有效的
SYN:表示一个请求连接报文,一般是发送请求时标志位置为1
FIN:一般用在断开连接时,表示是一个断开的请求

请求连接阶段三次握手

在这里插入图片描述第一次握手:客户端发送请求,数据包中的包头部分请求建立连接,所以向服务器端发送时发送序列号Seq=X(假设X=1000)和请求同步置为1.即SYN=1
第二次握手:服务器端接收到客户端想要连接的请求,如果同以连接的请求,就把SYN=1,ACK=1从接收的数据包中解析出序列号,加一之后们就作为回复包中的确认号ACKnum=X+1(1001),并且向客户端发送自己的序列号Seq=Y(假设Y=2000)
第三次握手时:客户端接收到服务器的数据包,于是从包中解析出回复包中的序列号,加一之后作为确认号,所以确认时ACK=1,ACKnum=Y+1(2001),至此,建立起连接开始传输数据

断开连接阶段四次挥手

在这里插入图片描述第一次挥手:客户端请求完毕,希望断开连接,所以向服务器发送数据包和序列号,请求断开连接,所以FIN=1,Seq=X.
第二次挥手;服务器端接收到请求,表示自己已经知道你要断开连接,但是需要处理一下可能没有完成的任务,所以先回复给客户端,已经知道你要断开连接了,所以ACK=1,确认号ACKnum=X+1
第三次挥手:服务器端检查完之后,表示所以数据传输完毕,所有的任务完成,可以断开连接,于是回复请求,你要是没有其他请求的话,我就真的断开连接了FIN=1,Seq=Y
第四次挥手:客户端接收断开请求,表示自己自己确实没有其他的请求了,可以断开了,于是恢复确认包,表示可以断开ACK=1,ACKnum=Y+1,服务器端接收到之后,不会在回复,会断开连接进入CLOSED状态

小小面试题

  1. 为什么需要三次握手?而不是两次?

主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

三次握手过程中可以携带数据吗?

第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。
假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN报文中放入大量的数据,因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第一次握手可以放数据的话,其中一个简单的原因就是会让服务器更加容易受到攻击了。
而对于第三次的话,此时客户端已经处于 established状态,也就是说,对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了

第二次挥手和第三次挥手为什么不能一起?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

当浏览器输入要查找页面的url时,按下enter键会发生什么
加粗样式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值