圌ãã¯ãã·ã¹ãã ã®èª€åäœãçè§£ãããŸã§ãã·ã¹ãã ãå®å
šã«çè§£ã§ããªããšèšããŸãã åŠçãšããŠãç§ã¯TCPã®å®è£
ãæ¥œãã¿ã®ããã«æžãããã®åŸITã§æ°å¹ŽéåããŸããããããã§ãTCPã®ä»äºãšãã®ãšã©ãŒã«ã€ããŠããã«æ·±ãç ç©¶ãç¶ããŠããŸãã æãé©ãã¹ãããšã¯ããããã®ãšã©ãŒã®äžéšãåºæ¬çãªãã®ã«çŸããããšã§ãã ãããŠããããã¯æããã§ã¯ãããŸããã ãã®èšäºã§ã¯ããããã
Car TalkãŸãã¯
å€ãJavaããºã«ã®ã¹ã¿ã€ã«ã®ããºã«ãšããŠæç€ºã
ãŸã ã ä»ã®åªããããºã«ãšåæ§ã«ããããã¯éåžžã«ç°¡åã«åçŸã§ããŸããã解決çã¯éåžžé©ãã¹ããã®ã§ãã ãããŠãç¥ç§çãªè©³çŽ°ã«æ³šæãåãã代ããã«ããããã®ããºã«ã¯ãTCPã®åºæ¬åçã®ããã€ããåŠã¶ã®ã«åœ¹ç«ã¡ãŸãã
åææ¡ä»¶
ãããã®ããºã«ã¯ãUnixã®ãããªã·ã¹ãã ã§ã®TCPã®åºæ¬çãªç¥èãæç€ºããŠããŸãã ããããããããæãäžããããã«ãã¹ã¿ãŒã«ãªãå¿
èŠã¯ãããŸããã äŸïŒ
- TCPã»ãã·ã§ã³ã®ç¶æ
ãæ¥ç¶ã®3ã€ã®æ®µéãããã³ãã®å®äºã®æ®µéã«é¢ããæ
å ±ã¯ã Wikipediaã§èŠã€ããããšãã§ããŸãã
- ããã°ã©ã ã¯éåžžã
read ã write ã connect ã bind ã listenããã³acceptã䜿çšããŠãœã±ãããšå¯Ÿè©±ããŸãã ããã«ã sendããã³recvãããsendãããã®äŸã§ã¯readããã³writeããã«åäœãwrite ã - ãã®èšäºã§ã¯
pollã䜿çšããŸãã å€ãã®ã·ã¹ãã ã¯kqueueãepollãªã©ã®ããå¹ççãªãã®ã䜿çšããŸããããã®ã¿ã¹ã¯ã§ã¯ãããã®ããŒã«ã¯ãã¹ãŠåçã§ãã ãããã®ã¡ã«ããºã ã§ã¯ãªããããããã³ã°æäœã䜿çšããã¢ããªã±ãŒã·ã§ã³ã«é¢ããŠã¯ãTCPãšã©ãŒãpollã©ã®ããã«åœ±é¿ããããçè§£ãããšãããããã³ã°æäœã«ã©ã®ãããªåœ±é¿ãããããæšæž¬ãããããªããŸãã
ãããã®äŸããã¹ãŠèªåã§ç¹°ãè¿ãããšãã§ããŸãã VMware Fusionã䜿çšããŠå®è¡ããŠãã2ã€ã®ä»®æ³ãã·ã³ã䜿çšããŸããã çµæã¯ãéçšãµãŒããŒãšåãã§ãã ãã¹ãã§ã¯ãSmartOSã§
nc(1)ã䜿çšããŸããããåçŸå¯èœãªåé¡ãç¹å®ã®OSã«åºæã®ãã®ã«ãªããšã¯æããŸããã ã·ã¹ãã ã³ãŒã«ã远跡ãã倧ãŸããªã¿ã€ãã³ã°æ
å ±ãåéããããã«ãillumosãããžã§ã¯ãã®
trussïŒ1ïŒãŠãŒãã£ãªãã£ã䜿çšããŸããã ãã®æ
å ±ã¯ãOS Xã®
dtrussïŒ1mïŒãŸãã¯GNU / Linuxã®
straceïŒ1ïŒã§ååŸã§ããŸãã
nc(1)éåžžã«åçŽãªããã°ã©ã ã§ãã æ¬¡ã®2ã€ã®ã¢ãŒãã§äœ¿çšããŸãã
- ãµãŒããŒã®ããã«ã ãã®ã¢ãŒãã§ã¯ãncã¯ãœã±ãããäœæããŠãªãã¹ã³ãã
acceptãåŒã³åºããŠæ¥ç¶ã確ç«ããããŸã§ãããã¯ããŸãã - 顧客ãšããŠã ãã®ã¢ãŒãã§ã¯ã
ncã¯ãœã±ãããäœæãããªã¢ãŒããµãŒããŒãžã®æ¥ç¶ã確ç«ããŸãã
äž¡æ¹ã®ã¢ãŒãã§ãæ¥ç¶ã確ç«ãããåŸãååŽã¯
pollã䜿çšããŠæšæºå
¥åãåŸ
æ©ããããèªã¿åãæºåãã§ããŠããããŒã¿ã®ãããœã±ãããæ¥ç¶ããŸãã çä¿¡ããŒã¿ã端æ«ã«åºåãããŸãã 端æ«ã«å
¥åããããŒã¿ã¯ããœã±ãããä»ããŠéä¿¡ãããŸãã CTRL-CãæŒããšããœã±ãããéããŠããã»ã¹ã忢ããŸãã
äŸã§ã¯ãã¯ã©ã€ã¢ã³ãã¯
kangãšåŒã°ãããµãŒããŒã¯
kodosãšåŒã°ã
kodos ã
ãŠã©ãŒã ã¢ããïŒéåžžã®TCPãã¬ãŒã¯
åºæ¬çãªç¶æ³ããå§ããŸãããã
kodosãµãŒããŒãæ§æãããšæ³åããŠ
kodos ïŒ
ãµãŒããŒ
[root@kodos ~]
ïŒãããã®äŸã§ã¯ã
ncãè¡ãã·ã¹ãã ã³ãŒã«ãåºåããããã«
trussã䜿çšããŠããããšãæãåºããŸããæéæ
å ±ã¯
trussãã©ã°ã䜿çšããŠè¡šç€ºãããŸãã
次ã«ã
kangæ¥ç¶ã確ç«ããŸãã
ã客æ§
[root@kang ~]
kodosã¯ä»¥äžã衚瀺ãããŸãã
ãµãŒããŒ
23.8934 accept(3, 0x08047B3C, 0x08047C3C, SOV_DEFAULT, 0) = 4 pollsys(0x08045680, 2, 0x00000000, 0x00000000) (sleeping...)
TCPæ¥ç¶ã¯ESTABLISHEDç¶æ
ã«ãããäž¡æ¹ã®ããã»ã¹ã¯
pollãŸãã
netstatã䜿çšããŠããã¹ãŠã®ã·ã¹ãã ã§ããã確èªã§ããŸãã
ãµãŒããŒ
[root@kodos ~]
ã客æ§
[root@kang ~]
質åïŒ
ããã»ã¹ã®1ã€ãå®äºãããšãä»ã®ããã»ã¹ã¯ã©ããªããŸããïŒ åœŒã¯äœãèµ·ãã£ãã®ãçè§£ã§ããŸããïŒ åœŒã¯ãããã©ã®ããã«çè§£ããŸããïŒ ç¹å®ã®ã·ã¹ãã ã³ãŒã«ã®åäœãäºæž¬ããããããããããè¡ãçç±ã説æããŠã¿ãŸãããã
kodos CTRL-Cã
kodosãŸãã
ãµãŒããŒ
pollsys(0x08045680, 2, 0x00000000, 0x00000000) (sleeping...) ^C127.6307 Received signal
ãããŠãããã
kangã«èŠããããã®ã§ãïŒ
ã客æ§
pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 126.1771 pollsys(0x08045670, 2, 0x00000000, 0x00000000) = 1 126.1774 read(3, 0x08043670, 1024) = 0 126.1776 close(3) = 0 [root@kang ~]
ã©ããã ãããçè§£ããŸãããïŒ
- ããã»ã¹ãçµäºãããšãã«ãSIGINTããµãŒããŒã«éä¿¡ããŸããã çµäºåŸããã¡ã€ã«èšè¿°åã¯éããããŸããã
ESTABLISHEDãœã±ããã®æåŸã®ãã³ãã«ãéãããããšãTCPã¹ã¿ãã¯ã¯FINæ¥ç¶ãä»ããŠkodoséä¿¡ãã FIN_WAIT_1å
¥ããŸããkangäžã®TCPã¹ã¿ãã¯ã¯FINãã±ãããåä¿¡ããèªèº«ã®æ¥ç¶ãCLOSE_WAITç¶æ
CLOSE_WAIT ãå¿çãšããŠACKãéä¿¡ããŸãã ncã¯ã©ã€ã¢ã³ãããœã±ããããããã¯ããŠããé-èªã¿åãã®æºåãã§ããŠããéãã«ãŒãã«ã¯POLLINã䜿çšããŠãã®ã¹ã¬ãããPOLLINãŸããncã¯ã©ã€ã¢ã³ãã¯ããœã±ããã®POLLINãPOLLINãã readãåŒã³åºãread ãããã¯ããã«0ãè¿ããŸããããã¯ãæ¥ç¶ã®çµäºãæå³ããŸãã ncã¯ããœã±ããã®åŠçãå®äºãããšå€æããéããŸãã- ãããŸã§ã®éã
kodosäžã®TCPã¹ã¿ãã¯ã¯ACKãåä¿¡ãã FIN_WAIT_2å
¥ãFIN_WAIT_2 ã - kangã®
ncã¯ã©ã€ã¢ã³ãããœã±ãããéããéãkangã®TCPã¹ã¿ãã¯ã¯FINãkodoséä¿¡ãkodos ã kangã®æ¥ç¶ã¯LAST_ACKç¶æ
ã«å
¥ããŸãã kodosã®TCPã¹ã¿ãã¯ã¯FINãåä¿¡ããæ¥ç¶ã¯TIME_WAITç¶æ
ã«ãªãã kodosã®ã¹ã¿ãã¯ã¯FINã確èªããŸããkangã®TCPã¹ã¿ãã¯ã¯FINã®ACKãåä¿¡ããæ¥ç¶ãå®å
šã«åé€ããŸãã- 2ååŸã
kodosã®TCPæ¥ç¶ã¯éããããã¹ã¿ãã¯ã¯æ¥ç¶ãå®å
šã«åé€ããŸãã
æé ã®é åºã¯ãããã«ç°ãªãå ŽåããããŸãã ãŸãã
kangã¯ã
FIN_WAIT_2代ããã«ã
CLOSINGç¶æ
ã«ãªãå ŽåããããŸãã
ãããã£ãŠãnetstatã«ãããšãæçµç¶æ
ã¯æ¬¡ã®ããã«ãªããŸãã
ãµãŒããŒ
[root@kodos ~]
ãã®æ¥ç¶ã®
kangã¯éä¿¡ããŒã¿ã¯ãããŸããã
äžéç¶æ
ã¯éåžžã«è¿
éã«ééããŸããã
DTrace TCPãããã€ããŒã䜿çšããŠè¿œè·¡ã§ã
ãŸã ã ãã±ãããããŒã¯ã
snoopïŒ1mïŒãŸãã¯
tcpdumpïŒ1ïŒã䜿çšããŠè¡šç€ºã§ããŸãã
çµè«ïŒæ¥ç¶ã®ã€ã³ã¹ããŒã«ããã³çµäºäžã«ã·ã¹ãã ã³ãŒã«ãæž¡ãéåžžã®æ¹æ³ãèŠãŸããã
kangã¯ãæ¥ç¶ã
kodosã§éãããããšããäºå®ãããã«çºèŠããããšã«æ³šæããŠãã ãã
kodosããèµ·ããã
readãŒãã®
readè¿ããšãã¹ããªãŒã ã®çµããã
readãŸãã ãã®æç¹ã§ã
kangã¯ãœã±ãã
ãéãã
ããšã«æ±ºã ãããã«ãã
kodosãžã®æ¥ç¶ã
kodosãã
kodos ã åŸã§ããã«æ»ãããã®ç¶æ³ã§
kangããœã±ãããéããªãã£ãå Žåã«ã©ããªãããèŠãŠãããŸãã
ããºã«1ïŒé»æºåèµ·å
ããããã®ã·ã¹ãã ã®é»æºãåèµ·åãããšã確ç«ãããéã¢ã¯ãã£ããªTCPæ¥ç¶ã¯ã©ããªããŸããïŒã¹ã±ãžã¥ãŒã«ãããåèµ·åäžã«å€ãã®ããã»ã¹ãïŒãrebootãã³ãã³ãã䜿çšããŠïŒæ£ããçµäºãããããCTRL-Cã䜿çš
kodosãŠãµãŒããŒã
kodosã³ã³ãœãŒã«ã§ãrebootãã³ãã³ããå
¥åããŠãåãçµæã«ãªããŸãã ããããåã®äŸã§
kodosã®é»æºã
kodosã©ããªããŸããïŒ æçµçã«ã
kangã¯ããããã§ãããïŒ
èŠãŠã¿ãŸãããã æ¥ç¶ã確ç«ããŸãã
ãµãŒããŒ
[root@kodos ~]
ã客æ§
[root@kang ~]
黿ºã®åèµ·åãã·ãã¥ã¬ãŒãããã«ã¯ãVMwareã®åèµ·åæ©èœã䜿çšããŸãã ããã¯å®éã®åèµ·åã«ãªãããšã«æ³šæããŠãã ãã-段éçãªã·ã£ããããŠã³ã«ã€ãªãããã®ã¯ãã¹ãŠãæåã®äŸã«äŒŒãŠããŸãã
20ååŸã
kangãŸã åãç¶æ
ã«ãããŸãã
ã客æ§
pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...)
TCPã®ä»äºã¯ãè€æ°ã®ã·ã¹ãã éã§åžžã«æœè±¡åïŒã€ãŸããTCPæ¥ç¶ïŒãç¶æããããšã§ãããšèããã¡ã§ããããããã®ãããªå£ããæœè±¡åã®ã±ãŒã¹ã¯é©ãã»ã©ã«èŠããŸãã ãããŠãããããªãããã®ncïŒ1ïŒåé¡ã ãšæããªããããªãã¯ééã£ãŠããŸãã
kodos ã
kodos ãã¯
kangãžã®æ¥ç¶ã衚瀺ããŸãããã
kangã¯
kodosãžã®å®å
šã«æ©èœããæ¥ç¶ã
kodosãŸãã
ã客æ§
[root@kang ~]
ãã®ãŸãŸã«ããŠãããšã
kangã¯
kodosãªããŒããããããšãç¥ãããšãã§ããŸããã
kang kodosããŒã¿ãéä¿¡ããããšããŠkangãšããŸãã ã©ããªãã®ïŒã客æ§
pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) kodos, are you there? 3872.6918 pollsys(0x08045670, 2, 0x00000000, 0x00000000) = 1 3872.6920 read(0, " kodos , are y".., 1024) = 22 3872.6924 write(3, " kodos , are y".., 22) = 22 3872.6932 pollsys(0x08045670, 2, 0x00000000, 0x00000000) = 1 3872.6932 read(3, 0x08043670, 1024) Err
ã¡ãã»ãŒãžãå
¥åããŠEnterãæŒããšã
kodosèµ·åããstdinããã¡ãã»ãŒãžãèªã¿åãããœã±ããçµç±ã§éä¿¡ããŸãã
write åŒã³åºã ãæ£åžžã«å®äºããŸãã ïŒ
ncã¯ã次ã®ã€ãã³ããåŸ
æ©ãã
pollæ»ããæåŸã«ããããã¯ããã«ãœã±ãããèªã¿åãããšãã§ããªããšçµè«ä»ããreadãåŒã³åºã
read ã ãã®æéã®
readã¯ãECONNRESETã¹ããŒã¿ã¹ã§äœäžããŸãã ããã¯ã©ãããæå³ã§ããïŒ
readïŒ2ïŒã®ããã¥ã¡ã³ãã«ã¯æ¬¡ã®ããšãèšèŒãããŠããŸã ã
[ECONNRESET] , .
å¥ã®ãœãŒã¹ã«ã¯ãããå°ã詳现ãå«ãŸããŠããŸãã
ECONNRESET filedes . . / filedes.
ãã®ãšã©ãŒã¯ã
readåŒã³åºãã«é¢ããç¹å®ã®åé¡ãæå³ãããã®ã§ã¯ãããŸããã ãœã±ãããåæããããšããã ãã§ãã ãã®ãããã»ãšãã©ã®ãœã±ããæäœã¯ãšã©ãŒã«ãªããŸãã
ããã§äœãèµ·ãã£ãã®ã§ããïŒ ãã®æç¹ã§ã
kangäžã®
ncãããŒã¿ãéä¿¡ããããšãããšããTCPã¹ã¿ãã¯ã¯ãŸã æ¥ç¶ããã§ã«åæ¢ããŠããããšãç¥ããŸããã§ããã
kangã¯ããŒã¿ãã±ããã
kodosã«éä¿¡ããŸãã
kodosã¯æ¥ç¶ã«ã€ããŠäœãç¥ããªãã£ããããRSTã§å¿çããŸããã
kangã¯RSTãèŠãŠãåæãããŸããã ãœã±ãããã¡ã€ã«èšè¿°åãéããããšã¯ã§ããŸããâãã¡ã€ã«èšè¿°åã¯ãã®æ¹æ³ã§ã¯åäœããŸãããããã®åŸã®æäœã¯ã
ncããã¡ã€ã«èšè¿°åãéãããŸã§ECONNRESETã¹ããŒã¿ã¹ã§å€±æããŸãã
çµè«ïŒ- æ¿ããåé»ã¯ããã¡ããšããã·ã£ããããŠã³ãšã¯å€§ããç°ãªããŸãã 忣ã·ã¹ãã ããã¹ãããå Žåããã®ã·ããªãªã¯åå¥ã«ç¢ºèªããå¿
èŠããããŸãã ãã¹ãŠãéåžžã®ããã»ã¹ã®ã·ã£ããããŠã³ïŒkillïŒãšåãã«ãªããšã¯æããªãã§ãã ããã
- äžæ¹ã®åŽãTCPæ¥ç¶ã確ç«ãããŠããããšã確èªããããäžæ¹ã®åŽãäžæã§ããç¶æ³ãããããã®ç¶æ³ã¯æ±ºããŠèªåçã«è§£æ±ºãããŸããã ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ãŸãã¯TCPã§ã®æ¥ç¶ã®ããŒãã¢ã©ã€ãã䜿çšããŠããã®ãããªåé¡ã®è§£æ±ºã管çã§ããŸãã
kangããŸã ãªã¢ãŒãåŽã®æ¶å€±ãçºèŠããå¯äžã®çç±ã¯ã圌ãããŒã¿ãéä¿¡ããæ¥ç¶ããªãããšã瀺ãå¿çãåä¿¡ããããã§ãã
åé¡ã¯ãäœããã®çç±ã§
kodosãããŒã¿ã®éä¿¡ã«å¿çããªãå Žåã¯ã©ãã§ããããïŒ
ããºã«2ïŒé»æºãªã
TCPæ¥ç¶ã®ãšã³ããã€ã³ãããã°ãããããã¯ãŒã¯ããåæããããšã©ããªããŸããïŒ ä»ã®ããŒãã¯ããã«ã€ããŠç¥ãã§ããããïŒ ãããããªããã©ã®ããã«ïŒ ãããŠãã€ïŒ
ncã䜿çšããŠåæ¥ç¶ããŸãã
ãµãŒããŒ
[root@kodos ~]
ã客æ§
[root@kang ~]
ããã§ãçªç¶
kodosã®é»æºããªãã«ãã
kangããŒã¿ãéä¿¡ããããšããŸãã
ã客æ§
pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 114.4971 pollsys(0x08045670, 2, 0x00000000, 0x00000000) = 1 114.4974 read(0, "\n", 1024) = 1 114.4975 write(3, "\n", 1) = 1 pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...)
writeåŒã³åºãã¯æ£åžžã«çµäºããç§ã¯é·ãéäœãèŠãŠããŸããã ããã5ååŸã«è¡šç€ºãããŸãã
ã客æ§
pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 425.5664 pollsys(0x08045670, 2, 0x00000000, 0x00000000) = 1 425.5665 read(3, 0x08043670, 1024) Err
ãã®ç¶æ³ã¯ã黿ºãå®å
šã«ãªãã«ããã®ã§ã¯ãªãã黿ºãåèµ·åããå Žåãšéåžžã«äŒŒãŠããŸãã 2ã€ã®éãããããŸãã
- ã·ã¹ãã ãç¶æ³ãçè§£ããã®ã«5åããããŸããã
- ãšã©ãŒã¹ããŒã¿ã¹ã¯ETIMEDOUTã§ããã
ç¹°ãè¿ããŸãããããã¯æéåãã®
readã¿ã€ã ã¢ãŠãã§ãã ä»ã®ãœã±ããæäœã§ãåããšã©ãŒãçºçããŸãã ããã¯ãæ¥ç¶ãã¿ã€ã ã¢ãŠããããšãã«
ãœã±ãããç¶æ
ã«å
¥ãããã§ãã ãã®çç±ã¯ããã®ã·ã¹ãã ã®èšå®ã«å¿ããŠããªã¢ãŒãåŽãé·ããã-5åéããŒã¿ãã±ããã確èªããªãã£ãããã§ãã
çµè«ïŒ- ãªã¢ãŒãã·ã¹ãã ã黿ºãåèµ·åãã代ããã«ãåã«ã·ã£ããããŠã³ãããšããæåã®ã·ã¹ãã ã¯ããŒã¿ãéä¿¡ããããšã«ãã£ãŠã®ã¿ãããç¥ãããšãã§ããŸãã ãããªããã°ã圌女ã¯å£ããæ¥ç¶ã«ã€ããŠæ±ºããŠç¥ãããšãã§ããŸããã
- ã·ã¹ãã ãé·ãããããŒã¿ãéä¿¡ããããšããŠå¿çãåä¿¡ããªãå ŽåãTCPæ¥ç¶ã¯éãããããœã±ããã䜿çšãããã¹ãŠã®æäœã¯ETIMEDOUTãšã©ãŒã§çµäºããŸãã
ããºã«3ïŒèœäžããã«æ¥ç¶ã®æ¬ åŠ
ä»åã¯ãç¹å®ã®ç¶æ³ã説æããŠäœãèµ·ãã£ãŠããã®ããå°ãã代ããã«ãå察ã®ããšãè¡ããŸããç¹å®ã®èгå¯ã説æãããããã©ã®ããã«èµ·ãã£ãããçè§£ã§ãããã©ããã確èªããŸãã
kangã
kodosã«æ¥ç¶ããŠãããšä¿¡ããŠãããããããªããã
kodosã¯ããã«ã€ããŠç¥ããªãããã€ãã®ç¶æ³ãè°è«ããŸããã
kodosãkodosã«æ¥ç¶ãããŠã kodosãç¡æéã«ãããç¥ããªãããã«kangããšã¯å¯èœã§ããïŒã€ãŸããåé¡èªäœã¯è§£æ±ºãããŸããïŒãåé»ãåèµ·åãä»ã®kodosãªãã¬ãŒãã£ã³ã°ã·ã¹ãã kodos ããããã¯ãŒã¯æ©åšïŒãã³ãïŒæ¥ç¶ãESTABLISHEDã¹ããŒã¿ã¹ã®ãŸãŸã§ããå Žåãäžèšã®ã±ãŒã¹ãèæ
®ããŠãã ããã ãœã±ãããéãããŸãŸã«ããŠãæ¥ç¶ãäžæããããšãã«ããŒã¿ãéä¿¡ããããšã§æ€åºã§ããããããã®åé¡ã解決ããã®ã¯ã¢ããªã±ãŒã·ã§ã³ã®è²¬ä»»ã§ãããšèšããŸãã ããããã¢ããªã±ãŒã·ã§ã³ããœã±ãããéãããŸãŸã«ããªããšã©ããªããŸããïŒ
ãŠã©ãŒã ã¢ããã§ã¯ã
kodos ncããœã±ãããéããç¶æ³ã調ã¹ãŸããã
kang ncã¯0ïŒè»¢éã®çµäºãžã®ãã€ã³ã¿ïŒãèªã¿åãããœã±ãããéãããšèšããŸããã ãœã±ãããéãããŸãŸã ãšããŸãããã æããã«ãããããèªãããšã¯äžå¯èœã§ãããã ãã ããTCPã«ã€ããŠã¯ãFINãéä¿¡ããçžæã«è¿œå ã®ããŒã¿ãéä¿¡ã§ããªããšã¯èšãããŠããŸããã
FINã¯ãFINãéä¿¡ãããæ¹åã®ããŒã¿ã¹ããªãŒã ã®ã¿ãéããããšãæå³ããŸãããããå®èšŒããããã«ã
kang ncã䜿çšããããšã¯ã§ããŸããã0ãåãåã£ãåŸã«ãœã±ãããèªåçã«éããããã§ãããããã£ãŠããã®ãã€ã³ããã¹ããããã
dncãšãã
ncãã¢ããŒãžã§ã³ãäœæããŸããã
Dncã¯ãŸããã·ã¹ãã ã³ãŒã«ãæç€ºçã«è¡šç€ºããŸãã ããã«ãããTCPã®ã¹ããŒã¿ã¹ã远跡ããæ©äŒãåŸãããŸãã
ãŸããæ¥ç¶ãæ§æããŸãã
ãµãŒããŒ
[root@kodos ~]
ã客æ§
[root@kang ~]
次ã«ãæ¥ç¶ãäž¡åŽã§ESTABLISHEDã¹ããŒã¿ã¹ã«ãªã£ãŠããããšã確èªããŸãã
ãµãŒããŒ
[root@kodos ~]
ã客æ§
[root@kang ~]
kodos ã
ncããã»ã¹ã«CTRL-Cãé©çšããŸãã
ãµãŒããŒ
pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) ^C[root@kodos ~]
kangã§ã¯ã次ã®ããšãããã«ããããŸãã
ã客æ§
2016-05-27T08:40:12Z: poll returned events 0x0/0x1 2016-05-27T08:40:12Z: reading from socket 2016-05-27T08:40:12Z: read end-of-stream from socket 2016-05-27T08:40:12Z: read 0 bytes from socket 2016-05-27T08:40:12Z: entering poll()
次ã«ãTCPæ¥ç¶ã®ã¹ããŒã¿ã¹ãèŠãŠã¿ãŸãããã
ãµãŒããŒ
[root@kodos ~]
ã客æ§
[root@kang ~]
ããã¯çã«ããªã£ãŠããŸãïŒkudosã¯FINã
kangéä¿¡ããŸããã
FIN_WAIT_2ã¯ã
kodosãéä¿¡ããFINã«å¿çããŠ
kangããACKãåä¿¡ããããšã瀺ãã
CLOSE_WAITã¯ã
kangãFINãåä¿¡
ãããå¿çã«FINãéä¿¡ããªãã£ãããšã瀺ããŸãã
ããã¯å®å
šã«æ£åžžãªTCPæ¥ç¶ç¶æ
ã§ãããæ°žä¹
ã«ç¶ãå¯èœæ§ããããŸãã kodosã
kangèŠæ±ãéä¿¡ããä»ã«äœãéä¿¡ããäºå®ã¯ãªãã£ããšæ³åããŠ
kodos ã
kangã¯äœæéãæ¥œããããŒã¿ãéãè¿ãããšãã§ããŸãã ç§ãã¡ã®å Žåã«ã®ã¿ã
kodos å®éã«ãœã±ãããéããŸãã ã
å°ãåŸ
ã£ãŠãTCPæ¥ç¶ã®ç¶æ
ãããäžåºŠç¢ºèªããŸãããã
kodosæ¥ç¶ãå®å
šã«å€±ãããŸããã
kangãŸã ååšããããšã
kodos ã
ã客æ§
[root@kang ~]
ã¢ããªã±ãŒã·ã§ã³ããœã±ãããéããã¹ã¿ãã¯ãFINãéä¿¡ãããªã¢ãŒãã¹ã¿ãã¯ãFINãèªèããããŒã«ã«ã¹ã¿ãã¯ãäžå®æéåŸ
æ©ã
ãŠæ¥ç¶ãéãããšãTCPã¹ã¿ãã¯ã«é¢é£ããããŸãç¥ãããŠããªãç¶æ³ã«çŽé¢ããŸããã çç±ã¯ïŒ ãªã¢ãŒãåŽããªããŒããããŸããã ãã®ã±ãŒã¹ã¯ãäžæ¹ã®æ¥ç¶ãESTABLISHEDã¹ããŒã¿ã¹ã«ãããããäžæ¹ã®åŽããããèªèããŠããªãå Žåã«äŒŒãŠããŸãã å¯äžã®éãã¯ãã¢ããªã±ãŒã·ã§ã³ããœã±ãããéããããšãããã³åé¡ãåŠçã§ããä»ã®ã³ã³ããŒãã³ãããªãããšã§ãã ãã®çµæãTCPã¹ã¿ãã¯ã¯æå®ãããæéåŸ
æ©ããæ¥ç¶ãéããŸãïŒçžæåŽã«äœãéä¿¡ããŸããïŒã
åé¡ã¯åŸã§ãã
ãã®ç¶æ³ã§kangãkodosããŒã¿ãéä¿¡ãããškodosãŸããïŒ kodosåŽã§ã¯æ¢ã«æ¥ç¶ãå®äºããŠããŸããã
kangãŸã æ¥ç¶ãéããŠãããšèããŠããŸãã
ã客æ§
2016-05-27T08:40:12Z: entering poll() kodos, are you there? 2016-05-27T08:41:34Z: poll returned events 0x1/0x0 2016-05-27T08:41:34Z: reading from stdin 2016-05-27T08:41:34Z: writing 22 bytes read from stdin to socket 2016-05-27T08:41:34Z: entering poll() 2016-05-27T08:41:34Z: poll returned events 0x0/0x10 2016-05-27T08:41:34Z: reading from socket dnc: read: Connection reset by peer
ããã¯ãããºã«1ã§èŠããã®ãšåãã§ãïŒTCPã¹ã¿ãã¯ã¯æ¥ç¶ãéããããããšããŸã ç¥ããªãããã
write()æåããŸãã ãããRSTãæ¥ãŠã
poll()ããã¹ã¬ãããèµ·åããåŸç¶ã®
read()èŠæ±ãECONNRESETãè¿ããŸãã
çµè«ïŒ- ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããããã¯ãŒã¯ããŸãã¯ããŒããŠã§ã¢ã«ãšã©ãŒã¯ãããŸããã§ããããäž¡æ¹ã®åŽãæ¥ç¶ã®ã¹ããŒã¿ã¹ã«åæããªãå¯èœæ§ããããŸã ã
- äžèšã®å Žåã
kang kodosãkangããã®ããŒã¿ãkodosããŠãããã©ããããŸãã¯kodosãœã±ãããéããŠãªãã¹ã³ããŠããªããã©ããïŒå°ãªããšããã±ãããéä¿¡ããªãå ŽåïŒãèŠã€ããããškangã§ããŸããã ãããã£ãŠãéåžžã®åäœæ¡ä»¶äžã§ã¯ããã®ãããªã»ããªãŒãã³ç¶æ
ã§é·æéãœã±ããã䜿çšããã·ã¹ãã ãèšèšãã䟡å€ã¯ãããŸããã
ãããã«
TCPã¯éåžžã2ã€ã®ã·ã¹ãã éã®æœè±¡åïŒãTCPæ¥ç¶ãïŒããµããŒããããããã³ã«ãšããŠæç€ºãããŸãã äžéšã®ãœãããŠã§ã¢ãŸãã¯ãããã¯ãŒã¯ã®åé¡ã«ãããæ¥ç¶ãåæãããããšãããã£ãŠããŸãã ,
, - . äŸïŒ
TCP. , TCP , . TCP, , . , , TCP- .
, , , ,
«TCP-, » â . - , , . , - ( keep-alive).
, «» TCP-. ( , ) , . , TCP- .
, :
- ( ) â , . . , â , .
- , TCP-. ,
read() , write() , . - , .
:
- ECONNRESET â ,
read() , write() . , RST. - ETIMEDOUT â ,
read() , write() . , , . , . , FIN KeepAlive.
, , - . , .