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