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