bc ltm de in
DESCRIPTION
báo cáo lập trình mạng, dùng winsock, tạo server và clientTRANSCRIPT
![Page 1: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/1.jpg)
Báo cáo bài tập lớn: Lập Trình Mạng
FTP SERVER
![Page 2: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/2.jpg)
Phân công công việc
Phần I:Tổng quan về họ giao thức TCP/IP
Trẩn Đình Tuấn
Phần II A.Giới thiệu ; B.Khái quát Trẩn Đình Tuấn C.Phương thức truyền dữ liệu Nguyễn Nam Tiến D.Phương thức truyền file Nguyễn Ngọc Cao E.Thông số kỹ thuật Vũ Quốc NgọcPhần III.Cài đặt bằng VS C++ Cả nhóm
![Page 3: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/3.jpg)
ContentsPHẦN I: TỔNG QUAN VỀ HỌ GIAO THỨC TCP/IP..........................................4
1.Giới thiệu.....................................................................................................42.Cấu trúc phân tầng của TCP........................................................................43.Họ giao thức TCP........................................................................................54.IPv4..............................................................................................................6
PHẦN II: FTP.........................................................................................................10A.Giới thiệu..................................................................................................10B.Khái quát...................................................................................................10
1.Một số thuật ngữ..............................................................................102.Mô hình FTP....................................................................................13
C.Phương thức truyền dữ liệu......................................................................141.Dữ liệu đại diện và lưu trữ...............................................................14
a)Kiểu dữ liệu...........................................................................15b)Cấu trúc dữ liệu.....................................................................17
2.Thiết lập kết nối dữ liệu...................................................................183.Quản lí kết nối dữ liệu......................................................................194.Chế độ truyền...................................................................................19
a)Stream mode..........................................................................20b)Block mode...........................................................................20c)Compress mode.....................................................................21
5.Khôi phục lỗi và khởi tạo lại............................................................22D.Phương thức truyền file............................................................................23
1.FTP command..................................................................................23a)Lệnh truy cập điều khiển.......................................................23b)Cấu hình tham số khi truyền..................................................25c)Lệnh sử dụng dịch vụ của FTP..............................................26
2.FTP reply..........................................................................................30E.Thông số kĩ thuật.......................................................................................34
1.Cài đặt tối thiểu................................................................................342.Kết nối..............................................................................................353.Lệnh.................................................................................................35
a)Lệnh FTP...............................................................................36b)Tham số của các lệnh............................................................37c)Chuỗi mã reply của các lệnh..................................................37
PHẦN III. CÀI ĐẶT BẰNG VISUAL C++...........................................................42
![Page 4: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/4.jpg)
PHẦN 1: TỔNG QUAN VỀ HỌ GIAO THỨC TCP/IP
1. Giới thiệu
Bộ giao thức TCP/IP, ngắn gọn là TCP/IP (tiếng Anh: Internet protocol suite hoặc IP suite hoặc TCP/IP protocol suite - bộ giao thức liên mạng), là một bộ các giao thức truyền thông cài đặt tầng giao thức mà Internet và hầu hết các mạng máy tính thương mại đang chạy trên đó. Bộ giao thức này được đặt tên theo hai giao thức chính của nó là TCP (Giao thức Điều khiển Giao vận) và IP (Giao thức Liên mạng). Chúng cũng là hai giao thức đầu tiên được định nghĩa.
2. Cấu trúc phân tầng của TCP/IP
TCP/IP là một thể hiện thực tế của mô hình OSI. Mô hình OSI nguyên bản chia thành 7 tầng giao thức, tuy nhiên TCP/IP hiện thực v{ đơn giản hóa đi chỉ còn 4 tầng.
![Page 5: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/5.jpg)
Tầng ứng dụng (Application Layer): gồm các giao thức đóng gói dữ liệu từ ứng dụng người dùng rồi truyền xuống tầng thấp hơn. Các giao thức ở tầng này là: HTTP, FTP, Telnet, DNS, SSH, SMTP, POP3,…
Tầng giao vận (Transport Layer): Nhận dữ liệu từ ứng dụng tầng trên và thông qua tầng dưới, truyền dữ liệu tới ứng dụng ở máy tính đích. Tầng này cung cấp dịch vụ truyền dữ liệu giữa ứng dụng - ứng dụng. Các giao thức ở tầng này: TCP, UDP, ICMP.
Tầng liên mạng (Network Layer): Định tuyến và truyền gói tin liên mạng, cung cấp dịch vụ truyền dữ liệu là các gói tin giữa các nút mạng trong cùng một mạng hoặc liên mạng. Các giao thức ở tầng này: IPv4, IPv6,…
Tầng liên kết (Network Acess Layer, Datalink Layer): Truyền dữ liệu giữa các nút mạng trên cùng một nhánh mạng. Tầng này làm việc trực tiếp với thiết bị chịu trách nhiệm chuyển đổi các bit sang một dạng tín hiệu vật lý khãc (ánh sáng, điện, điện từ…)
Dữ liệu của người dùng sẽ lần lượt đi qua các tầng trong mô hình, ở mỗi tầng, dữ liệu sẽ được thêm phần header để điều khiển và chuyển xuống tầng thấp hơp. Bên nhận sẽ lần lượt bóc tách các header từ tầng thấp và chuyển lên tầng cao, cho đến người dùng.
![Page 6: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/6.jpg)
3. Họ giao thức TCP/IP
Bao gồm hai phần chính:
Các giao thức tạo thành hệ thống truyền dẫn. Các giao thức hỗ trợ ứng dụng.
Tầng liên mạng (Internet)
Sử dụng giao thức connectionless – IP, là hạt nhân hoạt động của hệ thống truyền dẫn Internet.
Các thuật toán định tuyến RIP, OSFD, BGP Cho phép kết nối một cách mềm dẻo và linh hoạt các loại mạng “vật lý”
khác nhau; như: Ethernet, Token Ring, X25 v.v. dựa trên địa chỉ IP.
Tầng giao vận (Transport)
TCP là giao thức hướng liên kết (connection – oriented) UDP là giao thức không hướng liên kết (connectionless)
![Page 7: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/7.jpg)
4. IPv4
Giao thức Internet phiên bản 4 (IPv4) là phiên bản thứ tư trong quá trình phát triển của các giao thức Internet (IP). Đây là phiên bản đầu tiên của IP được sử dụng rộng rãi. IPv4 cùng với IPv6 (giao thức Internet phiên bản 6) là nòng cốt của giao tiếp internet. Hiện tại, IPv4 vẫn là giao thức được triển khai rộng rãi nhất trong bộ giao thức của lớp internet. Các giao thức IP chạy ở tầng liên mạng.
Giao thức này được công bố bởi IETF trong phiên bản RFC 791 (9 - 1981), thay cho phiên bản RFC 760 (công bố vào tháng 1 - 1980). Giao thức này cũng được chuẩn hóa bởi bộ quốc phòng Mỹ trong phiên bản MIL-STD-1777.
IPv4 là giao thức hướng dữ liệu, được sử dụng cho hệ thống chuyển mạch gói (tương tự như chuẩn mạng Ethernet). Đây là giao thức truyền dữ liêu hoạt động dựa trên nguyên tắc tốt nhất có thể, trong đó, nó không quan tâm đến thứ tự truyền gói tin cũng như không đảm bảo gói tin sẽ đến đích hay việc gây ra tình trạng lặp gói tin ở đích đến. Việc xử lý vấn đề này dành cho tầng trên của bộ giao thức TCP/IP. Nhưng IPv4 có cơ chế đảm bảo toàn vẹn dữ liệu = trường checksum.
Địa chỉ IPv4 Sử dụng 32 bit để đánh địa chỉ các máy tính trong mạng. Bao gồm: phần mạng và phần host. Số địa chỉ tối đa: 2^32 ~ 4,294,967,296. Dành riêng một vài dải đặc biệt không sử dụng. Chia thành bốn nhóm 8 bít (octet).
![Page 8: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/8.jpg)
Các lớp địa chỉ IPv4 Có năm lớp địa chỉ: A,B,C,D,E. Lớp A,B,C: trao đối thông tin thông thường. Lớp D: multicast Lớp E: để dành
Mặt nạ mạng Phân tách phần mạng và phần host trong địa chỉ IPv4. Sử dụng trong bộ định tuyến để tìm đường đi cho gói tin. Với mạng có dạng
Biểu diễn theo dạng /n n là số bit dành cho phần mạng. Thí dụ: 192.168.0.1/24
Biểu diễn dưới dạng nhị phân Dùng 32 bit đánh dấu, bít dành cho phần mạng là 1, cho phần host là 0.
![Page 9: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/9.jpg)
Thí dụ: 11111111.11111111.11111111.00000000 hay 255.255.255.0 Biểu diễn dưới dạng Hexa
Dùng số Hexa: 0xFFFFFF00 Ít dùng
Số lượng địa chỉ của mỗi mạng Mỗi mạng sẽ có n bit dành cho phần mạng, 32-n bit dành cho phần host. Phân phối địa chỉ trong mỗi mạng:
o 01 địa chỉ mạng (các bit phần host bằng 0).
o 01 địa chỉ quảng bá (các bit phần host bằng 1).
o 2^n - 2 địa chỉ gán cho các máy trạm (host).
5. TCP/IP Giao thức TCP: Transmission Control Protocol
o Giao thức lõi chạy ở tầng giao vận.
o Chạy bên dưới tầng ứng dụng và trên nền IP
o Cung cấp dịch vụ truyền dữ liệu theo dòng tin cậy giữa các ứng dụng.
o Được sử dụng bởi hầu hết các ứng dụng mạng.
o Chia dữ liệu thành các gói nhỏ, thêm thông tin kiểm soát và gửi trên
đường truyền. Lập trình mạng sẽ sử dụng giao thức này để trao đổi thông tin.
Cổng (Port)o Một số nguyên duy nhất trong khoảng 0-65535 tương ứng với một kết
nối của ứng dụng.o TCP sử dụng cổng để chuyển dữ liệu tới đúng ứng dụng hoặc dịch vụ.
o Một ứng dụng có thể mở nhiều kết nối => có thể sử dụng nhiều cổng.
o Một số cổng thông dụng: HTTP(80), FTP(21), SMTP(25), POP3(110),
HTTPS(443)... Đặc tính của TCP
o Hướng kết nối: connection oriented
Hai bên phải thiết lập kênh truyền trước khi truyền dữ liệu. Thực hiện bởi quá trình bắt tay ba bước (three ways handshake).
![Page 10: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/10.jpg)
o Truyền dữ liệu theo dòng (stream oriented): tự động phân chia dòng dữ
liệu thành các đoạn nhỏ để truyền đi, tự động ghép các đoạn nhỏ thành dòng dữ liệu và gửi trả ứng dụng.
o Đúng trật tự (ordering guarantee): dữ liệu gửi trước sẽ được nhận trước
o Tin cậy, chính xác: thông tin gửi đi sẽ được đảm bảo đến đích, không
thừa, sai sót...o Độ trễ lớn, khó đáp ứng được tính thời gian thực.
o Các đặc tính khác: QoS...
Header của TCP: Chứa thông tin về đoạn dữ liệu tương ứng
Rất nhiều dịch vụ chạy trên nền TCP: FTP(21), HTTP(80), SMTP(25), SSH(22), POP3(110), VNC(4899)...
PHẦN 2: FTP
I. GIỚI THIỆU
Mục tiêu của FTP là:
thúc đẩy sự chia sẻ file (chương trình máy tính và dữ liệu) truy cập từ xa bảo vệ người dùng trong các hệ thống file giữa các host trao đổi dữ liệu tin cậy và hiệu quả
![Page 11: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/11.jpg)
FTP có thể sử dụng trực tiếp từ người dùng hoặc thiết kế để sử dụng trong các chương trình FTP program
II. KHÁI QUÁT1. Một vài thuật ngữ
ASCII: tập kí tự định nghĩa trong ARPANET protocol. Trong FTP, ASCII được xác định là nửa dưới của bộ mã 8 bit (phần lớn các bit =0)
Access control (điều khiển truy cập): định nghĩa người dùng quyền truy cập để sử dụng hệ thống, truy cập file trong hệ thống ngăn ngừa người dùng bất hợp pháp hoặc vô tình truy cập vào hệ thống file cá nhân của người dùng khác. Đây là tiến trình của FTP – server.
Byte size: Có 2 byte size cần chú ý trong FTP: logical byte size của file và transfer byte size sử dụng để truyền data. Transfer byte size luôn là 8 bit (1byte), và không sử dụng để lưu trữ file trong hệ thống mà logical byte size làm nhiệm vụ này.
Control connection: Lien kết truyền thông giữa USER-PI và SERVER-PI để trao đổi thông tin của command và reply. Kết nối tuân theo giao thức TELNET
Data connection: Lien kết 2 hướng để truyền data qua nó với các chế độ và kiểu cụ thể. Có thể trao đổi 1 phần, 1 thực thể hay 1 nhóm của file. Có thể là lien kết giữa server-DTP với user-DTP hoặc giữa 2 server-DTP
Data port: Tiến trình truyền data bị động sẽ nghe trên 1 cổng cho kết nối chủ động từ 1 tiến trình truyền data chủ động để mở kết nối dữ liệu
DTP: Data transfer process: thiết lập và quản lí kết nối dữ liệu. có thể chủ động hay bị động
End-of-Line: EOL Chuỗi định nghĩa dấu phân cách của 1 dòng: carriage return + line feed (CRLF: \r\n)
EOF: End-of-File Là điều kiện để kết thúc việc truyền 1 file EOR: End-of-Record: Điều kiện để kết thúc 1 bản ghi (record) khi truyền
data. Error recovery: Thủ tục cho phép người dùng khôi phục lại từ 1 lỗi nào đó
trong khi thao tác với FTP server. Trong FTP, việc này cho phép 1 người dùng có thể truyền lại file từ 1 điểm khôi phục nào đó.
![Page 12: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/12.jpg)
FTP command: Tập các lệnh chứa thông tin điều khiển lưu lượng từ tiến trình user-FTP đến server-FTP
File: 1 tập có thứ tự các dữ liệ (gồm cả chương trình), kích thước tùy ý, có tên phân biệt với các file khác.
Mode: Chế độ mà data có thể truyền qua kết nối data, định nghĩa khuôn dạng dữ liệu trong quá trình truyền bao gồm cả EOR và EOF. Mô tả trong chương transmisstion mode
NVT: Network virtual terminal: định nghĩa trong Telnet-protocol NVFS: Network virtual file system: khái niệm định nghĩa 1 mạng lưới hệ
thống file cơ bản với các lệnh cơ bản và quy ước tên đường dẫn. Page: 1 file có thể cấu tạo như 1 tập của các phần riêng rẽ gọi là page
(trang). FTP hỗ trợ truyền file gián đoạn theo các trang được đánh số. Pathname: Định nghĩa tên đường dẫn là 1 chuỗi xâu kí tự, được user nhập
vào để nhận ra file. Pathname thường chứa tên ổ đĩa, và/hoặc tên thư mục, và filename cụ thể. Các hệ thống FTP khác nhau có thể có quy ước khác nhau với pathname
PI: Protocol interpreter: user PI và server PI đảm nhiệm vai trò khác nhau trong quá trình truyền command, file
Record: Chuỗi file có thể cấu tạo từ các phần liên tiếp nhau gọi là 1 record. Cấu trúc record được FTP hỗ trợ, nhưng file không cần theo cấu trúc này
Reply: Là 1 thông báo (xác nhận hoặc phủ nhận), gửi từ server đến user qua kết nối điều khiển, đáp lại các FTP command. Được quy định là mã có 3 số (dùng cho các chương trình FTP), theo sau bởi các xâu kí tự (thông báo trên giao diện người dùng)
Server DTP: Data transfer process: thường ở trạng thái chủ động (active), thiết lập kết nối điều khiển với 1 cổng data port được nghe. Thiết lập tham số cho việc truyền và lưu file. Khi ở trạng thái bị động (passive), nó sẽ nghe 1 data port.
Server FTP process: Tiến trình hoặc là 1 tập các tiến trình thực hiện các thủ tục truyền file cùng với user FTP process, và có thể với các server khác. Bao gồm server PI và server DTP.
Server PI: Server protocol interpreter: nghe trên 1 port L cho 1 kết nối từ user PI và thiết lập 1 kết nối điều khiển. Nó nhận các FTP command từ user PI, gửi lại reply và quản lí tiến trình user DTP
![Page 13: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/13.jpg)
Type: Kiểu dữ liệu điển hình cho việc truyền data và lưu trữ. Nó bao hàm sự chuyển đổi nào đó giữa việc truyền và lưu data. Được mô tả trong chương thiết lập kết nối dữ liệu
User: Người dùng hoặc 1 tiến trình thực hiện của 1 người dùng muốn sử dụng dịch vụ FTP.
User DTP: Data transfer process: nghe trên 1 cổng data cho 1 kết nối dữ liệu từ server FTP. Nếu 2 server trao đổi dữ liệu với nhau thì 1 trong 2 sẽ ở chế độ active
User DTP process: Tập các thủ tục gồm 1 PI, 1 DTP và 1 user interface (giao diện người dùng) cùng thực hiện thao tác truyền file với >= 1 server FTP process.
User PI: Khởi tạo 1 kết nối điều khiển từ cổng U của nó tới server FTP process. Khởi tạo FTP command và quản lí user DTP nếu nó là 1 phần của tiến trình FTP
![Page 14: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/14.jpg)
2. Mô hình FTP
Mô hình trên là mô hình cơ bản của FTP. Chú ý là kết nối dữ liệu không nhất thiết phải tồn tại mọi lúc.
Trong mô hình này, user PI khởi tạo 1 kết nối điều khiển theo giao thức Telnet. Sau khi tạo kết nối điều khiển, user PI phát sinh các FTP command cơ bản và truyền đến FTP server thông qua kết nối này. Các reply cơ bản sẽ được gửi từ server PI về cho user cũng qua kết nối điều khiển.
FTP command chỉ rõ tham số cho kết nối dữ liệu (data port, transfer mode, representation type, structure) và các thao tác tự nhiên với hệ thống file (store, retrieve, append, delete, vv…). User DTP sẽ nghe trên 1 data port cụ thể và server khởi tạo kết nối dữ liệu với các tham số phù hợp.
Một số tình huống, user lại muốn trao đổi file giữa 2 host, chứ không phải là với nó. Khi đó, user tạo kết nối điều khiển đến cả 2 server đó và sắp xếp 1 kết nối dữ liệu giữa chúng thông tin điều khiển từ 2 server sẽ đến user song dữ liệu lại truyền trực tiếp giữa 2 server mà không qua user
![Page 15: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/15.jpg)
Giao thức yêu cầu duy trì kết nối điều khiển trong khi trao đổi dữ liệu để lắng nghe xem user có yêu cầu ngừng truyền tải file không? Nếu có, server sẽ hủy bỏ thao tác. Server cũng sẽ hủy bỏ truyền tải dữ liệu nếu như kết nối điều khiển bị ngắt.
FTP sử dụng giao thức Telnet trong kết nối điều khiển, có 2 cách để thực hiện điều này: 1 là user PI và server PI phải cài đặt các quy tắc của Telnet trực tiếp trong các thủ tục của chúng. 2 là user PI và server PI có thể dùng 1 module Telnet trong hệ thống
III. PHƯƠNG THỨC TRUYỀN DỮ LIỆU
File chỉ được truyền qua kết nối dữ liệu. Kết nối điều khiển sử dụng cho truyền command (mô tả các lệnh sẽ thực hiện) và reply cho các command đó. 1 số command lien quan đến việc trao đổi file giữa 2 host. Các lệnh truyền file gồm:
MODE: chỉ rõ cách thức truyền các bit dữ liệu STRUCT và TYPE: định nghĩa các cấu trúc cho việc truyền dữ liệu
Về cơ bản các chế độ truyền và kiểu file không liên quan nhưng “Stream” mode lại phụ thuộc vào thuộc tính cấu trúc, nếu “Compressed” mode được sử dụng thì các byte chèn thêm vào phụ thuộc vào kiểu đại diện
1. Dữ liệu đại diện và dữ liệu lưu trữ
Dữ liệu được trao đổi từ 1 thiết bị lưu trữ trong host gửi đến thiết bị lưu trữ của host nhận. Thường thì có vài thao tác chuyển đổi dữ liệu vì có thể dữ liệu đại diện trên host gửi và host nhận là khác nhau.
Một vấn đề khác là khi ta truyền dữ liệu theo byte (không phải theo mã kí tự) giữa các host mà khác nhau về độ dài của word trở ngại khi sender gửi và receiver lưu dữ liệu. Ví dụ khi sender gửi 32-bit byte từ hệ thống 32-bit word sang hệ thống 36-bit word làm thế nào lưu được trên hệ thống 36 bit word length. Trong bất kì trường hợp nào, user sẽ có 1 tùy chọn cụ thể cho kiểu dữ liệu đai diện và thao tác biến đổi. FTP cung cấp khá hạn chế các kiểu dữ liệu đại diện việc chuyển kiểu sẽ thực hiện trực tiếp bởi user.
![Page 16: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/16.jpg)
a) Data type
Chuyển kiểu đại diện được thực hiện trực tiếp trên FTP bởi user. Kiểu có thể là ngầm định (ASCII) hoặc được chỉ rõ (1 kiểu Local byte của host gửi). Nhưng kích thước đơn vị dữ liệu được truyền luôn bằng 8-bit byte
ASCII type: là kiểu mặc định và phải được chấp nhận trên mọi cài đặt FTP. Sử dụng cho truyền các file văn bản, trừ khi 2 host tìm 1 EBCDIC code phù hợp hơn để truyền.Sender chuyển dữ liệu từ kiểu kí tự nội bộ sang kiều đại diện 8-bit NVT-ASCII. Bên nhận sẽ chuyển từ NVT-ASCII sang kiểu cục bộ của nó.Trong kiều NVT cơ bản, chuỗi <CRLF> sẽ dùng để chỉ ra EOL trong text. Sử dụng kiểu đại diện NVT-ASCII dữ liệu phải chuyển sang 8-bit byte.
EBCDIC type: nhằm cho việc trao đổi dữ liệu hiệu quả hơn giữa 2 host sử dụng EBCDIC cho các kiểu kí tự riêng của chúng. Để truyền file, dữ liệu đại diện là kí tự 8-bit EBCDIC. Mã kí tự chỉ khác thao tác cụ thể của EBCDIC và ASCII. EOL (khác với EOR) sẽ hiếm khi sử dụng trong EBCDIC cho mục đích chỉ rõ structure, nhưng nó sẽ cần kí tự new line <NL>
IMAGE type: dữ liệu được gửi như các bít liền kề, được gói trong 8-bit byte để truyền. Bên nhận sẽ lưu dữ liệu như các bit liên tiếp nhau. Cấu trúc của hệ thống lưu sẽ phải cần đệm vào dữ liệu (cho bằng 1 byte, word hay block). Các bit đệm vào là 0, điều này chỉ xảy ra đối với EOF, hoặc EOR. phải có cách để nhận biết các byte padding này và tách chúng ra khỏi dữ liệu nhận được, ghép lại thành dữ liệu hoàn chỉnh chuyển đổi padding phải được công khai để người dùng có thể xử lí file.ImageType được dùng để lưu có hiệu quả và lấy về bằng cách trao đổi các dữ liệu nhị phân. được mọi cài đặt FTP chấp nhận.
LOCAL type: dữ liệu được trao đổi với kích thước các byte logic cụ thể chỉ ra trong tham số thứ 2, Byte size. Giá trị của byte size là 1 số nguyên, và không có giá trị mặc định. Logical byte size không cần thiết cho kích thước gói truyền (do luôn là 8-bit byte). Nếu có 1 giá trị khác của byte size, logical byte sẽ gói dữ liệu liên tiếp có thể truyền các bit padding như nói trên.
![Page 17: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/17.jpg)
Khi nhận dữ liệu, receiver sẽ chuyển lại dữ liệu phụ thuộc vào logical byte size và đặc thù của host. Thứ tự chuyển sẽ ngược lại với sender
FORMAT CONTROL:
Cả ASCII và EBCDIC cũng có 1 tham số thứ 2 (tùy chọn), chỉ ra định dạng điều khiển nếu có, gắn với 1 file. Các kiểu đại diện sau được định nghĩa: 1file kí tự có thể tuyền đến 1 host cho 1 trong 3 mục đích: hiển thị (printing), lưu trữ & lấy lại sau (store & retrieval), và cho xử lí (processing). Nếu file truyền cho việc hiển thị, receiver phải hiểu ra định dạng điều khiển đại diện. Trường hợp thứ 2, nó phải có thể lưu file trên host rồi lấy lại sau với cùng định dạng. Cuối cùng, nó phải chuyển file từ 1 host đến host khác và xử lí file tại host thứ 2.
NON PRINT: là định dạng mặc định sử dung nếu tham số thứ 2 bị bỏ qua. Được mọi cài đặt FTP chấp nhận. file không cần chứa thông tin định dạng. Nếu file qua 1 tiến trình xử lí in, tiến trình này sẽ bỏ qua. Định dạng này sử dụng cho các file lưu trữ hoặc xử lí
TELNET FORMAT CONTROL: file chứa các ASCII / EBCDIC format control (<CR>,<LF>,<NL>,<VT>,<FF>, …) mà printer sẽ xử lí phù hợp. <CRLF> để xác định End-of-Line.
CARIAGE CONTROL (ASA): file chứa các kí tự định dạng điều khiển ASA (FORTRAN). Trong một dòng của record format tùy theo kiểu ASA, kí tự đầu tiên sẽ không được in. Thay vì vậy, nó sẽ sử dụng để xác định chuyển động lên xuống của trang giấy (vd ms word) diễn ra trước khi in phần còn lại của bản ghi. 1 số kí tự của ASA:
Blank chuyển tờ lên 1 dòng0 chuyển tờ lên 2 dòng1 chuyển tờ lên đầu của tờ tiếp theo
+ không di chuyển (vd: in chèn lên)
Rõ rang phải có 1 cách để tiến trình in phát hiện EOR. Nếu 1 file có record structure, nó sẽ không có vấn đề. Record sẽ được đánh dấu trong khoảng thời gian truyền, <CRLF> EOL sử dụng để phân biệt các dòng được in, nhưng nó sẽ bị ghi đè bởi ASA
![Page 18: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/18.jpg)
b) DATA STRUCTURES
Khi thêm các kiểu đại diện khác, FTP cho phép cấu trúc 1 file cụ thể. Có 3 kiểu cấu trúc sau được định nghĩa trên FTP:
File structure: file không có các cấu trúc con và được xem như chuỗi byte liên tiếp
Record structure: file tạo từ các chuỗi các record (bản ghi) Page structure: file tạo từ các trang (page) riêng biệt, được đánh chỉ số
File structure là giá trị mặc định nếu user không sử dụng lệnh STRU (structure command), cả file & record structure phải chấp nhận kiểu text file trong mọi cài đặt FTP. Cấu trúc file ảnh hưởng đến cả chế độ truyền, chuyển, và lưu file.
Cấu trúc tự nhiên của file sẽ phụ thuộc vào host lưu nó. 1 source-file sẽ thường lưu trên 1 IBM Mainframe trong 1 bản ghi có độ dài cố định nhưng trong DEC TOPS-20 lại lưu như là 1 luồng kí tự chia thành các dòng bởi <CRLF>. Nếu truyền file giữa 2 site là hữu ích, phải có cách để 1 site nhận ra site còn lại đang giữ file
File structure: được đặt mặc định nếu như STRU (structure command) không được dùng. Trong file structure, không có cấu trúc bên trong và file được xem như là các chuỗi data byte liên tiếp
Record structure: kiểu này phải được chấp nhận cho text file (vd với ASCII và EBCDIC) bởi mọi cài đặt FTP. File được tạo thành từ chuỗi các record
Page structure: dùng khi FTP muốn truyền file 1 cách gián đoạn. Trong cấu trúc này, file được xem như là các file truy cập ngẫu nhiên. Thỉnh thoảng trong file sẽ xuất hiện vài thông tin liên kết với file như nói chung (vd 1 thông tin file), hoặc với 1 đoạn của file (vd truy cập điều khiển trang – page access control), hoặc cả 2. Trong FTP, đoạn của file gọi là page.Để cung cấp các page với kích thước khác nhau và các thông tin liên kết, mỗi page được gửi cùng với 1 page header. 1 page header có các trường:
Header length: số byte trong 1 header bao gồm cả nó. Tối thiểu là 4 Page index: đánh dấu chỉ số page của nó trong file. Nó không phải là
chuỗi thứ tự truyền file, nhưng nó dùng để định danh 1 page trong file Data length: số logical byte của data kèm theo. Tối thiểu là 0 Page type: kiểu page. Có các kiểu sau được định nghĩa:
![Page 19: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/19.jpg)
o 0 = Last page: dùng để định danh page cuối trong các page truyền.
Header length phải =4 và data length phải =0o 1 = Simple page: chỉ các page bình thường và không có các thông
tin điều khiển. header length phải bằng 4o 2 = descriptor page: sử dụng để truyền các thông tin đặc tả file
o 3 = access controlled page: bao gồm 1 trường phụ cho page file với
thông tin mức điều khiển truy cập. header length phải = 5 Optional Fields: dùng để hỗ trợ cho mỗi thông tin điều khiển page, vd
cho thông tin điều khiển truy cậpMọi trường đều là 1 logical byte. Logical byte size được đặt cụ thể trong command TYPE.
2. Thiết lập kết nối dữ liệu
Kĩ thuật truyền dữ liệu gồm: thiết lập 1 kết nối dữ liệu đến 1 cổng thích hợp và chọn tham số cho truyền. Cả USER và SERVER-DTP đều có cổng mặc định. User-process có cổng mặc định là cổng cho kết nối điều khiển (U). Server-process có cổng mặc định là cổng liền kề với cổng kết nối điều khiển (giá trị là L-1)
1 transfer byte là 8-bit byte. Kích thước này chỉ phù hợp với việc truyền dữ liệu, không hiệu quả khi biểu diễn dữ liệu trong phạm vi 1 hệ thống file của 1 host.
Tiến trình truyền file thụ động (có thể là user DTP hoặc 1 server DTP thứ 2), sẽ nghe trên 1 data port trước khi gửi request command. FTP request command xác định hướng truyền dữ liệu. Server nhận request sẽ tạo 1 kết nối dữ liệu đến port. Khi thiết lập xong kết nối, dữ liệu cho truyền đã sẵn sàng thì server PI sẽ gửi 1 reply xác nhận đến user PI
Mọi cài đặt của FTP phải hỗ trợ sử dụng cổng mặc định, và chỉ user PI có thể khởi tạo thay đổi cho port mặc định. Khi đó user sử dụng command PORT, user có thể muốn lấy lại file hoặc đưa file sang 1 host khác. Trường hợp 2: user PI sẽ tạo cả 2 kết nối điều khiển đến cả 2 server PI, 1 server PI sẽ cho user PI biết port nó nghe kết nối, và server PI còn lại sẽ tạo kết nối đến port đó với các tham số được user PI gửi đến, sau đó cả 2 server sẽ truyền file qua kết nối riêng của chúng. Trình tự các command và reply gửi giữa user và server được nói trong chương FTP reply
![Page 20: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/20.jpg)
Nói chung server chịu trách nhiệm duy trì kết nối dữ liệu: khởi tạo và hủy nó. Trừ khi user DTP gửi dữ liệu trong chế độ truyền yêu cầu kết nối đóng để tạo EOF. Server phải đóng kết nối dữ liệu trong các điều kiện sau:
Server đã gửi xong data trong transfer mode yêu cầu đóng kết nối để tạo EOF
Server nhận 1 command ABORT từ user Port được thay đổi bởi command từ user Kết nối điều khiển bị đóng 1 lỗi không thể khôi phục xảy ra
Khi đóng kết nối data, server phải tạo 1 reply với mã 250 hoặc 226 đến user
3. Quản lí kết nối dữ liệu
Để dùng 1 cổng nghe dữ liệu không mặc định: user PI phải chỉ rõ 1 cổng khác bằng lệnh PORT. Ngược lại dùng PASV. Khi kết nối được tạo giữa 2 địa chỉ, nó vẫn cho phép thực hiện cả 2 lệnh trên để thay đổi port mới trên cả 2 điểm kết nối
Dùng lại kết nối dữ liệu: khi dùng stream mode để truyền dữ liệu, EOF phải được tạo khi đóng kết nối vấn đề nếu có nhiều file được truyền trong cùng 1 phiên, TCP không cho phép dùng lại kết nối trong 1 khoảng thời gian để đảm bảo tính tin cậy khi truyền thông kết nối sẽ không được mở lại ngay. Có 2 cách giải quyết là: 1 là dùng 1 non-defaul port, 2 là dùng chế độ truyền khác.
Chú ý là stream transfer mode vốn đã không tin cậy, khi chúng xác định kết nối đóng sớm hay không. Các chế độ truyền khác (block, compressed) không đóng kết nối để tạo EOF, mà nó phân tích dữ liệu nhận được để xem đã đến EOF chưa.
4. Transmission modes
Có 3 chế độ: 1 định dạng dữ liệu và cho phép khởi tạo lại thủ tục, 1 nén dữ liệu cho việc truyền data hiệu quả hơn, và 1 sẽ truyền dữ liệu với với tiến trình nhỏ hoặc không cần tiến trình. Trong trường hợp cuối, mode tác động với thuộc tính cấu trúc để xác nhận kiểu tiến trình. Trong chế độ nén, kiểu đại diện xác nhận byte làm đầy.
![Page 21: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/21.jpg)
Mọi dữ liệu truyền phải kết thúc với EOF, có thể định trực tiếp hoặc gián tiếp qua việc đóng kết nối data. Với file có cấu trúc record, mọi EOR được đánh dấu rõ ràng. Trong file với cấu trúc page, “last-page” sẽ được sử dụng để kết thúc truyền
Với mục đích là chuẩn hóa việc truyền file, sender sẽ chuyển EOL hoặc EOR của nó thành kiểu đại diện tương ứng với chế độ truyền và file structure, bên nhận sẽ chuyển ngược lại dữ liệu sang kiểu nội bộ của nó.
a) STREAM mode
Data được truyền như dòng các byte. Chế độ này không hạn chế kiểu đại diện, kể cả record structure.
Trong record structure, EOR và EOF sẽ được biểu diễn bằng 2 byte điều khiển. Byte đầu sẽ là toàn số 1 (kí tự ESC). Byte thứ 2 sẽ dùng các bít thấp nhất để biểu diễn EOR (00000001) và bit thứ 2 để biển diễn EOF (00000010). Nếu cùng chỉ ra cả EOR và EOF trong record thì sẽ dùng cả 2 bit này (00000011). Nếu 1 byte gồm toàn số 1 được dùng để gửi như dữ liệu thì nó sẽ được lặp lại trong byte thứ 2 của control code.
Nếu cấu trúc là file structure, EOF tương ứng việc host gửi sẽ đóng kết nối dữ liệu
b) BLOCK mode
File được truyền như chuỗi các khối (block) dữ liệu theo trước bởi >= 1 header byte. Header byte chứa 1 trường count, và mã đặc tả (descriptor). Count chỉ ra tổng độ dài của block, như vậy đánh dấu điểm đầu của các khối dữ liệu sau (không có bit padding). Descriptor định nghĩa: block cuối của file (EOF) hay của record (EOR), đánh dấu điểm restart, hoặc các bit khả nghi (không dùng trong bảo mật, mà dùng để truyền thông tin khẩn cấp). Record structure sẽ được dùng được mọi chế độ chấp nhận, mọi kiểu đại diện có thể sử dụng.
Header gồm 3 byte (24 bit). 16 bit thấp = byte count, 8 bit cao = descriptor
Descriptor8 bit
Byte count16-bit
Descriptor code chỉ ra bởi bit cờ trong descriptor byte. Có các giá trị:
![Page 22: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/22.jpg)
128: EOR 64: EOF 32: lỗi khả nghi trong data block 16: block này là restart marker (điểm khôi phục)
Có thể có nhiều hơn 1 trạng thái descriptor code có thể tồn tại trong 1 block. Restart marker được nhúng trong luồng dữ liệu như 1 số nguyên 8-bit byte, tượng trưng cho 1 kí tự hiển thị trong ngôn ngữ truyền qua kết nối điều khiển (vd NVT-ASCII). <SP> - space không được dùng trong restart marker. VD:
c) COMPRESS mode
Có 3 kiểu thông tin được gửi: dữ liệu thông thường – gửi trong 1 byte string; dữ liệu nén – gồm bản sao của nó và các bit đệm; và thông tin điều khiển – gửi trong 1 chuỗi 2 byte ESC. Nếu n>0 byte (<=127) của các thông tin được gửi, có n byte sau nó là dữ liệu, byte đầu tiên có bit trái nhất là 0 và 7 bit còn lại đặt giá trị là n.
![Page 23: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/23.jpg)
Để nén chuỗi n bản sao của byte dữ liệu d, 2 byte sau được gửi:
1 chuỗi của n byte đệm có thể nén trong 1 byte duy nhất. byte đệm có thể khác nhau với các kiểu khác nhau: ASCII và EBCDIC là <SP>, Image Type là byte 0.
Chuỗi ESC là cặp byte, byte đầu là byte ESC (các bit là 0) và byte thứ 2 chứa mã đặc tả như định nghĩa trong Block mode. Descriptor này có cùng nghĩa với Block mode và dùng để kết xâu kí tự.
Chế độ này giúp cho việc truyền file hiệu quả hơn và sử dụng ít tài nguyền mạng
5. Khôi phục lỗi và khởi tạo lại
FTP không có cơ chế phát hiện việc mất bit hoặc sự hỗn độn của dữ liệu nhận được, điều này do TCP xử lí. Nhưng nó cần có thủ tục khởi tạo lại việc truyền file từ thời điểm bị lỗi cho user.
Restart: chỉ dành cho BLOCK và COMPRESS mode. Nó yêu cầu seder chèn 1 mã đánh dấu vào luồng dữ liệu với 1 vài thông tin đánh dấu. Thông tin này chỉ cho sender, nhưng phải gồm các kí tự hiển thị được của kết nối điều khiển. Marker có thể đánh dấu bit-count, record-count hoặc bất kì thông tin nào khác để hệ thống có thể nhận ra điểm đánh dấu dữ liệu. Bên nhận, nếu có 1 thủ tục restart sẽ đánh dấu những điểm tương ứng với các marker, và trả về thông tin cho user. Khi đó, user có thể truyền lại data tại điểm restart được đánh dấu bằng thủ tục restart.
![Page 24: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/24.jpg)
IV. PHƯƠNG THỨC TRUYỀN FILE
Giao tiếp vật lí từ user PI đến server PI được thiết lập như TCP từ user đến 1 cổng của server. User PI chịu trách nhiệm gửi lệnh FTP và đọc reply gửi từ server trả về, server PI gửi reply và điều khiển server DTP để tạo 1 kết nối dữ liệu và truyền data. Nếu bên thứ 2 của kết nối dữ liệu là user DTP, thì nó sẽ chịu quản lí của user FTP. Nếu là server DTP, nó sẽ chịu quản lí bởi các command từ user FTP gửi đến.
1. FTP commandsa) Lệnh truy cập điều khiển - Access control commands
Các lệnh sau được chỉ rõ định danh trong dấu ngoặc đơn
USER NAME (USER)
Tham số là Telnet string, để định danh user. Server cần user xác thực 1 tải khoản để có thể truy cập tới hệ thống file. Đây thường là commands đẩu tiên trao đổi giữa user và server sau khi thiết lập kết nối điều khiển. Có thể kèm theo thông tin về password và/hoặc account. Server có thể chấp nhận 1 lệnh USER mới để có thể thay đổi điều khiển truy cập và/hoặc thông tin tài khoản có tác dụng loại bỏ thông tin về người dùng trước đó và bắt đầu lại trình tự đăng nhập.
PASSWORD (PASS)
Đối số là 1 Telnet string, chỉ rõ mật khẩu của user, phải lập tức theo sau lệnh USER, để hoàn thành đăng nhập (1 số server yêu cầu thêm account).
ACCOUNT (ACCT)
Tham số của lệnh acct là chuỗi Telnet string, chỉ rõ tài khoản của user. Command này không cần liên quan đến USER command, nhưng 1 vài server có thể yêu cầu thông tin này để hoàn thành đăng nhập, một số khác cần thông tin này để user có thể lưu file trên server (khi đó command này có thể xảy ra bất kì lúc nào).Có 1 số kiểu reply lại command này: khi thông tin account cần cho đăng nhập, reply sẽ có mã 332 – hoàn thành lệnh PASS. Mặt khác, nếu
![Page 25: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/25.jpg)
account không cần cho việc đăng nhập, reply có mã là 230 – hoàn thành đăng nhập. Nếu thông tin này cần cho các thao tác truy cập thì nó sẽ trả về mã 332 hoặc 532, phụ thuộc liệu nó sẽ lưu hoặc hủy command.
CHANGE WORKING DIRECTORY (CWD)
Cho phép user thay đổi thư mục / dữ liệu thao tác hiện tại mà không ảnh hưởng đến thông tin đăng nhập. Thông số truyền là không đổi. Đối số của lệnh này là 1 đường dẫn cụ thể hoặc trên hệ thống khác tùy vào nhóm file
CHANGE TO PARENT DIRECTORY (CDUP)
Là 1 trường hợp cụ thể của lệnh CWD, cho phép trở lại thư mục cha của thư mục hiện tại. Mã reply trả về là mã reply của CWD command
STRUCTURE MOUNT (SMNT)
Cho phép user gắn 1 cấu trúc hệ thống file khác mà không làm thay đổi thông tin đăng nhập. Thông số truyền là không thay đổi. Đối số của lệnh là đường dẫn cụ thể của thư mục hoặc hệ thống file khác tùy nhóm file
REINITIALIZE (REIN)
Lệnh này hủy USER, làm sạch mọi I/O và thông tin account, ngoại trừ cho phép bất kì tiến trình trao đổi nào hoàn thành. Mọi tham số được reset về giá trị mặc định và mở lại kết nối điều khiển. Ngay sau đó có 1 yêu cầu xác thực tài khoản (bằng lệnh USER)
LOGOUT (QUIT)
Lệnh này hủy USER. Nếu file truyền không trong một tiến trình, server đóng kết nối điều khiển. Nếu file đang trong quá trình truyền, kết nối sẽ vẫn mở cho kết quả trả về và server sẽ đóng nó sau. Nếu user PI trao đổi file cho vài USER nhưng không muốn đóng và mở lại kết nỗi cho mỗi user thì sử dụng lệnh REIN thay vì QUIT. Nếu vô tình đóng kết nối điều khiển => là nguyên nhân của hiệu ứng abort (ABOR) và logout (QUIT)
![Page 26: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/26.jpg)
b) Cấu hình tham số khi truyền - Transfer parameter command
Mọi tham số truyền dữ liệu có 1 giá trị mặc định, và lệnh chỉ rõ thông số truyền được yêu cầu chỉ khi giá trị mặc định cần thay đổi. Giá trị mặc định sẽ là giá trị của lần trước được sử dụng, nếu không có thì nó sẽ dùng giá trị mặc định của server. Như vậy server phải nhớ được giá trị phù hợp. Lệnh có thể ở bất kì trình tự nào, ngoại trừ nó phải đi trước các FTP service request.
DATA PORT (PORT)
Đối số có dạng là HOST-PORT cụ thể cho data port để dùng cho kết nối dữ liệu. nếu lệnh không dùng thì giá trị mặc định cho cả user và server sẽ được dùng. Nếu lệnh được dùng, đối số sẽ là chuỗi 32-bit host address và 16-bit TCP port. Chúng sẽ được chia thành các trường 8 bit, mỗi trường là 1 số nguyên (từ 0 đến 255).Ví dụ: PORT h1,h2,h3,h4,p1,p2 IP: h1.h2.h3.h4, Port: p1 = 8 bit cao, p2 = 8 bit thấp
PASSIVE (PASV)
Lệnh này yêu cầu server DTP nghe trên 1 port (không phải là port mặc dịnh) và chờ cho 1 kết nối đến port đó chứ không phải là tạo 1 kết nối dữ liệu đến user. Trong reply lại lệnh này sẽ chứa host IP và port mà server đang nghe trên đó
REPRESENTATION TYPE (TYPE)
Đối số chỉ rõ kiểu đại diện được mô tả trong chương Data Representation & Store. Vài kiểu có 1 đối số thứ 2. Tham số thứ nhất chỉ ra bởi 1 kí tự Telnet. Tham số thứ 2 sẽ là 1 kí tự cho kiểu ASCII và EBCDIC, hoặc là 1 số nguyên hệ 10 chỉ rõ kích cỡ byte. Các tham số cách nhau bởi dấu cách <SP> (ASCII code=32). Mặc định của kiểu đại diện là ASCII Non-print.
![Page 27: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/27.jpg)
FILE STRUCTURE (STRU)
Đối số là 1 kí tự Telnet, chỉ rõ cấu trúc file mô tả trong chương Data Representation & Store. Có các cấu trúc sau (mặc định là kiểu File):
TRANSFER MODE (MODE)
Tham số là 1 kí tự Telnet chỉ rõ chế độ truyền file mô tả trong chương Section on Transmission Modes. Có các chế độ sau (mặc định = Stream)
c) Lệnh sử dụng dịch vụ của FTP - FTP service commands
Định nghĩa truyền file hoặc hàm yêu cầu file của user. Đối số của lệnh này sẽ thường là đường dẫn thư mục/tệp. Cấu trúc của đường dẫn phải đúng với quy ước của server và ngôn ngữ dùng trong kết nối điều khiển. giá trị mặc định có thể là giá trị đường dẫn dùng trước đó, hoặc thư mục gốc của user. Trình tự các command này là bất kì ngoại trừ “rename from” phải lập tức theo sau bởi “rename to” command và “restart” command phải lập tức theo sau bởi “interrupted service command”. Dữ liệu truyền luôn qua kết nối dữ liệu trừ 1 số thông tin nào đó.
RETRIEVE (RETR)
Cho phép server truyền 1 bản sao của file chỉ rõ trong pathname đến user DTP qua kết nối dữ liệu. Trạng thái, nội dung file trên server không bị thay đổi
STORE (STOR)
Lệnh này cho phép server DTP chấp nhận dữ liệu truyền qua kết nối dữ liệu và lưu nó vào hệ thống dữ liệu của server. Nếu file chỉ trong pathname đã tồn tại, nội dung của nó sẽ bị thay bởi nội dung file được gửi. Nếu file chưa tồn tại, server sẽ tạo 1 file mới:
![Page 28: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/28.jpg)
STORE UNIQUE (STOU)
Cũng như STORE, ngoại trừ kết quả file được tạo trong thư mục hiện thời dưới 1 tên duy nhất. reply có mã 250 kèm theo tên file được tạo
APPEND (APPE)
Cho phép server chấp nhận trao đổi dữ liệu qua kết nỗi dữ liệu và lưu dữ liệu trong 1 file tại server. Nếu file chỉ trong pathname tồn tại trên server, dữ liệu sẽ được thêm vào file đó, ngược lại sẽ tạo file mới trên server.
ALLOCATE (ALLO)
Lệnh này có thể được yêu cầu bởi vài server để đặt trước 1 không gian lưu trữ đủ để cho file mới được truyền đến. đối số là số nguyên đại diện cho số byte (dùng cho logical byte size). Với file gửi theo kiểu record hoặc page structure, 1 max record hoặc max page sẽ cần thiết – được chỉ trong đối số thứ 2 của lệnh, đối số này là tùy chọn, nhưng khi có sẽ được ngăn với đối số thứ 1 bằng 3 kí tự Telnet: <SP>R<SP>. Lệnh này theo sau bởi STOR hoặc APPE command. ALLO command sẽ trả về như 1 NOOP (no operation) khi server không yêu cầu kích thước tối đa cho file mà chỉ quan tâm đến max record / page thì nó sẽ chấp nhận 1 giá trị giả ở đối số thứ 1 và bỏ qua nó.
RESTART (REST)
Đối số của lệnh này đại diện cho điểm đánh dấu file để bắt đầu lại việc truyền file. Nó không là nguyên nhân để truyền file nhưng có thề truyền luôn tại điểm đánh dấu mà không cần truyền lại file từ đầu. Lệnh này ngay lập tức theo sau bởi 1 FTP service command để truyền file
RENAME FROM (RNFR)
Chỉ rõ tên đường dẫn cũ của file để đổi tên. Phải lập tức theo sau bởi lệnh “rename to” chỉ rõ tên đường dẫn mới
RENAME TO (RNTO)
Chỉ rõ tên đường dẫn mới của file cụ thể trong lệnh RNFR. Cả 2 lệnh này là nguyên nhân thay đổi tên file
![Page 29: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/29.jpg)
ABORT (ABOR)
Lệnh này nói cho server để hủy bỏ FTP service command trước đó và mọi liên kết truyền dữ liệu. Lệnh này có thể cần đến 1 hoạt động đặc biệt như đã nói ở chương FTP commands, để server có thể nhận ra. Không hoạt động nào được tiếp nhận nếu lệnh này trước đó đã thực thi xong, kể cả truyền data. Kết nối điều khiển không đóng, nhưng kết nối dữ liệu sẽ bị đóng.Có 2 trường hợp cho server khi nhận được lệnh ABOR:
1 là FTP service command đã được hoàn thành: server chỉ việc đóng kết nối dữ liệu nếu nó mở và trả về mã 226 reply chỉ ra abort command đã hoàn thành
2 là FTP service command vẫn đang chạy: server sẽ hủy FTP service command và đóng kết nối dữ liệu, trả về mã 426 reply để chỉ ra service request đã bị hủy đột ngột, rồi gửi tiếp 226 reply để chỉ rằng ABOR command đã thành công
DELETE (DELE)
Làm cho 1 file cụ thể trong đường dẫn bị xóa trên server.
REMOVE DIRECTORY (RMD)
Xóa 1 thư mục chỉ trong đường dẫn (nếu đường dẫn là tuyệt đối) hoặc xóa thư mục con của thư mục hiện thời (nếu đường dẫn là tương đối)
MAKE DIRECTORY (MKD)
Tạo 1 thư mục mới có tên trong đường dẫn (nếu đường dẫn là tuyệt đối) và tạo ra thư mục con của thư mục hiện tại (nếu đường dẫn là tương đối)
PRINT WORKING DIRECTORY (PWD)
Trả về tên của thư mục đang làm việc
LIST (LIST)
Server nhận lệnh này sẽ gửi 1 danh sách đến user. Nếu đường dẫn chỉ rõ 1 thư mục hoặc một nhóm file cụ thể, server sẽ gửi danh sách các file trong thư mục đó. Nếu đường dẫn chỉ rõ 1 file thì server sẽ gửi thông tin
![Page 30: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/30.jpg)
hiện tại của file. Nếu đối số là NULL thì ám chỉ đến thư mục hiện tại. Data truyền qua kết nối dữ liệu theo kiểu ASCII hoặc EBCDIC (user đảm bảo là kiểu tương ứng).Có thể đòi hỏi nhiều thời gian.
NAME LIST (NLST)
Liệt kê 1 danh sách thư mục và trả lại cho user. Đường dẫn sẽ là 1 thư mục cụ thể hoặc 1 hệ thống nhóm file cụ thể khác. Nếu tham số là NULL sẽ ám chỉ thư mục hiện tại. server sẽ trả về luồng tên file hoặc thông tin khác. Dữ liệu sẽ truyền ở kiểu ASCII hoặc EBCDIC, qua kết nối dữ liệu như 1 đường dẫn hợp lệ ngăn cách nhau bởi <CRLF> hoặc <NL> (user phải đảm bảo đúng kiểu tương ứng). Sử dụng lệnh này có mục đích cho việc xử lí file tự động, vd: hàm “multiple get”: lấy cùng lúc nhiều file
SITE PARAMETERS (SITE)
Sử dụng bởi server để cung cấp dịch vụ cụ thể đến hệ thống file của nó cho truyền file nhưng không đủ để tác động toàn bộ bao gồm các command trong giao thức. có thể dùng lệnh HELP SITE để biết rõ
SYSTEM (SYST)
Tìm thông tin OS của server.
STATUS (STAT)
Lệnh sẽ làm server trả về trạng thái, qua kết nối điều khiển trong 1 khuôn dạng của reply. Lệnh này có thể gửi cả trong quá trình truyền file, khi đó server sẽ trả về trạng thái thực thi của các tiến trình hiện tại hoặc thông tin 1 file (nếu có đối số là 1 đường dẫn, lúc này lệnh giống với LIST chỉ khác là LIST có respond qua kết nối dữ liệu). Nếu 1 phần đường dẫn được gửi, server sẽ trả về 1 danh sách tên file hoặc thuộc tính liên kết
HELP (HELP)
Server sẽ đáp lại lệnh này các thông tin hữu ích về các vấn đề cần chú ý của user, qua kết nối điều khiển đến user. Command này có thể có đối số như tên của các command khác, và trả về nhiều thông tin cụ thể. Reply có mã 211 hoặc 214. Được chấp nhận trước cả lệnh USER.
![Page 31: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/31.jpg)
NOOP (NOOP)
Không ảnh hưởng gì đến các tham số hoặc các lệnh trước đó. Nó chỉ là 1 hoạt động server gửi 1 OK reply
FTP command là chuỗi Telnet string, kết thúc bởi Telnet EOL. Mã lệnh là các kí tự alphabetic kết thúc bởi kí tự <SP> nếu có tham số theo sau, nếu không thì kết thúc bằng Telnet EOL. Mã lệnh và ý nghĩa của chúng được mô tả sau, cùng với các chi tiết về reply tương ứng và trình tự của các command & reply.
Có thể chia FTP command theo định danh, tham số truyền dữ liệu hoặc các FTP service request. Vài command (vd ABOR, STAT, QUIT…) có thể gửi qua kết nối điều khiển trong khi truyền dữ liệu. Vài server có thể không giám sát cả kết nối điều khiển và dữ liệu đồng thời có vài hoạt động đặc thù sẽ cần để server sẽ giám sát chúng, như thứ tự sau:
(1)User chèn tín hiệu Telnet “Interrupt Process” (IP) trong luồng Telnet(2)User gửi tín hiệu Telnet “Synch”(3)User chèn lệnh (vd ABOR) trong luồng Telnet stream(4)Server PI, sau khi nhận “IP”, sẽ quét luồng Telnet stream để xác thực 1
FTP command
2. FTP reply
Reply lại các FTP command được đề ra để đảm bảo đồng bộ các yêu cầu và hoạt dộng trong xử lí truyền file, và đảm bảo user luôn biết trạng thái của server. Mọi command phải phát sinh tối thiểu 1 reply (có thể nhiều hơn 1 reply cho 1 command, các reply phải được phân biệt). 1 số command đi theo nhóm (vd USER, PASS, ACCT hoặc RNFR, RNTO). Reply hiển thị sự tồn tại của 1 trạng thái trung gian nếu mọi command trước đó đã hoàn tất. Lỗi tại 1 điểm trong trình tự sẽ yêu cầu lặp lại toàn bộ trình tự từ đầu
1 FTP reply gồm 1 bộ 3 số (truyền dưới dạng 3 kí tự alphanumeric) theo sau bởi các đoạn text. Bộ 3 số này dùng để các hệ thống nhận ra trạng thái hiện tại để đến trạng thái tiếp theo, còn text dùng trong giao diện để tương tác với người dùng. Về bản chất chỉ cần có bộ 3 số này là đủ, text kèm theo thì user PI có thể hủy bỏ nó
![Page 32: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/32.jpg)
hoặc chuyển đến user một cách thích hợp. Text có thể khác nhau với các máy chủ khác nhau. Cấu trúc của 1 reply:
xxx <SP> <Text>
trong đó xxx là bộ mã 3 số, <SP> là dấu cách, <text> là 1 dòng văn bản tùy chọn của mỗi server. Kết thúc bằng Telnet EOL. Có cả trường hợp text dài quá giới hạn của 1 dòng. Khi đó cần có 1 khuôn dạng đặc thù cho dòng đầu tiên để chỉ ra có nhiều hơn 1 dòng sẽ đến, cho đến khi gặp dòng cuối cùng. Ít nhất trong chúng phải có chứa 1 mã thích hợp để chỉ ra trạng thái của giao dịch. Dòng lệnh đầu tiên và cuối cùng có cùng mã.
Ví dụ về multiple line reply: dòng lệnh đầu tiên, theo sau bộ 3 số là dấu “-”, rồi đến text. Dòng cuối cùng có cùng mã như dòng đầu tiên, theo sau bởi <SP>, rồi đến text, kết thúc bởi Telnet EOL.
User process có thể chỉ cần biết dòng đầu tiên và cuối cùng, nó sẽ tìm dòng có cùng mã với dòng đầu tiên, theo sau bởi dấu cách. Với những dòng trung gian mà có mã reply thì phải đệm vào trước bộ 3 mã để tránh xung đột trong xử lí bên user.
3 số trong reply có ý nghĩa đặc biệt, nhằm cho phép phạm vi các đáp ứng từ đơn giản đến phức tạp. Số đầu tiên chỉ reply phản hồi là tốt, tồi hay còn thiếu. 1 user process sẽ xác định được hoạt động tiếp theo (theo kế hoạch, quay lại, giảm bớt, ..) bằng cách xem xét số thứ nhất. Nếu muốn biết được lỗi cụ thể xảy ra thì có thể xem số thứ 2, số thứ 3 dự trù cho việc phân cấp thông tin 1 cách tốt nhất (vd: RNTO command mà không có RNFR trước đó).
Có 5 giá trị của số đầu tiên trong reply code (giá trị thứ 6 cho protect reply – RFC 2228 - sẽ không được nói đến trong bài báo cáo này):
1yz xác thực sơ bộ: Hoạt dộng của request đang khởi tạo, chờ thêm 1 reply nữa trước khi xử lí với lệnh mới (tiến trình user gửi command khác trước khi hoàn thành reply sẽ vi phạm giao thức, nhưng server FTP sẽ xếp hàng bất kì command nào đến trong khi xử lí lệnh trước đó). Kiểu reply này
![Page 33: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/33.jpg)
có thể dùng để chỉ ra command đã được chấp nhận và user có thể chú ý đến kết nối dữ liệu, khi mà việc xử lí đồng thời nhiều request là khó khăn. FTP server có thể gửi nhiều nhất 1 reply 1yz cho mỗi command
2yz xác nhận hoàn thành: thực hiện xong lệnh. Có thể gửi request mới 3yz xác nhận hoạt động trung gian: Command tạm thời được chấp nhận,
nhưng việc xử lí yêu cầu bị tạm ngưng trong khi nhận thêm các thông tin cần thiết khác. User sẽ gửi các lệnh khác chỉ rõ các thông tin đó. Thường dùng với các lệnh theo nhóm
4yz từ chối tạm thời: Command sẽ không được chấp nhận và yêu cầu hoạt động không được thực hiện, nhưng lỗi này chỉ là tạm thời và user vẫn có thể gửi lại yêu cầu này lần nữa. User sẽ trở lại điểm bắt đầu trình tự thực hiện command. Rất khó để nói là tạm thời khi mà 1 trong 2 user hoặc server đã chấp nhận command. Mỗi reply 4yz phải có 1 1 giá trị hiện thời khác nhau, nhưng mục đích là để khuyến khích user thử lại lần nữa.
5yz từ chối vĩnh viễn: Command đã không được chấp nhận và yêu cầu không được thi. Tiến trình user không muốn lặp lại yêu cầu đó nữa (trong cùng chuỗi trình tự).
Các nhóm chức năng sau được mã hóa trong số thứ 2 của reply
x0z cú pháp – reply tham chiếu đến 1 lỗi cú pháp, cú pháp không đúng, không thể thực hiện hoặc command thừa
x1z thông tin – đây là reply đến yêu cầu cho thông tin, vd STAT, HELP x2z kết nối – reply tham chiếu đến 1 kết nối điều khiển hoặc dữ liệu x3z chứng thực và tài khoản – reply cho tiến trình đăng nhập và account x4z không rõ ràng x5z hệ thống file – reply chỉ rõ trạng thái của hệ thống file server đối diện
chuyển yêu cầu hoặc để hệ thống file khác hoạt động
Số thứ 3 cho các cấp thông tin tốt nhất trong mỗi chức năng, chỉ ra trong số thứ 2. Danh sách các reply dưới sẽ minh họa điều này. Chú ý text gắn với mỗi reply là khuyến cáo, có thể thay đổi tùy theo lệnh. Mã reply phải được tuân thủ đúng các
![Page 34: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/34.jpg)
quy tắc đã được đặt ra, không được cài đặt thêm mã mới cho các tình huống hơi khác nhau từ những mô tả này, mà nên thích ứng với các mã được định nghĩa sẵn.
Bây giờ ta sẽ liệt kê các mã reply theo thứ tự tăng dần:
110 restart marker reply: trường hợp này, text là chính xác và không sai để thực hiện cụ thể, nó phải đọc: MARK yyyy=mmmm yyyy là dữ liệu đánh dấu luồng của user process, mmmm là điểm đánh dấu tương đương (có dấu <SP> giữa marker và “=”)
120 dịch vụ sẵn sàng trong nnn phút nữa125 kết nối dữ liệu đã mở, bắt đầu truyền150 trạng thái file OK, quay lại mở kết nối dữ liệu200 command OK202 command không thực hiện, không cần thiết trong tiến trình211 trạng thái hệ thống, hoặc hệ thống hỗ trợ reply212 trạng thái thư mục213 trạng thái file214 thông báo trợ giúp: làm thế nào sử dụng server hoặc có ý nghĩa
của 1 command không chuẩn. hữu ích cho user215 tên kiểu hệ thống: đáp trả lệnh SYST220 dịch vụ sẵn sàng choc ho người dùng mới221 dịch vụ đóng kết nối điều khiển. đăng xuất nếu cần225 mở kết nối dữ liệu, không có tiến trình truyền226 đóng kết nối dữ liệu, yêu cầu file được thực hiện (vd truyền file
hoặc ABORT file)227 nhập chế độ thụ động (h1,h2,h3,h4,p1,p2)230 user đăng nhập, tiếp tục250 yêu cầu file OK, hoàn thành257 “pathname” được tạo331 user OK, cần password332 cần account cho đăng nhập350 tiến trình yêu cầu file cần tiếp thông tin sau421 dịch vụ không sẵn sàng, đóng kết nối điều khiển. nếu server
biết nó cần phải tắt, nó sẽ gửi đến mọi command
![Page 35: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/35.jpg)
425 không thể mở kết nối dữ liệu426 đóng kết nối dữ liệu, hủy việc truyền file450 yêu cầu file không được nhận, file không sẵn sàng (vd file bận)451 yêu cầu đã bị hủy: lỗi cục bộ trong xử lí452 yêu cầu không tiếp nhận. không đủ không gian lưu trữ file500 lỗi cú pháp, không nhận ra command. Bao gồm cả command
quá dài501 lỗi cú pháp trong tham số hoặc đối số502 command không được thực hiện503 trình tự các command tồi504 command không được thực hiện cho tham số này530 không đăng nhập532 cần account để lưu file550 yêu cầu không được tiếp nhận. file không sẵn sàng (không tìm
thấy, không truy cập được)551 yêu cầu bị hủy: page type lạ552 yêu cầu file bị hủy. chỉ định không gian lưu quá lớn (cho thư
mục hiện tại hoặc tập dữ liệu)553 yêu cầu không được tiếp nhận. không chấp nhận tên file
V. THÔNG SỐ KĨ THUẬT1. Cài đặt tối thiểu
Để tạo 1 FTP có thể chạy mà không cần báo lỗi, cài đặt tối thiểu sau là cần thiết cho mọi server:
Các giá trị mặc định cho tham số truyền file:
![Page 36: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/36.jpg)
Mọi host cần chấp nhận các giá trị trên như tiêu chuẩn mặc định
2. Kết nối - Connections
Server PI sẽ nghe trên port L. user hoặc user PI sẽ khỏi tạo 1 kết nối điều khiển 2 hướng. server và user process sẽ trao đổi theo giao thức Telnet. Server không có nghĩa vụ cung cấp để chỉnh sửa command, nó yêu cầu lệnh từ user. Kết nối điều khiển sẽ được server đóng theo yêu cầu của user, sau khi mọi trao đổi dữ liệu và reply được hoàn tất
User DTP phải nghe trên 1 port cụ thể, có thể là port mặc định của nó (U) hoặc 1 port cụ thể trong command PORT. Server sẽ tạo 1 kết nối dữ liệu từ cổng mặc định của server (L-1) đến port cụ thể của User. Hướng truyền dữ liệu và port sẽ được xác nhận bởi các service command
Chú ý mọi cài đặt FTP phải hỗ trợ truyền dữ liệu dùng port mặc định, và chỉ USER PI mới có thể khởi tạo 1 port không mặc định
3. Lệnh - Commands
Lệnh là các chuỗi kí tự Telnet truyền qua kết nối điều khiển và mô tả trong chương FTP command. Lệnh bắt đầu bằng 1 mã lệnh theo sau bởi 1 trường tham số. Mã lệnh gồm 4 hoặc một vài kí tự alphabetic. Cả chữ hoa lẫn chữ thường đều được coi như nhau (vd A & a là 1). Như vậy các từ sau đều đại diện cho command retrieve:
Quy tắc trên cũng áp dụng cho cả các kí tự đại diện cho tham số. Mã command và trường đối số được phân chia bởi 1 hoặc nhiều dấu <SP>. Trường đối số bao gồm
![Page 37: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/37.jpg)
1 xâu kí tự có độ dài thay đổi, kết thúc bởi chuỗi <CRLF> cho kiểu NVT-ASCII. Cho kiểu khác có thể dùng EOL. Nó sẽ chú ý rằng server sẽ nhận tham số cho đến khi nó đọc được kí tự EOL thì nó coi là command đã được đọc xong.
a) Lệnh FTP - FTP commands:
Các chuỗi sau là FTP commands:
USER <SP> <user name> <CRLF>PASS <SP> <password> <CRLF>ACCT <SP> <account information> <CRLF>CWD <SP> <pathname> <CRLF>CDUP <CRLF>SMNT <SP> <pathname> <CRLF>QUIT <CRLF>REIN <CRLF>PORT <SP> <host-port> <CRLF>PASV <CRLF>TYPE <SP> <type code> <CRLF>STRU <SP> <structure code> <CRLF>MODE <SP> <mode code> <CRLF>RETR <SP> <pathname> <CRLF>STOR <SP> <pathname> <CRLF>STOU <CRLF>APPE <SP> <pathname> <CRLF>ALLO <SP> <dec-integer>
[<SP> R <SP> <dec-integer>] <CRLF>REST <SP> <marker> <CRLF>RNFR <SP> <pathname> <CRLF>RNTO <SP> <pathname> <CRLF>ABORT <CRLF>DELE <SP> <pathname> <CRLF>RMD <SP> <pathname> <CRLF>MKD <SP> <pathname> <CRLF>PWD <CRLF>LIST [<SP> <pathname>] <CRLF>
![Page 38: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/38.jpg)
NLST [<SP> <pathname>] <CRLF>SITE <SP> <string> <CRLF>SYST <CRLF>STAT [<SP> <pathname>] <CRLF>HELP [<SP> <string>] <CRLF>NOOP <CRLF>
b) Tham số của FTP command
Cú pháp của trường đối số ở các command trên là:
c) Chuỗi các reply có thể có của 1 command Thiết lập kết nối
120 220 220 421
Login USER 230 530 500, 501, 421
![Page 39: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/39.jpg)
331, 332 PASS 230 202 530 500, 501, 503, 421 332 ACCT 230 202 530 500, 501, 503, 421 CWD 250 500, 501, 502, 421, 530, 550 CDUP 200 500, 501, 502, 421, 530, 550 SMNT 202, 250 500, 501, 502, 421, 530, 550
Logout REIN 120 220 220 421 500, 502 QUIT 221 500
Transfer parameters PORT 200 500, 501, 421, 530
![Page 40: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/40.jpg)
PASV 227 500, 501, 502, 421, 530 MODE 200 500, 501, 504, 421, 530 TYPE 200 500, 501, 504, 421, 530 STRU 200 500, 501, 504, 421, 530
File action commands ALLO 200 202 500, 501, 504, 421, 530 REST 500, 501, 502, 421, 530 350 STOR 125, 150 (110) 226, 250 425, 426, 451, 551, 552 532, 450, 452, 553 500, 501, 421, 530 STOU 125, 150 (110) 226, 250 425, 426, 451, 551, 552 532, 450, 452, 553 500, 501, 421, 530 RETR
![Page 41: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/41.jpg)
125, 150 (110) 226, 250 425, 426, 451 450, 550 500, 501, 421, 530 LIST 125, 150 226, 250 425, 426, 451 450 500, 501, 502, 421, 530 NLST 125, 150 226, 250 425, 426, 451 450 500, 501, 502, 421, 530 APPE 125, 150 (110) 226, 250 425, 426, 451, 551, 552 532, 450, 550, 452, 553 500, 501, 502, 421, 530 RNFR 450, 550 500, 501, 502, 421, 530 350 RNTO 250 532, 553 500, 501, 502, 503, 421, 530 DELE 250
![Page 42: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/42.jpg)
450, 550 500, 501, 502, 421, 530 RMD 250 500, 501, 502, 421, 530, 550 MKD 257 500, 501, 502, 421, 530, 550 PWD 257 500, 501, 502, 421, 550 ABOR 225, 226 500, 501, 502, 421
Informational commands SYST 215 500, 501, 502, 421 STAT 211, 212, 213 450 500, 501, 502, 421, 530 HELP 211, 214 500, 501, 502, 421
Miscellaneous commands (command hỗn hợp) SITE 200 202 500, 501, 530 NOOP 200 500 421
![Page 43: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/43.jpg)
PHẦN III: CÀI ĐẶT BẰNG VISUAL C++
Một vài chức năng chính của chương trình Xóa màn hình hiển thị
void CBTL_FTP_SERVERDlg::OnBnClickedClearScreen(){
// TODO: Add your control notification handler code heremListBox.ResetContent();
}
Thêm 1 tài khoản user tương ừng với root folder hiện tạivoid CBTL_FTP_SERVERDlg::OnBnClickedButtonAddUser(){
// TODO: Add your control notification handler code hereint lenUser=CUserDir.GetLength();int lenPass=CUserPass.GetLength();int lenSys=wcslen(sysFile);if(!lenUser || !lenPass || !lenSys){
MessageBox(L"Some Blank Field!!!",L"Add User",MB_OK);return;}wchar_t user_tmp[MAX_DIR_LEN];wcscpy(user_tmp,sysFile);wcscat(user_tmp,L"\\");wcscat(user_tmp,CUserDir);if(GetFileAttributes(user_tmp)!=INVALID_FILE_ATTRIBUTES){
MessageBox(L"User Already Exist!!!",L"Add User",MB_OK);return;}DWORD k=CreateDirectory(user_tmp,NULL);if(k==0){
MessageBox(L"Not Add User!!!",L"Add User",MB_OK);return;}wchar_t pass_tmp[MAX_DIR_LEN];wchar_t pass_file[MAX_DIR_LEN];wcscpy(pass_file,user_tmp);wcscat(pass_file,L"\\pass");wcscpy(pass_tmp,CUserPass);char pass[MAX_DIR_LEN];ZeroMemory(pass,sizeof(pass));strcpy(pass,WcharToChar(pass_tmp));FILE *f=_wfopen(pass_file,L"w");if(f==NULL){
![Page 44: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/44.jpg)
RemoveDirectory(user_tmp);MessageBox(L"Not Add User2!!!",L"Add User",MB_OK);return;
}strupr(pass);fputs(pass,f);fclose(f);MessageBox(L"Add User OK!!!",L"Add User",MB_OK);
}
Xoa 1 user cung tat ca cac file lien quan trong thu muc cua uservoid CBTL_FTP_SERVERDlg::OnBnClickedButtonDeleUser(){
// TODO: Add your control notification handler code hereint lenUser=CUserDir.GetLength();int lenSys=wcslen(sysFile);if(!lenUser || !lenSys)
MessageBox(L"Some Blank Field!!!",L"Add User",MB_OK);wchar_t user_tmp[MAX_DIR_LEN];wcscpy(user_tmp,sysFile);wcscat(user_tmp,L"\\");wcscat(user_tmp,CUserDir);if(GetFileAttributes(user_tmp)==INVALID_FILE_ATTRIBUTES){
MessageBox(L"User Not Exist!!!",L"Delete User",MB_OK);return;}BOOL k=DeleteDirectory(user_tmp);if(k==FALSE){
MessageBox(L"Not Delete User!!!",L"Delete User",MB_OK);return;}MessageBox(L"Delete User OK!!!",L"Delete User",MB_OK);
}
Hiển thị danh sách user hiện tại ứng với root folder hiện tạivoid CBTL_FTP_SERVERDlg::OnBnClickedButtonViewUserList(){
// TODO: Add your control notification handler code hereHANDLE hFind=INVALID_HANDLE_VALUE;wchar_t path[MAX_FILE_LEN];wcscpy(path,sysFile);wcscat(path,L"\\*");
![Page 45: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/45.jpg)
WIN32_FIND_DATA fdd;hFind=FindFirstFile(path,&fdd);if(hFind==INVALID_HANDLE_VALUE) return;do{
if(wcscmp(fdd.cFileName,L".")==0)continue;if(wcscmp(fdd.cFileName,L"..")==0)continue;if(fdd.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
mListBox2->InsertString(-1,fdd.cFileName);}while(FindNextFile(hFind,&fdd));
}
Chuyển control port của server, nếu port hợp lệ sẽ hiện thông báo thành công, nếu không hiện thông báo Lỗi
void CBTL_FTP_SERVERDlg::OnBnClickedButtonOk(){
// TODO: Add your control notification handler code hereif(run)return;int len=CListenPort.GetLength();if(len<=0){
MessageBox(L"Blank Field!!!",L"Listen Port",MB_OK);return;}int port;//gia tri port khong hop leswscanf(CListenPort,L"%d",&port);if((port<1) || (port>=65536)){
MessageBox(L"Port not compatible!!!",L"Listen Port",MB_OK);return;
}//van la gia tri cuif(ControlPort==(WORD)port)return;ControlPort=(WORD)port;DataPort=ControlPort-1;wchar_t tmp[MAX_BUF_LEN];ZeroMemory(tmp,sizeof(tmp));wsprintf(tmp,L"Now: FTP server listen port = %d\nDefault data port = %d",ControlPort,DataPort);DWORD k;for(int k=0;k<event_total;k++){
closesocket(sock_manage[k].sControl);closesocket(sock_manage[k].sData);
![Page 46: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/46.jpg)
closesocket(sock_manage[k].sDataAccept);WSAResetEvent(event_control[k]);
}event_total=0;TerminateThread(FTP_SERVER_THREAD->m_hThread,0);Sleep(10);sock_manage[0].sControl=socket(AF_INET,SOCK_STREAM,0);sock_manage[0].addrControl.sin_family=AF_INET;sock_manage[0].addrControl.sin_port=htons(ControlPort);sock_manage[0].addrControl.sin_addr.s_addr=htonl(INADDR_ANY);int ret = bind(sock_manage[0].sControl,(sockaddr*)&sock_manage[0].addrControl,sizeof(SOCKADDR_IN));if(ret==SOCKET_ERROR){
MessageBox(L"Error when listening port!!!",L"Listen Port",MB_OK);return;
}MessageBox(tmp,L"Listen Port",MB_OK);event_control[0]=WSACreateEvent();event_data[0]=WSACreateEvent();event_data_accept[0]=WSACreateEvent;WSAEventSelect(sock_manage[0].sControl,event_control[0],FD_ACCEPT|FD_CLOSE);event_total++;listen(sock_manage[0].sControl,5);FTP_SERVER_THREAD=AfxBeginThread(FTP_SERVER,NULL);
//AfxBeginThread(FTP_SERVER);}
Duyệ folder để chọn 1 folder làm folder gốcvoid CBTL_FTP_SERVERDlg::OnBnClickedButtonBrowser(){
// TODO: Add your control notification handler code hereBROWSEINFO BI;ZeroMemory(&BI,sizeof(BI));wchar_t path[MAX_FILE_LEN];BI.hwndOwner=h;BI.iImage=0;BI.lParam=NULL;BI.pidlRoot=0;
![Page 47: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/47.jpg)
BI.lpszTitle=L"Browser Root Folder!!";BI.pszDisplayName=path;if(run)return;LPITEMIDLIST lpItIdL=SHBrowseForFolder(&BI);wchar_t pathFile[MAX_FILE_LEN];if(lpItIdL!=NULL)
if(!SHGetPathFromIDList(lpItIdL,pathFile)){MessageBox(L"Can not open folder!!!",L"Open Root Dir",MB_OK);return;
}wcscpy(sysFile,pathFile);MessageBox(L"Change Root Directory OK!!!",L"Open Root Dir",MB_OK);mRootDir.SetCueBanner(pathFile);
}
Chạy chương trình tiếpvoid CBTL_FTP_SERVERDlg::OnBnClickedButtonRunPause(){
// TODO: Add your control notification handler code hereif(!run){
run=true;mCheckStop.SetCheck(BST_UNCHECKED);mCheckRun.SetCheck(BST_CHECKED);
}}
Tạm dừng chương trìnhvoid CBTL_FTP_SERVERDlg::OnBnClickedButtonStop(){
// TODO: Add your control notification handler code hereif(run){
run=false;mCheckRun.SetCheck(BST_UNCHECKED);mCheckStop.SetCheck(BST_CHECKED);
}}
Thoát khỏi chương trìnhvoid CBTL_FTP_SERVERDlg::OnBnClickedQuit()
![Page 48: BC LTM de in](https://reader036.vdocuments.site/reader036/viewer/2022062423/55cf944f550346f57ba11d66/html5/thumbnails/48.jpg)
{// TODO: Add your control notification handler code hereif(MessageBox(L"You Realy want to quit FTP server?",L"Quit",MB_OKCANCEL)==IDOK){
run=false;quit=true;Sleep(1000);DWORD i;for(i=0;i<event_total;i++){
send(sock_manage[index].sControl,SERVER_DOWN,strlen(SERVER_DOWN),0);WSAResetEvent(event_control[i]);closesocket(sock_manage[i].sControl);
}WSACleanup();OnOK();
}}
Hình ảnh minh họa chạy chương trình