SYN:用于建立连接。
ACK:用于确定收到了请求。
三次握手:
三次握手简单来说就是在不可靠的信道上建立可靠的连接
为什么称为三次握手呢?
① 首先我们客户要向服务端发送一个SYN包来请求连接
② 服务端收到之后就会向客户端也发送一个SYN包来建立连接以及一个ACK包来确定自己收到了来自客服端的SYN包
③ 客户端收到服务端的SYN包和ACK包后再向服务器发送一个ACK包来确认建立连接。
至此客户端已经和服务端建立了连接,一共发送了三次数据包因此称为三次握手
问题:为什么是三次握手吗?不能是两次握手或者其他次数呢?
首先如果是两次握手的话,客户端发送了SYN包后有可能因为一些原因没有发送到服务端,那么客户端就会再发送一个SYN包来请求连接,这一次顺利到达了服务端,并且服务端也顺利发送了SYN包和ACK包,两步就完成了连接,而并没有第三步的客户端再发送ACK包确认,那么如果最开始没发送完成的SYN包也来到了服务端,那么服务端就会认为是客户端又发送的一个新的连接请求,从而又连接了,就会导致服务端认为有两条连接,而客户端却只认为有一条连接,就导致了冲突,因此必须有第三步的客服端的确认让他确认到底自己发送了多少条连接请求从而将多余的舍弃掉,达到服务端和客户端连接数的统一。
其次三次握手是目前效率较高解决方式,若多次握手就会导致数据传输的复杂,丢包率也会更高。
四次挥手:
ACK:用于确定收到了请求。
FIN:释放一个连接。
① 客户端发送一个fin包来请求断开与服务端的连接
② 服务端收到客户端发送的fin包后就要回应一个ack包来同意断开请求,并进入关闭等待状态,客户端进入关闭等待状态
③ 此时客户端和服务端仍然可以互相发送数据,等最后的数据发送完毕之后 服务端会再向客户端发送一个fin包请求关闭,并进入到最后的最后确认状态
④ 客户端收到fin包后会想服务端回复一个ack包并且进入超时等待状态,服务端收到客户端到ack包后才最终断开连接
问题:为什么在第四次挥手的时候会有TIME-WAIT状态:
因为如果ack包没有发送到服务端,一段时间过后服务端会再次发送一个fin包,此时客户端会再次发送ack包到服务端,重复这个过程直到服务端收到了客户端到ack包才最终断开连接,而客户端经过一段时间后才会自己断开。如果没有TIME-WAIT 状态:客户端在发送了ACK包直接断开了,那么如果ACK包丢失了那么服务器则会一直处在最后确认状态而不能断开。