Linux Slow Start: Mengubah rute ip tidak berpengaruh pada jendela awal

10

Saya mengubah jendela awal tcp di mesin saya menjadi 10 seperti yang ditunjukkan di bawah ini

[user@site etc]$ sudo ip route change default via 17.255.209.1 dev eth0  proto static initcwnd 10 

Dan diubah tcp_slow_start_after_idleseperti yang ditunjukkan di bawah ini

[user@site etc]$ sudo sysctl -a | grep tcp_slow_start_after_idle
net.ipv4.tcp_slow_start_after_idle = 0

konfirmasi ip route show diberikan di bawah ini

[user@site etc]$ ip route show
default via 17.255.209.1 dev eth0  proto static  initcwnd 10
169.254.0.0/16 dev eth0  scope link  metric 1002
17.255.209.0/24 dev eth0  proto kernel  scope link  src 17.255.209.19

Sekarang ketika saya melakukan tcpdump di situs web saya sepertinya tidak melihat perubahan di jendela awal dengan WIN / MSS yang tersisa 4 sebagai default. 5840/1460 = 4

[user@site etc]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and port 80'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
11:17:45.048174 IP 21.101.151.198.45873 > 17.255.209.19.http: Flags [S], seq 2008673341, win 5840, options [mss 1460,sackOK,TS val 1724223146 ecr 0,nop,wscale 6], length 0

Curl hit yang saya lakukan pada halaman web meminta sekitar 30 KB data.

[user@machine ~]$ curl http://www.site.com/js/main.js > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 88212  100 88212    0     0   179k      0 --:--:-- --:--:-- --:--:--  272k

Apa yang bisa salah dalam pendekatan saya?

Inti

[user~]$ uname -r
3.0.4x86_64-linode21

Sebagai pembaruan, inilah hasilnya ketika saya mencoba google.com

[user@site ~]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and host www.google.com'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
17:20:28.033236 IP 17.255.209.19.42799 > 74.125.127.106.http: Flags [S], seq 3148947324, win 14600, options [mss 1460,sackOK,TS val 193695310 ecr 0,nop,wscale 4], length 0

Seperti yang Anda lihat WIN / MSS adalah 14600/1460 = 10 dalam kasus ini

Saya mencoba memukul situs saya dari mesin server itu sendiri melalui curl dan inilah hasilnya:

[user@site ~]$ sudo tcpdump -n -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and host www.site.com'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
17:25:14.584338 IP 17.255.209.19.35008 > 17.255.209.19.http: Flags [S], seq 3894567470, win 32792, options [mss 16396,sackOK,TS val 193981861 ecr 0,nop,wscale 4], length 0

WIN / MSS adalah 32792/16396 = 2 dalam hal ini

Quintin Par
sumber
perlu diingat, jika Anda menekan ini dari mesin linux, Anda harus menggunakan 3.0 juga, akan menggali melalui sumber / tag untuk mengkonfirmasi versi 3 yang tepat yang menginput perubahan
Sam Saffron
@ QuintinPar Bisakah Anda menambahkan output tcpdump dengan koneksi keluar dari mesin uji Anda?
kupson
@kupson Saya sudah memperbarui pertanyaan
Quintin Par
Sejauh yang saya tahu Anda tidak dapat mempengaruhi Jendela Awal pada koneksi masuk. Koneksi Anda ke google menunjukkan bahwa Anda memiliki IW yang diatur ke 10. Loopback inferface cukup istimewa dengan MTU besar itu, mungkin ada beberapa batasan pada Initial Window di sumber kernel.
kupson
perlu diingat, 2 hal akan menentukan IW. Klien jendela kongesti awal maksimal dan Server IW. Kemenangan yang lebih kecil. Jalankan tes dari 2 mesin, server harus memiliki IW yang ditetapkan secara default di 3.0 ... dan klien XP / Vista / Win7 tidak membatasi IW jadi buat klien yang baik untuk pengujian. 3.0 klien Linux juga berfungsi, tetapi harus merupakan mesin yang terpisah.
Sam Saffron

Jawaban:

9

Saya pikir Anda salah paham bagaimana TCP bekerja.

Setiap paket yang dikirim akan selalu mengiklankan jendela penerima (alias. RWIN) dan faktor penskalaan opsional, lihat RFC 1323

Pengirim tidak diperbolehkan mengirim lebih dari jumlah data yang ditentukan dalam RWIN tanpa diketahui. Bergantung pada jendela kemacetan, pengirim dapat memutuskan untuk mengisi RWIN atau tidak.

Jadi, ada dua bit informasi yang bersifat publik dalam paket TCP. RWIN di Server dan RWIN di klien. Kedua angka ini menentukan ukuran maksimal jendela kemacetan di kedua ujungnya.

RWIN di server menarik ketika kami mencoba mengoptimalkan kinerja untuk unggahan file.

RWIN pada klien menarik ketika kami mencoba menentukan kecepatan unduh.

