You are on page 1of 5

BÁO CÁO THỰC TẬP OPTION1

TCP Socket & UDP Socket

Sinh Viên Thực Tập:Vũ Mậu Sơn


Mục lục
I. TCP Socket: ................................................................................................................................. 3
I.1. Đặc điểm của TCP ................................................................................................................ 3
I.2. Tiến trình bắt tay 3 bước: ...................................................................................................... 3
I.3. TCP Socket: .......................................................................................................................... 3
II. UDP Socket: ............................................................................................................................... 4
II.1. Đặc điểm của UDP .............................................................................................................. 4
II.2. UDP Socket: ........................................................................................................................ 5
III. Bài Code................................................................................................................................... 5
I. TCP Socket:
I.1. Đặc điểm của TCP:
 TCP (Transmission Control Protocol – Giao thức kiểm soát đường truyền) là giao thức
truyền tải hướng kết nối (connection-oriented), nghĩa là phải thực hiện thiết lập kết nối với
Server trước khi thực hiện truyền dữ liệu. Tiến trình thiết lập kết nối ở TCP được gọi là
tiến trình bắt tay 3 bước (three-way handshake).
 Cung cấp cơ chế báo nhận (Acknowledgement): Khi A gửi dữ liệu cho B, B nhận được thì
gửi gói tin cho A xác nhận là đã nhận.
 Cung cấp cơ chế đánh số thứ tự gói tin (sequencing) cho các đơn vị dữ liệu được truyền,
sử dụng để ráp các gói tin chính xác ở điểm nhận và loại bỏ gói tin trùng lặp.
 Có các cơ chế điều khiển luồng thích hợp (flow control) để tránh tắc nghẽn xảy ra.
 Hỗ trợ cơ chế Full-duplex (truyền và nhận dữ liệu cùng một lúc).
 Phục hồi dữ liệu bị mất trên đường truyền (A gửi B mà không thấy xác nhận sẽ gửi lại).

I.2. Tiến trình bắt tay 3 bước:

Bước 1: Client (bên chủ động) gửi đến Server một TCP Segment yêu cầu nối kết, trong đó chứa
số thứ tự khởi đầu mà nó sẽ dùng (Flags = SYN, SequenceNum = x).
Bước 2: Server trả lời cho Client bằng một TCP Segment khác, trong đó báo nhận rằng nó sẵn
sàng nhận các Byte dữ liệu bắt đầu từ số thứ tự x+1 (Flags = ACK, Ack = x + 1) và cũng báo
rằng số thứ tự khởi đầu của Server là y (Flags = SYN, SequenceNum = y).
Bước 3: Cuối cùng Client báo cho Server biết, nó đã biết số thứ tự khởi đầu của server là y
(Flags = ACK, Ack = y+1).
I.3. TCP Socket:
Phía Client:
Hàm connect():
 Cú pháp:
int connect(int sockfd, struct sockaddr *addr, socklen_t addrlen);

 Chức năng: Kết nối Socket sockfd đến địa chỉ trong addr.
 Giá trị trả về: 0 nếu thành công, -1 nếu có lỗi xảy ra.
Phía Server:
Hàm listen():
 Cú pháp:
int listen(int sockfd, int backlog);

 Chức năng: Đặt Socket ở chế độ chờ kết nối tới.


 Giá trị trả về: 0 nếu thành công, -1 nếu có lỗi xảy ra.

Tham số backlog là số kết nối đến tối đa đang đợi để được chấp nhận. Từ Linux 5.4, giá trị
backlog tối đa là 4096.
Hàm accept():

 Cú pháp:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

 Chức năng: Hàm này lấy kết nối đầu tiên trong hàng đợi từ sockfd (đang listen), tạo 1
Socket mới và dùng nó để giao tiếp với kết nối mới chấp nhận.
 Giá trị trả về: FD của Socket mới nếu thành công, -1 nếu xảy ra lỗi.

Trong hàm này, địa chỉ trong addr là địa chỉ của Client đang kết nối tới. Socket cũ vẫn ở chế
độ listen.

Sau khi Server đã chấp nhận kết nối, hai bên có thể gửi và nhận dữ liệu qua các hàm read,
write, send, recv.

II. UDP Socket:


II.1. Đặc điểm của UDP:
 UDP (User Datagram Protocol – Giao thức gói dữ liệu người dùng) là giao thức truyền tải
hướng không kết nối (connectionless). Nó sẽ không thực hiện thao tác xây dựng kết nối
trước khi truyền dữ liệu mà thực hiện truyền ngay lập tức khi có dữ liệu cần truyền nên có
khả năng truyền tải rất nhanh cho dữ liệu của lớp ứng dụng.
 Không đảm bảo tính tin cậy khi truyền dữ liệu và không có cơ chế phục hồi dữ liệu (nó
không quan tâm gói tin có đến đích hay không, không biết gói tin có bị mất mát trên đường
đi hay không) nên dễ bị lỗi.
 Không thực hiện các biện pháp đánh số thứ tự cho các đơn vị dữ liệu được truyền.
 Nhanh và hiệu quả hơn đối với các dữ liệu có kích thước nhỏ và yêu cầu khắt khe về thời
gian.
 Không có cơ chế điều khiển luồng dữ liệu nên có thể bên gửi sẽ làm ngập bên nhận.

II.2. UDP Socket:


Các hàm gửi và nhận dữ liệu:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,


struct sockaddr *from, socklen_t *fromlen);

Do bản chất của UDP là không nối kết nên sẽ không có các hàm để thiết lập kết nối. Thay
vào đó, ta phải chỉ rõ địa chỉ IP và cổng của máy đích trong hàm sendto().

III. Bài Code:


Với mỗi giao thức (TCP và UDP) có 2 File tương ứng cho Server và Client. Trước tiên, ta
cần biên dịch 4 File mã nguồn này bằng gcc hoặc bất kì bộ biên dịch C khác. Tiếp theo, khởi chạy
Server và Client tương ứng với giao thức muốn sử dụng. Sau đó, nhập cổng lắng nghe bên phía
Server và địa chỉ IP, cổng bên phía Client. Quá trình truyền File sẽ bắt đầu ngay sau khi Client có
đủ thông tin về Server.

Ưu điểm:
 Chương trình đã chạy đúng chức năng: truyền 1 File từ Client đến Server.
 Hiển thị thông tin của Client (địa chỉ IP và cổng), hiển thị số Byte được truyền
thành công.
 Tận dụng hiệu quả bộ nhớ và đường truyền: Nạp dữ liệu đầy bộ nhớ tạm rồi mới
truyền gói tin.
 Server có kiểm tra xem có File bị trùng tên mặc định không. Nếu có, Server tạo
File mới, tránh làm thay đổi dữ liệu trên File đã tồn tại.
Nhược điểm:
 Cả Server và Client đều sử dụng tên File mặc định, chưa cho phép người dùng tự
nhập tên File.
 Trong quá trình đọc/ghi File từ bộ nhớ đệm, chương trình không kiểm tra xem dữ
liệu có bị lỗi hay không.

You might also like