LỜI MỞ ĐẦU 3 CHƯƠNG I: TỔNG QUAN ĐỀ TÀI 4 1.1. Lý do chọn đề tài 4 1.2. Phạm vi đề tài 4 1.3. Yêu cầu của đề tài 4 1.4. Kết quả dự kiến đạt được 4 CHƯƠNG II: CƠ SỞ LÝ THUYẾT 5 2.1. Tổng quan RDT 5 2.1.1. Nguyên tắc truyền dữ liệu đáng tin cậy 5 2.1.2. Ưu điểm so với các phiên bản trước 5 2.2. Mô hình RDT2.1 5 2.3. Hiện thực code bang c 7 CHƯƠNG III: KẾT LUẬN 15 TÀI LIỆU THAM KHẢO 16
Đại Học Quốc Gia TP.HCM Trường Đại Học Công Nghệ Thơng Tin Khoa Mạng Máy Tính Và Truyền Thơng BÁO CÁO ĐỒ ÁN XÂY DỰNG CHƯƠNG TRÌNH MƠ PHỎNG CÁC CHỨC NĂNG CỦA RDT 2.1 GV hướng dẫn: ThS Nguyễn Quang Minh SV thực hiện: Đặng Thái Hòa -12520596 Mạch Văn Nguyên -12520881 Nguyễn Văn Nhân -12520883 Nguyễn Thanh Tâm -12520909 Mơn học: Lập trình mạng Lớp: NT106F12 TP.Hồ Chí Minh, Tháng năm 2015 Trang / 16 MỤC LỤC LỜI MỞ ĐẦU .3 CHƯƠNG I: TỔNG QUAN ĐỀ TÀI .4 1.1 Lý chọn đề tài 1.2 Phạm vi đề tài .4 1.3 Yêu cầu đề tài 1.4 Kết dự kiến đạt .4 CHƯƠNG II: CƠ SỞ LÝ THUYẾT 2.1 Tổng quan RDT 2.1.1 Nguyên tắc truyền liệu đáng tin cậy .5 2.1.2 Ưu điểm so với phiên trước 2.2 Mơ hình RDT2.1 .5 2.3 Hiện thực code bang c# .7 CHƯƠNG III: KẾT LUẬN .15 TÀI LIỆU THAM KHẢO .16 Trang / 16 LỜI MỞ ĐẦU Ngày nay, với phát triển khoa học kỹ thuật, máy tính trở nên phổ biến với người, mang lại cho người khả to lớn làm cơng việc phi thường Máy tính đời khơng cơng cụ giải phóng sức lao động, hỗ trợ tối đa sản xuất mà phương tiện học tập, giải trí bổ ích đời sống người Sự phát triển máy tính cơng nghệ thơng tin phương tiện tiếp cận nhanh đến thành tựu khoa học kỹ thuật Điều mang lại thành tựu to lớn cho phát triển kinh tế đất nước Sức mạnh máy tính tăng lên nhiều lần máy tính kết nối thành mạng máy tính Là sở hạ tầng cho phép truyền liệu, trao đổi thông tin với tạo nên môi trường giao tiếp Khi liệu truyền từ máy gửi đến máy nhận để biết gói tin tới đích, gói tin chưa tới hay gói tin tới mà bị hỏng với giao thức RDT2.1 giải vấn đề để việc truyền liệu cách tin cậy Trang / 16 CHƯƠNG I: TỔNG QUAN ĐỀ TÀI 1.1 Lý chọn đề tài Lý Do Khách Quan Ngày nay, giới,với phát triển đến chóng mặt cơng nghệ thơng tin tiện ích trao đổi, tìm kiếm thơng tin, giải trí ( nghe nhạc, xem fim, chơi game…) dần trở nên phổ biến có mặt hầu hết lĩnh vực đời sống Câu hỏi đặt làm để trao đổi liệu, thơng tin cách nhanh chóng, đảm bảo độ tin cậy, xác hiệu cho người sử dụng Để giải vấn đề trên, nhóm em chọn đề tài Lý Do Chủ Quan Nhóm thực đề tài nhằm mục đích tìm hiểu rõ thực cách truyền liệu tin cậy 1.2 Phạm vi đề tài Điều khiển ACK/NAK - Khi máy nhận nhận gói tin báo cho máy gửi ACK nhận - Khi máy nhận nhận gói tin gói tin bị hỏng báo cho máy gửi NAK để máy gửi gửi lại gói tin hỏng 1.3 Yêu cầu đề tài Hiện thực RDT2.1 1.4 Kết dự kiến đạt Triển khai thành công RDT2.1 C# Trang / 16 CHƯƠNG II: CƠ SỞ LÝ THUYẾT 2.1 Tổng quan RDT 2.1.1 Nguyên tắc truyền liệu đáng tin cậy Giải lỗi bit Giải gói Bên gởi Gởi kèm theo thông tin kiểm tra lỗi Sử dụng phương pháp kiểm tra lỗi Checksum, parity checkbit, CRC, … Định nghĩa trường hợp gói Chờ nhận tín hiệu báo Bên nhận Kiểm tra có xảy lỗi bit Hành động xảy lỗi bit Báo bên gởi Gởi tín hiệu báo Gởi gói tin báo hiệu ACK, NAK Hành động phát gói 2.1.2 Ưu điểm so với phiên trước RDT1.0: truyền liệu kênh tin cậy - Khơng có bít lỗi - Khơng mát gói RDT2.0: kênh với lỗi - Sử dụng checksum để kiểm tra lỗi - Sử dung ACKs/NAKs thong báo bên nhận gói nhận mà gói lỗi - Khó khăn: ack/nak bị hỏng giải RDT2.1: với có khả xữ lý ack/nak bị hỏng mà RDT2.0 không xử lý Như với RDT2.1 tối ưu tin cậy so vói phiên 2.2 Mơ hình RDT2.1 RDT2.1 bên gửi xử lí lỗi ACK/NAK Trang / 16 RDT2.1 bên nhận xử lí lỗi ACK/NAK Trang / 16 2.3 Hiện thực code bang c# Rdt rerver: namespace RDT_Server { public partial class Form1 : Form { private segment[] segments = new segment[10];//mảng 10 phần tử cho segment private int index = -1; //Index public Form1() { InitializeComponent(); } private void Serve() { try { int recv;//Number int packet_number;//Packet Number bool work = true;//Biến Boolean cho vòng lặp while IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Trang / 16 byte[] data; foreach (Control var in this.Controls)//Check Controls Form { for (int i = 1; i < 11; i++) { if (var is Label && (var.Name == "label" + i.ToString())) { var.BackColor = Color.Silver; } } } while (work) { Socket client = newsock.Accept(); data = new byte[4]; recv = client.Receive(data); byte[] packet_tag = new byte[3]; packet_tag[0] = data[1]; packet_tag[1] = data[2]; packet_tag[2] = data[3]; packet_number = Convert.ToInt16(Encoding.ASCII.GetString(packet_tag, 0, 2)); int corrupted = Convert.ToInt16(Encoding.ASCII.GetString(packet_tag, 2, 1)); index = packet_number; if (packet_number >= 15) { work = false; } segments[packet_number - 1].data[0] = data[0]; if (corrupted == 0)//0 :không lỗi 1:lỗi { segments[packet_number - 1].reached_dest = true;//nhận segment segments[packet_number - 1].packet_pos = packet_number; //không lỗi :gửi ACK data = new byte[3]; data = Encoding.ASCII.GetBytes("ACK"); client.Send(data, data.Length, SocketFlags.None); foreach (Control var in this.Controls)//Checks tất controls Form { if (var is Label && (var.Name == "label" + segments[packet_number 1].packet_pos.ToString())) Trang / 16 { } var.BackColor = Color.RoyalBlue; } } else { segments[packet_number - 1].reached_dest = false; segments[packet_number - 1].packet_pos = packet_number; data = new byte[4]; data = Encoding.ASCII.GetBytes("NACK"); client.Send(data, data.Length, SocketFlags.None); foreach (Control var in this.Controls)//Checks tất controls Form { if (var is Label && (var.Name == "label" + segments[packet_number 1].packet_pos.ToString())) { var.BackColor = Color.Crimson; } } } client.Close(); } } catch (Exception ex) { MessageBox.Show(ex.Message,"Exception",MessageBoxButtons.OK,MessageBoxIcon.Error);//Exceptio n Message is shown } } private void btnServe_Click(object sender, EventArgs e) { Thread ta = new Thread(new ThreadStart(Serve)); ta.Start(); lblSrvState.Text = "Server ĐANG hoạt động!"; } private void btnDownload_Click(object sender, EventArgs e) { try { bool DownloadEnable = false; for (int i = 0; i < 10; i++) { if (segments[i].reached_dest == false)//Check segments { DownloadEnable = false; break; } else { Trang / 16 DownloadEnable = true; } } if (index >= 10 && DownloadEnable) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Title = "Select a text file"; sfd.Filter = "Text Files (*.txt)|*.txt"; if (sfd.ShowDialog(this) == DialogResult.OK)//check ghi tên file chưa { FileStream fs = new FileStream(sfd.FileName, FileMode.Create); StreamWriter swtr = new StreamWriter(fs, Encoding.GetEncoding("ISO-88599"));//Stream Writer sử dụng Turkish Encoding byte[] receivedData = new byte[10]; for (int i = 0; i < 10; i++) { receivedData[i] = segments[i].data[0]; } string words = Encoding.ASCII.GetString(receivedData, 0, 10); swtr.WriteLine(words); swtr.Flush(); fs.Close(); Process process = new Process(); process.StartInfo.FileName = sfd.FileName; process.StartInfo.Verb = "Open"; process.StartInfo.CreateNoWindow = true; process.Start(); } } else { MessageBox.Show("No File Received or File is Corrupted! ", "Failure"); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { segments[i] = new segment(); segments[i].data = new byte[1]; } foreach (Control var in this.Controls) { if (var is Label && var.Name.StartsWith("label")) { var.Text = var.Text.Replace("label", "Segment#"); Trang 10 / 16 } } ToolTip tipServe = new ToolTip(); tipServe.IsBalloon = true; tipServe.ToolTipTitle = "RDT Simulation"; tipServe.ToolTipIcon = ToolTipIcon.Info; tipServe.SetToolTip(btnServe, "Click to Start Simulation"); ToolTip tipDownload = new ToolTip(); tipDownload.IsBalloon = true; tipDownload.ToolTipTitle = "RDT Simulation"; tipDownload.ToolTipIcon = ToolTipIcon.Info; Random random = new Random(); } private void numProbability_ValueChanged(object sender, EventArgs e) { Random random = new Random(); } } class segment { private byte[] Data; public byte[] data { get { return Data; } set { Data = value; } } private bool Reached_dest; public bool reached_dest { get { return Reached_dest; } set { Reached_dest = value; } } private int Packet_pos; public int packet_pos { get { return Packet_pos; } set { Packet_pos = value; } } public segment() { packet_pos = 0; data = new byte[1]; } Trang 11 / 16 } class Probability { private int index; private bool used; public Probability() { used = false; index = -1; } public bool Used { get { return used; } set { used = value; } } public int Index { get { return index; } set { index = value; } } } } Rdt client: Hàm tải file lên: private void btnFileUpload_Click(object sender, EventArgs e) { index = 0; for (int i = 0; i < 10; i++) { segments[i] = new segment(); segments[i].data = new byte[1]; } OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Select a text file to Send"; ofd.Filter = "Text Files (*.txt)|*.txt"; if (ofd.ShowDialog(this) == DialogResult.OK) { FileStream fs = new FileStream(ofd.FileName, FileMode.Open); file = ReadFully(fs, 10); for (int i = 0; i < 10; i++) { segments[i].data[0] = file[i]; } btnConnect.Enabled = true; foreach (Control var in this.Controls) { if (var is Label && var.Name.StartsWith("label")) { var.BackColor = Color.PaleGreen; } } Trang 12 / 16 fs.Close(); } } Hàm gửi file: private void btnConnect_Click(object sender, EventArgs e) { bool firstSend = true; if (index > && index