TCP三次握手

三次握手主要是为了确定服务器和客户端的请求与发送能力是否正常

第一次握手  客户顿生成一个初时序列号x并设置syn为1发送给服务端 同时自己进入SYN-SENT状态

第二次握手 服务端收到请求后  发送syn+ack包 把x+1 并生产一个序列号q给客户端 同时自己进入syn-received状态 

第三次握手 客户端收到服务端的响应后 把y+1 发送ack包给服务端 连接建立成功 

那两次握手不行吗?

不行

因为

1. tcp握手需要客户端和服务端双方都确定彼此的发送接收能力都正常,若是只有前两次握手

客户端确实能知道服务端的发送和接收能力都正常,但是服务端并没有收到客户端的回应,所有他无法确定客户端的接受能力是否正常,所以需要第三次握手

2.由于网络传输具有波动,可能同一个请求,客户端第一次发 服务端没收到,所以再发一次,

但是第一次请求先到了,若是只有两次握手,服务端会响应两个请求,建立两次连接并等待,造成资源浪费,所以要三次握手,客户端通过比较序列号发现是旧请求,会发送rst报文中断这次连接。

3.若只有两次握手 服务端无法确定客户端是否对齐了序列号,不可靠

注:只有第三次握手允许携带数据,即连接正式建立后才能发数据,防止ddoss攻击

扩展

        半连接队列:即三次握手中间进行的请求 

        全连接队列:握手完成后的请求

TCP四次挥手

TCP终止连接需要四次挥手

第一次挥手 客户端自己确定不再发送数据,要断开连接时,会向服务器发送fin包 然后自己进入fin-wait-1状态

第二次挥手 服务端收到客户端发送的fin包后,回应一个ack包,表示自己收到了fin包,然后自己进入close-wait状态 等待自己的数据发完 客户端进入fin-wait-2状态

第三次挥手 服务端自己的数据发完后 发送一个 fin ack 包给客户端 表示自己的数据发完了,可以断开连接了 之后进入last-ack状态 等待客户端的回应

第四次挥手 客户端收到fin+ack包后 发送一个ack包给服务端  自己进入 Time -wait 状态 并等待2msl后断开连接 服务端收到后断开连接

为什么要等待2MSL时间?即为什么要进入time-wait状态

1.防止服务端没收到第四次挥手的ack包  服务端没收到会重发fin ack包 若客户端在这个时间内收再次收到和这个包就再发一次ack包

2.防止新旧数据包混淆,让本次连接的所有包都消失,确保这个ip+端口的组合的下一次连接是全新的

所以四次挥手就是要确保客户端与服务端两方都确实数据都发完了 然后安全的优雅的断开连接

确保tcp连接的可靠性

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