1、三次握手
三次握手是建立连接的过程
如图大致为三次握手的流程图:
当客户端对服务端发起连接时,会先发一个包 连接请求数据,去询问能否建立连接,该数据包称为 "SYN"包
然后,如果对方同意连接,那么对方将会回复一个 "SYN+ACK"包
客户端收到后,回复一个 "ACK"包,连接就建立了
因为该过程中,互相发送了三包数据,所以称为 "三次握手"
但是为什么是 "三次握手" , 而不是 "两次握手",明明服务端回复完 "SYN+ACK"包后就能建立连接
这是为了防止已失效的请求报文,忽然又传到服务器,从而引起错误
比如:
当发送请求包时,因为某些原因,该包并没有到达服务器,在某个节点产生了滞留 ,然而客户端为了建立连接会重新发送 "SYN"包 ,正常送达后回复 "SYN+ACK"包建立连接,但是,第一个包 滞留的包突然恢复,又送达到服务端,这时服务端会误以为客户端又 发送了一个连接请求 ,这时,服务端认为是两个连接 ,二客户端认为只有一个连接,造成了状态不一致。
如果在 "三次握手"的情况下
客户端没有回复 "ACK"包,就无法建立连接,解决了网络信道不可靠的问题
2、四次挥手
四次挥手大致流程图
第一次挥手
客户端向服务端发送 "FIN"包 ,表示要关闭连接,自己则进入终止等待1状态,这是第一次挥手,如图
第二次挥手
服务端接收到 "FIN"包 ,回复一个 "ACK"包 ,表示自己进入关闭等待状态 ,而客户端同时进入终止等待2状态,这是第二次挥手,如图
PS:服务端此时还可以发送未发送的数据,而客户端也还可以接收数据
第三次挥手
待服务端发送完数据后,会发送一个 "FIN"包 ,进入最后确认状态,这是第三次挥手
第四次挥手
客户端收到后,回复 "ACK"包 ,进入超时等待状态 ,经过超时时间后关闭连接 ,而服务端收到 "ACK"包 后立即关闭连接
为什么客户端需要 "等待超时时间"
这是为了保证 服务端已收到 "ACK"包 ,因为假设客户端发送完 "ACK"包后就断开连接 ,一旦 "ACK"包在网络中丢失 ,服务端就一直停留在最后确认状态。
而有了 "等待超时时间"
服务端会因为没有收到 "ACK"包,会对客户端重新 发 "FIN"包 ,此时,客户端会再 对服务端发送 "ACK"包 ,并且刷新超时时间,这也是为了在不可靠的网络连接中,可以可靠进行地连接断开。