Ukuran paket dalam aliran TCP

10

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 tsharkdump 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 
Vadim
sumber
Mungkin ada banyak alasan ... Ukuran jendela mungkin terlalu kecil (meskipun sangat tidak mungkin dalam kasus Anda), mungkin tidak ada cukup data untuk dikirim (apakah output dihasilkan oleh skrip?), Perangkat lunak yang menghasilkan data mungkin telah secara eksplisit menyiramnya, dll.
Sander Steffann
@SanderSteffann, ukuran jendela sepertinya tidak relevan, acks datang secara berkala. Seluruh respons adalah javascript, jadi saya tidak berpikir itu dihasilkan oleh skrip lain.
Vadim
@vadim, bisakah Anda memposting tangkapan layar atau lebih baik, hyperlink ke pcap dengan muatan 1080 byte?
Mike Pennington
@ MikePennington - terima kasih atas masukan Anda, saya akan memberikan tautan ke file pcap dalam beberapa jam.
Vadim
@ MikePennington - Saya telah menambahkan tautan ke file pcap yang menunjukkan ini.
Vadim

Jawaban:

6

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.

fredpbaker
sumber
Titik klarifikasi ... Aplikasi tidak memiliki kontrol langsung atas bit PSH ...
Mike Pennington
Benar sekali, ada yang HARUS dilakukan di RFC asli dan apa yang dilakukan
WAKTU
setelah melihat pcap, sangat tidak mungkin server web mengatur PSH pada lalu lintas OP
Mike Pennington
3

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.

Sebastian Wiesinger
sumber
Saya melihat banyak paket dengan ukuran maksimal dan hanya yang ini dengan ukuran lebih kecil, jadi ini bukan jenis standar. Mungkinkah itu merupakan cegukan server - macet pada hal lain karena penundaan yang cukup untuk tumpukan jaringan untuk memutuskan untuk mengirim apa yang ada di buffer?
Vadim
Tentu, bisa jadi apa saja. Tidak ada cara untuk mengetahui tanpa men-debug server dan OS yang dijalankannya. Tapi tidak perlu khawatir tentang IMHO.
Sebastian Wiesinger
Saya tidak khawatir, itu hanya terasa aneh dan saya ingin mencari tahu apakah ada yang lebih dari itu.
Vadim
1
Jika Anda memiliki tampilan wireshark di header 1080 paket TCP untuk bit PSH (push). Itu adalah tumpukan aplikasi yang mengatakan kirim data ini sekarang.
fredpbaker
1
Lihat di atas, ini adalah tumpukan TCP dalam banyak kasus
fredpbaker
1

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).

woliveirajr
sumber
0

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).

Peter Green
sumber
0

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.

marctxk
sumber