Saya lalu lintas jaringan dan ingin membagi setiap sesi TCP menjadi serangkaian permintaan dan tanggapan (protokol saya bekerja dengan semua pekerjaan seperti itu, seperti HTTP atau SSL).
Saya memiliki asumsi sederhana (mengabaikan paket yang keluar dari pesanan dan dikirim kembali) - mengingat sejumlah data yang perlu dikirim, itu akan dikirim menggunakan paket terbesar dan paket terakhir akan lebih kecil dari ukuran maksimum atau diikuti oleh paket dari sisi lain (mengabaikan paket kosong ACK). Jadi dalam sesi HTTP, saya berharap untuk melihat sesuatu seperti (lagi, mengabaikan acks) -
Paket 1 - Minta "Dapatkan ..."
Paket 2 - Respon, ukuran 1434
Paket 3 - Respons, ukuran 1434
Paket 4 - Respons, ukuran 1434
Paket 5 - Respon, ukuran 500
Itulah yang saya dapatkan di sebagian besar sesi, namun setidaknya ada satu kesempatan yang saya lihat
Paket 1 - Minta "Dapatkan ..."
Paket 2 - Respon, ukuran 1434
Paket 3 - Respons, ukuran 1080
Paket 4 - Respons, ukuran 1434
Paket 5 - Respon, ukuran 500
Tidak ada transmisi ulang, paket yang rusak di sini atau tidak ada keterlambatan luar biasa di server.
Saya ingin tahu - apa yang bisa menyebabkan ini dan kapan akan terjadi? Bagaimana asumsi saya yang salah?
MEMPERBARUI
Saya menaruh contoh file pcap di sini
PEMBARUAN 2
Termasuk tshark
dump dengan bidang yang relevan ...
$ tshark -r http_1082.pcap -T fields -e frame.number -e frame.len \
-e ip.src -e ip.dst -e tcp.flags.push -e http.request.method \
-e http.request.uri -e http.response.code | head -n 47
1 66 192.168.1.103 206.33.49.126 0
2 62 206.33.49.126 192.168.1.103 0
3 64 192.168.1.103 206.33.49.126 0
4 411 192.168.1.103 206.33.49.126 1 GET /money/.element/script/3.0/video/xmp/xmp_playlistapi.js
5 54 206.33.49.126 192.168.1.103 0
6 1434 206.33.49.126 192.168.1.103 0
7 1434 206.33.49.126 192.168.1.103 0
8 64 192.168.1.103 206.33.49.126 0
9 1434 206.33.49.126 192.168.1.103 0
10 1434 206.33.49.126 192.168.1.103 0
11 1434 206.33.49.126 192.168.1.103 0
12 64 192.168.1.103 206.33.49.126 0
13 1434 206.33.49.126 192.168.1.103 0
14 1434 206.33.49.126 192.168.1.103 0
15 1434 206.33.49.126 192.168.1.103 0
16 1434 206.33.49.126 192.168.1.103 0
17 64 192.168.1.103 206.33.49.126 0
18 1434 206.33.49.126 192.168.1.103 0
19 1434 206.33.49.126 192.168.1.103 0
20 1434 206.33.49.126 192.168.1.103 0
21 1434 206.33.49.126 192.168.1.103 0
22 1434 206.33.49.126 192.168.1.103 0
23 64 192.168.1.103 206.33.49.126 0
24 1434 206.33.49.126 192.168.1.103 0
25 1434 206.33.49.126 192.168.1.103 0
26 1434 206.33.49.126 192.168.1.103 0
27 1434 206.33.49.126 192.168.1.103 0
28 1434 206.33.49.126 192.168.1.103 0
29 1434 206.33.49.126 192.168.1.103 0
30 64 192.168.1.103 206.33.49.126 0
31 1434 206.33.49.126 192.168.1.103 0
32 1434 206.33.49.126 192.168.1.103 0
33 1434 206.33.49.126 192.168.1.103 0
34 1082 206.33.49.126 192.168.1.103 1 <------ Packet in question
35 1434 206.33.49.126 192.168.1.103 0
36 1434 206.33.49.126 192.168.1.103 0
37 1434 206.33.49.126 192.168.1.103 0
38 64 192.168.1.103 206.33.49.126 0
39 1434 206.33.49.126 192.168.1.103 0
40 1434 206.33.49.126 192.168.1.103 0
41 1434 206.33.49.126 192.168.1.103 0
42 1434 206.33.49.126 192.168.1.103 0
43 1434 206.33.49.126 192.168.1.103 0
44 1434 206.33.49.126 192.168.1.103 0
45 1434 206.33.49.126 192.168.1.103 0
46 626 206.33.49.126 192.168.1.103 1 200
47 64 192.168.1.103 206.33.49.126 0
Jawaban:
Lapisan TCP menggunakan algoritma Nagle untuk menyangga lalu lintas (mengirimkan lebih sedikit paket besar, bukan lebih banyak paket kecil ... membuatnya lebih efisien); ada cara bagi aplikasi untuk mengatakan 'kirim sekarang'. Anda melihat bahwa di header TCP dengan bendera yang disebut bit PSH (push). Sementara bit diatur oleh stack, push dilakukan atas permintaan aplikasi.
Jadi ini dimaksudkan dan perilaku normal.
sumber
Ukuran paket tergantung pada bagaimana aplikasi dan / atau OS mendukung dan mengirim data jaringan. Jika aplikasi dan / atau OS memutuskan untuk mengirim data setelah 1080 byte di buffer maka paket akan menjadi 1080 byte (plus header). Mungkin ada banyak alasan untuk melakukan itu. Dalam kasus Anda, Anda harus melihat kode sumber server web dan / atau tumpukan jaringan OS.
sumber
Ukuran paket ditentukan oleh OS (secara umum), dan terkait dengan buffer, jumlah data yang disediakan oleh aplikasi, dll. Banyak strategi dapat digunakan untuk mencapai kinerja maksimum, dan kadang-kadang mengirim paket yang lebih kecil dapat lebih cepat daripada menunggu untuk membuat paket yang lebih besar.
Kadang-kadang jumlah aplikasi yang berjalan dapat menuntut OS menjadi lebih cepat (mengirim apa pun yang ada di buffer sejauh ini) daripada menjenuhkan buffer.
Mungkin, Anda dapat memberi kami detail lebih lanjut tentang skenario yang sedang Anda kerjakan (mis .: server OS, aplikasi yang berjalan di atasnya).
sumber
Masalahnya pada dasarnya adalah implementasi TCP tidak tahu apa yang akan dilakukan aplikasi selanjutnya. Ketika aplikasi server membuat urutan penulisan, tumpukan tidak tahu apakah tulisan yang telah diterima sejauh ini adalah keseluruhan urutan atau hanya sebagian saja.
Sebagian besar waktu aplikasi server membuat penulisan ke buffer lebih cepat daripada tumpukan jaringan yang dapat mengosongkannya. Jadi buffernya penuh dan paket-paket berukuran penuh keluar.
Namun terkadang ada hal lain yang memperlambat aplikasi server. Mungkin menunggu disk membaca pada array disk yang kelebihan beban atau sesuatu. Jadi buffer kosong dan tumpukan jaringan harus memilih antara mengirimkan paket yang lebih kecil (lebih banyak overhead) atau menunggu data yang mungkin tidak pernah datang (menambahkan penundaan).
sumber
Jika Anda melihat pada frame 34, Anda akan melihat bahwa server telah mengirimkan buffer 32kB dan bit PSH diatur. Jika Anda melihat 82 Anda akan melihat hal yang sama, 32 kB dari bit PSH sebelumnya. Paket 52 memiliki bit PSH meskipun responnya kurang dari 2kB.
Bit PSH biasanya diatur oleh TCP stack untuk segmen terakhir dari PDU aplikasi yang ditulis ke jaringan. Jadi aplikasi ini menggunakan buffer 32kB dan ketika ada banyak data, tulislah itu ke soket TCP 32kB sekaligus. Ketika ada lebih sedikit data seperti dalam frame 51-52, itu karena aplikasi menulis catatan itu pertama kali dalam respons dan itu hanya 1.820 byte.
Perhatikan bahwa aplikasi yang saya rujuk mungkin sebenarnya bukan aplikasi server itu sendiri tetapi beberapa perangkat lunak menengah seperti Java Virtual Machine (JVM) atau apa pun. Tidak jelas dari konten data mengapa PDU 1820 byte dikirim, mungkin buffer 32kB tidak tersedia pada saat itu?
Intinya adalah bahwa itu tidak masalah, tidak ada penalti kinerja yang substantif.
sumber