แอพพลิเคชั่นสองตัวสามารถฟังพอร์ตเดียวกันได้หรือไม่?


283

แอปพลิเคชั่นสองตัวในเครื่องเดียวกันเชื่อมกับพอร์ตและที่อยู่ IP เดียวกันได้หรือไม่ เมื่อก้าวไปอีกขั้นหนึ่งแอปหนึ่งสามารถรับฟังคำขอที่มาจาก IP ที่แน่นอนและอีกอันไปยัง IP ระยะไกลอื่นได้หรือไม่ ฉันรู้ว่าฉันสามารถมีแอปพลิเคชั่นเดียวที่เริ่มต้นสองเธรด (หรือส้อม) เพื่อให้มีพฤติกรรมที่คล้ายกัน แต่แอปพลิเคชันสองรายการที่ไม่มีสิ่งใดเหมือนกันสามารถทำได้เหมือนกันหรือไม่


2
สำหรับคำตอบโดยละเอียดเกี่ยวกับการใช้ที่อยู่ / พอร์ตซ้ำด้วยซ็อกเก็ตหลายตัว: stackoverflow.com/questions/14388706/ …
Bjarke Freund-Hansen

คำตอบ:


248

คำตอบนั้นแตกต่างกันไปตามระบบปฏิบัติการที่กำลังพิจารณา โดยทั่วไปแล้ว:

สำหรับ TCP ไม่มี คุณสามารถรับฟังแอปพลิเคชั่นได้เพียงพอร์ตเดียวในครั้งเดียว ตอนนี้ถ้าคุณมีการ์ดเครือข่าย 2 ใบคุณสามารถให้แอปพลิเคชั่นหนึ่งฟังบน IP แรกและอีกอันหนึ่งบน IP ที่สองโดยใช้หมายเลขพอร์ตเดียวกัน

สำหรับ UDP (Multicasts) แอปพลิเคชั่นหลายตัวสามารถสมัครรับพอร์ตเดียวกันได้

แก้ไข: เนื่องจาก Linux Kernel 3.9 และใหม่กว่ารองรับหลายแอพพลิเคชั่นที่รับฟังพอร์ตเดียวกันโดยใช้SO_REUSEPORTตัวเลือก ข้อมูลเพิ่มเติมสามารถดูได้ที่บทความ lwn.net นี้


22
"แอปพลิเคชั่นหนึ่งฟังบนพอร์ตเดียว" นั่นเป็นสาเหตุที่ทำให้พอร์ตต่าง ๆ อยู่ - เพื่ออนุญาตให้แอปพลิเคชั่นหลายตัวใช้เครือข่ายร่วมกันโดยไม่มีข้อขัดแย้ง
S.Lott

46
หนึ่งฟังต่อพอร์ตต่อที่อยู่ IP การเพิ่มอินเทอร์เฟซเครือข่ายอื่นเป็นวิธีการรับที่อยู่ IP ที่สอง แพลตฟอร์มของคุณอาจรองรับอินเทอร์เฟซเสมือนซึ่งเป็นอีกวิธีหนึ่งในการรับที่อยู่ IP สองแห่งด้วยการ์ดเครือข่ายจริง
John M

7
แม้ว่าฉันจะมีความคิดเห็นแบบเดียวกันจนถึงตอนนี้ แต่กลับกลายเป็นว่าฉันสามารถผูกสองกระบวนการที่แตกต่างกับ ip และ TCP พอร์ตเดียวกันได้! สิ่งนี้เป็นไปได้ถ้าคุณตั้ง ServerSocket.setReuseAddress (จริง) ใน Java ก่อนที่จะผูกพัน พฤติกรรมที่ไม่คาดคิดจริงๆ
Eugen

7
(1) ความหมายที่แท้จริงของคำตอบของคุณคือ 'สำหรับ TCP, ใช่,จัดให้ ... ' (2) Multicast ไม่ใช่เงื่อนไขสำหรับการแชร์พอร์ต UDP แต่ SO_REUSEADDR คือ
มาร์ควิสแห่ง Lorne

12
สำหรับ UDP (Multicasts) แอปพลิเคชั่นหลายตัวสามารถสมัครรับพอร์ตเดียวกันได้ หากแพ็กเก็ตหนึ่งกล่องมาจากลูกค้าแอปพลิเคชันใดที่ได้รับ
ยาง Juven

123

