圌ãã¯ãã·ã¹ãã ã®èª€åäœãçè§£ãããŸã§ãã·ã¹ãã ãå®å
šã«çè§£ã§ããªããšèšããŸãã åŠçãšããŠãç§ã¯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.
, , - . , .