中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

無法回應的ARP請求包導致的網站緩慢問題排錯

發布時間:2020-07-29 14:12:26 來源:網絡 閱讀:5575 作者:yoke88 欄目:網絡安全

問題

訪問一個網站,從本地訪問很快,但是從客戶端訪問大概要等待3秒的樣子。在服務器放上靜態網頁,在客戶端訪問則返回時間很快。

排錯步驟

  • 在客戶端訪問問題網站,在客戶端用wireshark抓包

    1. 用tcp 三次握手及客戶端請求與服務器返回的ACK來判斷是否存在線路或者服務器忙問題,發現不是。348-349 顯示出服務器響應很快。 349-498 之間用了3.28秒,說明這是服務器應用的問題。

    無法回應的ARP請求包導致的網站緩慢問題排錯

  • 讓開發人員調查服務器端的應用,開發人員說之前有個小功能可以抓取客戶端MAC地址,但是看到抓的包,應該不是用的客戶端的代碼,因為第一個web頁響應就3秒多,要是客戶端代碼那也是后續的JS或者資源加載較慢。

  • 不管三七二十一,在服務器端也抓了下包。過濾下arp 和http的包看看,過濾后發現有三個ARP請求,但是沒有對應回應。另外仔細看ARP請求的具體內容也不對,服務器用ARP請求去解析客戶端的MAC地址應該是不對的,原因是服務器和客戶端不在一個網段,正常的跨網段的ARP請求是同一個網段才會用的,如果跨網段那應該去解析路由器的MAC地址。所以這些ARP請求有問題。

無法回應的ARP請求包導致的網站緩慢問題排錯

  • 開發人員注釋掉了客戶端ARP地址查詢的代碼。訪問速度瞬間提升了。
  • 開發人員同時注意到客戶端ARP地址查詢的結果為00-00-00-00-00-00,和我們的服務器上的抓包結果一致,因為去請求一個跨網段IP地址的MAC,所以目標地址不會收到,因為ARP廣播會在路由器端終止。

