Tải bản đầy đủ (.docx) (16 trang)

XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG CÁC CHỨC NĂNG CỦA RDT 2.1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (321.54 KB, 16 trang )

Đạ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: 1. Đặng Thái Hòa -12520596
2. Mạch Văn Nguyên -12520881
3. Nguyễn Văn Nhân -12520883
4. Nguyễn Thanh Tâm -12520909

Môn học: Lập trình mạng căn bản
Lớp: NT106F12

TP.Hồ Chí Minh, Tháng 1 năm 2015
Trang 1 / 16


MỤC LỤC
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

Trang 2 / 16


LỜI MỞ ĐẦU
Ngày nay, với sự phát triển của khoa học kỹ thuật, máy tính trở nên phổ biến
với mọi người, nó mang lại cho con người khả năng to lớn và làm được những công
việc phi thường. Máy tính ra đời không chỉ là công cụ giải phóng sức lao động, hỗ trợ
tối đa trong sản xuất mà còn là phương tiện học tập, giải trí bổ ích trong đời sống của
mọi người. Sự phát triển của máy tính cũng như công nghệ thông tin là phương tiện
tiếp cận nhanh nhất đến các thành tựu của khoa học kỹ thuật. Điều đó sẽ mang lại
những thành tựu to lớn cho sự phát triển của kinh tế đất nước.
Sức mạnh của máy tính được tăng lên nhiều lần khi các máy tính được kết nối

thành một mạng máy tính. Là cơ sở hạ tầng cho phép truyền dữ liệu, trao đổi thông tin
với tạo nên một môi trường giao tiếp. Khi dữ liệu được truyền đi từ máy gửi đến máy
nhận để biết được những gói tin nào tới đích, gói tin nào chưa tới hay gói tin tới mà bị
hỏng thì với giao thức RDT2.1 sẽ giải quyết được những vấn đề này để việc truyền dữ
liệu được một cách tin cậy.

Trang 3 / 16


CHƯƠNG I: TỔNG QUAN ĐỀ TÀI
1.1. Lý do chọn đề tài
 Lý Do Khách Quan
Ngày nay, trên thế giới,với sự phát triển đến chóng mặt của công nghệ thông tin
thì những tiện ích như 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 và có mặt trong hầu hết các lĩnh vực của đời sống.
Câu hỏi đặt ra là làm thế nào để trao đổi được những dữ liệu, thông tin một
cách nhanh chóng, đảm bảo độ tin cậy, chính xác và hiệu quả cho người sử dụng. Để
giải quyết vấn đề trên, nhóm em đã chọn đề tài này.
 Lý Do Chủ Quan
Nhóm thực hiện đề tài này nhằm mục đích tìm hiểu rõ hơn và có thể hiện thực
được cách truyền dữ liệu tin cậy như thế nào.

1.2. Phạm vi đề tài
 Điều khiển ACK/NAK
- Khi máy nhận nhận được gói tin thì sẽ báo về cho máy gửi ACK là đã nhận.
- Khi máy nhận nhận được gói tin nhưng gói tin bị hỏng sẽ báo về 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 của đề tài
 Hiện thực RDT2.1


1.4. Kết quả dự kiến đạt được
 Triển khai thành công RDT2.1 trên C#

Trang 4 / 16


CHƯƠNG II: CƠ SỞ LÝ THUYẾT
2.1. Tổng quan RDT
2.1.1. Nguyên tắc truyền dữ liệu đáng tin cậy

Giải quyết lỗi
bit

Giải quyết
mất gói

Bên gởi
Gởi kèm theo thông tin
kiểm tra lỗi
Sử dụng các phương pháp
kiểm tra lỗi
Checksum, parity checkbit,
CRC, …
Định nghĩa trường hợp mất
gói
Chờ nhận tín hiệu báo

Bên nhận
Kiểm tra có xảy ra lỗi bit

Hành động khi xảy ra lỗi bit
Báo về 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 khi phát hiện
mất gói
2.1.2. Ưu điểm so với các phiên bản trước

RDT1.0: truyền dữ liệu trên một kênh tin cậy.
- Không có bít lỗi
- Không mất mát gói
RDT2.0: kênh với các lỗi.
- Sử dụng checksum để kiểm tra lỗi.
- Sử dung ACKs/NAKs thong báo bên nhận những gói đã nhận mà
gói lỗi.
- Khó khăn: khi ack/nak bị hỏng thì giải quyết như thế nào.
RDT2.1: với có khả xữ lý các ack/nak bị hỏng mà RDT2.0 không xử
lý được. Như vậy với RDT2.1 tối ưu và tin cậy hơn so vói các phiên
bản trên.
2.2. Mô hình RDT2.1

 RDT2.1 bên gửi xử lí lỗi ACK/NAK
Trang 5 / 16


 RDT2.1 bên nhận xử lí lỗi ACK/NAK

Trang 6 / 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 7 / 16



byte[] data;
foreach (Control var in this.Controls)//Check Controls trong 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 cả controls trong Form
{
if (var is Label && (var.Name == "label" + segments[packet_number 1].packet_pos.ToString()))

Trang 8 / 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 cả controls trong 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 9 / 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 > 0 && index <= 10)
{
if (index == 1)
{
for (int i = 0; i < index; i++)
{
if (segments[i].packet_ack == false)
{
for (int j = 0; j < index; j++)
{
SendSegments(j + 1);//gửi lại Segments
}
firstSend = false;
break;
}
}
}
else
{
for (int i = index - 1; i < index; i++)
{
if (segments[i].packet_ack == false)
{
for (int j = index - 1; j < index; j++)

{
SendSegments(j + 1);//gửi Segments
}
firstSend = false;
break;
}
}
}
if (firstSend)
{
Thread[] threads = new Thread[1];
threads[0] = new Thread(new ThreadStart(SendSegment));
threads[0].Start();
Thread.Sleep(0);
}
}
if (index == 0 && firstSend)
{
Thread[] threads = new Thread[1];
threads[0] = new Thread(new ThreadStart(SendSegment));
threads[0].Start();
Thread.Sleep(0);

Trang 13 / 16


}
}

Trang 14 / 16



CHƯƠNG III: KẾT LUẬN
 Kết quả đạt được:
Đồ án hoàn thành giúp người đọc có cái nhìn khái quát hơn về quá trình
truyền dữ liệu trên mạng và hiểu rõ quá trình truyền tin tin cậy như thế nào.

 Kết luận:
Với RDT2.1 có thể giúp người lập trình lập trình những ứng dụng mạng có
thể truyền tin tin cậy và đảm bảo hiệu quả.

TÀI LIỆU THAM KHẢO
1. Slide môn nhập môn mạng máy tinh (uit)_chương 3
Trang 15 / 16


2.
3.

/> />
Trang 16 / 16



×