簡體   English   中英

Linux中非常奇怪的連接時間

[英]Very strange connection times in Linux

我創建了一個帶有待辦事項1的偵聽套接字,並將64個套接字連接到該套接字。

套接字

#define _POSIX_C_SOURCE 199309L

#include <arpa/inet.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/time.h> 
#include <time.h>

int main() {
    int server_socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_address = {0};
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(8000); 
    bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)); 
    if (listen(server_socket, 1) == 0) {
        printf("Listening\n");
    } else {
        printf("Failed to listen\n");
        return 1;
    }

    for (int i = 0; i < 64; i++) {
        int client_socket = socket(AF_INET, SOCK_STREAM, 0);
        struct timespec start;
        clock_gettime(CLOCK_MONOTONIC, &start);
        if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == 0) {
            struct timespec end;
            clock_gettime(CLOCK_MONOTONIC, &end);
            double elapsed = end.tv_sec - start.tv_sec + (end.tv_nsec - start.tv_nsec) / 1e9;
            printf("Connected socket #%d in %.3lfs\n", i, elapsed);
        } else {
            printf("Failed to connect socket #%d\n", i);
        }
    }
}

輸出:

$ gcc -o socket -std=c99 socket.c
$ ./socket
Listening
Connected socket #0 in 0.000s
Connected socket #1 in 0.000s
Connected socket #2 in 0.000s
Connected socket #3 in 0.000s
Connected socket #4 in 1.000s
Connected socket #5 in 0.000s
Connected socket #6 in 3.004s
Connected socket #7 in 0.000s
Connected socket #8 in 3.004s
Connected socket #9 in 0.000s
Connected socket #10 in 3.004s
Connected socket #11 in 0.000s
Connected socket #12 in 3.004s
Connected socket #13 in 0.000s
Connected socket #14 in 3.004s
Connected socket #15 in 0.000s
Connected socket #16 in 3.004s
Connected socket #17 in 0.000s
...

前四個連接是瞬時的,第五個連接是花費1秒,然后連接在0到3秒之間振盪,直到所有套接字都連接並且程序退出。 此行為是100%可重復的。

我已經廣泛閱讀了有關TCP連接,Linux網絡文檔和其他資源的文章

但是我仍然無法解釋正在發生的事情。

為什么連接時間變化如此之大?


系統信息

$ uname -a
Linux paul 3.19.0-51-generic #58~14.04.1-Ubuntu SMP Fri Feb 26 22:02:58 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

/etc/sysctl.conf為空。)

listen的文檔對此進行了解釋:“如果基礎協議支持重傳,則可以忽略該請求,以便以后在連接時重新嘗試成功”。 如果增加積壓,您會看到延遲開始的時間點發生了變化。

正如David Schwartz所說,這是由於您的積壓。 處理SYN請求的TCP代碼既認為接受隊列已滿,也認為SYN隊列已滿。 這里所見

1287         /* Accept backlog is full. If we have already queued enough
1288          * of warm entries in syn queue, drop request. It is better than
1289          * clogging syn queue with openreqs with exponentially increasing
1290          * timeout.
1291          */
1292         if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) {
1293                 NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
1294                 goto drop;
1295         }

一旦達到上述條件,您的SYN數據包將被丟棄。 客戶端的重傳發生在3秒鍾后(初始SYN),此被接受

如果將積壓設置為65,則連接不會出現任何延遲

暫無
暫無

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

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