Score:3

มีเพียงหนึ่งซ็อกเก็ต TCP (ผ่าน nc) เท่านั้นที่สามารถส่งข้อมูลไปยังโฮสต์/พอร์ตเดียวกันได้ในครั้งเดียว

ธง in

repro อย่างง่าย - ในกระบวนการเฝ้าดูหน้าต่างเดียวที่ด้านบนในการเรียกใช้อื่น ๆ : nc -lkp 10000 > /dev/null & ( head -50000000 /dev/urandom | nc -N 127.0.0.1 10000 ) & ( head -50000000 /dev/urandom | nc -N 127.0.0.1 10000 )

สังเกตที่เดียว ศีรษะ และ เอ็นซี กระบวนการกำลังใช้ CPU อย่างแข็งขัน

แนบรอยกับ ศีรษะ ที่ไม่ได้ใช้งาน - ดูว่าหยุดเขียนเช่น:

strace: แนบกระบวนการ 589084
เขียน(1, "\264\347\270\26\27\24'BRb^\353\302\36@\216\17V\210*n\252`\353\330\351\276\2\250 \330\350\217"..., 4096^Cstrace: แยกกระบวนการ 589084 ออก
 <เดี่ยว ...>

ตั้งค่า Listener สองตัวบนพอร์ตต่างๆ เช่น 10,000 และ 10,001 และทั้งคู่วิ่งด้วยความเร็วสูงสุด

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

ดังนั้น - เหตุใดฉันจึงมีการเชื่อมต่อ tcp ได้เพียงหนึ่งรายการกับโฮสต์/พอร์ตที่กำหนดที่กำลังส่งข้อมูลอยู่

มีแหล่งข้อมูลอิสระ (อย่าลังเลที่จะทดลองหากคุณไม่เชื่อฉัน) และกระบวนการอิสระที่เปิดการเชื่อมต่อ tcp ของตัวเอง (เน็ตสแตท จะแสดงทั้งคู่เปิดอยู่) - สิ่งเดียวที่เหมือนกันคือปลายทาง (ซึ่งไม่จำเป็นต้องเป็นไฟล์ เอ็นซี กำลังฟังอยู่ แท้จริง - เกิดขึ้นกับสิ่งใด).

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

Ron Maupin avatar
us flag
พอร์ตสามารถอ้างสิทธิ์ได้ด้วยกระบวนการเดียวเท่านั้น คุณต้องให้แอปพลิเคชันใช้พอร์ตชั่วคราวสำหรับต้นทาง (พอร์ต `0`) โดยพอร์ตต้นทางจะถูกเลือก "แบบสุ่ม" สำหรับแต่ละกระบวนการ การเชื่อมต่อ TCP ระบุโดยที่อยู่ต้นทางและปลายทางและพอร์ตต้นทางและปลายทาง หากคุณใช้ค่าเดียวกันสำหรับทั้งสี่ แสดงว่าตามคำนิยามแล้ว การเชื่อมต่อเดียวกัน และการพยายามเรียกใช้กระบวนการใหม่บนการเชื่อมต่อเดียวกันจะทำให้เกิดข้อผิดพลาด
garethhumphriesgkc avatar
in flag
มีพอร์ตต้นทางที่แตกต่างกันที่ใช้ในแต่ละการเชื่อมต่อ นั่นเป็นวิธีที่ nc ทำงานโดยค่าเริ่มต้น อินสแตนซ์ที่สองจะไม่เปิดหากพอร์ตต้นทางถูกใช้งานอยู่แล้ว และคุณสามารถเห็นผลลัพธ์ใน netstat ว่าแตกต่างกัน ฉันรับรองกับคุณว่าเป็นการเชื่อมต่อ TCP สองแบบที่แตกต่างกัน - ฉันขอแนะนำให้คุณลองด้วยตัวเองและดู
Score:8
ธง cl
A.B

ข้อจำกัดความรับผิดชอบ: มีมากมาย เอ็นซี ตัวแปร สันนิษฐานจาก -k ว่าเป็นตัวแปร OpenBSD แต่ละ เอ็นซี ตัวแปรมีข้อได้เปรียบในตัวเอง

เอ็นซี เป็นเครื่องมือที่ไม่ถูกต้องสำหรับงานนี้: nc -lkp 10,000 จะจัดการการเชื่อมต่อเดียวในเวลาเดียวกัน เพราะไม่แยก และแม้จะใช้ แบบสำรวจความคิดเห็น (2) ไม่เคยใช้ ยอมรับ(2) ในการเชื่อมต่อขาเข้าครั้งที่ 2 จนกว่าการจัดการครั้งแรกจะเสร็จสิ้น: เป็นการรับประกันว่าการเชื่อมต่อครั้งที่ 2 จะไม่ถูกจัดการ หากมีอีกสักสองสามคน พวกเขาจะเริ่มเข้าพัก SYN-ส่ง รัฐเพราะ nc -lkp 10,000 ใช้ 1 เป็น ฟัง (2) งานในมือ: นี่ไม่ใช่ตัวเลือกแบบสุ่ม สามารถตรวจสอบได้โดยใช้ สเตรส ในการวิ่ง nc -lkp 10,000 กระบวนการ.

เดอะ เอกสารเกี่ยวกับ -k ตัวเลือกบอกเหมือนกัน:

-k

เมื่อการเชื่อมต่อเสร็จสิ้น, ฟังอีกอันหนึ่ง ต้องใช้ -l.
[...]

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


แทนที่การฟัง เน็ตแคท กับ โซแคท (-d -d สำหรับข้อมูลเพิ่มเติม):

socat -d -d tcp4-listen:10000,reuseaddr,fork /dev/null

เดอะ ส้อม ตัวเลือกช่วยให้การประมวลผลแบบขนานทำได้ง่าย: หนึ่งกระบวนการต่อการเชื่อมต่อ

garethhumphriesgkc avatar
in flag
ขอบคุณสำหรับคำแนะนำ - socat ทำงานตามที่คาดไว้ ตอนนี้ฉันต้องทำงานว่าทำไมจาวาไม่ทำ - ฟังดูเหมือนโพสต์สแต็กโอเวอร์โฟลว์
A.B avatar
cl flag
A.B
พยายามมากขึ้น อันแรกคือ "เชื่อมต่ออัตโนมัติ" โดยระบบปฏิบัติการ โดยปกติจะขึ้นอยู่กับงานในมือ แต่อาจมีอีกเล็กน้อย ที่นี่ที่ 4 (เช่นที่ 3 ที่ยังไม่ประมวลผล) ได้รับ SYN-SENT แรก (พร้อม `ss -tn dst == 127.0.0.1:10000`)
garethhumphriesgkc avatar
in flag
ขออภัย A.B - ฉันลบความคิดเห็นของฉันหลังจากที่ฉันเห็นว่าคุณได้แก้ไขคำตอบของคุณแล้ว แต่ก่อนที่จะเห็นคำตอบของคุณ สำหรับผู้ที่มาในภายหลัง ฉันเพิ่งกล่าวว่าการเชื่อมต่อที่ตามมาเสร็จสมบูรณ์แล้ว ไม่ใช่ใน SYN_SENT
A.B avatar
cl flag
A.B
ฉันกำลังพูดถึงการเชื่อมต่อที่รอดำเนินการ: nc ที่รอการประมวลผล มีไคลเอนต์ nc อย่างน้อย 4 เครื่องที่ทำงานพร้อมกัน (ก่อนวันที่ 1 ใน 4 สิ้นสุด) เพื่อดูสิ่งนี้ ลักษณะการทำงานที่แน่นอนอาจขึ้นอยู่กับเวอร์ชันของเคอร์เนลและการตั้งค่า เพียงแค่ลองเพิ่มเติม ตัวอย่างของคุณใน OP เรียกใช้ไคลเอ็นต์เพียงสองเครื่องเท่านั้น ดังนั้นจึงไม่เห็นพฤติกรรมนี้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา