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

Bước 1: Cài đặt ứng dụng iperf3 trên máy client và server

Công cụ iperfipref3 (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
. . .

Bước 2: Chạy ứng dụng iperf3 trên server và client

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.

Bước 3: Quan sát quá trình vận hành liên kết TCP với Wireshark

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 SeqAck để 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.