Tak satu pun dari angka-angka ini membuat jendela kemacetan di masyarakat ujung lain .

JADI, jika saya memiliki RWIN 64k, jendela kemacetan di server bisa menjadi APAPUN angka yang lebih rendah dari 64k.

Satu-satunya cara untuk menentukan jendela kemacetan yang sebenarnya adalah dengan menghitung paket.

Jika saya tahu:

  1. Waktu pulang pergi saya (RTT) adalah ~ 200 ms.
  2. Saya hanya meminta sumber daya yang 100k.
  3. Saya memiliki RWIN 64k.

Jika saya mendapatkan 2 paket kembali dari server yang panjangnya 1452 byte dalam ~ 200ms, kemungkinan jendela kemacetan di server lebih kecil dari 4356, karena jika lebih besar 3 paket akan dikirim. Jika IW diatur ke 10, saya akan melihat ledakan 10 paket di sekitar tanda 200 ms.

Jika Anda mengubah IW Anda dan ingin mengonfirmasi bahwa perubahan itu berhasil, Anda perlu menghitung paket untuk mendapatkan perkiraan ukuran jendela kemacetan di server.

Ingat, Anda mungkin ingin melihat percakapan langsung setelah SYN, SYN-ACK, ACK untuk memastikan Anda tidak melihat di tengah-tengah percakapan (di mana jendela kemacetan bisa saja sudah tumbuh).

Sam Saffron
sumber
1
Perbedaan antara jendela kemacetan dan jendela tcp dinyatakan dalam 20,6 (mulai lambat) TCP / IP Illustrated: "Mulai lambat menambahkan jendela lain ke TCP pengirim: jendela kemacetan, disebut cwnd" (tebal adalah milikku). Ada diagram urutan dalam 20.7 yang menunjukkan ini saat bermain selama transfer massal.
Kyle Brandt
7

Ukuran jendela akan menjadi lebih kecil: server init ukuran jendela atau RWIN klien. Karena 5840 adalah RWIN default untuk Linux 2.6, tampaknya klien Anda adalah faktor pembatas di sini.

Coba dari kotak windows. Windows XP memiliki RWIN 64k, versi lebih baru 8k.

Sumber: http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/ (Bagian yang menarik ada di bawah video)

Sunting: Memperluas jawaban untuk membuatnya lebih jelas:

  • Dalam jabat tangan TCP, klien mengirim paket SYN ke server mengirimkan ukuran jendela maksimum yang diizinkan. (Seperti yang ditunjukkan oleh output tcpdump Anda, ini adalah 5.840 byte)
  • Server sekarang merespons dengan SYN ACK dan ukuran jendela yang ingin disetujui. Ukuran jendela ini hanya bisa lebih kecil dari yang diusulkan klien, bukan lebih besar. Tidak peduli bagaimana server dikonfigurasi, itu tidak akan pernah bisa memiliki ukuran jendela lebih besar dari 5.840 byte dengan klien itu.
  • Klien mengembalikan ACK dan mereka dengan senang hati bertukar data selamanya.

Sunting2: tcpdumps ditambahkan ke pertanyaan menunjukkan server membuka koneksi ke google dan itu sendiri BERTINDAK SEBAGAI KLIEN.

Some one
sumber
Jendela awal (diusulkan dalam paket SYN) adalah 5840. Ini adalah paket pertama dan mesin pengirim tidak tahu apa-apa tentang receiver saat ini (saya mengujinya dengan "ip route flush cache").
kupson
Eh, 17.255.209.0 adalah subnet server Anda, bukan? Paket yang Anda lihat adalah DARI 21.101.151.198.45873 KE 17.255.209.19.http. Saya bukan ahli dalam output tcpdump, tetapi bagi saya ini berbunyi: Hello Server, saya klien Anda, saya suka windows 5840 byte. :) Paket berikutnya adalah server merespons dengan ACK, 5840 hebat, tepuk tangan. :)
Seseorang
Hanya untuk menekankan, saya pikir Anda salah paham: Mesin pengirim pertama adalah klien saat membuka koneksi, bukan server Anda. Ini adalah klien yang menawarkan jendela 5840 byte. Server tidak dapat mengusulkan ukuran jendela yang lebih besar, hanya yang lebih kecil.
Seseorang
1
Saya bukan penulis asli pertanyaan ini. Saya mengujinya (dengan hasil serupa) di lingkungan pengujian saya sendiri dan tidak dapat mengubahnya juga. Ukuran Jendela Kemacetan Awal (initcwnd) tidak ada hubungannya dengan koneksi sisi lain.
kupson
Saya tidak tahu pengaturan Anda. Poster asli bertanya mengapa meskipun meningkatkan ukuran jendela awal pada server, koneksi pengujiannya hanya memiliki ukuran jendela 5840 bytes. Jawabannya adalah: Karena klien yang dia uji tidak memungkinkan ukuran jendela lebih besar. Saya tidak dapat mengomentari pengaturan lain atau mungkin masalah / bug lain dengan konsep secara umum.
Seseorang