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 ที่เชื่อมต่อ เชื่อถือได้ และเรียงลำดับ)