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:
- Server akan mendengarkan pada port
SERVER_SOCK
(yaitu 32413). - Klien akan terhubung ke server.
- Server akan mengirimkan pesan ("halo") ke klien.
- Klien membaca pesan tersebut, lalu saya tekan enter untuk menutup klien.
- 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:
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?