Một socket là một điểm kết nối truyền thông (đầu cuối) mà bạn cần 1 tên(name) và địa chỉ(address) trên mạng. Socket có thể sử dụng trên các hệ thống giống nhau hoặc các hệ thống khác nhau trên các mạng khác nhau. Socket hữu dụng cho cả ứng dụng độc lập và ứng dụng mạng. Socket cho phép bạn thay đổi thông tin giữa việc xử lý các trên các máy giống nhau và hai bên đầu cuối trên một mạng va cho phép truy xuất một cách dễ dàng tới các dữ liêu trung tâm.
21 trang |
Chia sẻ: diunt88 | Lượt xem: 6862 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Lập trình Socket trong Java, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 1
I, Socket
1. Socket:
Một socket là một điểm kết nối truyền thông (đầu cuối) mà bạn cần 1 tên(name)
và địa chỉ(address) trên mạng. Socket có thể sử dụng trên các hệ thống giống nhau hoặc
các hệ thống khác nhau trên các mạng khác nhau. Socket hữu dụng cho cả ứng dụng độc
lập và ứng dụng mạng. Socket cho phép bạn thay đổi thông tin giữa việc xử lý các trên
các máy giống nhau và hai bên đầu cuối trên một mạng va cho phép truy xuất một cách
dễ dàng tới các dữ liêu trung tâm.
Socket application program interfaces (APIs): là một mạng chuẩn TCP/IP. Phần
lớn các hệ điều hành đều hỗ trợ APIs. OS/400 socket hỗ trợ đa truyền tải và các giao thức
mạng. Các hàm socket system và socket network có hỗ trợ bảo mật.
Một chương trình Socket chỉ cho ta thấy làm thế nào để sử dụng Socket APIs để
thiết lập liên kết truyền thông giữa cách thức truy xuất từ xa và cục bộ. Programers là
những người sử dụng Integrated Language Environment (ILE) (dịch tạm là môi trường
hợp ngữ ) để phát triển các ứng dụng Socket. Bạn có thể lập trình Socket thông qua nhiều
ngôn ngữ lập trình (ILE) khác nhau.
Java là một trong những ngôn ngữ lập trình dùng để lập trình các ứng dụng
Socket. Java còn hỗ trợ giao diện (Socket programing interface).
2. Socket làm việc như thế nào?
Sockets phần lớn được sử dụng cho việc truyền thông giữa client và server. Điển
hình là cấu hình server trên 1 máy và clients trên 1 máy khác. Clients kết nối tới server,
trao đổi thông tin và sau đó kết thúc việc truyên thông, chúng sẽ ngắt kết nối.
Một socket có một loạt các khả năng.
Trong một kết nối kiểu client-to-server,
Socket trên server sẽ đợi xử lý các yêu cầu từ
một client Để làm điều này, server đầu tiên
phải thiết lập một địa chỉ mà các clients dựa
vào đó để tìm server. Khi địa chỉ server được
thiết lập, server sẽ đợi cho các clients gửi yêu
cầu về 1 dịch vụ. Dữ liệu lúc đó sẽ được trao
đổi thông qua socket. Server thực hiện yêu
cầu từ các Client và gửi phản hồi lại cho
Client.
Hình vẽ b miêu tả một phiên kết nối
Socket.
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 2
Bước 1: Hàm socket() tạo một điểm kết nối (endpoint – đầu cuối) cho việc kết nối
và trả lại một ký hiệu nhận diện socket tương ứng với điểm kết nối (endpoint).
Bước 2: Khi một ứng dung có một ký hiệu nhận diện socket, nó có thể gán 1 tên
duy nhất cho socket. Server phải gán 1 tên để có thể truy xuất tới mạng.
Bước 3: Hàm listen() cho thấy sự sẵn sàng để chấp nhận yêu cầu kết nối từ phía
client.
Bước 4: Ứng dụng Client sử dụng hàm connect() trên một stream socket để thực
hiện kết nối tới server.
Bước 5: Ứng dụng server sử dụng hàm accept() đẻ chấp nhận yêu cầu kết nối từ 1
client. Server phải thực hiện hàm bind() và listen() thành công trước khi nó có thể thực
hiện hàm accept().
Bươc 6: Khi một kết nối được thực hiện giữa Client và Server, chúng ta có thể
dùng một số hàm truyền dữ liệu Socket API. Các Client và Server có nhiều hàm truyền
dữ liệu để lựa chọn như send(), recv(), read(), write()...
Bước 7: Khi Server hoặc Client muốn ngừng việc truyền thông, nó thực hiện hàm
close() để để giải phóng tài nguyên mà hệ thống bỏ ra cho socket.
Note: Socket APIs được xác đinh trong mô hình truyền thông giữa lớp ứng dụng
và tầng vận chuyển. Socket APIs không phải một tầng của mô hình truyền thông. Socket
APIs cho phép ứng dụng tác động với tầng vạn chuyển và tầng mạng của một mô hình
truyền thông diển hình. Mũi tên trong hình sau đây chỉ ra vị trí của mọt socket và lớp
truyền thông mà socket cung cấp.
Điển hình, một cấu hình mạng không cho phép kết nối giữa một mạng bảo mật
trong và một mạng bảo mật thấp bên ngoài. Tuy nhiên bạn có thể cho phép truyền thông
giữa chương trình của server chạy trên một hệ thống ngoài firewall.
3. Socket characteristics
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 3
Khi một ứng dụng tạo 1 socket với hàm socket(), nó phải định dạng socket với 3 tham số
- Socket adddress family là một dạng của cấu trúc địa chỉ của socket.
- Socket type xác định form của truyền thông của socket
- Socket-supported protocols: giao thức mà socket sử dụng
Bảng tóm tắc socket characteristics
Address family Socket type Socket protocol
AF_UNIX SOCK_STREAM N/A
SOCK_DGRAM N/A
AF_INET SOCK_STREAM TCP
SOCK_DGRAM UDP
SOCK_RAW IP,ICMP
AF_INET6 SOCK_STREAM TCP
SOCK_DGRAM UDP
SOCK_RAW IP6, ICMP6
AF_TELEPHONY SOCK_STREAM N/A
SOCK_STREAM N/A
SOCK_DGRAM N/A
SOCKET address family:
Tham số địa chỉ address family trên một socket() là dạng của cấu trúc địa chỉ sử dụng
trên hàm socket. Giao thức address family cung cấp sự truyền các dữ liệu ứng dụng từ
một ứng dụng tới 1 ứng dụng khác. Các địa chỉ address family
- AF_INET address family
- AF_INET6 address family
- AF_UNIX address family
- AF_UNIX_CCSID address family
- AF_TELEPHONY address family
II, Các loại socket
1. Phân loại
Tham số thứ 2 trên một socket quyết định loại Socket. Socket cung cấp sự nhận
diện loại và đặc điểm mà sẽ thực hiện việc chuyển dữ liệu từ máy này sang máy khác.
Danh sách miêu tả các loại socket mà iSeries hỗ trợ:
a. Stream(SOCK_STREAM)
Loại Socket này là một kết nối định hướng. Thiết lập một kết nối điểm nối điểm
bằng việc sử dụng hàm bind(), listen(), accept(), và connect(). SOCKET_STREAM gửi
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 4
dữ liệu và nhận dữ liệu trong một danh sách. SOCK_TREAM xem xét dữ liệu trở thành
các luồn các byte. Trong một iSeries implementation, bạn có thể sử dụng nhiều luồng
socket qua TCP (Hay còn gọi là TCP socket)
b. Datagram(SOCK_TREAM)
Trong thuật ngữ Internet Protocol, đơn vị cơ bản của dữ liệu là datagram.
Datagram Socket là kết nối thấp. Nó thiết lập kết nối không phải điểm với điểm và với
giao thức. Socket gửi các datagramnhư các gói tin độc lập mà không cần sự dảm bảo hay
chuyển tiếp. Bạn có thể bị mất hoặc bị sao chép dữ liệu. Dữ liệu có thể tới mà ko theo
một thứ tự nào. Kích cỡ của các datagram bị giới bạn bởi kích cỡ của dữ liệu. Bạn có thể
sử dụng hàm connect() trên loại socket này. Tuy nhiên hàm connect(), bạn phải chỉ rõ địa
chỉ đích mà chương trình có thể gửi và nhận dữ liệu từ nó. Trong iSeries implementation,
bạn có thể sử dụng qua UDP. (Hay còn gọi là UDP socket)
c. Raw (SOCK_RAW)
Loại socket này cho phép truy xuất tới các giao thức ở tầng dưới, như giao thức IP
(Ipv4, Ipv6) và ICMP(ICMP hoặc ICMP6). SOCK_RAW yêu cầu lập trình thành thạo
bởi vì bạn quản lý thông tin protocol header được sử dụng bởi transport provider.
2, Socket protocols
Các giao thức cung cấp việc vận chuyển các dữ liệu của ứng dụng trên mạng từ 1
máy đến 1 máy khác. Các ứng dụng chỉ rõ giao thức trên tầng transport với các tham số
giao thức của hàm socket().
III. Nội dung của socket
Asynchronous I/O: đồng bộ vào ra.
Secure sockets: Bảo mật socket
Client SOCKS support: Hỗ trợ Client SOCKS
Thread safety
Non-blocking I/O
Signals: Các tín hiệu
IP multicasting
File data transfer – send_file() and accept_and_recv()
Out-of-band data
I/O multiplexing-select()
Socket network functions
Domain name system(DNS) support
BSD compatibility
Pass descriptors between processes-sendmsg() and recvmsg()
1. AsynchronousI/O (Đồng bộ vào ra)
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 5
Đồng bộ vào ra APIs cung cấp các phương thức cho các mô hình client-server để
tạo sự tương đồng giữa client và server và hiệu suất vào ra bộ nhớ cao nhất. Trong mô
hình Client/Server, điển hình là hai mô hình vào ra.
Một là một luồng có 1 client kết nối. Mô hình này tiêu tốn quá nhiều luồng và và
làm cho các trạng thái không được sử dụng một cách hiệu quả và đẩy chi phí lên cao.
Hai là tối thiểu só lượng các luồng bằng việc dùng hàm select() cấp cho mỗi một
client kết nối và ủy quyền cho client đã sẵn sàng kết nối hoặc yêu cầu một luồng. Trong
mô hình thứ 2 bạn phải lựa chọn hay đánh dấu cho mỗi lựa chọn tiếp theo, mà có thể
nguyên nhân của lượng lớn dư thưa công việc.
Asynchronouns I/O advantages
Sử dụng tài nguyên hệ thống hiệu quả. Dữ liệu được sao chép từ người dùng là sự
đồng bộ từ ứng dụng khi bắt đầu yêu cầu.
Tối thiểu hóa xử lý, luồng và thời gian đợi
cung cấp ứng dụng ngay lập tức khi client yêu cầu
Chỉ ra lỗi của ứng dụng
Cung cấp phần lơn các phương thưc hiệu quả trong việc xử lý lượng lớn các dữ
liệu di chuyển.
Tối thiểu số luồng cần sử dụng.
Tùy chọn thơi gian chỉ ra thơi gian tối đa cho phép hoàn tất một đồng bộ. Server
sẽ đóng một kết nối Client nếu nó không có hoạt động trong khoảng thời gian đã
được đặt trước. Đồng bộ thời gian sẽ cho phép server thiết lập giơi hạn thời gian.
Đồng bộ phiên bảo mật với hàm gsk_secure_soc_startInit() API
Bảng đồng bộ I/O APIs
Function Description
gsk_secure_soc_startInit() Starts an asynchronous negotiation of a
secure session, using the attributes set for
the SSL environment and the secure
session.
Note: This API only supports sockets with
address family AF_INET or AF_INET6
and type SOCK_STREAM.
gsk_secure_soc_startRecv() Starts an asynchronous receive operation
on a secure session.
Note: This API only supports sockets with
address family
AF_INET or AF_INET6 and type
SOCK_STREAM.
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 6
gsk_secure_soc_startSend() Start an asynchronous send operation on a
secure session.
Note: This API only supports sockets with
address family AF_INET or AF_INET6
and type SOCK_STREAM.
QsoCreateIOCompletionPort() Create a common wait point for completed
asynchronous overlapped I/O operations.
The QsoCreateIOCompletionPort()
function returns a port handle that
represents the wait point. This handle is
specified on the QsoStartRecv(),
QsoStartSend(), QsoStartAccept(),
gsk_secure_soc_startRecv(), or
gsk_secure_soc_startSend() functions to
initiate asynchronous overlapped I/O
operations. Also this handle can be used
with QsoPostIOCompletion() to post an
event on the associated I/O completion
port.
QsoDestroyIOCompletionPort() Destroys an I/O completion port.
QsoWaitForIOCompletionPort() Waits for completed overlapped I/O
operation. The I/O completion port
represents this wait point.
QsoStartAccept() Starts an asynchronous accept operation.
Note: This API only supports sockets with
address family AF_INET or AF_INET6
and type SOCK_STREAM.
QsoStartRecv() Starts an asynchronous receive operation.
Note: This API only supports sockets with
address family AF_INET or AF_INET6
and type SOCK_STREAM.
QsoStartSend() Starts an asynchronous send operation.
Note: This API only supports sockets with
the AF_INET or AF_INET6 address
families with the SOCK_STREAM
socket type.
QsoPostIOCompletion() Allows an application to notify a
completion port that some function or
activity has occurred.
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 7
Đồng bộ vào ra làm việc thế nào?
Một ứng dụng sẽ tạo một cổng vào ra sử dụng hàm QsoCreateIOCompletionPort()
API. API sẽ trả về một phương thức mà có thể sử dụng để lên kế hoạch và đợi một một
yêu cầu đồng bộ vào ra. Ứng dụng bắt đâu một hàm input và outputt, chỉ ra một công vào
ra. Khi vào ra I/O hoàn tất, thông tin trạng thái và một phương thức ứng dụng định sẽ sẽ
gửi tới cổng vào ra, và sẽ khởi động một trong những cổng đang đợi. Ứng dụng sẽ nhận:
- Một vùng đệm được cung cấp bởi yêu cầu gốc.
- Dữ liệu sẽ được xử lý tới và từ vùng đệm.
- Một chỉ số của loại điều khiển vào ra mà đã được hoàn thành.
2. Secure sockets
Hiện tại, OS/400 hỗ trợ 2 phương thức của bảo mật ứng dụng socket trên iSeries. Đó
là SSL_APIs và Global Secure Toolkit (GSKit) APIs cung cấp khả năng truyền thông
riêng tư qua một mạng truyền thông mở như internet. APIs cho phép ứng dụng
client/server truyền trên một đường mà được thiết kế để ngăn chặn sự can thiệp, xâm
nhập và giả mạo thông điệp.Cả hai đều hỗ trợ xác xác thực cho cả server và client và cho
phép sử dụng giao thức SSL (Secure Sockets Layer). Tuy nhiên, Gskit APIs hỗ trợ và là
nền tảng cho các máy IBM server.
Khái quát chung về bảo mật socket:
Khởi đầu được phát triển bởi Netscape, Giao thức secure Socket Layer (SSL) là
giao thức được sử dụng trên một cung cấp sự chuyển phát tin cậy như TCP để cung cấp
khả năng truyên thông tin cậy cho một ứng dụng. Một vài ứng dụng yêu truyền thông tin
cậy như HTTPs, FTPs, SMTP và TELNETs.
Khi một ứng dụng đc đặt trong chế độ SSL thì nó thường xuyên cần sử dụng một
cổng khác so với ứng dụng không tích hợp SSL. Một trình duyệt tích hợp SSL truy xuất
một server HTTP tích hợp SSL và 1 đường dẫn URL như HTTPs. Trong phần lớn các
trường hợp, một URL của HTTPs cố gắng mở một kết nối ở cổng 443 của hệ thống
server thay vì cổng 80 của một server HTTP chuấn sử dụng.
Có rất nhiều phiên bản của giao thức SSL được định nghĩa. Và phiên bản mới
nhất là TLS (Transport Layer Security) version 1.0 cung cấp sự thay đổi nâng cấp tứ
SSL version 3.0. Cả iSerises-native SSL_APIs và GSKit API hỗ trợ TLS version 1.0,
TLS version 1.0 tương thích với SSL version 3.0, SSL version 3.0 tương thích với SSL
version 2.0.
Global Secure ToolKit (GSKit) APIs
GSKit là một tập hợp giao diên chương trình có thể lập trình được cho phép môt
ứng dụng tích hợp SSL. Giống như SSL_APIs, GSKit APIs cho phép ban có thể truy xuất
tới hàm SSL và TLS từ chương trình ứng dụng socket. Ngoài ra, một GSKit API mới có
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 8
thể thêm để tạo mới một đồng bộ trường hợp của 1 phiên bảo mật socket. API cung cấp
kết nối tin cây cho nhiều client hoặc nếu số yêu đến cao và và yêu cầu nhiều công việc.
Chú ý: APIs chỉ hỗ trợ socket với địa chỉ address family của À_INET hoặc AF_INET6 và
loại SOCK_STREAM (TCP)
Bảng sau miêu tả các hàm
Function Description
gsk_attribute_get_buffer() Obtains specific character string
information about a secure session or an
SSL environment, such as certificate store
file, certificate store password, application
ID, and ciphers.
gsk_attribute_get_cert_info() Obtains specific information about either
the server or client certificate for a secure
session or an SSL environment.
gsk_attribute_get_enum_value() Obtains specific information about either
the server or client certificate for a secure
session or an SSL environment.
gsk_attribute_get_enum_value() Obtains values for specific enumerated data
for a secure session or an SSL
environment.
gsk_attribute_get_numeric_value() Obtains specific numeric information about
a secure session or an SSL environment.
gsk_attribute_set_buffer() Sets a specified buffer attribute to a value
inside the specified secure session or an
SSL environment.
gsk_attribute_set_enum() Sets a specified enumerated type attribute
to an enumerated value in the secure
session or SSL environment.
gsk_attribute_set_numeric_value() Sets specific numeric information for a
secure session or an SSL environment.
gsk_environment_close() Closes the SSL environment and releases
all storage associated with the environment.
gsk_environment_init() Initializes the SSL environment after any
required attributes are set.
gsk_environment_open() Returns an SSL environment handle that
must be saved and used on subsequent gsk
calls.
gsk_secure_soc_close() Closes a secure session and free all the
associated resources for that secure session.
gsk_secure_soc_init() Negotiates a secure session, using the
attributes set for the SSL environment and
the secure session.
gsk_secure_soc_misc() Performs miscellaneous functions for a
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 9
secure session.
gsk_secure_soc_open() Obtains storage for a secure session, sets
default values for attributes, and returns a
handle that must be saved and used on
secure session-related function calls.
gsk_secure_soc_read() Receives data from a secure session.
gsk_secure_soc_startInit() Starts an asynchronous negotiation of a
secure session, using the attributes set for
the SSL environment and the
secure session.
gsk_secure_soc_write() Writes data on a secure session.
gsk_secure_soc_startRecv() Initiates an asynchronous receive operation
on a secure session.
gsk_secure_soc_startSend() Initiates an asynchronous send operation on
a secure session.
gsk_strerror() Retrieves an error message and associated
text string which describes a return value
that was returned from calling a GSK API.
Một ứng dụng sử dụng GSKit APIs bao gồm:
- Một hàm socket() dùng để nhận diện socket
- Một hàm gsk_environment_open()
- Một hoặc nhiều hàm gsk_attribute_set_xxxxx() để lập thuộc tính cho SSL
environment
- Một hàm gsk_environment_init() khởi tạo environment cho xử lý processing và
thiếp lập thông tin bảo mật SSL cho tất cả các phiên SSL chạy sử dụng
environment
- Socket sử dụng hàm connect() để kich hoạt kết nối cho một chương trình client
hoặc sử dụng bind(), listen() và accept() để chấp nhấn nhận yêu cấu kết nối.
- Một hàm gsk_secure_soc_open() để khởi động phiên bảo mật
- Một hoặc nhiều hàm gsk_attribute_set_xxxxx() để lập thuộc tính của các phiên
bảo mật.Như hàm gsk_attribute_set_numeric_value() để kết hợp một socket
riêng biệt với phiên bảo mật.
………..
SSL_APIs
SSL_APIs cung cấp và cho phép các lập trình viên tạo ứng dụng bảo mật socket
trên iSeries. Không giống như GSKit_APIs, SSL_APIs chỉ được tích hợp tới hệ thống
OS/400. Bảng sau miêu tả 9 SSL_APIs hỗ trợ bổ sung cho OS/400.
Function Description
SSL_Create() Enable SSL support for the specified socket
descriptor.
SSL_Destroy() End SSL support for the specified SSL
Tìm hiểu về lập trình socket trong java
Manlivo at3akma – 10
session and socket.
SSL_Handshake() Initiate the SSL handshake protocol.
SSL_Init() Initialize the current job for SSL and
establish the SSL security information for
the current job.
Note: Either an SSL_Init() or
SSL_Init_Application() API must be
executed in a process before SSL can be
used.
SSL_Init_Application() Initialize the current job for SSL and
establish the SSL security information for
the current job.
Note: Either an SSL_Init() or
SSL_Init_Application() API must be
executed in a process before SSL can be
used.
SSL_Read() Receive data from an SSL-enabled socket
descriptor.
SSL_Write() Write data to an SSL-enabled socket
descriptor.
SSL_Strerror() Retrieve SSL runtime error message.
SSL_Perror() Print SSL error message.
3. Client SOCKs support
iSeries sử dụng SOCKs version 4 cho thực thi các chương trình sử dụng địa chỉ
AF_INET address family với loại socket SOCK_STREAM để truyền với 1 các
chương trình đóng vai trò như server chạy trên các hệ thống ko chịu ảnh hưởng của
firewall. Một firewall là một host bảo mật mà người quản trị mạng đặt giữa một mạng
bảo mật nội bộ và một mạng ngoài kém bảo mật. Điển hình là cấu hình mạng không
cho phép truyền thông bắt đầu từ host bảo mật trỏ tới mạng bảo mật kém hơn. Một
sever Proxy tồn tại trên firewall giúp quản lý các yêu câu truy xuất giữa host bảo mật
và mạng kém bảo mật.
Ứng dụng chạy tren các host trong mạng bảo mật nội bộ phải gửi các yêu cầu tới
firewall proxy server để tìm đường đi trên firewall. Proxy server có thể chuyển tiếp
yêu cấu tới server thật trên mạng bảo mật kém hơn và trả lới lại cho ứng dụng trên
các host đầu tiên. Một vd phổ biến của một proxy server là HTTP proxy server. Proxy
server thực hiện một số các công việc cho các HTTP client:
- Chúng giấu mạng nội bộ của bạn khỏi các hệ thống bên ngoài
- Chúng bảo vệ các host khỏi các truy cập trực tiếp