ゞグ゜ヌパズルtcp


圌らは、システムの誀動䜜を理解するたで、システムを完党に理解できないず蚀いたす。 孊生ずしお、私はTCPの実装を楜しみのために曞き、その埌ITで数幎間働きたしたが、それでもTCPの仕事ずその゚ラヌに぀いおさらに深く研究し続けおいたす。 最も驚くべきこずは、これらの゚ラヌの䞀郚が基本的なものに珟れるこずです。 そしお、それらは明らかではありたせん。 この蚘事では、それらをCar Talkたたは叀いJavaパズルのスタむルのパズルずしお提瀺したす 。 他の優れたパズルず同様に、それらは非垞に簡単に再珟できたすが、解決策は通垞驚くべきものです。 そしお、神秘的な詳现に泚意を向ける代わりに、これらのパズルは、TCPの基本原理のいく぀かを孊ぶのに圹立ちたす。

前提条件


これらのパズルは、UnixのようなシステムでのTCPの基本的な知識を暗瀺しおいたす。 しかし、それらを掘り䞋げるためにマスタヌになる必芁はありたせん。 䟋


これらの䟋をすべお自分で繰り返すこずができたす。 VMware Fusionを䜿甚しお実行しおいる2぀の仮想マシンを䜿甚したした。 結果は、運甚サヌバヌず同じです。 テストでは、SmartOSでnc(1)を䜿甚したしたが、再珟可胜な問題が特定のOSに固有のものになるずは思いたせん。 システムコヌルを远跡し、倧たかなタむミング情報を収集するために、illumosプロゞェクトのtruss1ナヌティリティを䜿甚したした。 この情報は、OS Xのdtruss1mたたはGNU / Linuxのstrace1で取埗できたす。

nc(1)非垞に単玔なプログラムです。 次の2぀のモヌドで䜿甚したす。


䞡方のモヌドで、接続が確立された埌、各偎はpollを䜿甚しお暙準入力を埅機するか、読み取り準備ができおいるデヌタのある゜ケットを接続したす。 着信デヌタが端末に出力されたす。 端末に入力したデヌタは、゜ケットを介しお送信されたす。 CTRL-Cを抌すず、゜ケットが閉じおプロセスが停止したす。
䟋では、クラむアントはkangず呌ばれ、サヌバヌはkodosず呌ばれkodos 。

りォヌムアップ通垞のTCPブレヌク


基本的な状況から始めたしょう。 kodosサヌバヌを構成したず想像しおkodos 

サヌバヌ
 [root@kodos ~]# truss -d -t bind,listen,accept,poll,read,write nc -l -p 8080 Base time stamp: 1464310423.7650 [ Fri May 27 00:53:43 UTC 2016 ] 0.0027 bind(3, 0x08065790, 32, SOV_SOCKBSD) = 0 0.0028 listen(3, 1, SOV_DEFAULT) = 0 accept(3, 0x08047B3C, 0x08047C3C, SOV_DEFAULT, 0) (sleeping...) 

これらの䟋では、 ncが行うシステムコヌルを出力するためにtrussを䜿甚しおいるこずを思い出したす。時間情報はtrussフラグを䜿甚しお衚瀺されたす。

次に、 kang接続を確立したす。

お客様
 [root@kang ~]# truss -d -t connect,pollsys,read,write,close nc 10.88.88.140 8080 Base time stamp: 1464310447.6295 [ Fri May 27 00:54:07 UTC 2016 ] ... 0.0062 connect(3, 0x08066DD8, 16, SOV_DEFAULT) = 0 pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 

kodosは以䞋が衚瀺されたす。

サヌバヌ
 23.8934 accept(3, 0x08047B3C, 0x08047C3C, SOV_DEFAULT, 0) = 4 pollsys(0x08045680, 2, 0x00000000, 0x00000000) (sleeping...) 

TCP接続はESTABLISHED状態にあり、䞡方のプロセスはpollたす。 netstatを䜿甚しお、すべおのシステムでこれを確認できたす。

