TCP三次握手和四次挥手
为什么一定要进行三次握手呢?
第一次握手,客户端什么都不能确定,只是发出了信息,服务器端确定对方发送正常,自己接受正常,发送第二次握手请求。
第二次握手,客户端确定自己发送接受正常,对方发送接受正常,服务器端确定对方发送正常,自己接受正常。
第三次握手,客户端全部确定没问题,服务器端确定对方发送接受正常,自己发送接受正常。
为什么是三次握手而不是两次握手呢?两次握手的话会造成一些半连接的情况,比如客户端向服务器发送了一个请求,但是这个请求因为网络原因没有及时到达,触发了超时重传机制,客户端重新发送请求和服务器建立连接,之后断开连接,经过很长时间之后第一次发送的连接请求到达了服务器,服务器表示同意,并回复了一个ACK,而客户端已经断开连接了,只有服务器维持着这个无效链接,会造成资源的浪费。
三次握手的流程
客户端发送SYN请求,并发送自己的序号,服务器收到后回复SYNACK报文段(客户端序列号+1)和自己的序号,客户端收到后,回复ACK(服务器的序号+1)加上自己的数据。第三次握手可以传输数据。如果第一次就可以,那么客户端能够发送海量数据攻击服务器。
SYN攻击是通过疯狂发送TCP请求但是不回复第三次握手来达到的,服务器收到请求后会缓存客户端的信息,如果没有得到确认的话会造成资源的浪费,但是现在一般通过SYN cookie来进行防御,服务器收到后并不会存储客户端的信息,而是通过一个散列函数将客户端的信息作为输入得到一个cookie,发送给客户端,客户端第三次握手携带cookie,服务器直接进行验证。
四次挥手的流程
客户端发送FIN报文段,服务器回复ACK,表示确认关闭,此时客户端向服务器发送数据的链接关闭了,但是服务器有可能还需要发送数据到客户端,所以服务器还可以发送数据,发送完之后发送FIN报文段,客户端收到后发送ACK到服务器,此时客户端开始计时,等待两个报文段最大生存时间后,如果这段时间没再次收到服务器的FIN请求的话,就可以关闭连接了。这样做是为了防止发送的ACK丢失了,这样服务器发送的超时重发的FIN可以再次到达,重新开始计时。