经过wireshark抓包来说解HTTP中Connection: keep-alive头部的做用

今天周末时间,有空给你们讲解一个小知识点,即HTTP的keep-alive头部。我使用wireshark来抓取网络包来在实战中讲解。但愿能让你们更容易、更直观的理解!服务器

HTTP中keep-alive头部的做用是为保持TCP链接,这样能够复用TCP链接不须要为每一个HTTP请求都创建一个单独的TCP链接。这样既能够节省操做系统资源,也可以保持HTTP请求的高效性。网络

咱们经过wireshark抓的包来分析一下:socket

下面的例子中128.14.154.105是HTTP服务器,192.168.1.6是客户端。spa

当服务器处理完一个HTTP请求时,会主动发起断开链接,以下图所示(四次挥手):操作系统

当服务器最后发送一个ACK包后进入TIME_WAIT状态,此状态将会持续2MSL(Maximum Segment Lifetime),一个MSL通常为2分钟,因此TIME_WAIT通常持续4分钟。在此期间仍是能够接受客户端的数据的。3d

此时客户端为了复用TCP链接,将会发送一个心跳包(keep-alive)来保持链接。blog

上面的例子中,共发送了2次心跳包。若是在此期间尚未新的HTTP请求那么服务器会再次主动断开。资源

此后,客户端不会再发送心跳包了。请求

在最后给你们说下,为何主动发起断开链接的一方在发送最后一个ACK包后须要进入TIME_WAIT状态2MSLim

1)咱们先假设发送完最后一个ACK包后直接断开的话,若是因为某种缘由对端没有收到的话,对端会再次发送一个FIN包(TCP的重传机制),因为此时另外一端已经关闭了对应的socket,因此TCP协议栈会

发送一个RST包。这个包表示的是一种错误。(好比,请求的TCP链接的端口没有在监听状态下),那么TCP链接就是因错误而被迫断开,因此TCP中工做没有正常完成。

2)第二个缘由是让老的重复包在网络中消失,解释一下这句话的意思:若是咱们的TCP断开以后,立马有一个新的TCP链接和以前的链接的IP和端口都同样的话,那么残留在网络中的包到达后会被误解为是新的

链接中的包。这样就会出现问题。若是咱们使用了TIME_WAIT,在这个状态下是不容许创建新的IP和端口都同样的TCP链接的,并且它会维持2MSL时间, 这足够让网络中的旧包消失掉。

 

最后欢迎你们评论指正!^_^

相关文章
相关标签/搜索