โปรโตคอลการขนส่งสองรายการที่ใช้ในการถ่ายโอนไฟล์ ได้แก่: TCP และ UDP UDP เป็นโปรโตคอลที่ไม่น่าเชื่อถือ ในขณะที่ TCP ให้ความน่าเชื่อถือ การควบคุมการไหล และการควบคุมความแออัด แต่มีขั้นตอนการสร้างการเชื่อมต่อที่ชัดเจน ซึ่งบางแอปพลิเคชันอาจไม่ต้องการ เป้าหมายของโปรเจ็กต์นี้คือการออกแบบและใช้งานแอปพลิเคชันถ่ายโอนไฟล์ซึ่งมีฟีเจอร์ที่ดีทั้งหมดของ TCP โดยไม่ต้องมีขั้นตอนการสร้างการเชื่อมต่อ
เซิร์ฟเวอร์ UDP และไคลเอนต์ใช้รูปแบบส่วนหัวต่อไปนี้:
เซิร์ฟเวอร์ได้รับการร้องขอไฟล์จากไคลเอนต์ แยกชื่อไฟล์ออกจากคำขอและรับเนื้อหาของไฟล์ในบัฟเฟอร์ จากนั้นจะแบ่งไฟล์ออกเป็นส่วนๆ ขนาด 1,450 ไบต์ตามที่ส่วนหัวรองรับ
มีสองขนาดหน้าต่างที่ต้องพิจารณา:
เซิร์ฟเวอร์เริ่มส่งเซ็กเมนต์ไฟล์จนถึงขนาดหน้าต่างความแออัดขั้นต่ำและขนาดหน้าต่างที่โฆษณา หลังจากส่งเซ็กเมนต์ทั้งหมดในหน้าต่างแล้ว ระบบจะรอรับการตอบรับ เมื่อได้รับการตอบรับสำหรับหมายเลขลำดับที่น้อยกว่าหมายเลขลำดับถัดไปที่จะส่ง นั่นหมายความว่าบางเซ็กเมนต์ก่อนหน้าไม่ได้รับการรับอย่างถูกต้อง และเซิร์ฟเวอร์ยอมรับการตอบรับ 3 รายการซ้ำจากไคลเอนต์ จากนั้นจะตั้งค่าหมายเลขลำดับถัดไปตามการตอบรับที่ได้รับ หลังจากได้รับการตอบรับสะสมแล้ว ระบบจะส่งเซ็กเมนต์ต่อไปในหน้าต่างถัดไป เมื่อได้รับการตอบรับซ้ำ เซิร์ฟเวอร์จะเริ่มส่งเซ็กเมนต์จากแพ็กเก็ตที่ไม่ได้รับอย่างถูกต้อง
ใช้อัลกอริทึมของ Jacobson/Karel สำหรับการประมาณเวลาไปกลับ (RTT) สำหรับแพ็กเก็ตที่ไคลเอ็นต์จะได้รับและการตอบรับที่เซิร์ฟเวอร์ได้รับ หากเซิร์ฟเวอร์ไม่ได้รับการตอบรับภายใน RTT เซิร์ฟเวอร์จะส่งแพ็กเก็ตเหล่านั้นอีกครั้ง
รหัสหลอก:
Estimated_RTT = (1-α) Estimated RTT + (α) Sample_RTT
In the original TCP Specification, α=.0125
Jacobson/Karels included a variation component to the calculation for the Estimated_RTT
Estimated_RTT = Estimated_RTT + δ (Sample_RTT-Estimated_RTT)
Deviation = Deviation + δ (|Sample_RTT- Estimated_RTT|- Deviation)
Timeout = μ * Estimated_RTT + φ * Deviation
Typically φ=4, μ = 1, δ is between 0 and 1
เซิร์ฟเวอร์เริ่มต้นด้วยการส่ง 1 ส่วน จากนั้นดำเนินการควบคุมความแออัด 2 ระยะ:
เริ่มต้นช้า: ขนาดเซ็กเมนต์จะเพิ่มขึ้นแบบทวีคูณจนกว่าผู้รับจะได้รับการยอมรับอย่างถูกต้องภายในระยะหมดเวลา และขนาดหน้าต่างความแออัดน้อยกว่า ssthresh ซึ่งตั้งค่าเป็น 64000 ไบต์
การหลีกเลี่ยงความแออัด: เมื่อขนาดหน้าต่างความแออัดมากกว่าหรือเท่ากับ ssthresh ขนาดหน้าต่างความแออัดจะเพิ่มขึ้นเชิงเส้น 1 ขนาดเซ็กเมนต์
หมดเวลา: คำนวณโดยใช้อัลกอริทึมของ Jacobson/Karel ที่ระบุข้างต้น เมื่อเกิดการหมดเวลา ssthresh จะถูกตั้งค่าเป็นครึ่งหนึ่งของค่าของหน้าต่างความแออัด และหน้าต่างความแออัดจะถูกรีเซ็ตเป็น 1 ขนาดเซ็กเมนต์
vagrant up
สิ่งนี้จะบู๊ตทั้งเครื่องเซิร์ฟเวอร์และเครื่องไคลเอนต์
vagrant ssh reliableUDPServer
vagrant ssh reliableUDPClient
make
./Server port advertised_window
เซิร์ฟเวอร์ยอมรับอาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้:
port: หมายเลขพอร์ตที่จะใช้ในการสื่อสาร
โฆษณา_หน้าต่าง: จำนวนไบต์ที่เซิร์ฟเวอร์ได้รับอนุญาตให้ส่งก่อนที่จะรอการตอบรับ
./Client server_host_name port file_name advertised_window
ไคลเอนต์ยอมรับอาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้:
พอร์ตและadverted_window: เช่นเดียวกับของเซิร์ฟเวอร์
server_host_name: ชื่อโฮสต์ของเซิร์ฟเวอร์
file_name: ชื่อของไฟล์ที่ลูกค้าร้องขอ
เมื่อโค้ดรันสำเร็จแล้ว คุณจะพบไฟล์ที่ไคลเอนต์ร้องขอในโฟลเดอร์ที่เชื่อถือได้UDPClient
เครือข่ายคอมพิวเตอร์-บน-ล่าง-แนวทาง