三次握手与四次挥手详解以及可能的面试题

一、三次握手与四次挥手

1.三次握手:

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
 

2.四次挥手:

1(我客户端已经没有话跟你说了) 当client所要发送的数据发送完毕之后(这里是接收到了来自于server方的,对于clien发送的最后一个数据包的收到确认ACK包之后),向server请求关闭连接,因此client向server发送一个FIN数据包,表明client数据发送完了,申请断开。并且自身进入等待结束连接状态FIN_WAIT-1 
2,(我服务器知道你没话说了,但是你等等我,我不确定是否没话跟你说了,等我的回复)当server收到了来自client的FIN请求包之后,向client回复一个确认报文ACK,同时进入关闭等待状态(CLOSE -WAIT),这时TCP连接的server便会向上层应用发送通知,表明client数据发送完毕,是否需要发送数据给client,这时TCP连接已经处于半关闭状态了,因为client已经没有数据要发送了。同时client收到了来自server的确认报文之后,便会进入FIN-WAIT-2状态。 
3,(我服务器的上层应用也没话说了,咱们可以断开连接了) TCP连接的server收到上层应用的指令表明没有数据要发送之后,会向client发送一个FIN请求数据包,其中确认位ACK=1,表明响应client的关闭连接请求,同时FIN=1表明server也准备好断开TCP连接了。 
4,*(好的,那么咱们断开连接吧)***client收到了来自server的FIN数据包之后,知道server已经准备好断开连接了,于是向server发送一个确认数据包ACK,告诉server,可以关闭资源断开连接了。同时自身进入TIME-WAIT阶段,这个阶段将持续2MSL(MSL:报文在网络链路中的最长生命时长),在等待2MSL之后,client将会关闭资源。 
5,serve日收到了来自于client的最后一个确认断开连接数据包之后便会直接进入TCP关闭状态,进行资源的回收。


二、为什么要四次挥手 


答:前两次挥手是为了断开client至server的连接,后两次挥手是为了断开server至client的连接,如果没有第四次挥手,会出现如下状况:

server发送FIN数据包并携带ACK至client之后直接断开连接,如果client没有收到这个FIN数据包,那么client会一直处于等待关闭状态,这是为了确保TCP协议是面向连接安全有保证锝。
上面解释了为什么不是三次挥手,同理,两次挥手也是不安全的。不能保证server与client都能正确关闭连接释放资源,而不会造成资源浪费。

前两次挥手是为了断开client至server的连接,后两次挥手是为了断开server至client的连接,如果没有第四次挥手,会出现如下状况:

 

三、三次握手有什么缺陷可以被黑客利用,用来对服务器进行攻击? 
答:黑客仿造IP大量的向server发送TCP连接请求报文包,从而将server的半连接队列(上文所说的未连接队列,即server收到连接请求SYN之后将client加入半连接队列中)占满,从而使得server拒绝其他正常的连接请求。即拒绝服务攻击
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值