9.8. Ports#

ที่อยู่ IP บอกว่าแพ็กเก็ตส่งไปยัง โฮสต์ ใด โฮสต์สมัยใหม่รันโปรแกรมหลายรายการพร้อมกัน เช่น เว็บบราวเซอร์ แชทไคลเอนต์ วิดีโอคอล งาน backup -- และแต่ละรายการกำลังส่งและรับแพ็กเก็ตพร้อมกัน ชั้น IP ไม่มีวิธีแยกความแตกต่าง มันแค่ส่งทุกแพ็กเก็ตที่มาถึงให้ "โฮสต์" มีบางอย่างต้องตัดสินใจว่าแพ็กเก็ตไหนเป็นของโปรแกรมใด

หมายเลขพอร์ต คือคำตอบ แพ็กเก็ตทุกรายการที่ชั้น transport มีสองฟิลด์เพิ่มเติมนอกเหนือจาก IP header ได้แก่ source port และ destination port แต่ละรายการเป็นจำนวนเต็ม 16 บิต ดังนั้นมีหมายเลขพอร์ตได้ถึง 65535 รายการต่อโฮสต์ เมื่อรวมกับที่อยู่ IP พอร์ตระบุ endpoint เฉพาะหนึ่งรายการ ภายใน โฮสต์ -- การสนทนาเฉพาะของโปรแกรมเฉพาะหนึ่งรายการ

A single host box on the right with an IP address labelled at the top. Three programs inside the host are labelled "HTTP server", "video call", "chat client", each connected to a different port number labelled 80, 5004, and 4321 respectively. Three arrows arrive at the host from the network, each tagged with a destination port; each arrow lands on the matching program.

โปรแกรมหลายรายการแชร์ที่อยู่ IP เดียวกัน destination port นำแพ็กเก็ตที่มาถึงแต่ละรายการไปยังโปรแกรมที่ถูกต้อง#

9.8.1. Well-known ports#

หมายเลขพอร์ต 1024 รายการแรกสงวนไว้ตามข้อตกลงสำหรับบริการมาตรฐาน บางรายการที่ผู้อ่านจะพบ:

  • 22 -- SSH (โปรโตคอล Secure Shell ใช้สำหรับการ login ระยะไกลแบบเข้ารหัส)

  • 53 -- DNS, ระบบ Domain Name System (อธิบายไว้ใน ชื่อและ DNS)

  • 80 -- HTTP, โปรโตคอล Hypertext Transfer -- โปรโตคอลที่ไม่เข้ารหัสของเว็บ

  • 123 -- NTP, โปรโตคอล Network Time Protocol (วิธีที่อุปกรณ์ตั้งนาฬิกาจาก time server)

  • 443 -- HTTPS, HTTP ที่ส่งผ่าน TLS (Transport Layer Security, wrapper เข้ารหัสมาตรฐานสำหรับโปรโตคอลอินเทอร์เน็ต) -- โปรโตคอลที่อยู่เบื้องหลังหน้าเว็บทุกหน้าที่แสดงไอคอนล็อกในบราวเซอร์

ข้อตกลงนี้ทำให้บราวเซอร์สามารถเชื่อมต่อกับ http://example.com โดยไม่ต้องระบุพอร์ต -- มันถือว่าเป็น 80 เพราะนั่นคือ well-known port สำหรับ HTTP camera ที่เชื่อมต่อกับ web server ทำเช่นเดียวกัน

เหนือ 1024 หมายเลขพอร์ตไม่มีข้อจำกัดและโปรแกรมใดก็สามารถจองได้ Database servers (5432 สำหรับ PostgreSQL, 3306 สำหรับ MySQL), application servers และโปรโตคอลกำหนดเองล้วนอยู่ในช่วงที่สูงกว่า

9.8.2. Ephemeral ports#

เซิร์ฟเวอร์รับฟังบนพอร์ตที่รู้จัก ไคลเอนต์ใช้พอร์ต ต่างกัน ของตัวเอง โดยเลือกใหม่สำหรับแต่ละการเชื่อมต่อขาออก

เมื่อ camera เชื่อมต่อกับ web server บนพอร์ต 443 การสนทนาเกิดขึ้นระหว่าง

camera IP : <some-port>     <-->     server IP : 443

<some-port> คือ ephemeral port -- MicroPython เลือกหมายเลขที่ไม่ได้ใช้จากช่วงสูง ใช้ตลอดระยะเวลาของการเชื่อมต่อ และปล่อยทิ้งหลังจากนั้น สคริปต์ไม่ต้องสนใจว่าเลือกหมายเลขใด ชั้น socket จัดการให้

9.8.3. การฟังเทียบกับการสื่อสาร#

บทบาทของพอร์ตขึ้นอยู่กับฝั่งใดของการสนทนาที่พอร์ตนั้นอยู่ มีสองกรณีที่แตกต่างกัน:

  • listening port เป็นของโปรแกรมที่ต้องการ รับ การเชื่อมต่อที่ไม่ได้ขอ โปรแกรมบอก MicroPython ว่า "แพ็กเก็ตขาเข้าใดๆ ที่ส่งมาหาฉันที่พอร์ต 80 เป็นของฉัน" และรอ เซิร์ฟเวอร์ทำเช่นนี้

  • connected port เป็นของโปรแกรมที่ต้องการ เริ่ม การสนทนา โปรแกรมเลือก (หรือขอให้ MicroPython เลือก) ephemeral port ส่งแพ็กเก็ตพร้อม source port นั้นและ well-known port ของเซิร์ฟเวอร์เป็น destination และใช้คู่พอร์ตเดียวกันตลอดการสนทนาที่เหลือ

โปรแกรมเดียวสามารถทำทั้งสองอย่างพร้อมกัน โดยถือพอร์ตต่างกันสำหรับแต่ละบทบาท camera อาจรับฟังบนพอร์ต 8000 สำหรับการเชื่อมต่อ HTTP ขาเข้าจาก configuration user interface และ ถือการเชื่อมต่อ HTTPS ขาออกไปยัง remote server บนพอร์ต 443 สองบทบาทนี้ไม่ขัดกัน -- แต่ละการสนทนาถูกระบุด้วย quadruple (src IP, src port, dst IP, dst port) ที่สมบูรณ์ และไม่มีสองการสนทนาใดแชร์ quadruple เดียวกัน

9.8.4. สิ่งที่ ports ปลดล็อก#

เมื่อมี ports แล้ว ชั้น transport สามารถแก้ปัญหาการส่งข้อมูล จากโปรแกรมหนึ่งไปยังโปรแกรมอื่น ได้ในที่สุด แพ็กเก็ตตอนนี้มีข้อมูลเพียงพอที่จะ route ไปยังไม่เพียงแค่ โฮสต์ ที่ถูกต้อง (ที่อยู่ IP) แต่ยังไปยัง socket ที่ถูกต้องภายในโฮสต์นั้น (หมายเลขพอร์ต)

สองหน้าถัดไปครอบคลุมสองรสชาติที่ชั้น transport เสนอบนการกำหนดที่อยู่นั้น ได้แก่ UDP (User Datagram Protocol -- แต่ละแพ็กเก็ตเป็นอิสระ ไม่มีการรับประกัน) และ TCP (Transmission Control Protocol -- stream ที่เชื่อมต่อ เชื่อถือได้ และเรียงลำดับ)