Bài số 1: Vận hành một ứng dụng client/server trên mạng TCP/IP
Bài này sử dụng công cụ iperf để thử nghiệm quá trình vận hành một cặp ứng dụng trên mạng TCP/IP theo mô hình client/server. Wireshark được sử dụng để theo dõi các gói tin truyền giữa client và server, qua đó đối chiếu với sơ đồ chuyển trạng thái TCP. Các bước thực hiện như sau:
- Cài đặt ứng dụng iperf3 trên máy client và server
- Chạy ứng dụng iperf3 trên server và client
- Quan sát quá trình vận hành liên kết TCP với Wireshark
Công cụ iperf và ipref3 (phiên bản 3) cho phép gửi các gói tin TCP, UDP theo các địa chỉ unicast, broadcast hay multicast. Nó còn cho phép đo đạc băng thông giữa trạm truyền. Để cài đặt iperf, cần kiểm tra Extra Packages for Enterprise Linux (epel) đã được đăng ký trong repository của yum chưa, nếu chưa thì đăng ký thêm. Sau đó dùng yum để cài đặt iperf hoặc iperf3:
[root@localhost ~]#
yum repolist
repo id repo name status
base/7/x86_64 CentOS-7 - Base 9,007
extras/7/x86_64 CentOS-7 - Extras 356
updates/7/x86_64 CentOS-7 - Updates 2,005
repolist: 11,368
[root@localhost ~]# yum search epel
============================== N/S matched: epel ===============================
epel-release.noarch : Extra Packages for Enterprise Linux repository : configuration
Name and summary matches only, use "search all" for everything.
[root@localhost ~]# yum install epel-release.noarch
. . .
Complete!
[root@localhost ~]# yum repolist
repo id repo name status
base/7/x86_64 CentOS-7 - Base 9,007
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 10,350
extras/7/x86_64 CentOS-7 - Extras 356
updates/7/x86_64 CentOS-7 - Updates 2,005
repolist: 21,718
[root@localhost ~]# yum install iperf ipref3
. . .
Trên máy server, giả sử có địa chỉ 192.168.2.1, chạy iperf3 chế độ server và đăng ký cổng 5001 để chờ kết nối từ client.
[root@R1 ~]# iperf3 -s -p 5001
-----------------------------------------------------------
Server listening on 5001
-----------------------------------------------------------
Trên client, chạy iperf3 chế độ client và kết nối đến server theo địa chỉ IP và cổng tương ứng. Mặc định, client sẽ kết nối đến server bằng giao thức TCP. Nếu client và server kết nối được với nhau, các thông tin được hiển thị phía client như sau:
[root@C2 ~]#
iperf3 -c 192.168.2.1 -p 5001
Connecting to host 192.168.2.1, port 5001
[ 4] local 192.168.2.15 port 44692 connected to 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 2.54 MBytes 21.3 Mbits/sec 4 41.0 KBytes
[ 4] 1.00-2.00 sec 13.3 MBytes 112 Mbits/sec 3 218 KBytes
[ 4] 2.00-3.00 sec 7.15 MBytes 60.0 Mbits/sec 3 69.3 KBytes
[ 4] 3.00-4.00 sec 1.20 MBytes 10.1 Mbits/sec 2 91.9 KBytes
[ 4] 4.00-5.00 sec 267 KBytes 2.19 Mbits/sec 2 53.7 KBytes
[ 4] 5.00-6.00 sec 1.42 MBytes 11.9 Mbits/sec 0 69.3 KBytes
[ 4] 6.00-7.00 sec 1.49 MBytes 12.5 Mbits/sec 2 97.6 KBytes
[ 4] 7.00-8.00 sec 23.7 MBytes 200 Mbits/sec 48 252 KBytes
[ 4] 8.00-9.00 sec 63.8 MBytes 535 Mbits/sec 91 188 KBytes
[ 4] 9.00-10.00 sec 84.6 MBytes 709 Mbits/sec 0 202 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 199 MBytes 167 Mbits/sec 155 sender
[ 4] 0.00-10.00 sec 199 MBytes 167 Mbits/sec receiver
iperf Done.
Trên server, thông tin cũng được hiển thị tương ứng:
[root@R1 ~]# iperf3 -s -p 5001
-----------------------------------------------------------
Server listening on 5001
-----------------------------------------------------------
Accepted connection from 192.168.2.15, port 44690
[ 5] local 192.168.2.1 port 5001 connected to 192.168.2.15 port 44692
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-1.00 sec 2.21 MBytes 18.6 Mbits/sec
[ 5] 1.00-2.00 sec 9.40 MBytes 78.7 Mbits/sec
[ 5] 2.00-3.00 sec 10.7 MBytes 89.8 Mbits/sec
[ 5] 3.00-4.00 sec 759 KBytes 6.21 Mbits/sec
[ 5] 4.00-5.00 sec 631 KBytes 5.17 Mbits/sec
[ 5] 5.00-6.00 sec 1.40 MBytes 11.7 Mbits/sec
[ 5] 6.00-7.00 sec 781 KBytes 6.39 Mbits/sec
[ 5] 7.00-8.00 sec 21.6 MBytes 181 Mbits/sec
[ 5] 8.00-9.00 sec 64.7 MBytes 542 Mbits/sec
[ 5] 9.00-10.00 sec 84.2 MBytes 706 Mbits/sec
[ 5] 10.00-10.03 sec 2.49 MBytes 739 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-10.03 sec 0.00 Bytes 0.00 bits/sec sender
[ 5] 0.00-10.03 sec 199 MBytes 166 Mbits/sec receiver
-----------------------------------------------------------
Server listening on 5001
-----------------------------------------------------------
Có thể sử dụng tham số -u để yêu cầu client kết nối đến server bằng giao thức UDP:
[root@C2 ~]#
iperf3 -u -c 192.168.2.1 -p 5001
Connecting to host 192.168.2.1, port 5001
[ 4] local 192.168.2.15 port 35392 connected to 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 120 KBytes 982 Kbits/sec 15
[ 4] 1.00-2.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 2.00-3.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 3.00-4.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 4.00-5.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 5.00-6.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 6.00-7.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 7.00-8.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 8.00-9.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 9.00-10.00 sec 128 KBytes 1.05 Mbits/sec 16
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.00 sec 1.24 MBytes 1.04 Mbits/sec 0.468 ms 0/159 (0%)
[ 4] Sent 159 datagrams
iperf Done.
Trong khi vận hành iperf3 để kết nối client-server, sử dụng Wireshark bắt các gói tin truyền giữa 2 trạm. Có thể lọc hiển thị các gói tin TCP hoặc UDP có cổng đích là 5001. Kết quả như sau:
Có thể nhìn thấy 3 gói tin TCP đầu tiên được trao đổi giữa client và server là SYN, SYN ACK và ACK. Đây chính là quá trình bắt tay 3 bước để thiết lập kết nối TCP. Tiếp theo là các gói dữ liệu truyền giữa client và server cùng với trường Seq và Ack để xác nhận các gói tin đã được nhận tốt ở mỗi phía. Tiếp tục sử dụng Wireshark và bắt các gói tin khi iperf3 kết nối với UDP. Kết quả như sau:
Có thể thấy với phương pháp truyền dữ liệu bằng UDP, không có quá trình bắt tay giữa client và server để thiết lập liên kết. Gói tin đầu tiên client gửi đến server cũng là gói dữ liệu được gửi thẳng đến cổng 5001 và không có cơ chế xác nhận từ server về client khi hoàn thành nhận các gói dữ liệu này.
Quay trở lại với trường hợp truyền dữ liệu iperf3 sử dụng TCP, theo dõi các gói tin cuối cùng của phiên truyền thông, có thể thấy máy client gửi đi thông điệp FIN, ACK và máy server trả lời bằng một thông điệp ACK. Đây là các bước kết thúc kênh truyền TCP và hủy kết nối.