เป็นไปได้หรือไม่ที่จะเชื่อมต่อกับพอร์ต TCP 0


59

การฟังพอร์ต TCP 0 จัดสรรหมายเลขพอร์ตฟรีให้ฉันบนระบบ

แต่จะเกิดอะไรขึ้นเมื่อฉันพยายามเชื่อมต่อกับพอร์ต TCP 0 คำตอบที่ชัดเจนคือ: "มันไม่ทำงาน":

$ nc localhost 0                 
nc: port number too small: 0

ระบบนี้จัดการกับที่ใดบ้าง? ในสแต็ก TCP ของเคอร์เนลระบบปฏิบัติการ มี Unixes ที่เชื่อมต่อกับพอร์ต TCP 0 จะทำงานได้อย่างไร


2
ในทางทฤษฎีคุณสามารถสร้างเอง TCP สแต็คที่ฟังหรือการเชื่อมต่อจากพอร์ต 0 งานซึ่งหมายความว่าสองการใช้งานดังกล่าวสามารถพูดคุยกับแต่ละอื่น ๆ ในพอร์ต 0.
โจชัว

คำตอบ:


60

เพียงเพื่อให้แน่ใจว่าเราอยู่ในหน้าเดียวกัน (คำถามของคุณคลุมเครือด้วยวิธีนี้) การขอผูก TCP บนพอร์ต 0 หมายถึงคำขอให้สร้างหมายเลขพอร์ตที่ไม่ได้ใช้แบบไดนามิก กล่าวอีกนัยหนึ่งหมายเลขพอร์ตที่คุณรับฟังหลังจากคำขอนั้นไม่เป็นศูนย์ มีความคิดเห็นเกี่ยวกับสิ่งนี้ใน[linux kernel source]/net/ipv4/inet_connection_sock.cเมื่อinet_csk_get_port():

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

ซึ่งเป็นแบบแผนยูนิกซ์มาตรฐาน อาจมีระบบที่จะอนุญาตให้ใช้พอร์ต 0 ได้จริง แต่ก็ถือว่าเป็นการปฏิบัติที่ไม่ดี อย่างไรก็ตามพฤติกรรมนี้ไม่ได้ระบุอย่างเป็นทางการโดย POSIX, IANA หรือโปรโตคอล TCP อย่างไรก็ตาม 1 คุณอาจพบที่น่าสนใจนี้

นั่นเป็นเหตุผลที่คุณไม่สามารถทำการเชื่อมต่อ TCP กับพอร์ตศูนย์ได้อย่างสมเหตุสมผล สันนิษฐานว่าncมีความตระหนักในเรื่องนี้และแจ้งให้คุณทราบว่าคุณกำลังทำสิ่งที่ไม่สมเหตุสมผล หากคุณลองใช้วิธีนี้ในเนทีฟ

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

คุณได้รับข้อผิดพลาดเดียวกันกับที่คุณพยายามเชื่อมต่อกับพอร์ตอื่นที่ไม่สามารถใช้งานได้: ECONNREFUSED"การเชื่อมต่อถูกปฏิเสธ" ดังนั้นในการตอบกลับ:

ระบบนี้จัดการกับที่ใดบ้าง? ในสแต็ก TCP ของเคอร์เนลระบบปฏิบัติการ

อาจจะไม่; ไม่ต้องการการจัดการเป็นพิเศษ นั่นคือถ้าคุณสามารถค้นหาระบบที่อนุญาตให้เชื่อมโยงและฟังพอร์ต 0 คุณอาจเชื่อมต่อกับมันได้


1 แต่ IANA ไม่เรียกมันว่า "ลิขสิทธิ์" ( ดูที่นี่ ) ความหมายพอร์ตนี้ไม่ควรใช้ออนไลน์ สิ่งนี้ทำให้ไม่เป็นไรเกี่ยวกับอนุสัญญาการมอบหมายแบบไดนามิก (เนื่องจากไม่ได้ใช้จริง) การกำหนดว่าโดยเฉพาะเพื่อจุดประสงค์นั้นอาจอยู่นอกเหนือขอบเขตของ IANA ในสาระสำคัญระบบปฏิบัติการมีอิสระที่จะทำสิ่งที่พวกเขาต้องการกับมันรวมถึงไม่มีอะไร


ดูเหมือนความคิดเดียวกับที่อยู่ 0.0.0.0 ใน ipv4 ค่าที่สงวนไว้และใช้โดยระบบปฏิบัติการและโปรแกรมเพื่อวัตถุประสงค์พิเศษ ในการเปรียบเทียบในวิทยุมีความถี่สงวนไว้ซึ่งไม่มีใครใช้สำหรับการส่งสัญญาณ แต่ถูกใช้ภายในอุปกรณ์
ctrl-alt-delor

1
@ Richard no, 0.0.0.0 มีความหมายที่แตกต่างกัน;) มันถูกใช้เพื่อกำหนดเป้าหมายที่ไม่ถูกต้องไม่ทราบหรือไม่สามารถใช้งานได้หรือเป็น "ออกอากาศ"
AndreaCi

2
@AndreaCi ไม่ได้ออกอากาศ 255.255.255.255?
วงล้อประหลาด

4
@ratchetfreak 255.255.255.255 กำลังออกอากาศ 0.0.0.0 มีสองความหมายขึ้นอยู่กับบริบท ในการเขียนโปรแกรมมันมีความหมายเหมือนกัน w / INADDR_ANYซึ่งเป็นสิ่งที่ริชาร์ดหมายถึง (ระบบจะแทนที่ด้วยค่าเริ่มต้น) แต่ที่จริงแล้วการใช้ที่อยู่บนเครือข่ายดูเหมือนว่าจะมีความหมายที่ Andrea กล่าวถึง (ยกเว้นไม่ชัดเจนว่านับเป็น "ออกอากาศ"): en.wikipedia.org/wiki/0.0.0.0
goldilocks


5

การใช้พอร์ต 0 จะทริกเกอร์ระบบปฏิบัติการเพื่อค้นหาและจัดสรรพอร์ตที่มีอยู่ถัดไป วิธีนี้ช่วยให้คุณไม่ต้องใช้รหัสยากในพอร์ตเฉพาะหรือต้องค้นหาพอร์ตที่มีอยู่ ระบบ Mint Linux ของฉันกลับมา

nc: port range not valid

ไปยัง

nc localhost 0 

2

nc -l 0จะขอให้ระบบปฏิบัติการเพื่อฟังบนพอร์ต 0 แต่เมื่อได้มีการตั้งข้อสังเกตข้างต้นระบบปฏิบัติการส่วนใหญ่จะเห็น 0 และเรียกศุลกากรเฉพาะของพวกเขาสำหรับการเลือกพอร์ตบวกเลขสำหรับการประยุกต์ใช้ของคุณเพื่อให้ncลมฟังพอร์ตบางอย่างเช่น 56514


ระบบปฏิบัติการส่วนใหญ่จะใช้ได้ใช่ไหม
barlop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.