揭開真相

  • 開發人員給了我服務器端的代碼C#
    ``` c#
    [DllImport("Iphlpapi.dll")]
    private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
    [DllImport("Ws2_32.dll")]
    private static extern Int32 inet_addr(string ip);

    public string getClientMac(string userip)
    {
        if (string.IsNullOrEmpty(userip)) return null;
        //string userip = Request.UserHostAddress;
        string strClientIP = userip.ToString().Trim();
        Int32 ldest = inet_addr(strClientIP);
        Int32 lhost = inet_addr("");
        Int64 macinfo = new Int64();
        Int32 len = 6;
        int res = SendARP(ldest, 0, ref macinfo, ref len);
        string mac_src = macinfo.ToString("X");
        //if (mac_src == "0")
        //{
        //    ip = userip;
        //}
    
        while (mac_src.Length < 12)
        {
            mac_src = mac_src.Insert(0, "0");
        }
    
        string mac_dest = "";
    
        for (int i = 0; i < 11; i++)
        {
            if (0 == (i % 2))
            {
                if (i == 10)
                {
                    mac_dest = mac_dest.Insert(0, mac_src.Substring(i, 2));
                }
                else
                {
                    mac_dest = "-" + mac_dest.Insert(0, mac_src.Substring(i, 2));
                }
            }
        }
    
        return mac_dest;
    }

* 按照代碼邏輯的話,服務器應該是用了一次SendARP 調用,但是為什么會有三個ARP請求產生,而且不同的ARP請求包之間的等待時間不一。所以為了驗證這個SendARP的調用的實際操作,我用powershell 寫了上面一個sendARP 調用,然后用wireshark抓包。
``` powershell
Function Send-Arp { 
param( 
    [string]$DstIpAddress, 
    [string]$SrcIpAddress = 0 
) 

$signature = @" 
[DllImport("iphlpapi.dll", ExactSpelling=true)] 
   public static extern int SendARP(  
       uint DestIP, uint SrcIP, byte[] pMacAddr, ref int PhyAddrLen); 
"@ 

    Add-Type -MemberDefinition $signature -Name Utils -Namespace Network 

    try { 
        $DstIp = [System.Net.IPAddress]::Parse($DstIpAddress) 
        $DstIp = [System.BitConverter]::ToInt32($DstIp.GetAddressBytes(), 0) 
    } catch { 
        Write-Error "Could not convert $($DstIpAddress) to an IpAddress type.  Please verify your value is in the proper format and try again." 
        break 
    } 

    if ($SrcIpAddress -ne 0) { 
        try { 
            $SrcIp = [System.Net.IPAddress]::Parse($SrcIpAddress) 
            $SrcIp = [System.BitConverter]::ToInt32($SrcIp.GetAddressBytes(), 0) 
        } catch { 
            Write-Error "Could not convert $($SrcIpAddress) to an IpAddress type.  Please verify your value is in the proper format and try again." 
            break 
        } 
    } else { 
        $SrcIp = $SrcIpAddress 
    } 

    $New = New-Object PSObject -Property @{ 
        IpAddress = $DstIpAddress 
        PhysicalAddress = '' 
        Description = '' 
        ArpSuccess = $true 
    } | Select-Object IpAddress,PhysicalAddress,ArpSuccess,Description 

    $MacAddress = New-Object Byte[] 6 
    $MacAddressLength = [uint32]$MacAddress.Length 

    $Ret = [Network.Utils]::SendARP($DstIp, $SrcIp, $MacAddress, [ref]$MacAddressLength) 

    if ($Ret -ne 0) { 
        $New.Description =  "An error was returned from SendArp() with error code:  $($Ret)" 
        $New.ArpSuccess = $false 
    } else { 
        $MacFinal = @() 
        foreach ($b in $MacAddress) { 
            $MacFinal += $b.ToString('X2') 
        } 

        $New.PhysicalAddress = ($MacFinal -join ':') 
    } 

    Write-Output $New 
} 
  • 使用powershell 來解析一個跨網段的目標IP地址,然后緊接著ping目標主機,這樣可以根據ping包的開始時間得出sendARP 的結束時間。
    powershell 命令如下:

    send-arp serverIP ;ping serverIP
  • 抓包過濾ARP以及ICMP來驗證,SendARP函數會發送三個ARP包,可能也會等待超時,因為沒有ARP包回應,這個測試的時間大概也在3.1秒左右,符合問題現象。
    無法回應的ARP請求包導致的網站緩慢問題排錯

最后總結:

  1. 在服務器上本機訪問非常快,是因為服務器使用ARP請求查本機,應該會很快有回應。如果其他客戶端和服務器在同一個網段,估計也不會慢。

  2. 客戶端慢是因為服務器在返回給客戶端http信息時,先用ARP請求跨網段的客戶端IP,但是不會有ARP回應,因為路由的原因,客戶端看不到服務器的ARP請求,而SendARP函數的超時時間大概為3.1秒,所以跨網段的客戶端收到服務器的一個HTTP響應在3.28秒左右。同樣單純在客戶端抓包只能分析出服務器應用有問題,但是說不出具體的問題。

  3. 靜態網頁快是因為,靜態網頁不執行服務器端代碼,所以不會執行ARP查詢。

  4. 另外開發人員也應該熟悉常見的網絡協議,像這次的代碼就會僅僅在特定場景下工作,如果網站是面向互聯網的話,那這個代碼將不會起到作用,反而影響性能
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滨州市| 永和县| 四子王旗| 诸暨市| 大田县| 邢台县| 宜兴市| 怀安县| 和平县| 左云县| 龙州县| 句容市| 那曲县| 密云县| 河南省| 余庆县| 镇赉县| 宜章县| 夹江县| 搜索| 巴楚县| 宁城县| 康保县| 沧州市| 时尚| 普兰县| 贵阳市| 个旧市| 龙山县| 苏州市| 曲阳县| 筠连县| 湖州市| 古浪县| 凤凰县| 杭锦后旗| 江孜县| 含山县| 金沙县| 昌图县| 弥渡县|