ใช่ (สำหรับ TCP) คุณสามารถรับฟังได้สองโปรแกรมในซ็อกเก็ตเดียวกันหากโปรแกรมได้รับการออกแบบมาให้ทำเช่นนั้น เมื่อซ็อกเก็ตถูกสร้างขึ้นโดยโปรแกรมแรกให้แน่ใจว่าตัวเลือกที่ตั้งอยู่บนซ็อกเก็ตก่อนที่คุณจะSO_REUSEADDR bind()อย่างไรก็ตามนี่อาจไม่ใช่สิ่งที่คุณต้องการ สิ่งนี้คือการเชื่อมต่อ TCP ขาเข้าจะถูกนำไปยังหนึ่งในโปรแกรมไม่ใช่ทั้งสองอย่างดังนั้นจึงไม่ได้ทำการเชื่อมต่อที่ซ้ำกันมันเพียงแค่อนุญาตให้สองโปรแกรมให้บริการคำขอที่เข้ามา ตัวอย่างเช่นเว็บเซิร์ฟเวอร์จะมีหลายกระบวนการที่ฟังบนพอร์ต 80 และ O / S ส่งการเชื่อมต่อใหม่ไปยังกระบวนการที่พร้อมที่จะยอมรับการเชื่อมต่อใหม่

SO_REUSEADDR

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


1
TCP + UDP ใช้งานได้แล้ว (ให้เคอร์เนลใหม่เพียงพอ) ดูลิงค์ที่ฉันเพิ่มไปยังคำตอบ
dpb

3
คำตอบนี้ไม่ถูกต้องเว้นแต่ซ็อกเก็ตทั้งหมดจะถูกผูกไว้กับที่อยู่ IP ที่แตกต่างกันซึ่งไม่มีใน INADDR_ANY หรือเว้นแต่ว่าคุณใช้ Windows ซึ่งผลลัพธ์นั้นไม่ได้กำหนดไว้
มาร์ควิสแห่ง Lorne

1
คุณสามารถขยายวิธีการที่ข้อมูลไปยังแอพเฉพาะบนพอร์ตเดียวกันได้หรือไม่? มีข้อกังวลด้านความปลอดภัยใด ๆ ที่ควรคำนึงเมื่อแอพใช้ SO_REUSEADDR หรือ SO_REUSEPORT
trusktr

@EJP คุณยังสามารถที่จะดูที่ความคิดเห็นก่อนหน้าของฉันได้อย่างไร
trusktr

3
SO_REUSEADDRแน่นอนไม่ให้คุณมีสองซ็อกเก็ต TCP ในสถานะการฟังในเวลาเดียวกันอย่างน้อยใน Unix มันหมายถึงการรับรอบTIME_WAIT state: unixguide.net/network/socketfaq/4.5.shtml อาจใช้งานได้บน Windows แต่คุณไม่รับประกันว่าคำขอนั้นจะไปถึงเซิร์ฟเวอร์ที่ถูกต้อง)
Bruno

48

ใช่.

  1. ซ็อกเก็ต TCP ที่รับฟังได้หลายตัวถูกผูกไว้กับพอร์ตเดียวกันสามารถอยู่ร่วมกันได้หากพวกเขาถูกผูกไว้กับที่อยู่ IP ท้องถิ่นที่แตกต่างกัน ลูกค้าสามารถเชื่อมต่อกับสิ่งที่พวกเขาต้องการ สิ่งนี้ไม่รวม0.0.0.0( INADDR_ANY)

  2. หลายได้รับการยอมรับซ็อกเก็ตสามารถอยู่ร่วมทั้งหมดได้รับการยอมรับจากซ็อกเก็ตฟังเดียวกันทั้งหมดแสดงหมายเลขพอร์ตท้องถิ่นเช่นเดียวกับซ็อกเก็ตฟัง

  3. ซ็อกเก็ต UDP หลายอันที่ถูกผูกไว้กับพอร์ตเดียวกันสามารถอยู่ร่วมกันได้โดยมีเงื่อนไขเดียวกับที่ (1) หรือมีการSO_REUSEADDRตั้งค่าตัวเลือกทั้งหมดก่อนที่จะรวม

  4. พอร์ต TCP และ UDP พอร์ตครอบครอง namespaces แตกต่างกันดังนั้นการใช้งานของพอร์ตสำหรับ TCP ไม่ได้ดักคอการใช้งานสำหรับ UDP และในทางกลับกัน

