Android VpnService: ìdúró kíkà TUN lòdì sí àwọn àṣìṣe kíkọ ENOBUFS
Kíkà tí kò padà rí àti kíkọ tí ó kùnà pẹ̀lú ENOBUFS ní àwọn ohun tí ó yàtọ̀. Wọn ìlà ìṣàkóso àti gígùn pákẹ́tì láti yan àtúnṣe.
Àwọn àmì méjì ń farahàn nínú ìyí VpnService kan náà, a sì fi ẹ̀sùn kan ohun kan náà fún méjèèjì: olùkà tí kò padà rí, àti kíkọ tí ó kùnà pẹ̀lú ENOBUFS. Wọ́n kì í ṣe oríṣi bọ́ọ̀gù kan. Ìdúró kíkà jẹ́ àìfohùnṣọ̀kan lórí ìṣàkóso ìṣàn pẹ̀lú peer; kíkọ tí ó kùnà jẹ́ pákẹ́tì tí ẹ̀rọ ìsopọ̀ kò ní gbà. Tí o bá kà wọ́n sí ìṣòro kan, ìwọ yóò lo ọjọ́ kan láti ṣàtúnṣe àwọn búfà tí kò kópa rí. Ìpín tí ó wà nísàlẹ̀ yìí ni bí mo ṣe ń pinnu ìdajì ìyí tí mo yóò wọn kọ́kọ́.
Ìyí kan, àwọn ibi ìkùnà méjì tí ó dúró dá
Iṣẹ́ rẹ ń ka pákẹ́tì IP láti inú àpèjúwe fáìlì TUN, ó ń yẹ̀wò rẹ̀, ó sì ń kọ ìdáhùn pada sínú àpèjúwe kan náà. Ohunkóhun tí ó bàjẹ́ lórí ọ̀nà yẹn yóò farahàn ní ọ̀kan nínú àwọn ìpè méjì yẹn, ìdí ni pé a ń sọ méjèèjì di túẹ́nẹ́lì tí ó ti bàjẹ́. Àwọn ìpè náà ní àdéhùn tí ó yàtọ̀. Kíkà ń dúró kí kẹ́nẹ́lì fún ọ ní pákẹ́tì, kíkọ sì ń fún kẹ́nẹ́lì ní pákẹ́tì tí ó ní ẹ̀tọ́ láti kọ̀.
Kíkà ni ìdajì tí ó rọrùn láti ronú lé lórí. Kíkà tí kò dá ohunkóhun padà yóò dúró de ìrìnàjò tí kò dé rí tàbí yóò dúró nítorí pé peer ti dá ṣíṣe ránṣẹ́ dúró.
Ìdúró kíkà jẹ́ àìfohùnṣọ̀kan lórí ìṣàkóso ìṣàn
Kíkà ẹ̀rọ TUN ń dẹ́kun títí pákẹ́tì yóò fi wà. Ìyẹn jẹ́ ìhùwàsí tí a ṣètò, ìdí ni pé ìlà tí ó dúró nínú read máa ń dà bíi deede lórí ìsopọ̀ tí kò ṣiṣẹ́. Ó di ìdúró nígbà tí stack TCP rẹ fúnra rẹ̀ ń gba dátà láti ọ̀dọ̀ app àdúgbò ṣùgbọ́n kò ṣe ìkéde fèrèsé tí ó tó fún peer jíjìnnà láti rán i kún. Peer yóò kún fèrèsé tí o kéde, yóò dúró de ACK àti ìmúdójúìwọ̀n fèrèsé, yóò sì dáwọ́ dúró. Nígbà náà olùkà rẹ kò ní ohunkóhun láti dá padà, app sì rí ìsopọ̀ tí ó ṣí ṣùgbọ́n tí ó dákẹ́.
Àwọn ohun tí ó fa èyí ni stack tí ń kọ sínú socket láì tẹ̀lé fèrèsé tí a kéde, àti èkejì tí ó gbàgbé láti rán ìmúdójúìwọ̀n fèrèsé lẹ́yìn tí ó ti da búfà rẹ̀ sílẹ̀. Láti ìta wọ́n dà bíi ti ara wọn: bytes ń jáde, kò sí ohun tí ń pada, kò sí àṣìṣe tí a ń gbé sókè. Dídẹ́kun ìlà kíkà lórí ṣíṣe àyẹ̀wò, yíyanjú DNS tàbí I/O disk ń dá irú àmì kan náà jáde fún ìdí tí kò níí ṣe pẹ̀lú rẹ̀, nítorí náà jẹ́rìí pé ìlà náà wà nínú read gan kí o tó fi ẹ̀sùn kan ìṣàkóso ìṣàn.
Àpò ìránṣẹ́ peer àti fèrèsé tí ó rí gbẹ̀yìn ni kí o yẹ̀wò. Tí peer bá ń dá dátà mú nítorí fèrèsé rẹ jẹ́ òdo, àtúnṣe wà ní ọ̀nà ACK rẹ, kì í ṣe nínú kíkà TUN.
ENOBUFS jẹ́ ìṣòro ìwọ̀n, kì í ṣe àìtó búfà
Kíkọ tí ó dá ENOBUFS padà lórí ẹ̀rọ ìsopọ̀ TUN máa ń kọ̀ ìgùn pákẹ́tì. Ẹ̀rọ ìsopọ̀ ní MTU, pákẹ́tì tí ó tóbi jù kò lè wọ ìlà, àti gbígbìyànjú pákẹ́tì kan náà yóò kùnà bákan náà ní gbogbo ìgbà. Ìpinnu yẹn ni àmì náà. Àìtó búfà gidi máa ń lọ nígbà tí ìpá bá dín, ṣùgbọ́n ìkọ̀ ìwọ̀n kò náání ìgbà tí o bá dúró.
TCP ní ẹ̀rọ fún ìdí yìí gan, ìyẹn sì ni ìgbésẹ̀ tí àwọn ènìyàn ń fò ó: ìdín MSS. Nígbà tí o bá ń ṣe àwọn apá nínú ààyè olùlò, ìwọ ni ó yan ìwọ̀n ẹrù, àti gbígba rẹ̀ láti MTU ẹ̀rọ ìsopọ̀ àdúgbò dípò MTU túẹ́nẹ́lì yóò gbé àwọn apá jáde tí túẹ́nẹ́lì kò lè gbé. Dín sí èyí tí ó kéré nínú méjèèjì. Ìdín náà bo TCP nìkan, nítorí náà datagram UDP tí ó tóbi jù gbọ́dọ̀ jẹ́ pínpín tàbí kí kóòdù rẹ sọ ọ́ nù.
Ṣàkọsílẹ̀ ìgùn gbogbo pákẹ́tì tí o kọ nígbà ìṣàtúpalẹ̀. Ìgùn tí ó kùnà ni ìdáhùn, kò sì ní yí padà láàrin àwọn ìgbìyànjú.
Àwọn ìwọ̀n mẹ́ta tí ń ya àwọn ọ̀ràn
O kò nílò ẹ̀rọ ìṣàtúpalẹ̀ fún ọ̀kan nínú àwọn ìkùnà méjì. Àwọn ìwòye mẹ́ta tó láti darí ọ sí apá tí ó tọ́, wọ́n sì ń gba àkókò tí ó dín ju àtúntò lọ.
| What you see | Where to look |
|---|---|
| Reader parked, peer send queue empty, last advertised window zero | Window updates in your ACK path |
| Write fails on one length and succeeds on a smaller one | MSS clamp and tunnel MTU |
| Both directions look fine, app still sees no data | Protected socket and routing loop |
Tí ìlà kẹta bá bámu, ìyí fúnra rẹ̀ dára, ìṣòro sì wà níbi tí túẹ́nẹ́lì kò lè rí i: socket ìgbéraga tí a kò dáàbò bò tí ń gbé ìrìnàjò VPN rẹ fúnra rẹ̀ padà sínú túẹ́nẹ́lì, èyí tí ó máa ń farahàn bíi ìsopọ̀ tí ó ṣàṣeyọrí tí kò sì fi ohunkóhun ránṣẹ́.
Ṣàtúnṣe pípàn tí àwọn ọ̀nà méjèèjì gbára lé
Kò sí àmì tí ó yẹ kí a lépa títí ẹ̀rọ ìsopọ̀ yóò fi jẹ́ kíkọ́ tọ́. Àwọn ìpè builder tí ó ṣe pàtàkì ni àdírẹ́sì, ọ̀nà, MTU àti ìfohùnṣọ̀kan, ní ìtòlẹ́sẹẹsẹ yẹn:
Builder()
.addAddress(10.8.0.2, 32)
.addRoute(0.0.0.0, 0)
.setMtu(1400)
.establish()Ṣètò MTU sí iye gidi túẹ́nẹ́lì dípò fífi í sílẹ̀ lórí èyí tí àpẹẹrẹ náà lò. Gbogbo ohun tí o bá kọ lẹ́yìn náà ni a fi nọ́mbà yẹn dín sí, àìbámu láàrin MTU tí o ṣètò àti MSS tí o dín sí ni ọ̀nà tí ó wọ́pọ̀ jù láti tún ìkùnà kíkọ mú pada lẹ́yìn àtúnṣe. Lẹ́yìn náà dáàbò bo socket tí ń gbé ìrìnàjò lọ sí olùpèsè VPN fúnra rẹ̀. Láìsí protect àwọn pákẹ́tì yẹn yóò padà wọ túẹ́nẹ́lì rẹ fúnra rẹ̀, ìsopọ̀ kò sì ní parí rí, èyí tí ó dà bíi kíkà tí ó dúró ṣùgbọ́n ó jẹ́ ìyí ìtọ́sọ́nà.
A kò lè yẹ̀ ìfohùnṣọ̀kan sílẹ̀. Iṣẹ́ tí a bẹ̀rẹ̀ láìsí kí prepare dá null padà kò ní ẹ̀rọ ìsopọ̀, establish sì ń dá null padà dípò jíjù, nítorí náà yẹ̀wò àpèjúwe náà kí o tó bẹ̀rẹ̀ ìyí rẹ. Ìtọ́kasí VpnService ni ibi tí o ti jẹ́rìí àdéhùn builder dípò dídà á tẹ́lẹ̀ àpẹẹrẹ.
Jẹ́rìí ọ̀nà kan ní ìgbà kan
Rán ìdásílẹ̀ UDP nípasẹ̀ túẹ́nẹ́lì kí o sì wo ìgùn pákẹ́tì kí o tó fi ọwọ́ kan TCP. Lẹ́yìn náà ṣí ìfọwọ́sowọ́pọ̀ kí o sì jẹ́rìí pé àwọn apá wà nísàlẹ̀ MSS tí o ṣirò. Ka àwọn pákẹ́tì dípò àwọn ìsopọ̀, kí ìdúró lè farahàn bíi àlàfo nínú olùka dípò socket tí ó so kọ́. Tí kíkà bá dáwọ́ dúró lẹ́yìn ìgbì kíkọ, fèrèsé ni afẹ̀sùn; tí kíkọ bá kùnà lẹ́sẹ̀kẹsẹ̀, ìgùn ni.
Lẹ́yìn náà tún ẹ̀rọ náà bẹ̀rẹ̀ kí o sì tún ṣe lẹ́ẹ̀kan, nítorí VpnService tí ó ń ṣiṣẹ́ títí dé ìyípadà nẹ́tíwọ́kì àkọ́kọ́ jẹ́ ìṣòro ìtọ́sọ́nà, kì í ṣe ti ìṣàkóso ìṣàn.