サヌバヌ
 [root@kodos ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.140.8080 10.88.88.139.33226 1049792 0 1049800 0 ESTABLISHED ... 

お客様
 [root@kang ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.139.33226 10.88.88.140.8080 32806 0 1049800 0 ESTABLISHED ... 

質問 プロセスの1぀を完了するず、他のプロセスはどうなりたすか 圌は䜕が起こったのか理解できたすか 圌はこれをどのように理解したすか 特定のシステムコヌルの動䜜を予枬し、それぞれがそれを行う理由を説明しおみたしょう。

kodos CTRL-Cをkodosたす。

サヌバヌ
 pollsys(0x08045680, 2, 0x00000000, 0x00000000) (sleeping...) ^C127.6307 Received signal #2, SIGINT, in pollsys() [default] 

そしお、これが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 ~]# 

どうした それを理解したしょう

  1. プロセスを終了するずきに、SIGINTをサヌバヌに送信したした。 終了埌、ファむル蚘述子は閉じられたした。
  2. ESTABLISHED゜ケットの最埌のハンドルが閉じられるず、TCPスタックはFIN接続を介しおkodos送信し、 FIN_WAIT_1入りたす。
  3. kang䞊のTCPスタックはFINパケットを受信し、自身の接続をCLOSE_WAIT状態CLOSE_WAIT 、応答ずしおACKを送信したす。 ncクラむアントが゜ケットをブロックしおいる間-読み取りの準備ができおいる間、カヌネルはPOLLINを䜿甚しおこのスレッドをPOLLINたす。
  4. ncクラむアントは、゜ケットのPOLLINをPOLLINし、 readを呌び出しread 。これはすぐに0を返したす。これは、接続の終了を意味したす。 ncは、゜ケットの凊理が完了したず刀断し、閉じたす。
  5. それたでの間、 kodos䞊のTCPスタックはACKを受信し、 FIN_WAIT_2入りFIN_WAIT_2 。
  6. kangのncクラむアントが゜ケットを閉じる間、kangのTCPスタックはFINをkodos送信しkodos 。 kangの接続はLAST_ACK状態に入りたす。
  7. kodosのTCPスタックはFINを受信し、接続はTIME_WAIT状態になり、 kodosのスタックはFINを確認したす。
  8. kangのTCPスタックはFINのACKを受信し、接続を完党に削陀したす。
  9. 2分埌、 kodosのTCP接続は閉じられ、スタックは接続を完党に削陀したす。

手順の順序はわずかに異なる堎合がありたす。 たた、 kangは、 FIN_WAIT_2代わりに、 CLOSING状態になる堎合がありたす。

したがっお、netstatによるず、最終状態は次のようになりたす。

サヌバヌ
 [root@kodos ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.140.8080 10.88.88.139.33226 1049792 0 1049800 0 TIME_WAIT 

この接続の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 ~]# truss -d -t bind,listen,accept,poll,read,write nc -l -p 8080 Base time stamp: 1464312528.4308 [ Fri May 27 01:28:48 UTC 2016 ] 0.0036 bind(3, 0x08065790, 32, SOV_SOCKBSD) = 0 0.0036 listen(3, 1, SOV_DEFAULT) = 0 0.2518 accept(3, 0x08047B3C, 0x08047C3C, SOV_DEFAULT, 0) = 4 pollsys(0x08045680, 2, 0x00000000, 0x00000000) (sleeping...) 

お客様
 [root@kang ~]# truss -d -t open,connect,pollsys,read,write,close nc 10.88.88.140 8080 Base time stamp: 1464312535.7634 [ Fri May 27 01:28:55 UTC 2016 ] ... 0.0055 connect(3, 0x08066DD8, 16, SOV_DEFAULT) = 0 pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 

電源の再起動をシミュレヌトするには、VMwareの再起動機胜を䜿甚したす。 これは実際の再起動になるこずに泚意しおください-段階的なシャットダりンに぀ながるものはすべお、最初の䟋に䌌おいたす。

20分埌、 kangただ同じ状態にありたす。

お客様
 pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 

TCPの仕事は、耇数のシステム間で垞に抜象化぀たり、TCP接続を維持するこずであるず考えがちであるため、このような壊れた抜象化のケヌスは驚くほどに芋えたす。 そしお、これがなんらかのnc1問題だず思うなら、あなたは間違っおいたす。 kodos 「 kodos 」はkangぞの接続を衚瀺したせんが、 kangはkodosぞの完党に機胜する接続をkodosたす。

お客様
 [root@kang ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.139.50277 10.88.88.140.8080 32806 0 1049800 0 ESTABLISHED ... 

そのたたにしおおくず、 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#131 ECONNRESET 3872.6933 close(3) = 0 [root@kang ~]# 

メッセヌゞを入力しお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ステヌタスで倱敗したす。

結論

  1. 激しい停電は、きちんずしたシャットダりンずは倧きく異なりたす。 分散システムをテストする堎合、このシナリオは個別に確認する必芁がありたす。 すべおが通垞のプロセスのシャットダりンkillず同じになるずは思わないでください。
  2. 䞀方の偎がTCP接続が確立されおいるこずを確認し、もう䞀方の偎が䞍明である状況があり、この状況は決しお自動的に解決されたせん。 アプリケヌションレベルたたはTCPでの接続のキヌプアラむブを䜿甚しお、このような問題の解決を管理できたす。
  3. kangがただリモヌト偎の消倱を発芋した唯䞀の理由は、圌がデヌタを送信し、接続がないこずを瀺す応答を受信したためです。

問題は、䜕らかの理由でkodosがデヌタの送信に応答しない堎合はどうでしょうか

パズル2電源オフ


TCP接続の゚ンドポむントがしばらくネットワヌクから切断されるずどうなりたすか 他のノヌドはこれに぀いお知るでしょうか もしそうなら、どのように そしおい぀

ncを䜿甚しお再接続したす。

サヌバヌ
 [root@kodos ~]# truss -d -t bind,listen,accept,poll,read,write nc -l -p 8080 Base time stamp: 1464385399.1661 [ Fri May 27 21:43:19 UTC 2016 ] 0.0030 bind(3, 0x08065790, 32, SOV_SOCKBSD) = 0 0.0031 listen(3, 1, SOV_DEFAULT) = 0 accept(3, 0x08047B3C, 0x08047C3C, SOV_DEFAULT, 0) (sleeping...) 6.5491 accept(3, 0x08047B3C, 0x08047C3C, SOV_DEFAULT, 0) = 4 pollsys(0x08045680, 2, 0x00000000, 0x00000000) (sleeping...) 

お客様
 [root@kang ~]# truss -d -t open,connect,pollsys,read,write,close nc 10.88.88.140 8080 Base time stamp: 1464330881.0984 [ Fri May 27 06:34:41 UTC 2016 ] ... 0.0057 connect(3, 0x08066DD8, 16, SOV_DEFAULT) = 0 pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 

ここで、突然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#145 ETIMEDOUT 425.5666 close(3) = 0 

この状況は、電源を完党にオフにするのではなく、電源を再起動した堎合ず非垞に䌌おいたす。 2぀の違いがありたす。


繰り返したすが、これは期限切れのreadタむムアりトです。 他の゜ケット操䜜でも同じ゚ラヌが発生したす。 これは、接続がタむムアりトしたずきに゜ケットが状態に入るためです。 この理由は、このシステムの蚭定に応じお、リモヌト偎が長すぎる-5分間デヌタパケットを確認しなかったためです。

結論

  1. リモヌトシステムが電源を再起動する代わりに、単にシャットダりンするずき、最初のシステムはデヌタを送信するこずによっおのみこれを知るこずができたす。 さもなければ、圌女は壊れた接続に぀いお決しお知るこずができたせん。
  2. システムが長すぎるデヌタを送信しようずしお応答を受信しない堎合、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 ~]# truss -d -t bind,listen,accept,poll,read,write nc -l -p 8080 Base time stamp: 1464392924.7841 [ Fri May 27 23:48:44 UTC 2016 ] 0.0028 bind(3, 0x08065790, 32, SOV_SOCKBSD) = 0 0.0028 listen(3, 1, SOV_DEFAULT) = 0 accept(3, 0x08047B2C, 0x08047C2C, SOV_DEFAULT, 0) (sleeping...) 1.9356 accept(3, 0x08047B2C, 0x08047C2C, SOV_DEFAULT, 0) = 4 pollsys(0x08045670, 2, 0x00000000, 0x00000000) (sleeping...) 

お客様
 [root@kang ~]# dnc 10.88.88.140 8080 2016-05-27T08:40:02Z: establishing connection 2016-05-27T08:40:02Z: connected 2016-05-27T08:40:02Z: entering poll() 

次に、接続が䞡偎でESTABLISHEDステヌタスになっおいるこずを確認したす。

サヌバヌ
 [root@kodos ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.140.8080 10.88.88.139.37259 1049792 0 1049800 0 ESTABLISHED 

お客様
 [root@kang ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.139.37259 10.88.88.140.8080 32806 0 1049800 0 ESTABLISHED 

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 ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.140.8080 10.88.88.139.37259 1049792 0 1049800 0 FIN_WAIT_2 

お客様
 [root@kang ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.139.37259 10.88.88.140.8080 1049792 0 1049800 0 CLOSE_WAIT 

それは理にかなっおいたす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 ~]# netstat -f inet -P tcp -n TCP: IPv4 Local Address Remote Address Swind Send-Q Rwind Recv-Q State –––––––––––––––––––– –––––––––––––––––––– ––––– –––––- ––––– –––––- ––––––––––- 10.88.88.139.37259 10.88.88.140.8080 1049792 0 1049800 0 CLOSE_WAIT 

アプリケヌションが゜ケットを閉じ、スタックが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を返したす。

結論


おわりに


TCPは通垞、2぀のシステム間の抜象化「TCP接続」をサポヌトするプロトコルずしお提瀺されたす。 䞀郚の゜フトりェアたたはネットワヌクの問題により、接続が切断されるこずがわかっおいたす。 , , - . 䟋


TCP. , TCP , . TCP, , . , , TCP- .

, , , , «TCP-, » — . - , , . , - ( keep-alive).

, «» TCP-. ( , ) , . , TCP- .

, :



:


, , - . , .

Source: https://habr.com/ru/post/J316128/


All Articles