การอ้างอิง: Stevens & Wright, TCP / IP Illustrated, Volume II


คุณมีลิงค์ในมือหรือไม่? โอกาสของ TCP-UDP การอยู่ร่วมกันเป็นคำถามของฉันมาก ขอบคุณล่วงหน้า :)
Wolf

1
@Wolf เพียงแค่ลอง นั่นคือหลักฐานทั้งหมดที่คุณต้องการจริงๆ การอ้างอิงของฉันคือสตีเวนส์และไรท์: คุณไม่สามารถได้รับมากดีกว่าว่า
มาร์ควิสแห่ง Lorne

1
ขอบคุณสำหรับคำตอบฉันต้องอ่านอย่างเอาใจใส่มากขึ้น แล้วคุณเขียนว่า UDP และ TCP สามารถอยู่ร่วมกัน
Wolf

47

ตามหลักการแล้ว

มันไม่ได้เขียนไว้ในหิน แต่มันเป็นวิธีการเขียน API ทั้งหมด: แอปเปิดพอร์ตรับการจัดการและระบบปฏิบัติการแจ้งเตือน (ผ่านทางหมายเลขอ้างอิงนั้น) เมื่อการเชื่อมต่อไคลเอนต์ (หรือแพ็กเก็ตในกรณี UDP) มาถึง

หากระบบปฏิบัติการอนุญาตให้สองแอปเปิดพอร์ตเดียวกันมันจะรู้ได้อย่างไรว่าจะต้องแจ้งให้ทราบ

แต่ ... มีวิธีการอยู่รอบ ๆ :

  1. ในฐานะที่เป็นเจดตั้งข้อสังเกตคุณสามารถเขียน 'ต้นแบบ' กระบวนการซึ่งจะเป็นเพียงคนเดียวที่จริงๆฟังบนพอร์ตและแจ้งให้ผู้อื่นใช้ตรรกะมันต้องการที่จะร้องขอของลูกค้าแยกต่างหากใด ๆ
    • บน Linux และ BSD (อย่างน้อย) คุณสามารถตั้งค่ากฎ 'remapping' ที่เปลี่ยนเส้นทางแพ็คเก็ตจากพอร์ต 'มองเห็น' ไปยังต่าง ๆ (ที่แอปกำลังฟัง) ตามเกณฑ์ของเครือข่ายที่เกี่ยวข้อง (อาจเป็นเครือข่ายต้นทางหรือบางเครือข่าย รูปแบบง่าย ๆ ของการทำโหลดบาลานซ์)

37
iptables -m statistic --mode random --probability 0.5คือความสนุก
Jed Smith

1
มีความหมายว่าอะไร "เปิดพอร์ต" ผมเข้าใจประโยค แต่คุณรู้ว่าสิ่งที่ระบบไม่เมื่อมันเปิดพอร์ตและจัดการกับมันได้หรือไม่ ฉันรู้ว่าเมื่อคุณต้องการเปิดพอร์ตด้วย TCP คุณจะได้รับสตรีมและสตรีมนั้นคือการเชื่อมต่อของคุณกับรีโมต แต่ฉันค้นหาบนเว็บและไม่พบคำอธิบายที่ดีมาก
ซามูเอล

4
@Samuel: เปิดพอร์ต (ในโหมดเซิร์ฟเวอร์) หมายถึงการอธิบายไฟล์และเมื่อระบบได้รับแพ็คเก็ต SYN ไปยังหมายเลขพอร์ตที่ตอบสนองกับ SYN + ACK และสร้างเหตุการณ์บนอธิบายไฟล์ที่เกี่ยวข้อง แอปพลิเคชันตอบสนองต่อเหตุการณ์นั้นด้วยการเรียก accept () ซึ่งสร้างตัวอธิบายไฟล์ใหม่ที่เกี่ยวข้องกับสตรีมเฉพาะปล่อยให้ตัวบอกเซิร์ฟเวอร์ดั้งเดิมให้อิสระในการรับการเชื่อมต่อใหม่จากไคลเอนต์
Javier

7
คำตอบนี้ไม่สามารถพิจารณาที่ถูกต้อง มันสามารถมองเห็นการมีอยู่ของทั้ง SO_REUSEADDR และ SO_REUSEPORT
มาร์ควิสแห่ง Lorne

