TCP三次握手四次挥手

三次握手
刚开始客户端处于closed状态,服务器处于listen状态
第一次握手:客户端向服务器发送syn报文,并指明客户端的初始化序列号isn,此时客户端处于请求连接状态(syn_Send)
第二次握手:服务器收到客户端的syn报文之后,会以自己的syn报文作为应答,并且也指定自己的初始化序列号ISN,同时会把客户端的ISN+1作为ACK的值,表示已经收到客户端的SYN,此时服务器处于半连接状态(SYN_REVD)
第三次握手:客户端收到syn报文之后,会发送ACK报文,当然也是把服务器的ISN+1作为ACK的值,表示已经收到服务端的 syn报文,此时客户端处于establised 状态(表示两台机器正在传输数据)
第四:服务器收到ACK报文之后也会变成established状态,此时双方建立起连接
三次握手的作用:
1.确认客户端和服务器的接收发送能力是否正常
2.指定自己的初始化序列号,为后面的可靠传送做准备
3.如果是https协议,三次握手的这个过程,还会进行数字证书的验证以及加密密钥的生成。
为啥只有三次握手才能确认双方的接收发送能力是否正常,而两次却不可以?
第一次握手:客户端发送网络包,服务端收到了,这样服务端就能确认客户端的发送,服务端的接收能力正常。
第二次握手:服务端发包,客户端收到了,这样客户端就能确认服务端的发送接收能力,客户端的接收发送能力正常,不过此时服务端不能确认客户端的接受能力是否正常。
第三次握手:客户端发包,服务端收到了,此时服务端能确认客户端的接收发送能力正常,服务端的接收发送能力正常。
因此需要三次握手才能确认双方的接受发送能力正常。
初始化序列号ISN是固定的么?
三次握手的一个重要功能是客户端和服务器交换ISN,以便让对方知道接下来接受数据的时候如何按序列号组装数据。
如果ISN是固定的,攻击者很容易猜出后续的确认号,所以ISN是动态生成的。
什么是半连接队列
服务器第一次收到客户端的syn之后,就会处于半连接状态,此时双方还没有完全建立连接,服务器会把此种状态下的请求连接放在一个队列内,我们把这种队列称为半连接队列。当然还有一个全连接队列,就是已经完成三次握手,建立起来的连接就会放在全连接队列中,如果队列满了就有可能出现丢包现象。
SYN_ACK重传次数问题
服务器发送完SYN-ACK包之后,如果未收到客户端的确认包,服务器进行首次重传,等待一段时间仍未收到客户端的确认包,进行二次重传,如果重传次数超过系统规定的最大重传次数,系统会将该连接信息从半连接队列删除,注意:每次重传的等待时间不一定相同,一般是指数增长。
三次握手可以携带数据么?
第一次第二次握手不可以,第三次可以
加入第一次握手可以携带数据,如果有人恶意攻击服务器,每次都在第一次握手的syn报文中携带大量数据,因为攻击者不需要理会服务器的接收发送能力是否正常,疯狂发送携带数据的报文会让服务器花费很多时间,内存空间处理这些报文,第一次握手可以携带数据的话,会让服务器更容易收到攻击。
第三次握手之后双方都已经建立连接,都处于建立连接的established状态,都知道双方的接收发送能力正常,所以可以携带数据。
为什么要进行三次握手?
当进行第一次握手,网络不好可能会堵塞,所以连接的请求并没有到达服务器端,但是tcp连接有超时重传的机制,所以再一次发送请求,这时服务器端收到你的请求也会返回一个请求给你,这就是第二次握手。
但是这时网络环境突然好了起来,被堵塞的请求到达服务器端,服务器端又给你回了一个请求,但是你又不想给服务器请求,这时服务器的资源会占用等待你的请求,为了不使服务器的资源继续占用,你又必须给服务器发送一个请求,所以要进行三次握手。
四次挥手
第一次挥手:客户端向服务器发送FIN报文,报文会指定一个序列号,此时客户端处于FIN_WAIT1状态(等待确认关闭连接状态)
第二次挥手:服务端收到FIN之后会发送ACK报文,并且把客户端的序列号+1作为ACK报文的序列号值,表明已经收到了客户端的报文,此时服务端处于CLOSE_WAIT状态。
第三次挥手:如果服务端也想断开连接,和客户端第一次挥手一样,向客户端发送FIN报文,且指定一个序列号,此时服务端处于LAST_ACK状态(被动关闭的一方发送FIN报文之后,等待对方的ACK报文)
第四次挥手:客户端收到FIN报文之后会发送ACK报文做应答,并且把服务端的序列号值+1作为自己的ACK报文的序列号值,此时客户端进入TIME_WAIT状态,需要等一段时间服务器接收到ACK报文之后才会进入CLOSED状态。
五:服务端收到ACK报文之后就处于CLOSED状态。
为什么客户端发送关闭连接的确认报文之后不直接关闭而是进入TIME_WAIT状态?
要确认服务器接收到ACK报文,如果没收到的话服务器会再次发出FIN报文给客户端,客户端再次受到ACK报文之后就会知道之前的ACK报文丢失,所以会再次发送ACK报文。
一般这个TIME_WAIT是一个报文的来回时间,一般会设置一个计时器,如果过了这个计时器时间没有在收到FIN报文,则代表对方接收到ACK报文,此时处于CLOSED状态

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值