มีคำถามเกี่ยวกับ client server(TCP) มาถามครับ
คือผมทำโปรแกรม ฝั่ง server(C#.NET) โดยที่มีโปรแกรม บน blackberry เป็น client
ทดลองกับเครื่องที่บ้านจนโปรแกรมทำงานสำเร็จแล้ว
ทีนี้เอาโปรแกรมไปวางที่ server โปรแกรมกลับทำงานไม่ครบที่ต้องการ
เอา wireshark ไปดูว่าเกิดอะไรขึ้น
client กับ server รับส่งข้อมูลกันปกตินะ(มี lost บ้างแต่ retransmit จนสำเร็จตลอด)
จนถึงข้อมูลชุดนึงขนาดประมาณ 900 byte (ใหญ่สุดที่รับส่งกันแล้ว)
server ส่งข้อมูลไปที่ client แล้วไม่มี ACK ตอบกลับมา retransmit หลายรอบก็ไม่สำเร็จ
(แปลว่า ส่งไม่ถึง client???)
น่าจะเกิดจากอะไรได้บ้างครับ
จะบอกว่าเพราะขนาดข้อมูลใหญ่จนมือถือรับไม่ได้ก็ไม่น่าใช่ เพราะเครื่องที่บ้านยังทำได้
ข้อมูลที่ขนาดไม่ใหญ่บน server รับส่งกันได้สำเร็จ แต่ 900 กว่า byte นี้กลับไม่สำเร็จ
พอที่จะช่วยเดาปัญหาได้รึเปล่าครับ
ปัญหาคิดว่าไม่น่าเกิดจาก code นะ
ถ้ามือถือได้รับ stream แล้ว ฝั่ง server ควรจะได้ ACK กลับมา
ปล. SYN ACK กับ Retransmission เป็นกลไกของ TCP/IP นะ ผมไม่ได้ implement อะไรเองทั้งสิ้น
ต้องบอกไว้ก่อน เพราะเคยเห็นคนพยายามทำสิ่งเหล่านี้เอง
ลำดับเหตุการณ์
Client<------------------> Server
SYN
ACK
//Established
SYN,PUSH
ACK
SYN,PUSH
เป็นแบบนี้ทุกครั้ง ตายที่ข้อมูลสุดท้ายที่ต้องส่ง
คือผมไ่ม่สามารถ redesign ใหม่ ให้ส่งข้อมูลน้อยลงได้
ได้เพราะเป็น protocol มาตรฐานที่โปรแกรมสำเร็จรูปต่างๆใช้กันอยู่แล้ว
ลองทดสอบให้ส่งข้อมูลขนาด 536 กับ 537 ไบต์ดูหน่อยสิครับ ผมเข้าใจว่าเกี่ยวกับ MSS
LinkedIn
ลองทำตามที่แนะนำแล้ว ดันส่งข้อมูลสำเร็จ
เลยลองส่งข้อมูลขนาด 1000 byte เลยก็ยังสำเร็จอีก
[ภาพประกอบ]
http://postimage.org/image/xdu5k4nvh/
เป็นรอบที่ลองส่ง byte ไป (gen ข้อมูลมั่วๆเอา)
เป็นรอบที่ทำงานตามปกติ
สังเกตว่า 1. ส่งข้อมูลได้
แต่ 2. ส่งไม่สำเร็จ