@Javier ไม่มีก็ไม่ได้ การเปิดพอร์ตจากมุมมองของแอปพลิเคชันเซิร์ฟเวอร์เกิดขึ้นเมื่อคุณเชื่อมซ็อกเก็ตฟังหรือเชื่อมโยงซ็อกเก็ตที่คุณกำลังจะlisten()เปิด คำถามน่าจะเกี่ยวกับการเปิดในไฟร์วอลล์ ห่างไกลข้อผิดพลาดมากเกินไปที่นี่และทุกคนไม่ได้แก้ไขในปีที่ 7 คำตอบยังละเว้นกรณีที่มีผลผูกพันไปยังที่อยู่ในท้องถิ่นที่แตกต่างกับหมายเลขพอร์ตเดียวกัน ในความเป็นจริงมันไม่ถูกต้องทั้งหมด
มาร์ควิสแห่ง Lorne

27

ใช่แน่นอน เท่าที่ผมจำได้จากเคอร์เนลเวอร์ชั่น 3.9 (ไม่แน่ใจในเวอร์ชั่น) เป็นต้นไปรองรับการใช้งานที่SO_REUSEPORTถูกแนะนำ SO_RESUEPORTอนุญาตให้รวมกับพอร์ตและที่อยู่เดียวกันที่แน่นอนตราบใดที่เซิร์ฟเวอร์ชุดแรกตั้งค่าตัวเลือกนี้ก่อนผูกซ็อกเก็ต

มันทำงานได้สำหรับทั้งTCPและUDP อ้างถึงลิงก์สำหรับรายละเอียดเพิ่มเติม: SO_REUSEPORT

หมายเหตุ : คำตอบที่ยอมรับแล้วไม่ถือเป็นจริงตามความคิดเห็นของฉัน


2
จริงทั้งหมด ถ้ามันไม่เป็นความจริง Wireshark จะทำงานได้อย่างไร?
Staszek

5
@Staszek Wireshark ไม่ฟังพอร์ต มันทำงานที่ระดับแพ็คเก็ต
มาร์ควิสแห่ง Lorne

โอ้ที่จะทำให้ความรู้สึก อย่างไรก็ตามการฟังสองพอร์ตโดย 2 แอพนั้นเป็นไปได้อย่างแน่นอน
Staszek

18

ไม่ได้แอปพลิเคชันเดียวเท่านั้นที่สามารถผูกเข้ากับพอร์ตในแต่ละครั้งและลักษณะการทำงานหากการผูกถูกบังคับไม่ได้กำหนด

ด้วยซ็อกเก็ตมัลติคาสต์ - ซึ่งไม่มีเสียงใกล้เคียงกับสิ่งที่คุณต้องการ - แอปพลิเคชันมากกว่าหนึ่งรายการสามารถผูกเข้ากับพอร์ตได้ตราบใดที่ SO_REUSEADDR ตั้งค่าไว้ในตัวเลือกของซ็อกเก็ตแต่ละตัว

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

นอกเหนือจากนี้เราได้รับเฉพาะ - คุณติดแท็กทั้ง TCP และ UDP มันคืออะไร? นอกจากนี้แพลตฟอร์มอะไร


ทั้งสองเป็นที่สนใจของฉัน แพลตฟอร์มเป็นหน้าต่าง แต่ถ้าคำตอบคือแตกต่างกันสำหรับลินุกซ์ก็จะรู้ดี
nadiv

8
ไม่มีสิ่งเช่นซ็อกเก็ตมัลติคาสเป็น มีซ็อกเก็ต UDP มัลติคาสต์ไม่ใช่เงื่อนไขเบื้องต้นสำหรับ SO_REUSEADDR
มาร์ควิสแห่ง Lorne

3

คุณสามารถรับฟังแอปพลิเคชั่นได้หนึ่งพอร์ตในพอร์ตเดียว ดังนั้นคุณสามารถมี:

  1. httpd ฟังบนอินเทอร์เฟซที่เข้าถึงได้จากระยะไกลเช่น 192.168.1.1:80
  2. อีก daemon กำลังฟัง 127.0.0.1:80

ตัวอย่างกรณีการใช้งานอาจใช้httpdเป็นโหลดบาลานเซอร์หรือพร็อกซี


3

อีกวิธีหนึ่งคือใช้โปรแกรมฟังในพอร์ตหนึ่งที่วิเคราะห์การรับส่งข้อมูล (ssh, https และอื่น ๆ ) ซึ่งจะเปลี่ยนเส้นทางภายในไปยังพอร์ตอื่นที่บริการ "ของจริง" กำลังฟังอยู่

