Đồ án Viết chương trình stream audio, video
giữa Client và Server, mã hóa trước khi
truyền”.
1
MỤC LỤC
Lời nói đầu 2
I.Các giao thức hỗ trợ liên lạc trên internet 3
1.Giao thức TCP/IP 3
1.1.Giới thiệu chung 3
1.2.Mô hình TCP/IP 3
1.3.Địa chỉ IP 4
1.4.Giao thức Internet IP (Internet Protocol) 5
2. Giao thức RTP/RTCP 7
II.Lập trình trong Java 11
1.Mã hóa với Java 11
2.Chương trình stream audio 12
Tài liệu tham khảo: 13
Internet là một hệ thống thông tin toàn cầu gồm nhiều mạng máy tính liên kết với nhau.
Bao gồm hàng ngàn mạng máy tính nhỏ hơn của các doanh nghiệp, của các viện nghiên cứu và
các trường đại học, của người dùng cá nhân, và các chính phủ trên toàn cầu.
Mạng Internet mang lại rất nhiều tiện ích hữu dụng cho người sử dụng, một trong các tiện
ích phổ thông của Internet là hệ thống thư điện tử (email), trò chuyện trực tuyến (chat), giải trí
trực tuyến, máy truy tìm dữ liệu (search engine), các dịch vụ thương mại và chuyển ngân, và
các dịch vụ về y tế giáo dục như là chữa bệnh từ xa hoặc tổ chức các lớp học ảo.
Như vậy, mạng internet đã mang lại nhiều lời ích và một trong những lợi ích đó là thông
qua nó, người dùng có thể xem, nghe video, audio thời gian thực. Với mục đích tìm hiểu cách
truyền video, audio thời gian thực trong mô hình Client/Server, em đã thực hiện đồ án “Viết
chương trình stream audio, video giữa Client và Server, mã hóa trước khi truyền”. Từ đó
em xác định các yêu cầu khi thực hiện đồ án:
+ Tìm hiểu về giao thức RTP/RTCP.
+ Lập trình mạng với Java.
+ Mã hóa với Java.
Công cụ thực hiện chương trình là Java.
Nội dung đồ án được chia thành 2 phần:
+ Các giao thức hỗ trợ liên lạc trên internet.
+ Lập trình trong java.
Với đồ án này, do em mới làm quen với ngôn ngữ java cùng với sự hạn chế về thời gian
nên bản đồ án đã thực hiện chưa tốt, còn nhiều thiếu sót. Và với đồ án này, em xin gửi lời cảm
ơn đến cô Bành Thị Quỳnh Mai đã giúp đỡ em thực hiện đồ án này.
nhất. Mỗi gói dữ liệu được gửi trên mạng TCP/IP có một header gồm địa chỉ của máy
đích cũng như địa chỉ của máy nguồn.
- Khung Client-Server: TCP/IP là khung cho những ứng dụng client-server mạnh hoạt
động trên mạng cục bộ và mạng diện rộng.
- Chuẩn giao thức ứng dụng: TCP/IP không chỉ cung cấp cho người lập trình phương
thức truyền dữ liệu trên mạng giữa các ứng dụng mà còn cung cấp nhiều giao thức mức
ứng dụng (những giao thức thực hiện các chức năng thường dùng như e-mail, truyền
nhận file).
1.2.Mô hình TCP/IP
Mô hình TCP/IP được tổ chức thành 4 lớp như sau: lớp ứng dụng (Application), lớp giao
vận (Transport), lớp mạng (Internet) và lớp network access.
Lớp Application:
Ở lớp cao nhất, các chương trình ứng dụng giao tiếp với các giao thức ở lớp Transport để
truyền và nhận dữ liệu. Chương trình ứng dụng truyền dữ liệu ở dạng được yêu cầu đến lớp
Transport để xử lý trước khi chuyển xuống lớp Internet để tìm đường phân phối nó đi. Lớp
Application bao gồm những ứng dụng trên mạng.
Lớp Transport:
4
Cung cấp giao tiếp từ chương trình ứng dụng này đến chương trình ứng dụng khác. Giao
tiếp như vậy được gọi là đầu cuối- tới- đầu cuối (end-to-end). Lớp Transport sẽ đảm bảo thông
tin đến mà không bị lỗi và theo đúng trật tự. Để làm được điều này, máy nhận phải gửi ACK
về báo đã nhận đủ và đúng thông tin hay chưa, nếu chưa thì máy phát phải truyền lại datagram
đã mất. Phần mềm ở lớp Transport chia thông tin thành các gói (packet), trong mỗi gói có chứa
các trường (fields): địa chỉ nguồn, địa chỉ đích, checksum, Thông tin sau khi được chia thành
các gói sẽ được chuyển xuống các lớp thấp hơn để tiếp tục xử lý và gửi tới máy thu. Máy thu
sẽ dựa vào nội dung của các trường này để quyết định nhận, kiểm tra tính đúng đắn của việc
truyền và phục hồi lại thông tin.
Clas
s ID
Ne
t ID
Hos
t ID - Lớp A có Class ID là bit cao nhất bằng 0; 7 bit kế tiếp là net ID, 24 bit còn lại là host
ID.
5
- Lớp B có Class ID là 2 bit cao nhất lần lượt là 1 và 0, 14 bit kế tiếp là net ID, 16 bit cuối
cùng là host ID.
- Lớp C có Class ID là 3 bit cao nhất lần lượt bằng 1, 1, và 0; 21 bit kế tiếp là Net ID; 8
bit cuối cùng là Host ID.
1.4.Giao thức Internet IP (Internet Protocol)
IP tiếp nhận các datagram từ giao diện mạng (network interface) và từ các giao thức lớp
cao hơn, sau khi định tuyến, nó sẽ gửi các gói dữ liệu này xuống giao diện mạng hoặc gửi lên
các giao thức ở cấp cao hơn. Trên một host, có thể xem IP bao gồm hai phần, một phần kiểm
soát các gói dữ liệu đến và một phần kiểm soát việc gửi các gói dữ liệu đi.
Phương thức hoạt động của IP:
- Hàng nhập chung, định tuyến chung: Quá trình IP dùng một hàng nhập chung cho tất cả
các datagrams mà nó kiểm soát, bất kể là chúng đến từ giao diện mạng hay từ các giao thức lớp
cao hơn. IP lấy các datagrams ra khỏi hàng nhập và xử lý chúng mà không cần biết chúng đến
từ đâu. Hàng nhập chung đem lại sự đơn giản trong các thuật toán.
- IP hoạt động như một quá trình độc lập.
- Giao diện nội bộ (local host interface): Để tránh việc phân phát các gói tin nội bộ như
một quá trình đặc biệt, IP thực hiện một giao thức mạng giả cho chính nội bộ của máy mình.
thông tin. Vì trên một máy trong một thời điểm có thể có rất nhiều quá trình cùng tồn tại, cho
nên giá trị port được đưa ra là để có sự phân biệt giữa các quá trình. UDP sẽ dựa vào giá trị
port để gửi các gói (packet) thông tin đến đúng địa chỉ của quá trình. Vì vậy, một chương trình
khi muốn tham gia vào quá trình thông tin thì phải xác định giá trị port cho mình.
Các quá trình sử dụng port trong giao tiếp có thể thực hiện theo hai cách. Cách liên kết
trực tiếp cho phép các quá trình nối kết trực tiếp với nhau và tiến hành trao đổi dữ liệu. Một
cách khác là mô hình client/server cho phép một quá trình có thể thực hiện nhiều liên kết qua
đó có thể gửi nhận dữ liệu với nhiều quá trình khác cùng một lúc.
Khi một quá trình muốn trao đổi dữ liệu với một quá trình khác theo phương thức trực
tiếp thì cả hai quá trình phải xác định giá trị cổng của chính mình. Sau đó một quá trình sẽ tiến
hành xác định giá trị cổng cũng như địa chỉ IP của quá trình kia. Sau khi định xong thì việc
trao đổi dữ liệu mới bắt đầu diễn ra.
Còn với mô hình client/server (khách/chủ) thì server phải xác định cổng và chờ dữ liệu từ
chính cổng này. Các quá trình client sẽ gọi đến cổng này để tiến hành quá trình truyền nhận dữ
liệu.
Khi UDP nhận datagram và tiến hành việc phân phát theo đúng port tương ứng. Có hai
cách để thực thi. Cách thứ nhất là chỉ dựa vào địa chỉ cổng đích, với cách này chương trình có
thể nhận được dữ liệu từ tất cả các quá trình khác gửi đến. Cách thứ hai là tiến hành việc phân
phát dựa trên địa chỉ nguồn và địa chỉ đích, với cách này quá trình chỉ có thể nhận dữ liệu từ
một địa chi xác định. Mỗi cách trên đều có ưu điểm cũng như nhược điểm tuỳ theo từng thời
điểm hoạt động của hệ thống. Vì vậy khi thực hiện, cả hai cách trên đều được sử dụng.
Transmission Control Protocol (TCP)
TCP là một trong những giao thức phức tạp nhất trong các giao thức trên mạng. Nó bao
gồm cơ chế liên kết trực tiếp, gửi nhận dữ liệu tin cậy và có tính điều khiển được. TCP dùng cơ
chế time out (đếm thời gian) và retransmission(truyền lại) để bảo đảm tính tin cậy trong việc
truyền dữ liệu. Ngoài ra, TCP còn cung cấp cơ chế kiểm tra khi có hiện tượng trễ, trùng lặp hay
mất mát trong quá trình truyền nhận dữ liệu.
TCP được thực hiện thông qua 3 quá trình. Quá trình thứ nhất kiểm soát các datagram
được truyền đến, quá trình thứ hai chịu trách nhiệm về các datagram sẽ được truyền đi, quá
vụ giám sát chất lượng dịch vụ và thu thập các thông tin về những người tham gia vào phiên
truyền RTP đang tiến hành.
Khuôn dạng gói RTP
Tiêu đề giao thức RTP bao gồm một phần tiêu đề cố định thường có ở mọi gói RTP và
một phần tiêu đề mở rộng phục vụ cho các mục đích nhất định.
1/Phần tiêu đề cố định
Tiêu đề cố định được miêu tả trong hình vẽ trên:
8
12 octets (byte) đầu tiên của phần tiêu đề có trong mọi gói RTP còn các octets còn lại
thường được mixer thêm vào trong gói khi gói đó được mixer chuyển tiếp đến đích.
- Version(V): 2 bit.
Trường này chỉ ra version của RTP. Giá trị của trường này là 2.
- Padding (P): 1 bit.
Nếu bit padding được lập, gói dữ liệu sẽ có một vài octets thêm vào cuối gói dữ liệu.
Octets cuối cùng của phần thêm vào này sẽ chỉ kích thước của phần thêm vào này (tính theo
byte). Những octets này không phải là thông tin. Chúng được thêm vào để đáp ứng các yêu cầu
sau:
Phục vụ cho một vài thuật toán mã hoá thông tin cần kích thước của gói cố định.
Dùng để cách ly các gói RTP trong trường hợp nhiều gói thông tin được mang trong cùng
một đơn vị dữ liệu của giao thức tầng dưới.
- Extension (X): 1 bit.
Nếu như bit X được lập, theo sau phần tiêu đề cố định sẽ là một tiêu đề mở rộng.
- Marker (M): 1 bit.
Tuỳ từng trường hợp cụ thể mà bít này mang những ý nghĩa khác nhau ý nghĩa của nó
được chỉ ra trong một profile đi kèm.
- Payload Type (PT): 7 bits.
Trường này chỉ ra loại tải trọng mang trong gói. Các mã sử dụng trong trường này ứng
PT sequence number
timestamp
synchronization source identifier (SSRC)
contributing source list (CSRC)
Tiêu đề cố định gói RTP.
9
đồng bộ và tính toán độ jitter. Bước tăng của đồng hồ này phải đủ nhỏ để đạt được độ chính
xác đồng bộ mong muốn khi phát lại và độ chính xác của việc tính toán jitter. Tần số đồng hồ
này là không cố định, tuỳ thuộc vào loại khuôn dạng của tải trọng. Giá trị khởi đầu của tem
thời gian cũng được chọn một cách ngẫu nhiên. Một vài gói RTP có thể mang cùng một giá trị
tem thời gian nếu như chúng được phát đi cùng một lúc về mặt logic (ví dụ như các gói của
cùng một khung hình video). Trong trường hợp các gói dữ liệu được phát ra sau những khoảng
thời gian bằng nhau (tín hiệu mã hoá thoại tốc độ cố định, fixed-rate audio) thì tem thời gian
được tăng một cách đều đặn. Trong trường hợp khác giá trị tem thời gian sẽ tăng không đều.
- Số nhận dạng nguồn đồng bộ SSRC (Synchronization Source Identifier): 32 bits.
SSCR chỉ ra nguồn đồng bộ của gói RTP, số này được chọn một cách ngẫu nhiên. Trong
một phiên RTP có thể có nhiều hơn một nguồn đồng bộ. Mỗi một nguồn phát ra một
dòng các gói RTP. Bên thu nhóm các gói của cùng một nguồn đồng bộ lại với nhau để
phát lại tín hiệu thời gian thực. Nguồn đồng bộ có thể là nguồn phát các gói RTP phát ra
từ một micro, camera hay một RTP mixer.
- Các số nhận dạng nguồn đóng góp (CSRC list - Contributing Source list): có từ 0
đến 15 mục mỗi mục 32 bít.
Các số nhận dạng nguồn đóng góp trong phần tiêu đề chỉ ra những nguồn đóng góp thông
tin và phần tải trọng của gói. Các số nhận dạng này được Mixer chèn vào tiêu đề của gói và nó
chỉ mang nhiều ý nghĩa trong trường hợp dòng các gói thông tin là dòng tổng hợp tạo thành từ
việc trộn nhiều dòng thông tin tới mixer. Trường này giúp cho bên thu nhận biết được gói
giám sát và đánh giá quá trình truyền tin dựa trên việc truyền một cách định kỳ các gói tin điều
khiển tới các thành viên tham gia phiên truyền với cùng cơ chế truyền dữ liệu. RTCP thi hành
4 chức năng chính :
Cung cấp cơ chế phản hồi chất lượng truyền dữ liệu. Bên gửi thống kê quá trình gửi dữ
liệu qua bản tin người gửi cho các thành viên. Bên nhận cũng tiến hành gửi lại bản thống kê
các thông tin nhận được qua bản tin người nhận. Từ việc giám sát quá trình gửi và nhận giữa
các bên, ta có thể điều chỉnh lại các thông số cần thiết để tăng chất lượng cho phiên truyền.
Đây là chức năng quan trọng nhất của RTCP.
Mỗi nguồn cung cấp gói tin RTP được định danh bởi một tên CNAME (Canonical end-
point identifer SDES item). RTCP có nhiệm vụ cho các thành viên biết tên này. Khi có thành
viên mới tham gia phiên truyền thì anh ta phải được gán với một trường CNAME trong gói tin
SDES.
Quan sát số thành viên tham gia phiên truyền thông qua sự thống kê ở các bản tin.
0
2
3
4
8
9
16 31
defined by profile length
header extension
chiếm một phần nhỏ và đã biết là 5% để không ảnh hưởng đến chức năng chính của giao thức
là truyền các dòng dữ liệu media.
Như vậy không những RTP đáp ứng được yêu cầu thời gian thực mà còn cho phép
tagiám sát và đánh giá chất lượng truyền tin cho VoIP.
II.Lập trình trong Java
1.Mã hóa với Java
Mã hóa (Encryption) là một tiến trình lấy dữ liệu, một khóa mã hóa và một bộ phát sinh
văn bản mật mã để mã hóa toàn bộ dữ liệu. Nếu như không có khóa giải mã, khóa dữ liệu sẽ
chỉ là vô nghĩa.
Giải mã (Decryption) là quá trình ngược lại của mã hóa. Là quá trình lấy dữ liệu đã mã
hóa và khóa mã hóa rồi dịch ngược để có dữ liệu ở dạng ban đầu.
Các bộ công cụ mã hóa:
+ Mã hóa với khóa đối xứng: thông điệp chỉ đọc được khi người nhận có khóa mã hóa
đúng với khóa mà người gửi đã dùng.
12
+ Mã hóa với khóa công khai: ta sử dụng một cặp khóa, khó bí mật và khóa công khai.
Người gửi sử dụng khóa công khai của người nhận để mã hóa, khóa bí mật được theo cách nào
đó gửi đến người nhận để phục vụ cho việc giải mã.
+ Phương pháp chữ ký số: người gửi cho dữ liệu qua một hàm băm để phát sinh một mã
khóa gọi là mã băm, tiếp tục mã hóa nó với khóa bí mật rồi gửi mã băm đã mã hóa đi cùng với
dữ liệu và khóa công khai. Người nhận dùng khóa công khai để giải mã tìm ra mã băm. Người
nhận tiếp tục thực hiện cùng hàm băm trên phần dữ liệu nhận được để tìm ra mã băm, đối chiều
nếu có sự giống nhau về mã băm nghĩa là truyền an toàn.
Java cung cấp một số giao diện lập trình ứng dụng cho việc mã hóa như JCA (Java
Cryptography Architecture) và JCE (Java Cryptography Extension) trong đó JCE được thừa
hưởng từ JCA API và bao gồm các APIs cho việc mã hóa, chuyển đổi khóa và mã xác thực
- Tạo phiên RTP session.
- Tạo datasource.
- Tạo jmf processor.
13
- Cấu hình processor với RTP và định dạng truyền.
- Liên kết datasource với processor.
- RTP manager tạo ra luồng gửi cho datasource. RTP Manager bắt đầu truyền.
RTPPlayer
- Tạo RTP Mananger.
- Thêm vào 1 RTP Session Listener.
- Thêm vào 1 listener để xác định khi nào một luồng đã được nhận.
- Tạo data source từ luồng ReceiveStream.
- Tạo 1 player liên kết với data source.
- Hiển thị player.
- Khi không còn dữ liệu nhận về, thoát khỏi tất cả các luồng và đóng lại.
Tài liệu tham khảo:
Bảo mật lập trình mạng trong Java2 – NXB Thống kê.
Java lập trình mạng – NXB Giáo dục.
Java sun tutorial www.java.sun.com
Java Media Framework API - http://java.sun.com/products/java-media/jmf/2.1.1/apidocs/
JMF Programmers Guide - http://java.sun.com/products/java-media/jmf/2.1.1/guide/