三次握手
当客户端向服务端发起连接的时候,会先发送一包连接请求数据,过去询问一下能否建立连接,这包数据我们称之为SYN包,如果服务端同意连接,则服务端向客户端回复SYM+ACK包,客户端收到后再发送一个ACK包,连接建立
为什么三次握手而不是两次握手
为了防止已失效的请求报文再传到服务端引起错误
四次挥手
处于数据连接状态的客户端和服务端都可以发起关闭连接请求,假设客户端主动发起关闭连接请求,它需要向服务端发送一个SYN包,表示要关闭连接,客户端自己则进入中止等待1状态,这是第一次挥手。
服务端收到SYN包,发送一个ACK包给客户端,表示自己进入了关闭等待状态,客户端收到后进入中止等待2状态,这是第二次挥手,服务端此时还可以发送未发送的数据,客户端还可以接受数据。
服务端发送完数据后,就给客户端发送一个FIN包,而后服务端进入最后确认状态,这是第三次挥手。
客户端收到后,给服务端发送一个ACK包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包后立即关闭连接,这是第四次挥手
为什么客户端需要设置超时等待时间
为了确认服务端已经收到ACK包,假设客户端发送最后一个ACK包后就释放了连接,一旦ACK因为网络原因不小心丢失,服务端就会一直停留在最后确认状态。如果服务端没有收到ACK包,那么服务端会重发一个FIN包并刷新客户端的超时时间。