Více TCP a POSIX zásuvky listen () a přijímám () sémantika

hlasů
3

Situace: Volání serveru listen () (ale neakceptuje ()!). Klient pošle SYN k serveru. Server dostane syn, a pak pošle SYN / ACK zpět klientovi. Klient však nyní zavěsí / zemře, tak to nikdy pošle ACK zpátky do serveru. Spojení je ve stavu SYN_SENT.

Nyní jiný klient pošle SYN, dostane SYN / ACK zpět ze serveru a odešle zpět ACK. Toto spojení je nyní ve stavu ESTABLISHED.

Nyní server nakonec volá přijmout (). Co se stalo? Má akceptovat) blok na prvním, vadné spojení (až nastane nějaký časový limit? Znamená to zkontrolovat frontu pro všechny navázaných spojení a vrátit těm, první?

Položena 11/04/2009 v 17:29
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
5

No, co jste popisující tady je typický syn-povodňové útok ( http://en.wikipedia.org/wiki/SYN_flood ) když je vykonán více než jednou.

Podíváme-li se například na adrese: http://lkml.indiana.edu/hypermail/linux/kernel/0307.0/1258.html existují dva oddělené fronty, jeden syn fronta a jedna se sídlem fronta. Zřejmě to první spojení zůstane ve frontě syn (protože je to ve stavu SYN_RCVD), druhé připojení bude ve vymezeném frontě, kde přijímám () dostane ji vybírat. Netstat by měl stále zobrazovat jako první ve státě SYN_RCVD.

Poznámka : viz také můj komentář, je to klient, který bude ve stavu SYN_SENT, bude server (které se bavíme) musí být ve stavu SYN_RCVD.

Odpovězeno 11/04/2009 v 18:11
zdroj uživatelem

hlasů
0

Musíte si uvědomit, že listen(), accept()et al, tak není v souladu s ladicí nástroje kapuce protokolu. Z acceptmanuálové stránky: „accept - přijmout připojení na zásuvku“. Nekompletní zapojení nejsou hlášeny, ani by neměly být. Aplikace nemusí starat o nastavení a demontáže zásuvek nebo opakovaných vysílání, nebo fragment smontování, nebo ...

Pokud píšete síťovou aplikaci, která zahrnuje věci, které byste měli být znepokojeni, je víc než dost práce. Máte-li pracovní uplatnění, ale snaží se přijít na to, problémy pak použít krásný síť ladicí nástroje, nástroje pro kontrolu stavu vašeho operačního systému, atd. Nepokoušejte se dát do vašich aplikací.

Pokud se snažíte se zapsat ladicí nástroje, pak nemůžete dosáhnout toho, co chcete, pomocí aplikační úrovni TCP / IP volání. Budete muset klesat alespoň o jeden stupeň.

Odpovězeno 11/04/2009 v 18:22
zdroj uživatelem

hlasů
2

Měli byste si uvědomit, že v některých realizacích je otevřít připojení poloviční (ten ve stavu SYN_RCVD), ani nemusí být zaznamenány na serveru. Implementace mohou používat syn cookies , ve kterém kódují veškeré informace, které potřebují k dokončení navazování spojení do pořadovým číslem SYN + ACK paketu. Když se vrátí ACK paket, s pořadovým číslem zvýšen, mohou si jej decrement a získat informace zpět. To může pomoci při ochraně před povodněmi SYN tím, že přidělování žádné prostředky na serveru pro tyto částečně otevřených připojení; tedy bez ohledu na to, kolik navíc SYN pakety klient odešle, bude server nelze spustit nedostatek prostředků.

Všimněte si, že SCTP realizuje 4-way handshake, s cookies zabudovaných do protokolu s cílem chránit proti SYN povodněmi a zároveň umožňuje další informace, které mají být uloženy v cookie, a tudíž nemají omezovat funkce protokolu podporovány, protože velikost cookie je příliš malý (TCP, dostanete pouze 32 bitů pořadového čísla pro uložení všech informací).

Takže odpověď na vaši otázku, uživatel-space accept()se jen někdy vidět plně zavedené spoje, a nebude mít žádnou představu pootevřenými připojení, které jsou čistě detail implementace TCP stacku.

Odpovězeno 11/04/2009 v 19:09
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more