http和tcp的关系:tcp主要用于建立数据通道,然后http协议进行数据交换
客户端(浏览器)请求服务器的80端口,会先和服务器建立tcp三次握手,并建立起一个安全的通道,然后在通过http协议进行数据交换,最后在四次挥手断开。
三次握手
第一次握手:客户端向服务器端发送SYN请求,请求标记是seq=X,此时客户端处于syn_send发送状态
第二次握手:服务器端回复客户端的SYN请求用ACK=X+1来表示,同时服务器端也向客户端发起了一个SYN请求,请求标记是seq=Y,此时服务端处于syn_recv半接受状态
第三次握手:客户端回复服务器端的SYN请求用ACK=Y+1来表示,最后用第一次握手标记+1 (seq=X+1)来表示握手成功established。
三次握手与SYN泛洪攻击:
客户端伪造一堆不存在的ip给服务器端发送syn请求,服务器收到syn请求后会给客户端回复ACK包并且也给给客户端发送一个syn请求,此时服务器端处于syn_recv半接收状态,但是客户端的ip是伪造的,导致服务器无法给客户端发送数据包从而出现大量的syn_recv连接,这些连接会导致服务端资源被沾满。
四次挥手
第一次挥手:客户端向服务器端发送了一个FIN断开请求,请求标记是seq=X,此时客户端处于等待状态。
第二次挥手:服务器端回复客户端的FIN请求,回复内容是ack=X+1,同时服务器端也会向客户端发送一个FIN断开请求,请求标记是seq=Y,此时客户端处于半断开状态(能收不能发)
第三次挥手:服务端再次确认是否断开,发送的信息依然是ack=X+1 seq=Y
第四次挥手:客户端回复服务器端的FIN端口请求,回复内容是ack=Y+1,同时seq=X+1(第一次挥手的seq+1)表示四次挥手成功。之后客户端会处于time_wait状态并等待2msl才会正真端开(2mls目的:1确保最后一个断开确认的数据包服务器端已经收到 2防止服务器端接收到失效的数据包,msl是报文生存时间,默认单位2分钟)
客户端为什么 要等待2msl?
如果客户端不等待2msl的话,当客户端发送完最后一个断开请求的数据包后,之后又发送了一个新的数据包(建立新的连接),如果这个新的数据包优先被服务器端收到的话,服务器端就会把这个数据包当成正常数据包来处理, 客户端的本意是先让服务器收到断开请求的数据包确保本次回话已经结束,然后再与服务器端建立新的连接这才是正常的操作,所以客户端会等待2msl确保上一次的连接已经彻底断开。