ตัวอย่างเช่นสำหรับ Linux, sslh: https://github.com/yrutschle/sslh


มีโปรแกรมดังกล่าวใน windows หรือไม่? ฉันต้องมีทั้งเซิร์ฟเวอร์ IIS ในตัวเครื่องและโบรกเกอร์ ActiveMQ ที่พอร์ต 443
Harvey Lin

3

เมื่อคุณสร้างการเชื่อมต่อ TCP คุณจะต้องเชื่อมต่อกับที่อยู่ TCP เฉพาะซึ่งเป็นการรวมกันของที่อยู่ IP (v4 หรือ v6 ขึ้นอยู่กับโปรโตคอลที่คุณใช้) และพอร์ต

เมื่อเซิร์ฟเวอร์รับฟังการเชื่อมต่อเซิร์ฟเวอร์สามารถแจ้งเคอร์เนลว่าต้องการรับฟังที่อยู่ IP และพอร์ตเฉพาะเช่นที่อยู่ TCP เดียวหรือบนพอร์ตเดียวกันบนที่อยู่ IP ของโฮสต์แต่ละเครื่อง (โดยปกติจะระบุด้วยที่อยู่ IP 0.0.0.0) ซึ่งมีประสิทธิภาพในการฟังจำนวนมากที่แตกต่างกัน "ที่อยู่ TCP" (เช่น192.168.1.10:8000, 127.0.0.1:8000ฯลฯ )

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

อย่างไรก็ตามคุณในระบบปฏิบัติการส่วนใหญ่คุณสามารถตั้งค่าที่อยู่ IP หลายแห่งในอินเทอร์เฟซเดียว (เช่นหากคุณมี192.168.1.10อินเทอร์เฟซคุณสามารถตั้งค่าได้192.168.1.11หากไม่มีใครในเครือข่ายใช้อยู่) และในกรณีเหล่านั้นคุณ อาจมีแอปพลิเคชันแยกต่างหากที่รับฟังพอร์ต8000ในแต่ละที่อยู่ IP เหล่านั้น


2

หากอย่างน้อยหนึ่งใน IP ระยะไกลเป็นที่รู้จักแล้วคงที่และทุ่มเทเพื่อพูดคุยกับหนึ่งในแอพของคุณเท่านั้นคุณอาจใช้กฎ iptables (nat table, chain prerouting) เพื่อเปลี่ยนเส้นทางการรับส่งข้อมูลจากที่อยู่นี้ไปยังพอร์ตท้องถิ่น พอร์ตอื่นใดที่แอปพลิเคชันที่เหมาะสมฟังจริง


1

ใช่และไม่. แอปพลิเคชั่นเดียวเท่านั้นที่สามารถรับฟังพอร์ตได้ แต่แอปพลิเคชันนั้นสามารถยกระดับการเชื่อมต่อกับกระบวนการอื่นได้ ดังนั้นคุณสามารถมีหลายกระบวนการทำงานในพอร์ตเดียวกัน


@trusktr ฉันคิดว่าเขาหมายถึงสิ่งนี้
warvariuc

1

ใช่.

จากบทความนี้:
https://lwn.net/Articles/542629/

ตัวเลือกซ็อกเก็ตใหม่อนุญาตให้มีหลายซ็อกเก็ตบนโฮสต์เดียวกันเชื่อมโยงกับพอร์ตเดียวกัน


1
ลิงก์ดี แต่อย่าเขียนบรรทัดนี้ - ตัวเลือก SO_REUSEPORT นั้นไม่ได้มาตรฐาน
Sahil Singh

0

หากโดยแอปพลิเคชันคุณหมายถึงกระบวนการหลายรายการใช่แล้ว แต่โดยทั่วไปไม่ใช่ ตัวอย่างเช่นเซิร์ฟเวอร์ Apache ทำงานหลายกระบวนการในพอร์ตเดียวกัน (โดยทั่วไป 80) มันทำโดยการกำหนดหนึ่งในกระบวนการจริงผูกกับพอร์ตและจากนั้นใช้กระบวนการที่จะส่งมอบกระบวนการต่างๆที่ยอมรับการเชื่อมต่อ


0

คุณสามารถทำให้สองแอปพลิเคชั่นฟังพอร์ตเดียวกันบนอินเทอร์เฟซเครือข่ายเดียวกัน

