Mengapa bit ACK selalu diset di hampir semua paket TCP mengharapkan SYN pertama? [duplikat]

Saya mengetahui bahwa bit ACK dalam paket TCP diatur ketika membalas pesan yang dikirim oleh rekannya, artinya "OK, saya telah menerima semua paket dengan nomor urutnya lebih kecil dari . Sekarang saya mengharapkan untuk menerima sebuah paket dengan nomor urutnya sama dengan ". Namun dari pengalaman saya, sepertinya bit ACK selalu diset di hampir semua paket TCP, kecuali paket SYN pertama.

Pengalaman saya adalah sebagai berikut:

  1. Server akan mendengarkan pada port SERVER_SOCK (yaitu 32413).
  2. Klien akan terhubung ke server.
  3. Server akan mengirimkan pesan ("halo") ke klien.
  4. Klien membaca pesan tersebut, lalu saya tekan enter untuk menutup klien.
  5. Saya tekan enter untuk menutup server.

Kode C untuk pengalaman saya tercantum sebagai berikut:

Klien

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

#define SERVER_SOCK 32413

int main() {
    // Create socket
    int sock = socket(AF_INET, SOCK_STREAM, 0);

    // Connect to server
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(SERVER_SOCK);
    connect(sock, (struct sockaddr*) &server_addr, sizeof(server_addr));
    printf("Connected\n");

    // Read message from server
    char msg[32] = {0};
    read(sock, msg, 32);
    printf("%s\n", msg);

    printf("Press ENTER to call close()");
    getchar();
    close(sock);
    return 0;
}

Server

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

#define SERVER_SOCK 32413
#define LISTEN_BACKLOG 3

int main() {
    int server_sock, client_sock;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_len = sizeof(client_addr);

    // Create socket
    server_sock = socket(AF_INET, SOCK_STREAM, 0);

    // Set address and port
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(SERVER_SOCK);

    // Bind to port and begin listening
    bind(server_sock, (struct sockaddr*) &server_addr, sizeof(server_addr));
    listen(server_sock, LISTEN_BACKLOG);
    printf("Server is listening\n");

    // Accept client socket
    client_sock = accept(server_sock, (struct sockaddr*) &client_addr, &client_len);
    printf("Connection accepted\n");

    // Send message to client
    send(client_sock, "hello", 5, 0);

    printf("Press enter to call close()");
    getchar();
    close(client_sock);
    close(server_sock);

    return 0;
}

Saya menggunakan Wireshark untuk menangkap paket, dan hasilnya adalah sebagai berikut:

hasil wireshark

Seperti yang Anda lihat, setiap paket kecuali paket pertama memiliki bit ACK yang disetel. Jadi kenapa? Apa yang diakui oleh paket #4, #6 dan #8?


tcp
person TsReaper    schedule 12.04.2018    source sumber
comment
Ini bukan pertanyaan yang sama. Yang saya tanyakan adalah mengapa bit ACK hampir setiap paket diset, termasuk paket yang membawa data ke orang lain. Pertanyaan duplikat yang mungkin diajukan adalah apakah SYN diperlukan setiap kali seseorang mencoba mengirim data ke rekannya. Jawaban atas kemungkinan pertanyaan rangkap tidak dapat menjelaskan fenomena yang saya hadapi.   -  person TsReaper    schedule 12.04.2018
comment
Itu benar, tapi menurut saya jawaban atas pertanyaan itu juga menjawab pertanyaan Anda, khususnya bagian ini: ACK hanyalah sebuah flag dan field di header TCP. Mengirimnya membutuhkan setidaknya bandwidth sebesar header, ditambah apa pun yang digunakan oleh lapisan bawah. Tapi segmen data sudah mencakup semua itu...jadi jika Anda mengirim data, Anda dapat mengirim ACK sekaligus secara gratis. Dan paragraf dan diagram di bawahnya.   -  person TypeIA    schedule 12.04.2018
comment
Ack menyampaikan informasi kepada pengirim tentang data apa yang berhasil dikirimkan. Pernyataan duplikat digunakan untuk transmisi ulang/pemulihan yang cepat. Jadi menyetel tanda ack hanya ketika data baru diterima akan menyebabkan kinerja buruk. Juga tidak ada biaya untuk mengatur bit ack.   -  person FormerNcp    schedule 14.04.2018