簡體   English   中英

直接寫入套接字並獲取TCP ZeroWindow

[英]Write to socket directly and get TCP ZeroWindow

如您所見,我每10秒鍾直接向特定套接字發送一個請求(以保持活動狀態並被檢測到),但是只能發送兩次。 使用wireshark,我發現我發送的第三個程序包具有TCP ZeroWindow ,並且無法發送到服務器。 以下軟件包也是如此。 通常,窗口大小應保持在正常水平,而不是一直減小。 源代碼有什么問題? 任何幫助表示贊賞!

我得到了三個包:

第一包第二包第三包

源代碼:很簡單

public class pediy {

    public static void main(String[] args) throws IOException {

        URL url = new URL("http://bbs.pediy.com");
        Socket socket = null;
        PrintWriter os = null;
        BufferedReader is = null;

        while(true) {

            socket = new Socket(url.getHost(), 80);
            os = new PrintWriter(socket.getOutputStream());

            String request = "GET / HTTP/1.1\nHost: bbs.pediy.com\nProxy-Connection: keep-alive\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\nUser-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17 CoolNovo/2.0.6.12\nAccept-Encoding: gzip,deflate,sdch\nAccept-Language: en-US;q=0.6,en;q=0.4\nAccept-Charset: utf-8;q=0.7,*;q=0.3\n";
            try {
                while (true) {

                    os.println(request);
                    os.flush();

                    System.out.println("Finished");
                    Thread.sleep(1000*10);
                }

            } catch (Exception e) {
                System.out.println("Error" + e);
            } finally {
                CloseAll(socket, os);
            }
        }
    }

    private static void CloseAll(Socket socket, PrintWriter os) throws IOException {
        if(socket != null) socket.close();
        if(os != null) os.close();
    }
}

這僅表示TCP連接的另一端沒有使用(讀取)您發送的數據,因此TCP流控制啟動以降低發送者的速度。

好,

  1. 您沒有發送有效的HTTP。 HTTP中的行終止符是\\r\\n ,而不僅僅是\\n ,並且標頭后面必須有一個空行。

  2. 您沒有閱讀回復。

因此,另一端將遇到一些困難。 您很幸運,它尚未關閉連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM