โปรโตคอลการถ่ายโอนข้อมูล TCP และ UDP โปรโตคอล UDP

โปรโตคอล TCP และ UDP

โปรโตคอลควบคุมการส่งผ่าน TCP

การสื่อสารที่มุ่งเน้นการเชื่อมต่อสามารถใช้การสื่อสารที่เชื่อถือได้ โดยที่โปรโตคอล Layer 4 จะส่งการตอบรับเมื่อได้รับข้อมูล และร้องขอให้ส่งข้อมูลอีกครั้ง หากไม่ได้รับข้อมูลหรือเสียหาย โปรโตคอล TCP ใช้การสื่อสารที่เชื่อถือได้ประเภทนี้ TCP ใช้ในโปรโตคอลแอปพลิเคชัน เช่น HTTP, FTP, SMTP และ Telnet

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

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

หลังจากนี้ก็สามารถเริ่มกระบวนการส่งและรับข้อความได้ เมื่อได้รับข้อความ ข้อความ ACK จะถูกส่งตอบกลับเสมอ หากการหมดเวลาหมดลงก่อนที่ผู้ส่งจะได้รับ ACK ข้อความจะถูกจัดคิวสำหรับการส่งสัญญาณซ้ำ

ฟิลด์ส่วนหัว TCP แสดงอยู่ในตารางต่อไปนี้:

ส่วนหัวของ TCP
สนาม ความยาว คำอธิบาย
พอร์ตต้นทาง 2 ไบต์ หมายเลขพอร์ตต้นทาง
ท่าเรือปลายทาง 2 ไบต์ หมายเลขพอร์ตปลายทาง
หมายเลขซีเรียล 4 ไบต์ หมายเลขลำดับถูกสร้างขึ้นโดยต้นทางและใช้โดยปลายทางเพื่อเรียงลำดับแพ็กเก็ตใหม่เพื่อสร้างข้อความต้นฉบับและส่งการตอบรับไปยังต้นทาง
หมายเลขยืนยัน 4 ไบต์ หากมีการตั้งค่าบิต ACK ของฟิลด์ควบคุม ฟิลด์นี้ประกอบด้วยหมายเลขลำดับถัดไปที่คาดไว้
ข้อมูลชดเชย 4 บิต ข้อมูลเกี่ยวกับการเริ่มต้นแพ็กเก็ตข้อมูล
จอง 6 บิต สงวนไว้สำหรับใช้ในอนาคต
ควบคุม 6 บิต บิตควบคุมมีแฟล็กที่ระบุว่าฟิลด์การรับทราบ (ACK) ความเร่งด่วน (URG) ควรรีเซ็ตการเชื่อมต่อ (RST) หรือไม่ ว่าหมายเลขซีเรียลการซิงโครไนซ์ (SYN) ถูกส่งไปแล้วหรือไม่ เป็นต้น
ขนาดหน้าต่าง 2 ไบต์ ฟิลด์นี้ระบุขนาดของบัฟเฟอร์การรับ เมื่อใช้ข้อความยืนยัน ผู้รับสามารถแจ้งให้ผู้ส่งทราบถึงจำนวนข้อมูลสูงสุดที่เขาสามารถส่งได้
เช็คซัม 2 ไบต์ การตรวจสอบส่วนหัวและข้อมูล จะกำหนดว่าแพ็กเก็ตเสียหายหรือไม่
ตัวบ่งชี้ความเร่งด่วน 2 ไบต์ ในช่องนี้ อุปกรณ์เป้าหมายจะได้รับข้อมูลเกี่ยวกับความเร่งด่วนของข้อมูล
ตัวเลือก ตัวแปร ค่าเสริมที่ระบุหากจำเป็น
ส่วนที่เพิ่มเข้าไป ตัวแปร มีการเพิ่มศูนย์เพียงพอในฟิลด์ช่องว่างภายใน เพื่อให้ส่วนหัวสิ้นสุดที่ขอบเขต 32 บิต

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

โปรโตคอล TCP มีความสามารถในการจัดส่งที่เชื่อถือได้ในตัว หากส่งข้อความไม่ถูกต้อง เราจะได้รับข้อความแสดงข้อผิดพลาด โปรโตคอล TCP ถูกกำหนดไว้ใน RFC 793

UDP - โปรโตคอลเดตาแกรมผู้ใช้

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

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

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

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

ออกอากาศหมายความว่าข้อความถูกส่งไปยังโหนดทั้งหมดบนเครือข่าย การกระจายกลุ่ม (หลายผู้รับ)เป็นกลไกระดับกลาง: ข้อความจะถูกส่งไปยังกลุ่มโหนดที่เลือก

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

ขอให้เป็นวันดีผู้อ่านที่รัก
ตามความต้องการที่เป็นที่นิยมวันนี้ฉันกำลังเผยแพร่บทความที่จะแนะนำคุณเกี่ยวกับพื้นฐานของคำศัพท์เครือข่ายคอมพิวเตอร์ ได้แก่ :

  • โปรโตคอลเครือข่าย - ชื่อที่น่ากลัวเหล่านี้คืออะไรและใช้ทำอะไร?
  • UDP, TCP, ICMP, - อะไร ทำไม และอะไรคือความแตกต่าง
  • ไอพี-ที่อยู่ - ทุกคนมี แต่ไม่ใช่ทุกคนที่รู้ว่าทำไมสิ่งนี้ :-)
  • มาสก์ที่อยู่ (ซับเน็ต)
  • เกตเวย์
  • คำไม่กี่คำเกี่ยวกับตารางเส้นทาง
  • พอร์ต - จริงๆ แล้วคืออะไร?
  • แม็ค-ที่อยู่

บางอย่างเช่นนี้

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

โปรโตคอลเครือข่าย TCP/IP, NWLink IPX/SPX, NetBEUI

เริ่มจากกันก่อนว่าโปรโตคอลเครือข่ายคืออะไรและใช้ทำอะไร
โปรโตคอลเครือข่ายคือชุดของซอฟต์แวร์ที่ใช้กฎเกณฑ์ในการสื่อสารระหว่างคอมพิวเตอร์ ภาษาประเภทหนึ่งที่คอมพิวเตอร์สื่อสารกันและส่งข้อมูล ก่อนหน้านี้ คอมพิวเตอร์เป็นแบบพูดได้หลายภาษาและเป็นเวอร์ชันเก่ากว่า หน้าต่างมีการใช้โปรโตคอลทั้งชุด - TCP/IP, NWLink IPX/SPX, NetBEUI- ตอนนี้เรามาถึงข้อตกลงทั่วไปแล้ว และมาตรฐานได้กลายเป็นการใช้โปรโตคอลโดยเฉพาะ ทีพีซี/ไอพีและจะมีการอภิปรายเพิ่มเติมเกี่ยวกับเขา

เมื่อพวกเขาพูดถึง ทีพีซี/ไอพีดังนั้นชื่อนี้มักจะหมายถึง... กฎเกณฑ์ที่แตกต่างกันมากมาย หรือพูด มาตรฐานที่กำหนดโดยใช้ (หรือใช้) โปรโตคอลนี้ ตัวอย่างเช่น มีกฎสำหรับการแลกเปลี่ยนข้อความระหว่างเมลเซิร์ฟเวอร์ และมีกฎที่ผู้ใช้ปลายทางได้รับจดหมายในกล่องจดหมายของเขา มีกฎสำหรับการดำเนินการประชุมทางวิดีโอและกฎสำหรับการจัดการการสนทนา "โทรศัพท์" ผ่านทางอินเทอร์เน็ต อันที่จริงสิ่งเหล่านี้ไม่ใช่กฎเกณฑ์จริงๆ ด้วยซ้ำ... เหมือนไวยากรณ์หรืออะไรบางอย่างมากกว่า คุณรู้ไหมว่าในภาษาอังกฤษมีโครงสร้างหนึ่งสำหรับการสร้างบทสนทนา ในภาษาฝรั่งเศสก็มีอีกโครงสร้างหนึ่ง... เอาล่ะค่ะ ทีพีซี/ไอพีสิ่งที่คล้ายกันคือ กฎไวยากรณ์ที่แตกต่างกันจำนวนหนึ่งถือเป็นโปรโตคอลที่สมบูรณ์ ทีพีซี/ไอพีหรือพูดให้เจาะจงกว่านั้นคือ สแต็คโปรโตคอล TCP/IP.

โปรโตคอลเครือข่าย UDP, TCP, ICMP

เป็นส่วนหนึ่งของระเบียบการ ทีพีซี/ไอพีโปรโตคอลที่ใช้ในการส่งข้อมูล - TCPและ ยูดีพี- หลายๆ คนคงเคยได้ยินมาว่ามีพอร์ตแบบนี้ TCP, ดังนั้น ยูดีพีแต่ไม่ใช่ทุกคนที่รู้ว่าความแตกต่างคืออะไรและเกี่ยวกับอะไร ดังนั้น..

การถ่ายโอนข้อมูลผ่านโปรโตคอล TCP(Transmission Control Protocol) จัดให้มีการยืนยันการรับข้อมูล “ พวกเขาบอกว่าคุณเข้าใจไหม - เข้าใจแล้ว!” หากฝ่ายที่ส่งสัญญาณไม่ได้รับการยืนยันที่จำเป็นภายในกรอบเวลาที่กำหนด ข้อมูลจะถูกส่งอีกครั้ง ดังนั้นโปรโตคอล TCPเรียกว่าโปรโตคอลที่ใช้การเชื่อมต่อและ ยูดีพี(โปรโตคอลเดตาแกรมผู้ใช้) - หมายเลข ยูดีพีใช้ในกรณีที่ไม่จำเป็นต้องยืนยันการรับ (เช่น การสอบถาม DNS หรือระบบโทรศัพท์ IP (ตัวแทนที่โดดเด่นคือ Skype)) นั่นคือความแตกต่างอยู่ที่การยืนยันการรับ ดูเหมือน "พอแล้ว!" แต่ในทางปฏิบัติก็มีบทบาทสำคัญ

นอกจากนี้ยังมีโปรโตคอล ไอซีเอ็มพี(Internet Control Message Protocol) ซึ่งใช้ในการส่งข้อมูลเกี่ยวกับพารามิเตอร์เครือข่าย รวมถึงแพ็คเกจอรรถประโยชน์ประเภทต่างๆ เช่น ปิง, ระยะทางไม่สามารถเข้าถึงได้, TTLฯลฯ

ที่อยู่ IP คืออะไร

ทุกคนมีที่อยู่ แต่ไม่ใช่ทุกคนจะรู้ว่านี่คือที่อยู่ประเภทใด และเหตุใดจึงไม่สามารถอยู่ได้โดยปราศจากที่อยู่ดังกล่าว ฉันกำลังบอกคุณ.

ไอพี-ที่อยู่ - 32 -x หมายเลขบิตที่ใช้ระบุคอมพิวเตอร์บนเครือข่าย เป็นเรื่องปกติที่จะเขียนที่อยู่ในค่าทศนิยมของแต่ละออคเต็ตของตัวเลขนี้โดยแยกค่าผลลัพธ์ด้วยจุด ตัวอย่างเช่น, 192.168.101.36

ไอพีที่อยู่ไม่ซ้ำกัน ซึ่งหมายความว่าคอมพิวเตอร์แต่ละเครื่องมีตัวเลขผสมกัน และไม่สามารถมีคอมพิวเตอร์สองเครื่องบนเครือข่ายที่มีที่อยู่เดียวกันได้ ไอพี-ที่อยู่จะถูกกระจายจากส่วนกลาง ผู้ให้บริการอินเทอร์เน็ตจะสมัครไปยังศูนย์ระดับชาติตามความต้องการของพวกเขา ช่วงที่อยู่ที่ได้รับจากผู้ให้บริการจะถูกกระจายไปยังลูกค้าเพิ่มเติม ในทางกลับกัน ลูกค้าสามารถทำหน้าที่เป็นผู้ให้บริการและแจกจ่ายที่ได้รับได้ด้วยตนเอง ไอพี- ที่อยู่ระหว่างลูกค้ารายย่อย ฯลฯ ด้วยวิธีการกระจายแบบนี้ ไอพี-ที่อยู่ ระบบคอมพิวเตอร์รู้แน่ชัดว่า “ตำแหน่ง” ของคอมพิวเตอร์ซึ่งมีเอกลักษณ์เฉพาะตัว ไอพี-ที่อยู่; - ก็เพียงพอแล้วสำหรับเธอที่จะส่งข้อมูลไปยังเครือข่าย "เจ้าของ" และผู้ให้บริการจะวิเคราะห์ปลายทางและเมื่อรู้ว่าใครมอบที่อยู่ส่วนนี้ให้กับใคร จะส่งข้อมูลไปยังเจ้าของคนต่อไป วงย่อย ไอพี- อยู่จนกว่าข้อมูลจะมาถึงคอมพิวเตอร์ปลายทาง

สำหรับการสร้างเครือข่ายท้องถิ่นจะมีการจัดสรรช่วงที่อยู่พิเศษ เหล่านี้คือที่อยู่ 10.x.x.x,192.168.x.x, 10.x.x.x, ค 172.16.x.xโดย 172.31.x.x, 169.254.x.xที่ไหนภายใต้ x- หมายถึงตัวเลขใดๆ จาก 0 ถึง 254 - แพ็กเก็ตที่ส่งจากที่อยู่ที่ระบุไม่ได้ถูกกำหนดเส้นทาง กล่าวคือ แพ็กเก็ตเหล่านั้นจะไม่ถูกส่งผ่านอินเทอร์เน็ต ดังนั้นคอมพิวเตอร์บนเครือข่ายท้องถิ่นที่แตกต่างกันอาจมีที่อยู่ที่ตรงกันจากช่วงที่ระบุ นั่นคือใน บริษัท LLC " เขาและกีบ" และแอลแอลซี " วาสยาและบริษัท“อาจมีคอมพิวเตอร์สองเครื่องพร้อมที่อยู่ 192.168.0.244 แต่พวกเขาไม่สามารถพูดพร้อมที่อยู่ได้ 85.144.213.122 ที่ได้รับจากผู้ให้บริการอินเทอร์เน็ตเพราะว่า ไม่สามารถมีสองสิ่งที่เหมือนกันบนอินเทอร์เน็ตได้ ไอพี-ที่อยู่ ในการส่งข้อมูลจากคอมพิวเตอร์ดังกล่าวไปยังอินเทอร์เน็ตและย้อนกลับ จะใช้โปรแกรมและอุปกรณ์พิเศษที่แทนที่ที่อยู่ในเครื่องด้วยที่อยู่จริงเมื่อทำงานกับอินเทอร์เน็ต กล่าวคือข้อมูลจะถูกส่งไปยังเครือข่ายจากของจริง ไอพี-ที่อยู่ ไม่ใช่จากคนในพื้นที่ กระบวนการนี้เกิดขึ้นโดยผู้ใช้โดยไม่มีใครสังเกตเห็น และเรียกว่าการแปลที่อยู่ ฉันอยากจะพูดถึงสิ่งนั้นภายในเครือข่ายเดียวกันเช่น บริษัท, LLC " เขาและกีบ" ไม่สามารถมีคอมพิวเตอร์สองเครื่องที่มีที่อยู่ IP ในเครื่องเดียวกันได้ กล่าวคือ ในตัวอย่างข้างต้นหมายความว่าคอมพิวเตอร์เครื่องหนึ่งที่มีที่อยู่เดียวกัน 192.168.0.244 ในบริษัทหนึ่ง บริษัทที่สองที่มีที่อยู่เดียวกัน - ในอีกบริษัทหนึ่ง ในบริษัทเดียวกันมีคอมพิวเตอร์สองเครื่องพร้อมที่อยู่ 192.168.0.244 พวกเขาจะไม่เข้ากัน

คุณต้องการที่จะรู้และสามารถทำอะไรได้มากกว่านี้ด้วยตัวเอง?

เราเสนอการฝึกอบรมในด้านต่อไปนี้: คอมพิวเตอร์ โปรแกรม การดูแลระบบ เซิร์ฟเวอร์ เครือข่าย การสร้างเว็บไซต์ SEO และอื่นๆ ดูรายละเอียดได้เลย!

คุณคงเคยได้ยินคำศัพท์เช่นภายนอก ไอพีและภายใน ไอพี, ค่าคงที่ (IP แบบคงที่) และตัวแปร (ไดนามิก) ไอพี- โดยสรุปเกี่ยวกับพวกเขา:

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

ประเภทของคุณ ไอพี(คงที่หรือไดนามิก) ขึ้นอยู่กับการตั้งค่าของผู้ให้บริการ

Address Mask (ซับเน็ต) คืออะไร

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

มาสก์คือพารามิเตอร์ที่บอกซอฟต์แวร์ว่ามีคอมพิวเตอร์กี่เครื่องรวมอยู่ในกลุ่มที่กำหนด (ซับเน็ต) มาสก์ที่อยู่มีโครงสร้างเดียวกันกับที่อยู่ IP โดยเป็นชุดตัวเลขสี่กลุ่มซึ่งแต่ละกลุ่มสามารถอยู่ในช่วงตั้งแต่ 0 ถึง 255 - ในกรณีนี้ ยิ่งค่ามาสก์ยิ่งต่ำ คอมพิวเตอร์ก็ยิ่งเชื่อมต่อกับเครือข่ายย่อยนี้มากขึ้น สำหรับเครือข่ายของบริษัทขนาดเล็ก หน้ากาก มักจะมีลักษณะเช่นนี้ 255.255.255.x(เช่น 255.255.255.224) เน็ตเวิร์กมาสก์ถูกกำหนดให้กับคอมพิวเตอร์พร้อมกับที่อยู่ IP ตัวอย่างเช่น เครือข่าย 192.168.0.0 ด้วยหน้ากาก 255.255.255.0 อาจมีคอมพิวเตอร์ที่มีที่อยู่จาก 192.168.0.1 ถึง 192.168.254 192.168.0.0 ด้วยหน้ากาก 255.255.255.128 อนุญาตให้มีที่อยู่จาก 192.168.0.1 ถึง 192.168.0.127 - ฉันคิดว่าความหมายนั้นชัดเจน ตามกฎแล้ว ผู้ให้บริการจะใช้เครือข่ายที่มีคอมพิวเตอร์จำนวนน้อยที่เป็นไปได้เพื่อบันทึกที่อยู่ IP ตัวอย่างเช่น ลูกค้าอาจได้รับมอบหมายที่อยู่ด้วยการสวมหน้ากาก 255.255.255.252 - ซับเน็ตนี้มีคอมพิวเตอร์เพียงสองเครื่องเท่านั้น

หลังจากที่คอมพิวเตอร์ได้รับที่อยู่ IP และทราบค่าของซับเน็ตมาสก์แล้ว โปรแกรมสามารถเริ่มทำงานในเครือข่ายย่อยภายในเครื่องนี้ได้ อย่างไรก็ตาม เพื่อแลกเปลี่ยนข้อมูลกับคอมพิวเตอร์เครื่องอื่นบนเครือข่ายทั่วโลก คุณจำเป็นต้องทราบกฎเกณฑ์ว่าจะส่งข้อมูลไปยังเครือข่ายภายนอกได้จากที่ไหน เพื่อจุดประสงค์นี้ มีการใช้คุณลักษณะเช่นที่อยู่เกตเวย์

เกตเวย์คืออะไร?

เกตเวย์คืออุปกรณ์ (คอมพิวเตอร์หรือเราเตอร์) ที่ส่งต่อข้อมูลระหว่างเครือข่ายย่อย IP ที่แตกต่างกัน หากโปรแกรมกำหนด (โดย IP และมาสก์) ว่าที่อยู่ปลายทางไม่ได้เป็นส่วนหนึ่งของเครือข่ายย่อยภายในเครื่อง โปรแกรมจะส่งข้อมูลนี้ไปยังอุปกรณ์ที่ทำหน้าที่เป็นเกตเวย์ ในการตั้งค่าโปรโตคอล ให้ระบุที่อยู่ IP ของอุปกรณ์ดังกล่าว

หากต้องการทำงานเฉพาะในเครือข่ายท้องถิ่น อาจไม่สามารถระบุเกตเวย์ได้

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

ตารางเส้นทางคืออะไร

แล้วเราก็ไปถึงพวกเขาได้อย่างราบรื่น แล้ว.. โต๊ะพวกนี้เป็นแบบไหน?

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

พอร์ตเครือข่ายคืออะไร

เมื่อถ่ายโอนข้อมูลยกเว้น ไอพี-ที่อยู่ของผู้ส่งและผู้รับ แพ็กเก็ตข้อมูลประกอบด้วยหมายเลขพอร์ต ตัวอย่าง: 192.168.1.1: 80 , - วี ในกรณีนี้ 80 - นี่คือหมายเลขพอร์ต พอร์ตคือตัวเลขที่ใช้ในการรับและส่งข้อมูลเพื่อระบุกระบวนการ (โปรแกรม) ที่ควรประมวลผลข้อมูล ดังนั้นหากแพ็คเก็ตถูกส่งไปที่ 80 พอร์ต th ซึ่งบ่งชี้ว่าข้อมูลมีไว้สำหรับเซิร์ฟเวอร์ HTTP.

หมายเลขพอร์ตด้วย 1 ก่อนหน้านี้ 1023 -th ถูกกำหนดให้กับโปรแกรมเฉพาะ (เรียกว่าพอร์ตที่รู้จักกันดี) พอร์ตที่มีตัวเลข 1024 -65 535 สามารถใช้ในโปรแกรมที่เป็นกรรมสิทธิ์ ในกรณีนี้ข้อขัดแย้งที่อาจเกิดขึ้นจะต้องแก้ไขโดยโปรแกรมเองโดยเลือกพอร์ตที่ว่าง กล่าวอีกนัยหนึ่งพอร์ตจะถูกกระจายแบบไดนามิก: เป็นไปได้ว่าในครั้งถัดไปที่โปรแกรมเริ่มทำงานโปรแกรมจะเลือกค่าพอร์ตอื่น เว้นแต่คุณจะตั้งค่าพอร์ตด้วยตนเองผ่านการตั้งค่า

ที่อยู่ MAC คืออะไร

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

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

ตามกฎแล้ว แม็ค- บางครั้งจำเป็นต้องใช้ที่อยู่เพื่อระบุตัวตน เช่น กับผู้ให้บริการ (หากผู้ให้บริการใช้การผูกมัดด้วยที่อยู่ป๊อปปี้แทนรหัสผ่านเข้าสู่ระบบ) หรือเมื่อตั้งค่าเราเตอร์

จะดูการตั้งค่าเครือข่ายทั้งหมดได้ที่ไหน

ฉันเกือบลืมที่จะพูดสองสามคำเกี่ยวกับที่ที่คุณสามารถดูและเปลี่ยนแปลงทั้งหมดนี้ได้

เมื่อเราพูดถึงความปลอดภัยของข้อมูล เราหมายถึงการรักษาความลับ ความสมบูรณ์ และความพร้อมของข้อมูลในเวลาใดก็ตาม และหากทุกอย่างชัดเจนด้วยการรักษาความลับและความพร้อมใช้งาน แล้วจะมั่นใจในความสมบูรณ์ของข้อมูลเมื่อส่งผ่านเครือข่ายได้อย่างไร? เพื่อแก้ไขปัญหานี้ เราจะต้องมีความรู้เกี่ยวกับโปรโตคอลเครือข่าย ในบทความนี้เราจะดูโปรโตคอล TCP และ UDP เป็นส่วนหนึ่งของสแต็กโปรโตคอล TCP/IP ซึ่งอยู่ในเลเยอร์การขนส่งของโมเดล OSI และใช้ในการถ่ายโอนข้อมูลจากโหนดหนึ่งไปอีกโหนดหนึ่ง

แต่ละโปรโตคอลเหล่านี้คืออะไร อะไรคือความแตกต่าง และเมื่อใดควรใช้การเชื่อมต่อ UDP และเมื่อใดคือ TCP

ยูดีพี

โปรโตคอล UDP เป็นโปรโตคอลที่ให้การส่งข้อมูล (ดาตาแกรม) โดยไม่ต้องสร้างการเชื่อมต่อระหว่างโฮสต์ก่อน เมื่อส่งดาตาแกรมไม่มีความแน่นอนเกี่ยวกับการมีอยู่ของผู้รับและความพร้อมในการแลกเปลี่ยน โปรโตคอลเครือข่าย UDP ยังไม่มีการเรียงลำดับดาตาแกรมเมื่อได้รับ มันถูกใช้โดยแอปพลิเคชันที่จำเป็นต้องมีเวลาในการจัดส่ง เมื่อไม่มีทางที่จะรอการล่าช้าหรือร้องขอแพ็กเก็ตที่สูญหาย เช่น ในระบบเรียลไทม์ ดาตาแกรมอาจถูกจัดส่งผิดลำดับ ทำซ้ำ หรือไม่จัดส่งเลย นี่คือสาเหตุที่ UDP ถูกเรียกว่า “Unreliable Datagram Protocol”

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

TCP

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

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

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

ขอแนะนำให้ใช้ TCP ในกรณีที่ข้อมูลสูญหายเป็นสิ่งที่ยอมรับไม่ได้ เช่น ในระหว่างการอนุญาต ตลอดจนเมื่อส่งข้อมูลที่เข้ารหัส

ความแตกต่างของ TCP และ UDP

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

แบ่งปันข้อมูลที่เป็นประโยชน์กับคนที่คุณรัก

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

สวัสดี ฉันชื่อ Glenn Fiedler ยินดีต้อนรับคุณสู่บทความแรกในหนังสือออนไลน์ของฉัน Network Programming for Game Developers

ในบทความนี้ เราจะเริ่มต้นด้วยลักษณะพื้นฐานที่สุดของการเขียนโปรแกรมเครือข่าย - การรับและส่งข้อมูลผ่านเครือข่าย การรับและส่งข้อมูลเป็นส่วนหลักและง่ายที่สุดของงานทั้งหมดที่โปรแกรมเมอร์เครือข่ายทำ แต่มักจะเป็นเรื่องยากที่จะพิจารณาว่าควรใช้วิธีใดดีที่สุด ให้ความสนใจกับส่วนนี้ให้เพียงพอ - หากคุณหลงเหลือความเข้าใจผิด อาจส่งผลร้ายแรงต่อเกมที่มีผู้เล่นหลายคนของคุณในภายหลัง!

คุณคงเคยได้ยินบางอย่างเกี่ยวกับซ็อกเก็ตมาบ้างแล้ว และคุณอาจรู้ว่าซ็อกเก็ตมีสองประเภทหลัก - TCP และ UDP สิ่งแรกที่คุณต้องตัดสินใจเมื่อพัฒนาเกมที่มีผู้เล่นหลายคนคือซ็อกเก็ตประเภทใดที่จะใช้ - TCP, UDP หรือทั้งสองอย่าง

การเลือกประเภทซ็อกเก็ตขึ้นอยู่กับประเภทของเกมที่คุณกำลังพัฒนา สำหรับบทความชุดนี้ ฉันจะถือว่าคุณกำลังเขียนเกมแอคชั่น เช่น Halo, Battlefield 1942, Quake, Unreal, CounterStrike, Team Fortress ฯลฯ

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

TCP ย่อมาจาก "โปรโตคอลควบคุมการส่งสัญญาณ" และ IP ย่อมาจาก "โปรโตคอลอินเทอร์เน็ต" สิ่งเหล่านี้ร่วมกันสนับสนุนเกือบทุกสิ่งที่คุณทำทางออนไลน์ ตั้งแต่การท่องเว็บไปจนถึง IRC และการสื่อสารทางอีเมล ทั้งหมดนี้ทำงานบน TCP/IP

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

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

อีกครั้งหนึ่ง - ทุกอย่างง่ายดายเหมือนการเขียนหรืออ่านจากไฟล์ตามปกติ ชั้นประถม วัตสัน!

แต่ความสะดวกในการใช้งานนี้แตกต่างอย่างสิ้นเชิงจากสิ่งที่เกิดขึ้นจริง "ใต้ฝากระโปรง" ในระดับที่ต่ำกว่า - ระดับโปรโตคอล IP

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

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

จะเป็นอย่างไรหากเราต้องการถ่ายโอนข้อมูลระหว่างคอมพิวเตอร์ที่ไม่ได้อยู่ในรูปแบบการอ่าน/เขียนไฟล์ แต่โดยการส่งและรับแพ็กเก็ตเดี่ยวโดยตรง?

เราสามารถทำได้โดยใช้ UDP UDP ย่อมาจาก “user datagram protocol” และทำงานบน IP (เช่น TCP) แต่แทนที่จะเพิ่มฟังก์ชันการทำงานมากมาย กลับเป็นเพียงส่วนเสริมเล็กๆ ของ IP

เมื่อใช้ UDP เราสามารถส่งแพ็กเก็ตไปยังที่อยู่ IP เฉพาะ (เช่น 112.140.20.10) และพอร์ต (เช่น 52423) และมันจะถูกส่งจากคอมพิวเตอร์หนึ่งไปอีกเครื่องหนึ่งจนกว่าจะถึงปลายทาง (หรือสูญหายไปตาม ทาง).

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

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

นอกจากนี้ UDP ยังไม่รับประกันลำดับในการจัดส่งแพ็กเก็ต คุณสามารถส่งห้าแพ็คเก็ตตามลำดับ - 1, 2, 3, 4, 5 - แต่สามารถส่งในลำดับที่แตกต่างไปจากเดิมอย่างสิ้นเชิง - เช่น 3, 1, 2, 5, 4 อีกครั้ง ในทางปฏิบัติ พวกเขามักจะมีโอกาสมากที่สุด มาถึงในลำดับที่ถูกต้องเกือบตลอดเวลา แต่คุณไม่สามารถวางใจได้!

สุดท้าย แม้ว่า UDP จะไม่เพิ่ม IP มากนัก แต่ก็รับประกันสิ่งหนึ่งได้ หากคุณส่งต่อแพ็กเก็ต มันจะมาถึงอย่างสมบูรณ์หรือไม่ได้เลย ดังนั้น หากคุณส่งแพ็กเก็ตขนาด 256 ไบต์ไปยังคอมพิวเตอร์เครื่องอื่น คอมพิวเตอร์จะไม่สามารถรับเฉพาะ 100 ไบต์แรกจากแพ็กเก็ตได้ แต่จะต้องรับทั้งหมด 256 ไบต์ นี่เป็นสิ่งเดียวที่รับประกันโปรโตคอล UDP - ทุกสิ่งทุกอย่างตกอยู่บนบ่าของคุณ

ดังนั้นเราจึงต้องตัดสินใจว่า - เราควรใช้ซ็อกเก็ต TCP หรือ UDP หรือไม่ มาดูคุณสมบัติของพวกเขากันดีกว่า:

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

แต่ไม่มี

การใช้ TCP อาจเป็นข้อผิดพลาดที่เลวร้ายที่สุดที่คุณสามารถทำได้เมื่อพัฒนาเกมที่มีผู้เล่นหลายคน เพื่อทำความเข้าใจว่าทำไม เรามาดูกันว่าอะไรทำให้ TCP ใช้งานง่ายมาก!

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

แล้วเขาจะทำอย่างไร?

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

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

TCP มีตัวเลือกในการแก้ไขปัญหานี้ - “TCP_NODELAY” มันบอกโปรโตคอลว่าอย่ารอให้ข้อมูลสะสมในคิวการส่ง แต่ให้ส่งทันที

น่าเสียดายที่แม้จะติดตั้งตัวเลือกนี้แล้ว TCP ก็ประสบปัญหามากมายเมื่อใช้ในเกมออนไลน์

ต้นตอของปัญหาทั้งหมดอยู่ที่วิธีที่ TCP จัดการกับแพ็กเก็ตที่สูญหายหรือชำรุด ซึ่งสร้างภาพลวงตาของการเชื่อมต่อที่เชื่อถือได้และสม่ำเสมอ

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

แต่จะเกิดอะไรขึ้นหากหนึ่งในแพ็กเก็ตไม่มาถึง? หรือหากพัสดุมาถึงผิดลำดับหรือมีของซ้ำกัน?

โดยไม่ต้องเจาะลึกรายละเอียดวิธีการทำงานของ TCP อย่างลึกซึ้งเกินไป (และนี่เป็นหัวข้อที่ซับซ้อนมาก - คุณสามารถอ่านได้ใน TCP/IP Illustrated) กระบวนการจะมีลักษณะดังนี้: TCP ส่งแพ็กเก็ต กำหนดว่าแพ็กเก็ตมาไม่ถึง และส่งแพ็กเก็ตเดียวกันไปยังผู้รับอีกครั้ง แพ็กเก็ตที่ซ้ำกันจะถูกกำจัดในฝั่งของผู้รับ และแพ็กเก็ตที่มาถึงผิดลำดับจะถูกจัดเรียงใหม่เพื่อให้ทุกอย่างเป็นไปตามที่ควรจะเป็น - เชื่อถือได้และเป็นระเบียบ

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

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

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

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

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

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

แต่เดี๋ยวก่อน! เหตุใดฉันจึงใช้ทั้ง UDP และ TCP ร่วมกันไม่ได้

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

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

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

8 คำตอบ

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

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

ในบางสถานการณ์ UDP จะถูกใช้เนื่องจากอนุญาตให้มีการส่งแพ็กเก็ตได้ บางครั้งนี่เป็นเรื่องพื้นฐานในกรณีต่างๆ เช่น โปรโตคอล DHCP เนื่องจากเครื่องไคลเอ็นต์ยังไม่ได้รับที่อยู่ IP (ซึ่งเป็นโปรโตคอล t26) และจะไม่มีวิธีสร้างสตรีม TCP โดยไม่มีที่อยู่ IP