สามารถมีซ็อกเก็ตการรับฟังได้หนึ่งซ็อกเก็ตสำหรับพอร์ตเครือข่ายและพอร์ตที่ระบุ แต่ซ็อกเก็ตนั้นสามารถใช้ร่วมกันระหว่างแอปพลิเคชั่นต่างๆ

หากคุณมีซ็อกเก็ตการรับฟังในกระบวนการแอปพลิเคชันและforkกระบวนการนั้นซ็อกเก็ตจะได้รับการถ่ายทอดดังนั้นในทางเทคนิคจะมีสองกระบวนการที่ฟังพอร์ตเดียวกัน


0

ฉันได้ลองทำสิ่งต่อไปนี้ด้วยsocat:

socat TCP-L:8080,fork,reuseaddr -

และแม้ว่าฉันจะไม่ได้ทำการเชื่อมต่อกับซ็อกเก็ต แต่ฉันไม่สามารถฟังสองครั้งบนพอร์ตเดียวกันแม้ว่าจะมีreuseaddrตัวเลือก

ฉันได้รับข้อความนี้ (ซึ่งฉันคาดไว้ก่อนหน้านี้):

2016/02/23 09:56:49 socat[2667] E bind(5, {AF=2 0.0.0.0:8080}, 16): Address already in use

0

เพียงแบ่งปันสิ่งที่ @jnewton พูดถึง ฉันเริ่ม nginx และกระบวนการ tomcat แบบฝังตัวใน mac ของฉัน ฉันเห็นกระบวนการทั้งสองทำงานที่ 8080

LT<XXXX>-MAC:~ b0<XXX>$ sudo netstat -anp tcp | grep LISTEN
tcp46      0      0  *.8080                 *.*                    LISTEN     
tcp4       0      0  *.8080                 *.*                    LISTEN   

-2

คำตอบสั้น ๆ :

ไปตามคำตอบให้ที่นี่ คุณสามารถมีแอพพลิเคชั่นสองตัวรับฟังที่อยู่ IP เดียวกันและหมายเลขพอร์ตดังนั้นหนึ่งในพอร์ตนั้นคือพอร์ต UDP ในขณะที่รายการอื่นเป็นพอร์ต TCP

คำอธิบาย:

แนวคิดของพอร์ตที่เกี่ยวข้องในชั้นการขนส่งของ TCP / IP stack ดังนั้นตราบใดที่คุณกำลังใช้โปรโตคอลชั้นการขนส่งที่แตกต่างกันของสแต็คคุณสามารถมีกระบวนการหลายฟังบนเดียวกัน<ip-address>:<port>รวมกัน

สงสัยหนึ่งที่ผู้คนมีคือถ้าสองโปรแกรมกำลังทำงานอยู่บนเดียวกัน<ip-address>:<port>รวมกันว่าเป็นลูกค้าที่ทำงานบนเครื่องระยะไกลจะเห็นความแตกต่างระหว่างสอง? หากคุณดูที่ส่วนหัวของแพ็คเก็ต IP เลเยอร์ ( https://en.wikipedia.org/wiki/IPv4#Header ) คุณจะเห็นว่าบิต 72 ถึง 79 ใช้สำหรับการกำหนดโปรโตคอลนี่คือความแตกต่างที่สามารถทำได้

หากคุณต้องการมีสองแอพพลิเคชั่นในการ<ip-address>:<port>รวมTCP เดียวกันคำตอบคือไม่ (แบบฝึกหัดที่น่าสนใจจะเปิดตัว VMs สองรายการให้ที่อยู่ IP เดียวกัน แต่ที่อยู่ MAC ต่างกันและดูว่าเกิดอะไรขึ้น - คุณจะสังเกตเห็นว่าบางครั้ง VM1 จะได้รับแพ็คเก็ตและเวลาอื่น ๆ VM2 จะได้รับแพ็คเก็ต - ขึ้นอยู่กับการรีเฟรช ARP แคช)

ฉันรู้สึกว่าการทำให้แอปพลิเคชั่นสองตัวทำงานเหมือนกันกับที่<op-address>:<port>คุณต้องการให้เกิดความสมดุลของโหลด สำหรับสิ่งนี้คุณสามารถเรียกใช้แอปพลิเคชั่นบนพอร์ตต่าง ๆ และเขียนกฎตาราง IP เพื่อแยกการรับส่งข้อมูลระหว่างสองแอพ

ดูคำตอบของ @ user6169806 ด้วย

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