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 1Đạ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 2MỤ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 3LỜ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 4CHƯƠ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 5CHƯƠ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
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
Giải quyết lỗi
bit
Gởi kèm theo thông tin kiểm tra lỗi
Kiểm tra có xảy ra lỗi bit
Sử dụng các phương pháp kiểm tra lỗi
Hành động khi xảy ra lỗi bit
Checksum, parity checkbit, CRC, …
Báo về bên gởi
Giải quyết
mất gói
Định nghĩa trường hợp mất gói
Gởi tín hiệu báo
Chờ nhận 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
Trang 6 RDT2.1 bên nhận xử lí lỗi ACK/NAK
Trang 72.3 Hiện thực code bang c#
Rdt rerver:
namespace RDT_Server
{
publicpartialclassForm1 : Form
{
privatesegment[] segments = newsegment[10];//mảng 10 phần tử cho segment
privateint index = -1; //Index
public Form1()
{
InitializeComponent();
}
privatevoid Serve()
{
try
{
int recv;//Number
int packet_number;//Packet Number
bool work = true;//Biến Boolean cho vòng lặp while
IPEndPoint ipep = newIPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
Socket newsock = newSocket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Trang 8byte[] data;
foreach (Control var inthis.Controls)//Check Controls trong Form
{
for (int i = 1; i < 11; i++)
{
if (var isLabel && (var.Name == "label" + i.ToString()))
{
var.BackColor = Color.Silver;
}
}
}
while (work)
{
Socket client = newsock.Accept();
data = newbyte[4];
recv = client.Receive(data);
byte[] packet_tag = newbyte[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 = newbyte[3];
data = Encoding.ASCII.GetBytes("ACK");
client.Send(data, data.Length, SocketFlags.None);
foreach (Control var inthis.Controls)//Checks tất cả controls trong Form
{
if (var isLabel && (var.Name == "label" + segments[packet_number -
1].packet_pos.ToString()))
Trang 9{
var.BackColor = Color.RoyalBlue; }
}
}
else {
segments[packet_number - 1].reached_dest = false; segments[packet_number - 1].packet_pos = packet_number; data = newbyte[4]; data = Encoding.ASCII.GetBytes("NACK"); client.Send(data, data.Length, SocketFlags.None); foreach (Control var inthis.Controls)//Checks tất cả controls trong Form {
if (var isLabel && (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 }
}
privatevoid btnServe_Click(object sender, EventArgs e) {
Thread ta = newThread(newThreadStart(Serve)); ta.Start(); lblSrvState.Text = "Server ĐANG hoạt động!"; }
privatevoid 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 10DownloadEnable = true;
}
}
if (index >= 10 && DownloadEnable)
{
SaveFileDialog sfd = newSaveFileDialog();
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 = newFileStream(sfd.FileName, FileMode.Create);
StreamWriter swtr = newStreamWriter(fs, Encoding.GetEncoding(
"ISO-8859-9"));//Stream Writer sử dụng Turkish Encoding
byte[] receivedData = newbyte[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 = newProcess();
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);
}
}
privatevoid Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
segments[i] = newsegment();
segments[i].data = newbyte[1];
}
foreach (Control var inthis.Controls)
{
if (var isLabel && var.Name.StartsWith("label"))
{
var.Text = var.Text.Replace("label", "Segment#");
Trang 11}
}
ToolTip tipServe = newToolTip();
tipServe.IsBalloon = true;
tipServe.ToolTipTitle = "RDT Simulation";
tipServe.ToolTipIcon = ToolTipIcon.Info;
tipServe.SetToolTip(btnServe, "Click to Start Simulation");
ToolTip tipDownload = newToolTip();
tipDownload.IsBalloon = true;
tipDownload.ToolTipTitle = "RDT Simulation";
tipDownload.ToolTipIcon = ToolTipIcon.Info;
Random random = newRandom();
}
privatevoid numProbability_ValueChanged(object sender, EventArgs e)
{
Random random = newRandom();
}
}
classsegment
{
privatebyte[] Data;
publicbyte[] data
{
get { return Data; }
set { Data = value; }
}
privatebool Reached_dest;
publicbool reached_dest
{
get { return Reached_dest; }
set { Reached_dest = value; }
}
privateint Packet_pos;
publicint packet_pos
{
get { return Packet_pos; }
set { Packet_pos = value; }
}
public segment()
{
packet_pos = 0;
data = newbyte[1];
}
Trang 12}
classProbability {
privateint index; privatebool used; public Probability() {
used = false; index = -1; }
publicbool Used {
get { return used; } set { used = value; } }
publicint Index {
get { return index; } set { index = value; } }
}
} Rdt client: Hàm tải file lên: privatevoid btnFileUpload_Click(object sender, EventArgs e) {
index = 0; for (int i = 0; i < 10; i++) {
segments[i] = newsegment(); segments[i].data = newbyte[1]; }
OpenFileDialog ofd = newOpenFileDialog(); ofd.Title = "Select a text file to Send"; ofd.Filter = "Text Files (*.txt)|*.txt"; if (ofd.ShowDialog(this) == DialogResult.OK) {
FileStream fs = newFileStream(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 inthis.Controls) {
if (var isLabel && var.Name.StartsWith("label")) {
var.BackColor = Color.PaleGreen; }
}
Trang 13fs.Close();
}
}
Hàm gửi file:
privatevoid 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 = newThread[1];
threads[0] = newThread(newThreadStart(SendSegment));
threads[0].Start();
Thread.Sleep(0);
}
}
if (index == 0 && firstSend)
{
Thread[] threads = newThread[1];
threads[0] = newThread(newThreadStart(SendSegment));
threads[0].Start();
Thread.Sleep(0);
Trang 14}
}
Trang 15CHƯƠ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 162 http://data.tailieuhoctap.vn/books/cong-nghe-thong-tin/quan-tri-mang/file_goc_775131.pdf
3 https://www.youtube.com/watch?v=9z-BSRnxjHU