UDP (User Datagram Protocol) เป็นโปรโตคอลทั่วไปที่ใช้กันอย่างแพร่หลายบนอินเทอร์เน็ต อย่างไรก็ตาม UDP ไม่เคยใช้เพื่อส่งข้อมูลละเอียดอ่อน เช่น เว็บเพจ ข้อมูลฐานข้อมูล ฯลฯ; UDP มักใช้สำหรับการสตรีมเสียงและวิดีโอ การสตรีมสื่อ เช่น ไฟล์เสียง Windows Media (.WMA), Real Player (.RM) และอื่นๆ ใช้ UDP เพราะมันให้ความเร็ว! สาเหตุที่ UDP เร็วกว่า TCP ก็เนื่องมาจากไม่มีการควบคุมการไหลหรือการแก้ไขข้อผิดพลาด ข้อมูลที่ส่งทางอินเทอร์เน็ตได้รับผลกระทบจากการชนกันและข้อผิดพลาดจะปรากฏขึ้น โปรดจำไว้ว่า UDP นั้นเกี่ยวกับความเร็วเท่านั้น นี่คือสาเหตุหลักที่ทำให้สื่อสตรีมมิ่งมีคุณภาพไม่ดี

1) TCP เน้นการเชื่อมต่อและเชื่อถือได้ โดยที่ UDP มีการเชื่อมต่อน้อยและไม่น่าเชื่อถือ

2) TCP ต้องการการประมวลผลเพิ่มเติมในระดับอินเทอร์เฟซเครือข่าย โดยที่เช่นเดียวกับ UDP ก็ไม่เป็นเช่นนั้น

3) TCP ใช้การจับมือสามทาง การควบคุมความแออัด การควบคุมการไหล และกลไกอื่น ๆ เพื่อให้มั่นใจในการส่งข้อมูลที่เชื่อถือได้

4) UDP ใช้เป็นหลักในกรณีที่ความล่าช้าของแพ็กเก็ตรุนแรงกว่าการสูญเสียแพ็กเก็ต

คิดว่า TCP เป็นแพ็คเก็ตการกำหนดเวลาของ UPS/FedEx ระหว่างสองสถานที่ ในขณะที่ UDP นั้นเทียบเท่ากับการส่งไปรษณียบัตรไปยังกล่องจดหมาย

UPS/FedEx จะทำทุกอย่างที่เป็นไปได้เพื่อให้แน่ใจว่าพัสดุที่คุณส่งทางไปรษณีย์ไปถึงที่นั่นและได้รับตรงเวลา โปสการ์ดถือว่าโชคดีถ้ามาถึงเลย และอาจล้มเหลวหรือล่าช้า (กี่ครั้งแล้วที่คุณได้รับโปสการ์ดจากใครบางคนหลังจากที่พวกเขากลับถึงบ้านจากวันหยุด?)

TCP นั้นใกล้เคียงกับโปรโตคอลการส่งมอบที่มีการรับประกันมากที่สุดเท่าที่คุณจะได้รับจาก UDP - มันเป็นเพียง "ความพยายามอย่างดีที่สุด"

เหตุผลที่ใช้ UDP สำหรับ DNS และ DHCP:

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

DHCP - DHCP เป็นส่วนขยายของ BOOTP BOOTP เป็นโปรโตคอลที่คอมพิวเตอร์ไคลเอนต์ใช้เพื่อรับข้อมูลการกำหนดค่าจากเซิร์ฟเวอร์ในขณะที่ไคลเอนต์กำลังบูท หากต้องการค้นหาเซิร์ฟเวอร์ การออกอากาศจะถูกส่งไปพร้อมกับคำขอไปยังเซิร์ฟเวอร์ BOOTP (หรือ DHCP) การออกอากาศสามารถส่งผ่านโปรโตคอลไร้การเชื่อมต่อ เช่น UDP เท่านั้น ดังนั้น BOOTP จึงจำเป็นต้องมีแพ็กเก็ต UDP อย่างน้อยหนึ่งแพ็กเก็ตเพื่อออกอากาศไปยังเซิร์ฟเวอร์ นอกจากนี้ เนื่องจาก BOOTP ทำงานในขณะที่ไคลเอนต์กำลัง... กำลังบูท และนี่เป็นช่วงเวลาที่ไคลเอนต์อาจไม่ได้โหลดและรันสแต็ก TCP/IP ทั้งหมด UDP อาจเป็นโปรโตคอลเดียวที่ไคลเอนต์ยินดีจัดการในระหว่างนั้น เวลานั้น สุดท้ายนี้ ไคลเอนต์ DHCP/BOOTP บางตัวจะมีเพียง UDP บนเครื่องเท่านั้น ตัวอย่างเช่น IP Thermostats บางตัวใช้เฉพาะ UDP เท่านั้น เหตุผลก็คือพวกมันถูกสร้างขึ้นด้วยโปรเซสเซอร์ขนาดเล็กและมีหน่วยความจำน้อยจนไม่สามารถทำ TCP ได้ แต่ยังต้องได้รับที่อยู่ IP เมื่อบู๊ต

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

ความแตกต่างประการหนึ่งคือการลดลง

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