HTTP3次握手和4次揮手的分析

       Http協議屬於ISO7層模型中的應用層,TCP協議屬於IOS7層模型中的傳輸層,因此Http是比TCP更高層的協議。本文將採用wireshark工具對Http請求作抓包分析來講明Http的3次握手和4次揮手。html

知識回顧:

  •   Http的3次握手:

       

  1.    第一次握手:客戶端發送一個帶SYN的TCP報文到服務器,表示客戶端想要和服務器端創建鏈接。
  2.    第二次握手:服務器端接收到客戶端的請求,返回客戶端報文,這個報文帶有SYN和ACK確認標示,訪問客戶端是否準備好。
  3.    第三次握手:客戶端再次響應服務端一個ACK確認,表示我已經準備好了。
  • Http的4次揮手:

  1.   第一次揮手:TCP發送一個FIN(結束),用來關閉客戶端到服務器端的鏈接。
  2.   第二次揮手:服務器端收到這個FIN後發回一個ACK確認標示,確認收到。
  3.   第三次揮手:服務器端發送一個FIN到客戶端,服務器端關閉客戶端的鏈接。
  4.   第四次揮手:客戶端發送ACK報文確認,這樣關閉完成。

 

下面用實驗來講明HTTP的3次握手和4次揮手:

  •   編寫服務代碼:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        try {
            Thread.sleep(10*1000);//睡眠10秒鐘
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        out.print("this is my gg jsp");
    %>
    
    </body>
    </html>

    部署應用,並用nginx作反向代理。java

  • 訪問頁面:http://47.105.110.244/httptest/gg.jsp,並用wireshark抓包,如圖所示:nginx

 

當咱們在nginx中配置服務器

keepalive_timeout  0;

關閉了http的長鏈接,Http請求一完成就會關閉鏈接,因爲咱們在服務器端故意sleep了10秒,當咱們一請求url時,在服務器端用命令行:jsp

netstat -natp|grep -i "80"|grep '183.206.27.116'

顯示客戶端ip:183.206.27.116的19945端口鏈接到了服務器的80端口上,狀態爲ESTABLISHED工具

當http請求完成以後,再經過上述命令去統計,沒有80端口的任何服務信息了。this

  • 修改nginx的配置,啓用服務端的長鏈接設置:
keepalive_timeout  0;

 wireshark抓包信息以下:url

當http請求完成以後,用:spa

netstat -natp|grep -i "80"|grep '183.206.27.116'

統計出來的信息以下:命令行

當http請求完成以後,http鏈接不會立馬關閉,此時進行的狀態是TIME_WAIT。當10秒事後,沒有複用此http鏈接,此鏈接纔會真正的關閉。

相關文章
相關標籤/搜索