Các phương thức của giao thức mạng HTTP: Giao thức HTTP có các phương thức phổ biến sau: GET: Phương thức GET được dùng để truy xuất thông tin từ máy chủ Ngày nay, với sự phát triển mạ
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT
THÀNH PHỐ HỒ CHÍ MINH
ĐỒ ÁN TỐT NGHIỆP NGÀNH CNKT CƠ ĐIỆN TỬ
NGHIÊN CỨU XÂY DỰNG NỀN TẢNG PHẦN MỀM
FULLSTACK-MQTT CHO KỸ SƯ
Trang 2TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HỒ CHÍ MINH
KHOA CƠ KHÍ CHẾ TẠO MÁY
ĐỒ ÁN TỐT NGHIỆP
NGHIÊN CỨU XÂY DỰNG NỀN TẢNG PHẦN MỀM
FULLSTACK-MQTT CHO KỸ SƯ
GVHD: ThS LÊ PHAN HƯNG SVTH: NGUYỄN TRẦN PHÚC BẢO 17146232
Khoá: 2017
Tp Hồ Chí Minh, ngày 17 tháng 2 nằm 2023
Trang 3TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HỒ CHÍ MINH
KHOA CƠ KHÍ CHẾ TẠO MÁY
ĐỒ ÁN TỐT NGHIỆP
NGHIÊN CỨU XÂY DỰNG NỀN TẢNG PHẦN MỀM
FULLSTACK-MQTT CHO KỸ SƯ
GVHD: ThS LÊ PHAN HƯNG SVTH: NGUYỄN TRẦN PHÚC BẢO 17146232
Khoá: 2017
Tp Hồ Chí Minh, ngày 17 tháng 2 nằm 2023
Trang 4i
Trang 5ii
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HCM CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do – Hạnh phúc KHOA CƠ KHÍ CHẾ TẠO MÁY
NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP
Giảng viên hướng dẫn: Th.S Lê Phan Hưng
Sinh viên thực hiện: Nguyễn Trần Phúc Bảo MSSV: 17146232
1 Tên đề tài:
- Nguyên cứu xây dựng nền tảng phần mềm Fullstack-MQTT cho kỹ sư
2 Các số liệu, tài liệu ban đầu:
+ Linh hoạt hiệu quả trong dự án
+ Dễ dàng sử dụng
+ Dễ dàng nâng cấp và cá nhân hoá mô hình
+ Miễn phí khi sử dụng
3 Nội dung chính của đồ án:
- Nội dung nghiên cứu tổng quan
7 Ngôn ngữ trình bày: Bản báo cáo: Tiếng Anh Tiếng Việt
Trình bày bảo vệ: Tiếng Anh Tiếng Việt
(Ký, ghi rõ họ tên) (Ký, ghi rõ họ tên) (Ký, ghi rõ họ tên)
Trang 6iii
NGHIÊN CỨU XÂY DỰNG NỀN TẢNG PHẦN MỀM FULLSTACKMQTT
DÀNH CHO KỸ SƯ
Trang 7iv
DANH MỤC VIẾT TẮT
HTTPS Hypertext Transfer Protocol Secure
IMAP Internet Message Access Protocol
MQTT Originally an initialism of MQ Telemetry Transport
Trang 8v
MỤC LỤC
DANH MỤC VIẾT TẮT iv
MỤC LỤC v
MỤC LỤC HÌNH ẢNH ix
MỤC LỤC BẢNG x
LỜI CAM ĐOAN xi
LỜI CẢM ƠN: xii
CHƯƠNG 1 TỔNG QUAN 1
1.1 Lý do chọn đề tài: 1
1.2 Tính cấp thiết của đề tài: 1
1.3 Mục tiêu: 1
1.4 Phương pháp nghiên cứu và đối tượng nghiên cứu: 1
1.5 Các sản phẩm tương tự hoặc sản phẩm tiền nhiệm 2
1.5.1 Sản phẩm Django: 2
1.5.2 Sản phẩm Flask: 2
1.6 Phạm vi đề tài: 3
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 4
2.1 Mô hình mạng OSI: 4
2.2 Giao thức mạng TCP: 5
2.2.1 Lịch sử của giao thức TCP: 5
2.2.2 Bản thân TCP: 5
2.2.3 Cách hoạt động giao tiếp của phương thức TCP 5
2.3 Nền tảng WWW (world wide web): 6
2.4 Giao thức HTTP: 6
2.4.1 HTTP là gì? 7
2.4.2 Cách hoạt động của phương thức HTTP trên hạ tầng mạng: 7
2.4.3 Các phương thức của giao thức mạng HTTP: 7
2.5 Mã hoá dữ liệu: 7
2.6 Mã hoá bất đối xứng: 7
2.7 Mã hoá đối xứng: 8
2.8 Phương thức HTTPS: 9
2.9 Các khái niệm Python cơ bản 9
2.9.1 Cách thực thi một lệnh Python: 9
Trang 9vi
2.9.2 Khái niệm Indentation (Thụt lề) trong Python 9
2.9.3 Biến trong Python: 9
2.9.4 Ghi chú trong Python: 10
2.9.5 Các nguyên tắc đặt tên biến 10
2.9.6 Các kiểu dữ liệu trong Python: 10
2.9.7 Kiểu văn bản trong Python (str): 11
2.9.8 Cắt văn bản (str) trong Python: 11
2.9.9 Cắt văn bản từ vị trí đầu tiên trong Python: 11
2.9.10 Cắt văn bản đến vị trí cuối trong Python: 12
2.9.11 Chỉ mục âm: 12
2.9.12 Chuyển đổi dữ liệu sang dạng viết hoa trong Python: 12
2.9.13 Chuyển đổi dữ liệu sang dạng viết hoa trong Python (với casefold): 12 2.9.14 Chuyển đổi dữ liệu sang dạng viết thường trong Python: 12
2.9.15 Xoá khoảng trắng thừa trong Python: 12
2.9.16 Thay thế văn bản trong Python: 12
2.9.17 Tách văn bản và tạo thành một mảng trong Python: 12
2.9.18 Nối văn bản trong Python: 12
2.9.19 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 1): 12
2.9.20 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 2): 13
2.9.22 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 4): 13
2.9.23 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 5 – với %): 13 2.9.24 Chuyển đổi chữ cái đầu tiên thành chữ viết hoa trong Python: 13
2.9.25 Canh đều lề trong Python: 13
2.9.26 Đếm số lần xuất hiện của một văn bản con trong văn bản gốc – Python: 13 2.9.27 Chuyển đổi văn bản sang chuẩn UTF-8 trong Python: 13
2.9.28 Tìm vị trí của một văn bản con trong Python: 13
2.9.29 Kiểm tra tất cả ký tự có thuộc bảng Alphabet: 14
2.9.30 Kiểm tra tất cả ký tự có phải là số: 14
2.9.31 Kiểm tra tất cả ký tự có phải là số (Phần 2): 14
2.9.32 Boolean trong Python: 14
2.9.33 Số nguyên trong Python (int): 14
Trang 10vii
2.9.34 Số thực trong Python (float): 14
2.9.35 Số phức trong Python: 14
2.9.36 Toán tử trong Python – Giới thiệu: 14
2.9.37 Toán tử số học: 15
2.9.39 Toán tử so sánh: 15
2.9.40 Toán tử lý luận (Logical): 15
2.9.41 Toán tử xác thực (Identify): 16
2.9.42 Toán tử Membership: 16
2.9.43 Toán tử Bitwise: 16
2.9.44 Danh sách trong Python 16
2.9.45 Truy xuất dữ liệu qua chỉ số mục: 16
2.9.46 Chỉ số trong một mảng: 17
2.9.47 Thay đổi giá trị phần tử: 17
2.9.48 Thêm phần tử từ một đối tượng: 17
2.9.49 Thêm phần tử từ một mảng khác: 17
2.9.50 Chèn phần tử vào mảng: 17
2.9.51 Xoá phần tử trong mảng: 17
2.9.52 Xoá phần tử qua chỉ mục: 17
2.9.53 Xoá sự tồn tại của một danh sách: 18
2.9.54 Xoá tất cả phần tử của một danh sách: 18
2.9.55 Vòng lặp với một danh sách: 18
2.9.56 Lấy chiều dài của một danh sách: 18
2.9.57 Sắp xếp một mảng chữ số: 18
2.9.58 Sao chép một mảng: 18
2.9.59 Tuple trong Python: 18
2.9.60 Khởi tạo một biến Tuple: 19
2.9.61 Truy xuất phần tử trong Tuple: 19
2.9.62 Vòng lặp for trong Python: 19
2.9.63 Vòng lặp while trong Python: 20
2.9.64 Các từ khóa tác động đến vòng lặp: 21
2.9.65 Câu lệnh điều kiện trong Python: 22
2.9.66 Cấu trúc lệnh if trong Python: 22
2.9.67 Lệnh if … else 24
Trang 11viii
2.9.68 Lệnh if … elif … else trong Python: 25
2.9.69 Lệnh if lồng nhau trong Python: 26
2.10 Javascript cơ bản: 34
2.11 HTML cơ bản 41
2.12 Database là gì? Vai trò? 46
2.13 SQLInjection 46
CHƯƠNG 3 TRIỂN KHAI ĐỒ ÁN: 48
3.1 Mã hoá: 48
3.2 Giao thức TCP/IP với Socket 49
3.3 Giao thức HTTP: 52
3.4 Giao thức MQTT 54
3.5 Cơ chế Broken: 66
3.6 Cơ sở dữ liệu: 68
3.6.1 Lưu đồ giải thuật trợ giúp kết nối với MySQL 68
3.6.2 Lưu đồ giải thuật trợ giúp kết nối với SQLServer 69
3.7 Lưu đồ giải thuật bộ điều phối Render 70
CHƯƠNG 4 THỰC NGHIỆM: 74
CHƯƠNG 5: KẾT LUẬN VÀ KIẾN NGHỊ: 77
5.1 Kết luận: 77
5.2 Kiến nghị: 77
CHƯƠNG 6 TÀI LIỆU THAM KHẢO 78
PHỤ LỤC: 79
Trang 12ix
MỤC LỤC HÌNH ẢNH
Hình 1.1 Hình Django dành cho Python 2
Hình 1.2 Hình nền tảng Flask dành cho Python 2
Hình 2.1 Mô hình giao tiếp giữa máy khách và máy chủ qua giao thức TCP 5
Hình 2.2 Thời gian cần thiết để một hacker Brute force mật khẩu của bạn 8
Hình 2.3 Thực thi lệnh python trên command line 9
Hình 2.4 Thực thi lệnh python qua một tệp tin *.py 9
Hình 2.5 Cách tạo ra một biến trong Python (trong command line) 10
Hình 2.6 Ghi chú trên một dòng 10
Hình 2.7 Ghi chú trên nhiều dòng 10
Hình 2.8 Ví dụ về hàm print trong python 11
Hình 2.9 Ví dụ về biến có dữ liệu là văn bản chứa nhiều dòng thông tin 11
Hình 2.10 Sơ đồ câu lệnh If tham khảo tại tài liệu [5] 23
Hình 2.11 Sơ đồ lệnh if else tham khảo tại [5] 24
Hình 2.12 Sô đồ lệnh if elif else tham khảo tại [5] 26
Hình 2.13 Hình mô tả quá trình làm việc của một hàm 28
Hình 2.14 Hộp thoại sau khi sử dụng hàm alert 34
Hình 2.15 Mẫu siêu văn bản html 42
Hình 2.16 Mẫu siêu văn bản html 2 45
Hình 2.17 Hình mẫu về thẻ ul và li 46
Hình 3.1 Lưu đồ giải thuật thuật toán mã hoá RSA 48
Hình 3.2 Lưu đồ giải thuật TCP/IP với thư viện socket trong python 49
Hình 3.3 Lưu đồ phương thức mạng HTTP 52
Hình 3.4 Lưu đồ giải thuật giao thức MQTT 65
Hình 3.5 Cách hoạt động của các Subcribe 67
Hình 3.6 Cách hoạt động của các gói tin Publish 68
Hình 3.7 Lưu đồ giải thuật quá trình kết nối cơ sở dữ liệu MySQL 68
Hình 3.8 Lưu đồ quá tình kết nối với cơ sở dữ liệu SQLServer 69
Hình 3.9 Lưu đồ thuật toán tạo ra nội dung gửi cho 71
Trang 13x
MỤC LỤC BẢNG
Bảng 2.1 So sánh giữa HTTP và HTTPS 9
Bảng 2.2 Bảng toán tử số học 15
Bảng 2.3 Bảng toán tử chuyển nhượng 15
Bảng 2.4 Bảng toán tử so sánh 15
Bảng 2.5 Bảng toán tử logical 16
Bảng 2.6 Bảng toán tử xác thực 16
Bảng 2.7 Bảng toán tử membership 16
Bảng 2.8 Bảng toán tử bitwise 16
Bảng 2.9 Bảng mẫu về chỉ số trong một mảng 17
Bảng 2.10 Bảng thuộc tính của đối tượng Math 40
Bảng 2.11 Bảng các phương thức phổ biến trong thư viện Math 41
Bảng 3.1 Bảng thông tin về các dạng tin nhắn 55
Bảng 3.2 Bảng thông tin, vị trí và ý nghĩa của các Flag trong Fixed header 56
Bảng 3.3 Bảng thông tin về giá trị Connect return trong phiên bản MQTT V3.1 58
Bảng 3.4 Bảng trạng tháy Connect Return của phiên bản đặc biệt V5.1f 60
Bảng 3.5 Bảng thông tin về giá trị của Payload 60
Bảng 3.6 Bảng phân tích chủ đề và giá trị qua hệ HEX 61
Bảng 3.7 Bảng phân tích giá trị chủ đề và QoS qua mã HEX 63
Trang 14xi
LỜI CAM ĐOANTên đề tài: “Nghiên cứu xây dựng nền tảng phần mềm Fullstack-MQTT cho kỹ sư” GVHD: Th.S Lê Phan Hưng
Tp.Hồ Chí Minh, ngày … tháng 02 năm 2023
Thay mặt nhóm sinh viên
Ký tên
Nguyễn Trần Phúc Bảo
Trang 15xii
LỜI CẢM ƠN:
Chúng em xin cảm ơn thạc sĩ Lê Phan Hưng đã giúp đỡ và tạo điều kiện cho nhóm chúng em hoàn thành đồ án này Chúng em cũng cảm ơn sâu sắc tới toàn thể giảng viên và ban giám hiệu nhà trường
Chúng con xin cảm ơn đến gia đình và người thân đã giúp đỡ cho chi phí khi thực hiện đề tài này
Chúng tôi cũng rất cảm ơn bạn bè và đọc giả đã tìm tới và đọc bài nghiên cứu này Chúng tôi cũng xin cảm ơn một vài người bạn ẩn danh đã tải nền tảng của mình trên sourceforce nơi lưu trữ mã nguồn mở Tôi rất mong các bạn cùng nhóm chúng tôi xây dựng FullstackMQTT trở nên thiết thực hơn nữa
Trang 16CHƯƠNG 1 TỔNG QUAN
1.1 Lý do chọn đề tài:
Ngày nay, với sự phát triển mạnh mẽ của công nghệ đặt biệt công nghệ thông tin
và viễn thông nhằm tiên phong tạo ra một nền tảng hỗ trợ cho lập trình fullstack
và IoT Nên nhóm đề nghiên cứu nền tảng fullstackmqtt dành cho kỹ sư Nhằm phục vụ cho mục đích nghiên cứu và học tập Nhóm rất mong muốn được nhiều nhà phát triển cùng nhau xây dựng FullstackMQTT trở thành nền tảng mạnh mẽ,
có thể trợ giúp cho sự phát triển IoT, AIoT và IioT của nước nhà
1.2 Tính cấp thiết của đề tài:
Ngày nay, công nghệ mới luôn luôn được ra đời và công việc liên quan cũng được sinh ra, như Facebook ra đời kéo theo đó các lĩnh vực lập trình tự động marketing,
… cũng ra đời Đồng thời, cũng rất nhiều công nghệ cũ cùng với công việc liên quan cũng bị mất đi Chúng ta sẽ rất tốn thời gian nếu như vô tình tìm hiểu về những công nghệ đó Thay vào đó, chúng ta tự tạo ra nền tảng riêng biệt và từ tạo
ra cơ hội việc làm thì thật tuyệt vời Nhưng dám nghĩ và dám làm thì vẫn chưa đủ nếu như chúng ta thiếu đi nền tảng kiến thức đến từ sách, các đoạn phim liên quan
Đề tài này được xây dựng từ nền kiến thức mà nhóm học tập được từ các sách, bài báo khoa học, các bài học trực tuyến miễn phí và có trả phí trên các nền tảng học tập trực tuyến Đề tài xây dựng ra nền tảng lập trình mới và cũng đặc biệt chứng minh rằng tự học, tự đọc sách và chi trả chi phí cho việc nâng cấp kiến thức bản thân sẽ quan trọng như thế nào đối với mọi người nói chung và học sinh cùng sinh viên nói riêng
1.3 Mục tiêu:
Mục tiêu và sản phẩm nhóm hướng tới sau khi hoàn thành dự án là:
Nền tảng fstkmqtt (Fullstack MQTT) dưới dạng module package dành cho python; và đặt biệt cải tiến Broken ở lớp thứ 7 trong mô hình OSI
Tài liệu hướng dẫn tích hợp bản thuyết mình
Mẫu thử nghiệm
1.4 Phương pháp nghiên cứu và đối tượng nghiên cứu:
Các phương pháp nghiên cứu nhóm sử dụng là:
Đọc tài liệu đề cập đến mạng OSI Đặc biệt, nghiên cứu sâu tới TCP/IP và các ứng dụng của nó
Đọc tài liệu liên quan đến các chuẩn giao tiếp của giao thức MQTT V3.1 và V5.0
Xem và học hỏi từ các nguồn chia sẽ kiến thức như youtube, facebook, …
Tham gia các cuộc tra đổi học thuật online qua các phần mềm như Messenger, Zalo và Zoom
Trao đổi với giảng viên trợ dẫn để hướng dẫn, đưa lời khuyên
Đối tượng nghiên cứu:
Nghiên cứu về hạ tầng mạng với mô hình OSI
Nghiên cứu giao thức mạng TCP/IP
Nghiên cứu giao thức HTTP
Trang 17 Nghiên cứu giao thức MQTT
1.5 Các sản phẩm tương tự hoặc sản phẩm tiền nhiệm
1.5.1 Sản phẩm Django:
Hình 1.1 Hình Django dành cho Python
Django là một trong những nền tảng tốt bậc nhất dành cho python hỗ trợ cho lập trình viên trong lập trình
Ưu điểm:
Bảo mật của Django khá tốt
Hỗ trợ người dùng mở rộng thoải mái với lưu lượng traffic lớn
Dễ sử dụng với Python và mô hình MVC
Dễ học tập với nguồn tài liệu học tập phổ biến dễ tìm
Nhược điểm:
Không đưa ra cảnh báo khi có lỗi
Tạo bộ định tuyến tương đối khó và phức tạp
1.5.2 Sản phẩm Flask:
Hình 1.2 Hình nền tảng Flask dành cho Python
Trang 18 Không thể xem mô tả lỗi
Khó triển cho việc triển khai
1.6 Phạm vi đề tài:
- Triển khai dự án lên các nền tảng mã nguồn mở khác bao gồm hệ thống dịch
vụ pip và sourceforce
- Phạm vi sử dụng: Quốc tế
Trang 19CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1 Mô hình mạng OSI:
7 Lớp ứng dụng Là nơi tương tác giữ người dùng với các phần mềm trên thiết bị có thể truy cập mạng
6 Lớp trình bày Là nơi mã hoá dữ liệu từ dữ liệu từ kết quả ở lớp 7 (Lớp ứng dụng)
5 Lớp phiên Là nơi tạo ra các kênh liên lạc qua cổng thông tin (port) có giá trị trong vùng 1 ÷ (2 − 1)
4 Lớp vận chuyển Là nơi vận chuyển dữ liệu qua các giao thức TCP, UDP, ATP, CUDP, RUDP
3 Lớp mạng Quyết định con đường vật lý mà gói dữ liệu sẽ được gửi đi
2 Lớp liên kết dữ liệu Xác định cấu trúc của dữ liệu trên mạng
1 Lớp vật lý Vận chuyển dòng bit thô (0 1) trên phương tiện vật lý
Lớp ứng dụng: Là nơi có các tương tác giữa người dùng và máy tính qua các ứng dụng mà có thể truy cập dịch vụ mạng tới các hệ thống máy chủ khác nhau trên máy tính của người dùng
Lớp trình bày: Khi người dùng thao tác với phần mềm sinh ra các dữ liệu có thể sử dụng được thì các dữ liệu đó sẽ được chuyển tới lớp trình bày để được
xử lý qua các quá trình như mã hoá dữ liệu
Lớp phiên: Là nơi tạo ra kênh để trao đổi giữa 2 máy (2 thực thể) khác nhau qua môi trường mạng, hay gọi là một phiên Lớp này đóng vai trờ quan trọng
và chịu trách nhiệm cho việc mở phiên và đảm bảo duy trình hoạt động của một cổng đảm bảo rằng các gói dữ liệu đều được gửi trước khi một trong 2 bên yêu cầu ngắt quá trình do các yếu tố khác ảnh hưởng
Lớp vận chuyển: Đây là lớp mạng đóng vai trò phân rã gói tin từ lớp phiên thành nhiều gói tin phù hợp với tốc độ truyền, phù hợp với lớp phiên tại thiết
bị đầu cuối, tạo và kiểm tra tính đúng đắn gói tin nếu không đúng sẽ yêu cầu lại gói đó
Lớp mạng: Giữ 2 vai trò quan trọng Một là định danh địa chỉ cuối cần nhận Hai là tìm đường đi đến điểm cuối ngắn nhất (Mô hình đồ thị) Các dữ kiện trên sẽ được đính kèm vào gói tin từ lớp vận chuyển đề xuất tới và tạo ra các gói
Lớp liên kết dữ liệu: Từ các gói lớp này sẽ phân chia thành các khung và thực hiện gửi từ nguồn tới đích Lớp này có 2 phần chính bao gồm điều khiển liên kết Logical (LLC) nhằm xác định phương thức mạng, kiểm tra và động bộ
Trang 20hoá các khung dữ liệu Hai là MAC (Media Access Control), địa chỉ MAC đóng vai trò cung cấp kết nối thiết bị và xác định đặc quyền để gửi và nhận
dữ liệu
Lớp vật lý: là nơi tín hiệu số được chuyển đổi thành các tính hiện vật lý học như sóng, điện, cơ, … Một số thiết bị ở lớp vật lý như Ăng-ten của router (Sóng điện trường), Cáp quang, vệ tinh, dây điện, …
2.2 Giao thức mạng TCP:
Phương thức TCP xuất hiện ở lớp thứ 4 trong mô hình OSI TCP viết tắt cho cụm
từ Transmission Control Protocol
Trong thực tế giao thức TCP xuất hiện rất nhiều trong thực tế, từ những trang website mà chúng ta tìm kiếm hằng ngày, từ những phần mềm thiết kế như Adobe, phần mềm văn phòng của Microsoft, … Đâu đâu chúng ta cũng đều
có thể thấy giao thức TCP xuất hiện
Trong lập trình, TCP chúng ta có thể tìm bất cứ ở đâu, như socket trong python, winsock trên C, websocket.io trên javascript, …
2.2.3 Cách hoạt động giao tiếp của phương thức TCP
Hình 2.1 Mô hình giao tiếp giữa máy khách và máy chủ qua giao thức TCP
Ta có cái trạng thái trên hình 3 lần lượt là:
CLOSED: Trang thái đóng
Trang 21 LISTEN: Trạng thái lắng nghe (Chỉ có trên máy chủ)
ESTABLISHED: Trạng thái được thành lập, ở trạng thái này máy khách và máy chủ có thể giao tiếp với nhau qua các khung dữ liệu
FIN_WAIT_1, FIN_WAIT_2: Trạng thái chờ hoàn tất
CLOSEWAIT: Trạng thái chờ đóng khi hoàn tất tất cả tác vụ truyền nhận giữ hai thiết bị
LAST_ACK: Trạng thái chờ gói ACK cuối cùng từ nguồn bạn
TIMEWAIT: Trạng thái chờ, thông thường là 2 mili giây
Ví dụ minh hoạ, máy chủ (Server) có địa chỉ IP là 43.122.32.123 và cổng port được mở là 43226, máy khách (Client) có địa chỉ IP là 213.213.43.123 Khi máy khách kết nối tới máy chủ thì cổng port được mở trên máy khách sẽ
là 65322 Ta có các thông tin như sau:
Địa chỉ khách: 213.213.43.123/65322 ở trạng thái CLOSED
Địa chỉ máy chủ: 43.122.32.123/43226 ở trạng thái LISTEN
Quá trình kết nối như sau:
Client sẽ gửi một gói đồng bộ hoá (SYN) đến Server và chuyển sang trạng thái SYN_SENT
Khi Server nhận được gói SYN và gửi đến Client SYN + đoạn mã thừa nhận (ACK), đồng thời chuyển trạng thái từ LISTEN sang trạng thái SYN_RECD
Client sẽ gửi trả ACK
Kết thúc quá trình kiểm tra kết nối Client và Server sẽ kết nối với nhau qua cổng 43226 tại 213.213.43.123 (Đối với Server) với cổng 65322 tại 213.213.43.123 (đối với Client) đồng thời, cả Client và Server sẽ chuyển sang trạng thái ESTABLISHED
Sau đó giữa Client và Server sẽ có các đường truyền trao đổi dữ liệu với nhau
Khi Client muốn chấm dứt kết nối Nó thực hiện điều đó bằng cách gửi FIN và chuyển sang trạng thái FIN_WAIT_1 Khi máy chủ nhận được vây đó, nó sẽ trả lời với ACK và di chuyển đến trạng thái CLOSE_WAIT Khi ACK này được Client nhận được, nó sẽ di chuyển đến trạng thái FIN_WAIT_2, chờ Server đóng kết nối Khi Server đóng kết nối nó cũng gửi một FIN, di chuyển đến trạng thái LAST_ACK Khi Client nhận được gói FIN đó nó sẽ gửi một ACK và chuyển đến trạng thái TIME_WAIT Sau đó sau khoảng 2ms, nó sẽ chuyển sang đến trạng thái đón CLOSED Đồng thời, khi server nhận được gói ACK từ Client thì Server cũng đóng kết nối tới Client
Nếu Client không muốn đóng kết nối thì mối liên hệ giữa Client và Server sẽ duy trì vĩnh viễn (cho đến khi một trong hai bên đóng kết nối hoặc bị gián đoạn kết nối mạng)
2.3 Nền tảng WWW (world wide web):
Trước khi hiểu về HTTP chúng ta cùng nhau đi đến khởi nguyên cũng là lý do ra đời của HTTP Đó là WWW (World Wide Web) nền tảng phần mềm đầu tiên hỗ trợ quản lý các tệp siêu văn bản HTML mà chúng ta sẽ tìm hiểu ở mục sau HTTP sinh ra giống như một vị cứu tinh trong việc hỗ trợ tìm kiếm và truy xuất đến các tệp siêu văn bản thông qua các máy chủ trên thế giới được kết nối mạng
2.4 Giao thức HTTP:
Trang 222.4.1 HTTP là gì?
HTTP viết tắt cho cụm từ Hypertext Transfer Protocol (Giao thức truyền siêu văn bản) được xây dựng trên phương thức có sẵn là TCP
2.4.2 Cách hoạt động của phương thức HTTP trên hạ tầng mạng:
Đối với các hồi tiếp tại các trạng thái LISTEN, SYN_SENT, SYN_RECD của máy khách và máy chủ giống với giao thức TCP
Tại đầu trạng thái ESTABLISHED máy khách sẽ gửi đến máy chủ một gói SYN chứa thông điệp “hello server”
Khi máy chủ nhận được thông điệp trên thì gửi một gói FIN kèm theo thông điệp “Hello client” và hoàn tất quá trình kết nối
2.4.3 Các phương thức của giao thức mạng HTTP:
Giao thức HTTP có các phương thức phổ biến sau:
GET: Phương thức GET được dùng để truy xuất thông tin từ máy chủ
Ngày nay, với sự phát triển mạnh mẽ của công nghệ thông tin và công cuộc số hoá,
tự động hoá các thiết bị công, nông nghiệp và nhà thông minh thì chúng ta sẽ không thể không nhắc đến dữ liệu và kho lưu trữ dữ liệu Vấn đề sẽ là làm sao để dữ liệu phải đảm bảo tính toàn vẹn và an toàn đặc biệt có thể vô hiệu hoá gây cản trở đến tin tặc khi họ lấy được dữ liệu? Đó chính là một câu hỏi khó trả lời, đôi lúc một cuộc tấn công an ninh mạng sẽ xảy ra với một công ty, tổ chức nào đó với nhiều cách tấn công như Brute Force, SQLInjection, DLL Injection, tấn công xã hội Cách tấn công nào cũng rất nguy hiểm đối với dữ liệu người dùng và khách hàng
Vì vậy, ngay từ thời xa xưa họ đã nghĩ ra một cách tuyệt vời để mê hoặc đi trí thông minh của kẻ tấn công, đó chính là mã hoá Phương pháp mã hoá được sử dụng ở khắp mọi nơi, nó đóng vai trò không thể thiếu trên các lĩnh vực liên quan đến dữ liệu
Một số thuật toán mã hoá đơn giản mà chúng ta có thể đã biết như Mouse Code, MD5… Chúng ta sẽ tìm hiểu sâu hơn ở những phần kế tiếp
2.6 Mã hoá bất đối xứng:
Chúng ta đã biết về mã hoá dữ liệu và quá trình hình thành của nó, ở phần này chúng ta sẽ tìm hiểu về mã hoá bất đối xứng Trong kỹ thuật bảo mật dữ liệu, mã
Trang 23hoá bất đối xứng là một dạng mã hoá mạnh nhất, bởi vì đôi khi có một vài thuật toán sẽ băm nhỏ dữ liệu ra tạo thành những đoạn mã vô nghĩa Tuy nhiên, cũng có một số thuật toán mã hoá 2 chiều với các chìa khoá hoàn toàn khác nhau như RSA,
… Mã hoá bất đối xứng đối với dữ liệu thì sẽ tạo ra sự an toàn gần như là tuyệt đối Nhưng, một vài thuật toán có thể làm tăng độ dài của dữ liệu (tốn nhiều không gian ô nhớ máy chủ để lưu trữ hơn) Có thể kể tên đến các loại mã hoá bất đối xứng như SHA, SHA-2 được dùng trong công nghệ Blockchain, MD5, …
2.7 Mã hoá đối xứng:
Ở mục 2.6 ở trước chúng ta đã tìm hiểu về mã hoá bất đối xứng, ở phần này chúng
ta sẽ tìm hiểu về một dạng mã hoá mà ngắn hơn phần trước một ký tự Mã hoá đối xứng khác với mã hoá bất đối xứng ở chỗ nó có một chìa khoá để mã hoá và giải
mã Tuy nhiên, tuỳ thuộc vào độ dài của key mà chúng ta có các đánh giá về độ bảo mật và an toàn của nó Nếu như quá ngắn thì hệ thống có thể bị kẻ tấn công sử dụng các kỹ thuật như Brute force tấn công vào hệ thống thông qua mật khẩu yếu
Và, nghiêm trọng hơn là họ có thể xem và giải mã được những tệp tin quan trọng Nhưng hình dưới đây là bảng thuộc tính thời gian tấn công giải mã của hacker đối với độ dài của mật khẩu
Hình 2.2 Thời gian cần thiết để một hacker Brute force mật khẩu của bạn
Trang 24Như hình 4 ta thấy được độ dài và dạng ký tự của mật khẩu sẽ ảnh hưởng tới thời gian tấn công của một hacker
Không mã hoá dữ liệu người dùng
Nhanh hơn
Có mã hoá dữ liệu người dùng
Chậm hơn vì có mã hoá dữ liệu
Bảng 2.1 So sánh giữa HTTP và HTTPS 2.9 Các khái niệm Python cơ bản
2.9.1 Cách thực thi một lệnh Python:
Đối với viết mã trực tiếp trên command line:
Hình 2.3 Thực thi lệnh python trên command line
Đối với một tệp tin python
Hình 2.4 Thực thi lệnh python qua một tệp tin *.py 2.9.2 Khái niệm Indentation (Thụt lề) trong Python
Indentation chỉ đến khoảng trắng trước một dòng code Đối với ngôn ngữ khác như C, Java, Javascript, Cpp, C#, … thì khái niệm indentation chỉ giúp cho chúng ta dễ đọc các mã lệnh hơn Tuy nhiên, đối với Python, khái niệm Indentation là không thể thiếu Indentation sẽ giúp trình biên dịch ngôn ngữ Python hiểu rằng đâu là một khối mã phụ thuộc
2.9.3 Biến trong Python:
Biến trong Python là một dạng có kiểu dữ liệu là Object, tức là, chúng ta có thể thay đổi giá trị của nó theo các kiểu dữ liệu khác nhau mà chúng ta sẽ tìm
Trang 25hiểu ở phần in đậm sau Biến trong Python sẽ được tạo ra khi và khi chúng
ta gán giá trị cho nó
Hình 2.5 Cách tạo ra một biến trong Python (trong command line)
2.9.4 Ghi chú trong Python:
Ghi chú là một phần không thể thiếu trong lúc chúng ta viết một chương trình,
nó sẽ giúp chúng ta hiểu hơn về chương trình, hàm con hay một đoạn mã nào
đó giúp tổng quan chương trình làm nhiệm vụ gì
Ta có hai dạng ghi chú:
Ghi chú trên một dòng:
Hình 2.6 Ghi chú trên một dòng
Ghi chú trên nhiều dòng:
Đối với ghi chú cho các Object hay Hàm thì chúng ta hay sữ dụng bằng cách sau:
Hình 2.7 Ghi chú trên nhiều dòng
Ta có thể thay dấu nháy đơn thành dấu nháy kép để thức hiện ghi chú nhiều lần
2.9.5 Các nguyên tắc đặt tên biến
Bắt đầu với các ký tự chữ hoặc “_”
Trong tên biến có thể có chữ, “_” và số
Có phân biệt chữ hoa chữ thường
2.9.6 Các kiểu dữ liệu trong Python:
Kiểu văn bản: str
Kiểu số: int, float, complex
Kiểu mảng: list, tuple, range
Trang 26 Kiểu thư viện: dict
Kiểu phân loại: set, frozenset
Kiểu Boolean: bool
Kiểu nhị phân: bytes, bytearray và memoryview
Kiểu rỗng: none
2.9.7 Kiểu văn bản trong Python (str):
Kiểu văn bản trong Python được định nghĩa trong cặp dấu nháy đơn hoặc dấu nháy kép Ví dụ “hello” và ‘hello’, chúng đều là dữ liệu kiểu văn bản trong Python Chúng ta có thể hiển thi dữ liệu ra màn hình console thông qua hàm print()
Hình 2.8 Ví dụ về hàm print trong python
Ngoài ra, chúng ta có thể tạo ra một biến có kiểu văn bản có dữ liệu nhiều dòng:
Hình 2.9 Ví dụ về biến có dữ liệu là văn bản chứa nhiều dòng thông tin
2.9.8 Cắt văn bản (str) trong Python:
Ta có một biến str sau:
a ="Hello python code!"
print(a[2:5])
Khi thực thi câu lệnh print(a[2:5]) ta sẽ thu được kết quả là “llo”
2.9.9 Cắt văn bản từ vị trí đầu tiên trong Python:
a ="Hello python code!"
print(a[:2])
Khi thực thi câu lệnh trên ta thu được “He”
Trang 272.9.10 Cắt văn bản đến vị trí cuối trong Python:
a ="Hello python code!"
Khi thực thi ta thu được kết quả sau “code” Chúng ta sẽ tìm hiểu chỉ mục
âm này kỹ hơn ở phần “Mảng trong Python”
2.9.12 Chuyển đổi dữ liệu sang dạng viết hoa trong Python:
a ="Hello python code!"
print(a.upper())
Khi thực thi ta thu được kết quả sau “HELLO PYTHON CODE!”
2.9.13 Chuyển đổi dữ liệu sang dạng viết hoa trong Python (với casefold):
a ="Hello python code!"
print(a.casefold())
Khi thực thi ta thu được kết quả sau “HELLO PYTHON CODE!”
2.9.14 Chuyển đổi dữ liệu sang dạng viết thường trong Python:
a ="Hello python code!"
print(a.lower())
Khi thực thi ta thu được kết quả sau “hello python code!”
2.9.15 Xoá khoảng trắng thừa trong Python:
a =" Hello python code! "
print(a.strip())
Khi thực thi ta thu được kết quả sau “Hello python code!”
2.9.16 Thay thế văn bản trong Python:
a ="Hello python code!"
print(a.replace(“o”, “a”, 1))
Ta có cấu trúc sau: S.replace(ord_sub, new_sub,) Vì vậy kết quả thu được là
“Hella python code!”
2.9.17 Tách văn bản và tạo thành một mảng trong Python:
a ="Hello python code!"
print(a.split())
Ta có cấu trúc *.split([Ký tự làm mốc tách mặc định là “ ”], Số lần tách) Vì vậy kết quả thu được là [“Hello”, “python”, “code!”]
2.9.18 Nối văn bản trong Python:
Trong Python, chúng ta có thể dùng toán tử cộng đối với các văn bản hoặc biến có kiểu dữ liệu văn bản với nhau Ví dụ:
a ="Hello python code!"
b ="Python"
print(a+b)
Kết quả sẽ là “Hello python code!Python”
2.9.19 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 1):
a ="My name is Bao, I’m {} young!”
Trang 28print(a.format(18))
Kết quả thu được là “My name is Bao, I’m 18 young!”
2.9.20 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 2):
a ="My name is {1}, I’m {0} young!”
print(a.format(18, “Bao”))
Kết quả vẫn sẽ giống ở trên
2.9.21 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 3):
a ="My name is {name}, I’m {age} young!”
print(a.format(age = 18, name = “Bao”))
Kết quả vẫn sẽ giống ở trên
2.9.22 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 4):
a ="My name is {name}, I’m {age} young!”
print(a.format(age = 18, name = “Bao”))
Kết quả vẫn sẽ giống ở trên
2.9.23 Cấu trúc sắp xếp sẵn cho văn bản trong Python (Phần 5 – với %):
a ="My name is %s, I’m %d young!”
print(a%(“Bao”, 18))
Kết quả vẫn sẽ giống ở trên
2.9.24 Chuyển đổi chữ cái đầu tiên thành chữ viết hoa trong Python:
a ="hello code python!”
print(a.capitalize())
Kết quả thu được sẽ là “Hello code python!”
2.9.25 Canh đều lề trong Python:
là 2
2.9.27 Chuyển đổi văn bản sang chuẩn UTF-8 trong Python:
a ="Yolo”
print(a.encode())
Kết quả sẽ thu được là b“Yolo” chữ b phía trứa có nghĩa là bytes
2.9.28 Tìm vị trí của một văn bản con trong Python:
a ="Yolo”
print(a.index(“o”))
Cấu trúc chúng của hàm là S.index(sub[start, [end]]) với S là một văn bản, start là vị trí bắt đầu (mặc định là 0) và end là vị trí kết thúc (mặc định là cuối văn bản) Tuy nhiên, hàm trên không tìm toàn bộ vị trí mà nó sẽ trả về
Trang 29đầu tiên gặp được Nên kết quả của mẫu trên là 1 Lưu ý, nếu không tìm được
sẽ trả về là -1
2.9.29 Kiểm tra tất cả ký tự có thuộc bảng Alphabet:
a ="Yolo”
print(a.isalpha())
Cấu trúc S.isalpha() với S là một văn bản, hàm isalpha sẽ trả về True nếu tất
cả ký tự đều thuộc trong bảng chữ cái latin (a-Z), còn lại, hàm sẽ trả về False
Vì vậy kết quả trên sẽ là True
2.9.30 Kiểm tra tất cả ký tự có phải là số:
a ="Yolo”
print(a.isdecimal())
Cấu trúc S.isdecimal() với S là một văn bản, hàm isdecimal sẽ trả về True nếu tất cả ký tự đều thuộc trong bảng số (0-9), còn lại, hàm sẽ trả về False
Vì vậy kết quả trên sẽ là False
2.9.31 Kiểm tra tất cả ký tự có phải là số (Phần 2):
Chúng ta sẽ sử dụng bult-in function của văn bản là isdigit() Khác với isdecimal, isdigit phạm vi tìm sẽ rộng hơn, trong khi isdecimal chỉ chấp nhận các ký tự số (0-9) nhưng không chấp nhận khi các số đó là cơ số mũ Nhưng với isdigit thì rộng hơn chấp nhận tất cả chỉ cần thoả mãn rằng nó là một số
từ 0 đến 9
2.9.32 Boolean trong Python:
Boolean trong Python được biểu diễn dưới 2 loại giá trị True (đúng) và False (sai)
2.9.33 Số nguyên trong Python (int):
Từ khoá trong ngôn ngữ lập trình Python là int, số nguyên trong Python có
2.9.34 Số thực trong Python (float):
Từ khoá trong ngôn ngữ lập trình Python là float, số thực trong Python giới hạn số chữ số sau dấu “.” là 15 chữ số
Từ khoá trong ngôn ngữ lập trình Python là complex, cấu trúc một số phức
là a+bj với a và b là hai số bất kỳ, j là ký tự bắt buộc có ở phần ảo
Trang 30Trong Python, toán tử đóng vai trò rất quan trọng vậy nên ở ngôn ngữ lập trình này sẽ được phân chia thành 7 loại toán tử khác nhau:
Thực hiện toán tử bitwise and và gán &=
Thực hiện dần sang trái x bit và gán <<= x
Thực hiện dần sang phải x bit và gán >>= x
Bảng 2.3 Bảng toán tử chuyển nhượng 2.9.39 Toán tử so sánh:
Trang 31Toán tử Mô tả and Trả về giá trị True nếu như cả hai vế đều là True
or Trả về giá trị True khi một trong hai vế là True not Trả về giá trị True khi mệnh đề có giá trị False
Bảng 2.5 Bảng toán tử logical 2.9.41 Toán tử xác thực (Identify):
is Trả về giá trị True nếu cả hai vế đều có giá trị và
kiểu dữ liệu giống nhau
is not Trả về giá trị True nếu cả hai về khác giá trị hay
khác kiểu dữ liệu
Bảng 2.6 Bảng toán tử xác thực 2.9.42 Toán tử Membership:
& AND Trả về 1 nếu cả 2 bit là 1
| OR Trả về 1 nếu cả 2 bit có ít nhất 1 giá trị là
1
^ XOR Trả về nghịch đảo của phép toán OR của 2 bit
<< Dần về trái Dần về trái x bit và điền thêm x bit 0 vào
vị trí LSB
>> Dần về phải Dần về phải x bit và điền thêm x bit 0 vào
vị trí MSB Bảng 2.8 Bảng toán tử bitwise 2.9.44 Danh sách trong Python
Cú pháp tạo một danh sách: Với dữ liệu chúng ta có thể bỏ trống
Tên biến = [dữ liệu]
Ví dụ:
a =[“Banana”, “Cherry”, “Kiwi”]
2.9.45 Truy xuất dữ liệu qua chỉ số mục:
Chỉ số trong mảng chúng ta sẽ tìm hiểu ở “2.9.46 Chỉ số trong một mảng”
Để truy xuất dữ liệu qua chỉ số mục ta có cấu trúc như sau:
<tên biến>[<chỉ số>]
Ví dụ về truy xuất và in dữ liệu tại chỉ số 1 của mảng a:
Trang 32Chúng ta sẽ sử dụng chỉ số để thay đổi giá trị của một phần tử List Bằng cú pháp <tên biến>[<chỉ số>] = <giá trị mới>
Ví dụ mẫu:
a[1] = “Orange”
2.9.48 Thêm phần tử từ một đối tượng:
Để thêm một phần tử từ một đối tượng List ta sẽ sử dụng builti-function là l.append(<giá trị mới>) Giá trị mới sẽ được thêm vào vị trí cuối của một mảng
Ví dụ mẫu:
a.append(“Apple”)
2.9.49 Thêm phần tử từ một mảng khác:
Để thêm các phần tử từ một mảng khác ta sẽ sử dụng builti-function là l.extend(<mảng khác>) Các phần tử từ mảng khác sẽ lần lượt thêm vào vị trí cuối của mảng gốc
Ví dụ thêm mảng [“Apple”, “Lemon”] vào mảng a:
a.extend([“Apple”, “Lemon”])
2.9.50 Chèn phần tử vào mảng:
Để chèn phần tử mới vào một vị trí chỉ số của một mảng ta có thể sử dụng l.insert(<chỉ số>, <giá trị mới>) Giá trị mới sẽ được thêm vào vị trí <chỉ số> Nếu <chỉ số> vượt qua độ dài hiện tại của mảng thì <giá trị mới> sẽ được thêm ở vị trí cuối Nếu <chỉ số> thoả mãn giá trị trong đoạn 0 đến độ dài của mảng trừ đi cho 1 hoặc trong giá trị chỉ số ẩm thoả mãn thì <giá trị mới> sẽ được thêm vào vị trí đó, đồng thời các giá trị đã tồn tại sẵn và có giá trị chỉ số lớn hơn sẽ lùi ra sau
Ví dụ thêm giá trị “Mango” vào vị trí chỉ số 1 trong mảng a:
a.insert(1, “Mango”])
2.9.51 Xoá phần tử trong mảng:
Để xoá phần tử trong mảng chúng ta có thể sử dụng builti-function sau:
<tên biến>[<giá trị cần xoá>].<giá trị cần xoá> sẽ được xoá đi đồng thời các phần tử phía sau nó sẽ được dồn lên phía trước
Trang 33Ví dụ về lấy phần tử tại chỉ số 2 ra khỏi mảng a:
a.pop(2)
2.9.53 Xoá sự tồn tại của một danh sách:
Để xoá đi một danh sách ta có câu lệnh: del <tên biến> Điều này sẽ giúp máy giải phóng bộ nhớ tại <tên biến>
Ví dụ giải phóng ô nhớ tại biến a:
del a
2.9.54 Xoá tất cả phần tử của một danh sách:
Để xoá tất cả phần tử của một danh sách ta có thể sử dụng builti-function là l.clean() Điều này sẽ dọn sạch tất cả phần tử hiện có của danh sách l
Ví dụ về xoá tất cả phần tử của danh sách a:
Ví dụ mảng a có các phần tử từ 1 đến 10 và in ra màn hình các giá trị đó:
A = [1,2,3,4,5,6,7,8,9,10]
for i in A:
print(i)
2.9.56 Lấy chiều dài của một danh sách:
Chúng ta có thể sử dụng hàm len(<tên biến>) Giá trị trả về sẽ là số lượng các phần tử trong mảng <tên biến>
Ví dụ lấy giá trị số lượng các phần tử của mảng A:
len(A)
2.9.57 Sắp xếp một mảng chữ số:
Để sắp xếp một mảng chúng ta có thể sử dụng builti-function
l.sort(reverse:bool) Mặc định giá trị của reverse sẽ là False (giá trị đầu ra sẽ
là một mảng tăng dần) Nến reverse là True thì sẽ có một mảng có giá trị giảm dần
Ví dụ sao chép dữ liệu mảng A cho mảng mới B:
A = [1,2,3,4,5,6,7,8,9,10]
B = A.copy()
2.9.59 Tuple trong Python:
Trong Python, một biến Tuple cũng là một dạng danh sách lưu trữ, tuy nhiên, chúng ta không thể thay đổi giá trị phần từ như danh sách Giá trị của một biến Tuple được thể hiện trong cặp dấu ngoặc tròn
Trang 342.9.60 Khởi tạo một biến Tuple:
Ví dụ khởi tạo một biến Tuple:
A = (1,2,3,4,5,6,7,8,9,10)
2.9.61 Truy xuất phần tử trong Tuple:
Tương tự với mảng ta có thể ứng dụng để truy xuất đến một phần tử trong một biến tuple
Ví du: xuất ra màn hình giá trị phần tử chỉ số 1 của Tuple A
print(A[1])
2.9.62 Vòng lặp for trong Python:
Vòng lặp for trong ngôn ngữ Python có tác dụng lặp các biến dữ liệu có trong list, tuple hoặc string,…
Cú pháp:
for variable in data:
# code
Giải thích:
variable là các biến tạm dùng để chứa dữ liệu sau mỗi lần lặp
data là một list, tuple, range hoặc string,… chứa giá trị cần lặp
Ví dụ: ở đây sẽ khai báo một string name = “nguyennambinh” và dùng vòng lặp for để lặp ra từng ký tự của nó
Trang 352.9.63 Vòng lặp while trong Python:
Vòng lặp này trong Python dùng để lặp các dữ liệu mà giá trị ngừng có của
nó là chưa biết trước
Trang 36 Nếu condition trả về giá trị là true thì vòng lặp while sẽ thực thi, ngược lại nếu trả về giá trị là false thì vòng lặp sẽ không được thực thi
Trang 372 từ keyword này sử dụng trong một số trường hợp như vòng lặp sẽ có thể không cần thực thi code trong một số vòng lặp cụ thể hay là cần nhảy lần vòng lặp đó và thực thi các vòng lặp tiếp theo
Break: Giúp chúng ta chấm dứt vòng lặp tại thời điểm nó xuất hiện và các code cùng cấp phía sau nó sẽ không được thực thi nữa
2.9.65 Câu lệnh điều kiện trong Python:
Python hỗ trợ người dùng những lệnh như if, if else, elif, if lồng nhau 2.9.66 Cấu trúc lệnh if trong Python:
Các điều kiện trong Python và lệnh if:
Python hỗ trợ các điều kiện logic toán học thông thường:
Lớn hơn hoặc bằng a>=b
Những điều kiện logic trên đường dùng theo nhiều cách, phổ biến nhất là if
và loops (vòng lặp)
Trang 38Sơ đồ lệnh if:
Hình 2.10 Sơ đồ câu lệnh If tham khảo tại tài liệu [5]
Chúng ta sẽ hiểu rõ hơn về lệnh if thông qua một vài ví dụ sau đây:
Ví dụ 1:
# Nếu là số dương ta sẽ in một thông điệp thích hợp
num = 3
if num > 0
print(num, "là số dương.")
print("Thông điệp này luôn được in.")
num = -1
if num > 0
print(num, "là số dương.")
print("Thông điệp này cũng luôn được in.")
Kết quả sau khi chạy chương trình trên là:
3 là số dương
Thông điệp này luôn được in
Thông điệp này cũng luôn được in
Giải thích:
Trang 39num > 0 là điều kiện, khối lệnh của if thực thi khi thỏa mãn điều kiện true Khi num bằng 3 , đối chiếu kiểm tra so với điều kiện, đúng, khối lệnh của if được thực thi Ngược lại khi num bằng -1, so sánh với điều kiện, sai, khối lệnh if bị bỏ qua và thực hiện lệnh print() cuối cùng
Chúng ta có thể thấy có lệnh print() ở dòng cuối cùng không viết thụt lề do chúng ta có thể thấy rằng lệnh print() ở cuối không nằm trong khối lệnh if nên nó được thực hiện bất kể điều kiện hay kết quả so sánh là gì
# Chuong trinh kiem tra xem so am hay duong
# Va hien thi thong bao phu hop
Trang 40print("So am")
Giải thích:
Khi biến num bằng 3, kiểm tra điều kiện, kết quả so sánh là true, do đó phần lệnh sau if được thực hiện, phần else sẽ bị bỏ qua Khi biến num bằng -5, kiểm tra điều kiện, kết quả so sánh là false, do dó phần khối lệnh else sẽ được thực hiện phần if sẽ bị bỏ qua Khi num bằng 0 sẽ thực hiện giống như num bằng 3
2.9.68 Lệnh if … elif … else trong Python:
Cấu trúc lệnh if …elif … else
Khối lệnh của else
Elif là viết gọn của else if, nó cho phép chúng ta kiểm tra nhiều điều kiện Nếu dieu_kien1 là sai, nó sẽ kiểm tr adieu_kien2 của khối elif tiếp theo và cứ như vậy cho đến hết nếu tất cả các điều kiện đều sẽ nó sẽ thực hiện khối lệnh của else
Chỉ một khối lệnh trong if elif else được thực hiện theo nếu điều kiện là true
Có thể không có hoặc có nhiều Elif