tcp的三次握手和四次回收
一、三次握手
三次握手建立tcp连接:
1.客户端发送syn报文给服务端
2.服务端收到客户端端syn报文,返回syn+ack应答报文,告诉客户端可以建立连接了
3.客户端收到服务端的应答报文后,发送一个ack报文,告诉服务端我收到服务端的响应报文了,并且进入established状态
第3步看起来好像有点多余,到底有什么作用呢?
1.如果客户端第1步建立连接正好网络延时,syn报文没发送到服务端。客户端收不到ack报文则会再发起一次建立连接请求这是第二次请求,服务端返回ack建立连接。这是第一次请求到达了服务端,服务端则会认为又一次新的连接请求,再建立一个连接,这就浪费服务端资源了。
2.第2步服务端返回ack报文时由于网络延时,没有及时返回给客户端。客户端此时就会认为服务端没有同意建立连接,就不继续往下运行了,不会发送数据给服务端。而服务端此时认为已经建立好连接了,一直在等客户端发送数据过来,浪费服务端连接资源。
syn攻击:
攻击者模拟客户端发送syn报文给服务端,服务端为这些请求建立连接,一直等待客户端的确认报文。由于这些连接长时间得不到释放,正常客户端的请求进不来被丢弃,导致服务变慢。
二、四次挥手
四次挥手释放连接:
1.客户端发送fin报文给服务端,客户端不会再发送数据请求给服务端了,从established状态进入fin-wait-1状态
2.服务端收到fin请求后,返回ack应答报文
3.服务端数据处理完后,发送fin报文给客户端,不再发送数据请求给客户端了,可以断开连接了
4.客户端发送ack报文给服务端。
为什么关闭连接需要四次挥手呢?
对方发送fin报文过来,只是表示对方不再发送数据过来了,你可能还有数据需要处理,所以只是立即返回一个ack报文给对方,告诉对方收到了。然后处理完数据后,再发送fin报文给对方,告诉对方你处理完了,可以关闭连接了。
参考文章: