Ce garanții există pentru spălarea bufferelor de trimitere TCP, dacă există, atunci când subsistem congelator îngheață un cgroup?
Luați în considerare următorul scenariu: Server A, care rulează într-un cgroup, trimite date către Server B prin TCP. Socket-ul TCP este configurat să utilizeze algoritmul lui Naggle ( TCP_NODELAY
opțiunea nu este setată). Prin urmare, trimite
Transferarea datelor peste socket nu blochează ACK-ul serverului B, ci revine după ce datele de trimis au fost copiate în bufferul de trimitere TCP. După aceea, dar înainte ca datele să fie trimise către Server B, cgroup-ul este înghețat.
Ce se întâmplă cu datele din bufferul de trimitere TCP?
- Operația de înghețare va aștepta până când toate datele din buffer vor fi confirmate de serverul B? Ce se întâmplă dacă tamponul de recepție al serverului B este plin? Înghețarea va aștepta la nesfârșit confirmarea serverului B?
- Înghețarea nu va aștepta ACK-ul serverului B și va continua să trimită datele după ce cgroup-ul a fost dezghețat? Dacă întârzierea dintre înghețare și dezghețare este suficient de mare pentru ca serverul B să închidă conexiunea TCP, datele din buffer se vor pierde.
Sunt apreciate link-urile către specificații și garanții în jurul acestui comportament. Dar poate că nu există garanții, așa că a te baza pe oricare dintre comportamente ar fi fragil?
Fundalul întrebării este că mă întreb cât de atent trebuie să fie atunci când trimiteți date prin TCP pe AWS Lambda (presupunerea mea este că AWS Lambda folosește cgroups pentru a îngheța/dezgheța după/înainte de gestionarea unei invocari Lambda). Este suficient să ștergeți bufferele aplicației în socket-ul TCP/tamponul de trimitere TCP? Sau trebuie să vă asigurați că serverul B a primit datele de pe stratul de aplicație, de exemplu folosind HTTP și așteptând răspunsul HTTP al serverului?