Tags:

มีคำถามเกี่ยวกับ 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 อะไรเองทั้งสิ้น

ต้องบอกไว้ก่อน เพราะเคยเห็นคนพยายามทำสิ่งเหล่านี้เอง

Get latest news from Blognone
By: lunatic on 29 February 2012 - 19:05 #389486
lunatic's picture

ลำดับเหตุการณ์

Client<------------------> Server

SYN

                [SYN,ACK]

ACK

//Established

SYN,PUSH

                ACK

                SYN,PUSH

ACK

SYN,PUSH

                ACK

                SYN,PUSH

                Retransmission

                Retransmission

                ...

                TIME OUT(Disconnected)

เป็นแบบนี้ทุกครั้ง ตายที่ข้อมูลสุดท้ายที่ต้องส่ง

คือผมไ่ม่สามารถ redesign ใหม่ ให้ส่งข้อมูลน้อยลงได้

ได้เพราะเป็น protocol มาตรฐานที่โปรแกรมสำเร็จรูปต่างๆใช้กันอยู่แล้ว

By: PaePae
WriteriPhoneAndroidWindows
on 29 February 2012 - 19:23 #389499
PaePae's picture

ลองทดสอบให้ส่งข้อมูลขนาด 536 กับ 537 ไบต์ดูหน่อยสิครับ ผมเข้าใจว่าเกี่ยวกับ MSS


LinkedIn

By: lunatic on 1 March 2012 - 11:06 #389725
lunatic's picture

ลองทำตามที่แนะนำแล้ว ดันส่งข้อมูลสำเร็จ

เลยลองส่งข้อมูลขนาด 1000 byte เลยก็ยังสำเร็จอีก

[ภาพประกอบ]

http://postimage.org/image/xdu5k4nvh/

  1. เป็นรอบที่ลองส่ง byte ไป (gen ข้อมูลมั่วๆเอา)

  2. เป็นรอบที่ทำงานตามปกติ

สังเกตว่า 1. ส่งข้อมูลได้

แต่ 2. ส่งไม่สำเร็จ