jika klien tcp mengirim paket, dengan nomor urut 10.000 hingga 20.000, ke server tcp. tcp akan merespons dengan ACK dengan seq_ack 20001.
jika saya mencegat paket TCP dari klien, dan membagi paket menjadi 2 segmen tcp, satu dengan seq dari 10.000 hingga 15.000, dan yang lainnya dengan seq dari 15001 hingga 20000. Dan kemudian 2 segmen TCP ini dikirim ke server TCP. Asumsikan bahwa segmen kedua hilang di jalur. Server TCP akan merespons ACK dengan seq_ack 15001.
Sekarang karena klien TCP mengirim paket integral dengan seq 10000 hingga 20000, tetapi mendapat ACK dengan 15001, dari sudut pandang klien, ini aneh. Bagaimana ini akan bereaksi? Secara teori, klien harus mengirim ulang byte dari seq 15001 ke 20000, yaitu, klien akan mengirimkan paket baru dari seq 15001. Tetapi bagaimana dengan praktiknya, dalam implementasi TCP stack, apakah sama seperti dalam teori?
Saya pikir dalam buffer pengiriman TCP, ketika segmen tcp dikirim, segmen itu tetap di sana sampai ACK. Ketika ACK datang, byte ini untuk segmen dihapus dari buffer. Ada pointer di buffer kirim, ketika ACK datang, pointer menunjuk ke lokasi di mana ack_seq sesuai. Bytes yang berada di bawah ack_seq dihapus. Dengan cara ini, seluruh segmen tidak perlu dikirim ulang?
sumber
Ukuran segmen dapat (dan memang) berubah sepanjang masa koneksi. Untungnya, TCP tidak perlu merekam ukuran segmen yang dikirim paket individu sebelumnya. Karena itu, ia akan melakukan hal berikut:
Kedua operasi dilakukan secara independen dari ukuran segmen byte ini pada awalnya dikirim. Jadi teori harus cocok dengan sebagian besar implementasi.
Biarkan saya memberikan latar belakang untuk menjelaskan:
Apakah TCP menggunakan byte atau segmen? Untuk aplikasi, TCP memperlihatkan antarmuka aliran byte. Juga, semua bidang header dan variabel internal dalam byte. Namun, untuk mengirimkan informasi, TCP memotong mereka dalam segmen-segmen, karena mengirim byte satu-per-satu akan sangat boros :-). Menggunakan penghitung byte di mana saja memiliki keuntungan bahwa ukuran segmen tidak perlu tetap konstan selama masa koneksi:
BTW: SACK bukan jawabannya di sini, karena penerima akan (biasanya) hanya menggunakan SACK jika ia mengenali lubang dalam aliran byte (yaitu, jika suatu paket hilang tetapi paket berikut tiba).
sumber