สถานะพอร์ต“ LISTENING”,“ TIME_WAIT”,“ CLOSE_WAIT” และ“ ESTABLISHED” แตกต่างกันอย่างไร


45

ฉันใช้netstatเพื่อตรวจสอบสถานะพอร์ตของฉัน

ผมสงสัยว่าสิ่งที่แตกต่างระหว่างสถานะพอร์ตLISTENING, TIME_WAIT, CLOSE_WAIT, FIN_WAIT1และESTABLISHED?



@muru คำศัพท์เดียวกันอาจไม่ได้หมายถึงสิ่งเดียวกันใน Windows และบน Ubuntu
Pacerier

คำตอบ:


58

manpageของnetstatมีคำอธิบายสั้น ๆ ของแต่ละรัฐ:

   ESTABLISHED
          The socket has an established connection.
   SYN_SENT
          The socket is actively attempting to establish a connection.
   SYN_RECV
          A connection request has been received from the network.
   FIN_WAIT1
          The socket is closed, and the connection is shutting down.
   FIN_WAIT2
          Connection is closed, and the socket is waiting for  a  shutdown
          from the remote end.
   TIME_WAIT
          The socket is waiting after close to handle packets still in the
          network.
   CLOSE  The socket is not being used.
   CLOSE_WAIT
          The remote end has shut down, waiting for the socket to close.
   LAST_ACK
          The remote end has shut down, and the socket is closed.  Waiting
          for acknowledgement.
   LISTEN The  socket is listening for incoming connections.  Such sockets
          are  not  included  in  the  output  unless  you   specify   the
          --listening (-l) or --all (-a) option.
   CLOSING
          Both  sockets are shut down but we still don't have all our data
          sent.
   UNKNOWN
          The state of the socket is unknown.

คุณสามารถใช้แผนภาพการเปลี่ยนแปลงรัฐ (ตัวอย่างที่นี่ , ที่นี่และที่นี่ ) เพื่อให้ความรู้สึกที่ดีขึ้นของสหรัฐฯ


พิจารณาสองโปรแกรมที่พยายามเชื่อมต่อซ็อกเก็ต (เรียกใช้aและb) ทั้งตั้งค่าซ็อกเก็ตและเปลี่ยนเป็นLISTENสถานะ จากนั้นหนึ่งโปรแกรม (พูดa) พยายามเชื่อมต่อกับอีกโปรแกรมหนึ่ง( b) aส่งคำขอและเข้าสู่SYN_SENTรัฐและbได้รับคำขอและเข้าสู่SYN_RECVรัฐ เมื่อbรับทราบคำขอพวกเขาจะเข้าสู่ESTABLISHEDรัฐและทำธุรกิจของพวกเขา ตอนนี้มีสองสิ่งที่สามารถเกิดขึ้นได้:

  1. aFIN_WAIT1มีความประสงค์ที่จะปิดการเชื่อมต่อและเข้าสู่ bได้รับFINการร้องขอส่งACK(แล้วaเข้าFIN_WAIT2) เข้ามาCLOSE_WAITบอกว่ามันกำลังจะปิดลงและเข้าสู่a LAST_ACKเมื่อaยอมรับนี้ (และเข้าTIME_WAIT) เข้าสู่b รอนิดเพื่อดูว่า anythings ที่เหลือจากนั้นจะเข้าสู่CLOSEaCLOSE
  2. aและbเสร็จสิ้นธุรกิจและตัดสินใจที่จะปิดการเชื่อมต่อ (ปิดพร้อมกัน) เมื่อaอยู่ในFIN_WAITและแทนที่จะได้รับACKจากbมันได้รับFIN(ตามbความปรารถนาที่จะปิดมันเช่นกัน) เข้าสู่a CLOSINGแต่ยังมีข้อความที่จะส่ง ( ACKที่aควรจะได้รับสำหรับต้นฉบับFIN) และเมื่อสิ่งนี้ACKมาถึงaเข้าสู่TIME_WAITตามปกติ

ข้อมูลเพิ่มเติมเพื่อคำตอบของ muru แผนภาพสถานะไปยัง netstat (อ้างจาก: http://www4.cs.fau.de/Projects/JX/Projects/TCP/tcpstate.html )! ป้อนคำอธิบายภาพที่นี่
charkh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.