LỜI NÓI ĐẦU Ngày nay, mạng máy tính đang ngày càng phát triển không ngừng và trở nên tiện dùng kèm theo đó là tính phức tạp cồng kềnh không kém. Các dự án nghiên cứu, xây dựng và phát triển chương trình ứng dụng chỉ mới đề cập và quan tâm đúng mức trong thời gian gần đây. Muốn xây dựng các công cụ mạnh đáp ứng được nhu cầu phát triển của mạng thì cần có các công cụ hỗ trợ mạnh mẽ (như C++, C#, Java ).
Với sự phát triển mạnh mẽ của mạng máy tính như vậy, nhu cầu sử dụng Internet ngày càng cao nên việc xây dựng những chương trình ứng dụng nhằm tạo sự tiện ích cho người sử dụng là rất cần thiết. Nhiều chương trình ứng dụng trên mạng đã ra đời và rất hữu ích, vì vậy mà công việc lập trình mạng phát triển mạnh mẽ và cần thiết. Chúng em đã chọn đề tài “Xây dựng chương trình tra cứu thông tin Domain” nhằm giúp người dùng dễ dàng trong việc tìm hiểu và tra cứu thông tin về một tên miền nào đó được nhanh chóng , việc xây dựng hoàn thiện chương trình nhằm giúp cho sinh viên tăng khả năng lập trình và hiểu sâu hơn về hệ thống mạng. Đề tài có ý nghĩa thiết thực trong việc tìm hiểu và xây dựng phần mềm, đồng thời xây dựng nên một cơ sở nền tảng lý thuyết về lập trình mạng.
MỤC LỤC LỜI NÓI ĐẦUi
MỤC LỤCii
MỤC LỤC HÌNH ẢNHiv
MỤC LỤC BẢNG BIỂUv
CHƯƠNG 1. GIỚI THIỆU VỀ HỆ THỐNG TÊN MIỀN DNS. 1
1.1. TÊN MIỀN LÀ GÌ?. 1
1.2. HỆ THỐNG TÊN MIỀN LÀ GÌ (DOMAIN NAME SYSTEM). 2
1.2.1. Lịch sử phát triển hệ thống tên miền. 2
1.2.2. Mục đích của hệ thống tên miền (DNS). 2
1.3. CẤU TRÚC CỦA HỆ THỐNG TÊN MIỀN (DNS). 3
1.3.1. Cấu trúc cơ sở dữ liệu. 3
1.3.2. Cấu trúc của tên miền. 3
1.3.2.1. Cách đặt tên miền. 3
1.3.2.2. Phân loại tên miền. 3
1.3.2.3. Cấu trúc tên miền. 4
1.3.3. Máy chủ quản lý tên miền (Domain name server-dns). 5
1.3.4. Các bản ghi thường có trong cơ sở dữ liệu của DNS server:6
1.3.4.1. Bản ghi SOA (Start of Authority )6
1.3.4.2. Bản ghi kiểu A6
1.3.4.3. Bản ghi CNAME7
1.3.4.4. Bản ghi MX7
1.3.4.5. Bản ghi NS. 8
1.3.4.6. Bản ghi PTR8
1.4. PHÂN LOẠI DNS SERVER VÀ ĐỒNG BỘ DỮ LIỆU GIỮA CÁC DNS SERVER9
1.4.1. Phân loại DNS server. 9
1.4.2. Đồng bộ dữ liệu giữa các DNS server( Zone transfer). 10
1.4.2.1. Các phương pháp đồng bộ dữ liệu giữa các DNS server10
1.4.2.2. Cơ chế hoạt động đồng bộ dữ liệu giữa các DNS server11
CHƯƠNG 2. LẬP TRÌNH MẠNG TRONG .NET FRAME WORK13
2.1. SOCKET KHÔNG HƯỚNG KẾT NỐI (UDP SOCKET). 14
2.2. CÁC LỚP HỖ TRỢ ĐƯỢC XÂY DỰNG TỪ LỚP SOCKET14
2.2.1. Lớp TCP Client:14
2.2.2. Lớp TCPListener. 15
2.2.3. Lớp UDP Client:16
2.3. SOCKET KHÔNG ĐỒNG BỘ:17
2.3.1. Sử dụng Socket không đồng bộ:17
2.3.2. Sử dụng các phương thức Non-Blocking. 18
2.3.3. Giao thức ICMP. 19
2.3.3.1. Giới thiệu về giao thức ICMP. 19
2.3.3.2. Khái niệm22
CHƯƠNG 3. XÂY DỰNG CHƯƠNG TRÌNH24
3.1. CÁCH THỨC HOẠT ĐỘNG .24
3.1.1. Giới thiệu WHOIS. 24
3.1.1.1. Lịch sử. 24
3.1.1.2. Các giao thức WHOIS. 25
3.1.2. Hoạt động của lệnh ping. 26
3.2. VIẾT CHƯƠNG TRÌNH28
3.2.1. WHOIS. 28
3.2.2. PING31
3.3. GIỚI THIỆU CHƯƠNG TRÌNH.39
KẾT LUẬN46
TÀI LIỆU THAM KHẢO47
51 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3509 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Xây dựng chương trình tra cứu thông tin Domain, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ệp HOSTS.txt chứa các thông tin về chuyển đổi địa chỉ và tên mạng. Nhưng khi mạng máy tính ngày càng phát triển thì với một tệp HOSTS.txt là không khả thi. Do vậy đến năm 1984 Paul Mockpetris thuộc viện USC’s Information Sciences Institute phát triển một hệ thống quản lý tên miền mới lấy tên là Hệ thống tên miền – Domain Name System và ngày càng phát triển
Mục đích của hệ thống tên miền (DNS)
Hệ thống tên miền bao gồm một loạt các cơ sở dữ liệu chứa địa chỉ IP và các tên miền tương ứng của nó.Mỗi tên miền tương ứng với một địa chỉ IP cụ thể. Hệ thống tên miền trên mạng Internet có nhiệm vụ chuyển đổi tên miền sang địa chỉ IP và ngược lại từ địa chỉ IP sang tên miền. Hệ thống DNS ra đời nhằm mục đích giúp người sử dụng sử dụng một tên dễ nhớ và mang tính gợi mở và đồng thời nó giúp cho hệ thống Internet dễ dàng sử dụng để liên lạc và ngày càng phát triển.
Hệ thống DNS là hệ thống sử dụng cơ sở dữ liệu phân tán và phân cấp hình cây do đó việc quản lý sẽ dễ dàng hơn và cũng rất thuận tiện cho việc chuyển đổi từ tên miền sang địa chỉ IP và ngược lại.
Tên miền là những tên gợi nhớ như home.vnn.vn hoặc www.cnn.com .Nó thân thiện hơn địa chỉ IP giúp cho người sử dụng dễ dàng nhớ vì nó ở dạng chữ mà người bình thường có thể hiểu và sử dụng hàng ngày.
CẤU TRÚC CỦA HỆ THỐNG TÊN MIỀN (DNS)
Cấu trúc cơ sở dữ liệu
Cơ sở dữ liệu của hệ thống DNS là hệ thống cơ sở dữ liệu phân tán và phân cấp hình cây. Với .Root server là đỉnh của cây và sau đó các miền (domain) được phân nhánh dần xuống dưới và phân quyền quản lý. Khi một máy khách (client) truy vấn một tên miền nó sẽ đi lần lượt từ root phân cấp xuống dưới để đến DNS quản lý domain cần truy vấn. Tổ chức quản lý hệ thống tên miền trên thế giới là The Internet Coroperation for Assigned Names and Numbers (ICANN) .Tổ chức này quản lý mức cao nhất của hệ thống tên miền (mức root) do đó nó có quyền cấp phát các tên miền ở mức cao nhất gọi là Top-Level-Domain.
Cấu trúc của dữ liệu được phân cấp hình cây root quản lý toàn bộ sơ đồ và phân quyền quản lý xuống dưới và tiếp đó các tên miền lại được chuyển xuống cấp thấp hơn (delegale) xuống dưới.
Zone: Hệ thống tên miền(DNS) cho phép phân chia tên miền để quản lý và nó chia hệ thống tên miền thành zone và trong zone quản lý tên miền được phân chia đó.Các Zone chứa thông tin vê miền cấp thấp hơn, có khả năng chia thành các zone cấp thấp hơn và phân quyền cho các DNS server khác quản lý.
Ví dụ : Zone “.vn” thì do DNS server quản lý zone “.vn” chứa thông tin về các bản ghi có đuôi là “.vn” và có khả năng chuyển quyền quản lý (delegate) các zone cấp thấp hơn cho các DNS khác quản lý như “.fpt.vn” là vùng (zone) do fpt quản lý.
Hệ thống cơ sở dữ liệu của DNS là hệ thống dữ liệu phân tán hình cây như cấu trúc đó là cấu trúc logic trên mạng Internet về mặt vật lý
Cấu trúc của tên miền
Cách đặt tên miền
Tên miền sẽ có dạng : Label.label.label….label
Độ dài tối đa của một tên miền là 255 ký tự
Mỗi một label tối đa là 63 ký tự bao gồm cả dấu “.”
Label phải được được bắt đầu bằng chữ số và chỉ được chứa chữ, số, dấu trừ (-
Phân loại tên miền
Các loại tên miền được phân chia thành các loại sau:
Com : Tên miền này được dùng cho các tổ chức thương mại
Edu: Tên miền này được dùng cho các cơ quan giáo dục, trường học
Net: Tên miền này được dùng cho các tổ chức mạng lớn
Gov: Tên miền này được dùng cho các tổ chức chính phủ
Org: Tên miền này được dùng cho các tổ chức khác
Int: Tên miền này dùng cho các tổ chức quốc tế
Info: Tên miền này dùng cho việc phục vụ thông tin
Arpa: Tên miền ngược
Mil: Tên miền dành cho các tổ chức quân sự, quốc phòng
Mã các nước trên thế giới tham gia vào mạng internet, các quốc gia này được qui định bằng hai chữ cái theo tiêu chuẩn ISO-3166 (Ví dụ : Việt Nam là .vn, Singapo la sg….)
Tổ chức ICANN đã thông qua hai tên miền mới là :
Travel: Tên miền dành cho tổ chức du lịch
Post: Tên miền dành cho các tổ chức bưu chính
Các tên miền dưới mức root này được gọi là Top –Level – Domain
Cấu trúc tên miền
Tên miền được phân thành nhiêu cấp như:
Gốc (Domain root):Nó là đỉnh của nhánh cây của tên miền. Nó xác định kết thúc của domain.Nó thể diễn đơn giản chỉ là dấu chấm “.”
Tên miền cấp một (Top-level-domain) :Là gồm vài kí tự xác định một nước, khu vực hoặc tổ chức. Nó được thể hiện là “.com”
Tên miền cấp hai(Second-level-domain):Nó rất đa dạng rất đa dạng có thể là tên một công ty, một tổ chức hay một cá nhân.
Tên miền cấp nhỏ hơn (Subdomain): Chia thêm ra của tên miền cấp hai trở xuống thường được sử dụng như chi nhánh, phòng ban của một cơ quan hay chủ đề nào đó. Như phone.fpt.vn là một phòng của công ty Fpt.
Ví dụ: có tên miền www.thanglong.edu.vn
Tên miền sẽ được đọc từ trái qua phải, mục đầu tiên (www) là tên của máy tính.Tiếp theo là tên tên miền cấp 3 (thanglong) , tên miền được đăng ký với cơ quan quản lý tên miền ở dưới cấp vn là trung tâm thông tin mạng Internet Viet Nam(VNNIC)>Tên miền đứng thứ 2 từ bên phải là tên miền ở mức 2 (com) tên miền này miêu tả chức năng của tổ chức sở hữu tên miền ở mức 3.Trong ví dụ này tổ chức lấy tên miền ở mức hay là “edu” có nghĩa là tổ chức thuộc về giáo dục. Cuối cùng là tên miền “.vn”, tên miền này chỉ ra toàn bộ miền này thuộc quyền quản lý của mạng Internet Viet nam.
Một số chú ý khi đặt tên miền:
Tên miền nên đặt giới hạn từ cấp 3 đến cấp 4 vì nhiều hơn nữa việc nhớ tên và quản trị khó khăn.
Sử dụng tên miền là phải duy nhất trong mạng Internet.
Nên đặt tên đơn giản gợi nhớ và tránh.
Máy chủ quản lý tên miền (Domain name server-dns)
Máy chủ quản lý tên miền (dns) theo từng khu vực, theo từng cấp như : một tổ chức, một công ty hay một vùng lãnh thổ.Máy chủ đó chứa thông tin dữ liệu về địa chỉ và tên miền trong khu vực , trong cấp mà nó quản lý dùng để chuyển giữa tên miền và địa chỉ IP đồng thời nó cũng có khả năng hỏi các máy chủ quản lý tên miền khác hoặc cấp cao hơn nó để có thể trả lời được các truy vấn về những tên miền không thuộc quyền quản lý của nó và cũng luôn sẵn sàng trả lời các máy chủ khác về các tên miền mà nó quản lý.
Máy chủ cấp cao nhất là Root Server do tổ chức ICANN quản lý:
Là server quản lý toàn bộ cấu trúc của hệ thống tên miền
Root Server không chứa dữ liệu thông tin về cấu trúc hệ thống DNS mà nó chỉ chuyển quyền (delegate) quản lý xuống cho các server cấp thấp hơn và do đó root server có khả năng định đường đến của một domain tại bất kì đâu trên mạng
Hiện nay trên thế giới có13 root server quản lý toàn bộ hệ thống Internet. Dưới đây là các thông tin về tên và địa lý, tổ chức quản lý, địa chi IP và số hiệu ASN của từng root server :
Bảng 1.1 Danh sách các Root Server DNS
ROOT SERVER
Server
Tổ chức quản lý
Vị trí
Địa chỉ IP
Số hiệu ASN
A
B
C
VeriSign Global Registry Services
Information Sciences Institute
Cogent Communications
Dulles VB
Marina Del Rey CA
Herndon VA; Los Angeles; NewYork
192.41.0.4
IPv4:192.228.79.201
IPv6:2001:478:65::53
19836
tba
Một DNS server có thể nằm bất cứ vị trí nào trên mạng Internet nhưng được cấu hình logic để phân cấp chuyển tên miền cấp thấp hơn xuống cho các DNS server khác nằm bất cứ vị trí nào trên mạng Internet. Nhưng tốt nhất là đặt DNS tại vị trí nào gần với các client để dễ dàng truy vấn đến đồng thời cũng gần với vị trí của DNS server cấp cao hơn trực tiếp quản lý nó.
Các bản ghi thường có trong cơ sở dữ liệu của DNS server:
Bản ghi SOA (Start of Authority )
Bản ghi này xác định máy chủ DNS có thẩm quyền cung cấp thông tin về tên miền xác định trên DNS.
Bản ghi kiểu A
Bản ghi kiểu A được dùng để khai báo ánh xạ giữa tên của một máy tính trên mạng và địa chỉ IP của một máy tính trên mạng.
Bản ghi kiểu A có cú pháp như sau:
Domain IN A
Ví dụ :
Home.vnn.vn IN A 203.162.0.12
Theo ví dụ trên, tên miền home.vnn.vn được khai với bản ghi kiểu A trỏ đến địa chỉ 203.162.0.12 sẽ là tên của máy tính này. Một tên miền có thể được khai nhiều bản ghi kiểu A khác nhau để trỏ đến các địa chỉ IP khác nhau. Như vậy có thể có nhiều máy tính có cùng tên trên mạng. Ngược lại một máy tính có một địa chỉ IP có thể có nhiều tên miền trỏ đến, tuy nhiên chỉ có duy nhất một tên miền được xác định là tên của máy, đó chính là tên miền được khai với bản ghi kiểu A trỏ đến địa chỉ của máy.
Bản ghi CNAME
Bản ghi CNAME cho phép một máy tính có thể có nhiều tên. Nói cách khác bản ghi CNAME cho phép nhiều tên miền cùng trỏ đến một địa chỉ IP cho trước. Để có thể khai báo bản ghi CNAME , bắt buộc phải có bản ghi kiểu A để khai báo tên của máy. Tên miền được khai báo trong bản ghi kiểu A trỏ đến địa chỉ IP của máy được gọi là tên miền chính (canonical domain ).Các tên miền khác muốn trỏ đến máy tính này phải được khai báo là bí danh của tên máy (alias domain).
Bản ghi CNAME có cú pháp như sau :
alias-domain IN CNAME canonical domain
Ví dụ :
www.vnn.vn IN CNAME home.vnn.vn
Tên miền www.vnn.vn sẽ là tên bí danh của tên miền home.vnn.vn, hai tên miền www.vnn.vn sẽ cùng trỏ đến địa chỉ IP 203.162.0.12
Bản ghi MX
Bản ghi MX dùng để khai báo trạm chuyển tiếp thư điện tử của một tên miền.
Ví dụ : Để các thư điện tử có cấu trúc user@vnn.vn được gửi đến trạm chuyển tiếp thư điện tử có tên mail.vnn.vn, trên cơ sở dữ liệu cần khai báo bản ghi MX như sau:
Vnn.vn IN MX 10 mail.vnn.vn
Các thông số được khai báo trong bản ghi MX nêu trên gồm có:
vnn.vn: là tên miền được khai báo để sử dụng như địa chỉ thư điện tử.
mail.vnn.vn: là tên của trạm chuyển tiếp thư điện tử, nó thực tế là tên của máy tính dùng làm máy trạm chuyển tiếp thư điện tử.
10: Là giá trị ưu tiên, giá trị ưu tiên có thể là một số nguyên bất kì từ 1 đến 225, nếu giá trị ưu tiên này càng nhỏ thì trạm chuyển tiếp thư điện tử được khai báo sau đó sẽ là trạm chuyển tiếp thư điện tử được chuyển đến đầu tiên.
Ví dụ nếu khai báo :
Vnn.vn IN MX 10 mail.vnn.vn
Vnn.vn IN MX 20 backupmail.vnn.vn
Thì tất cả các thư điện tử có cấu trúc địa chỉ user@vnn.vn trước hết sẽ được gửi đến trạm chuyển tiếp thư điện tử mail.vnn.vn.Chỉ trong trường hợp may chủ mail.vnn.vn không thể nhận thư thì các thư này mới chuyển đến trạm chuyển tiếp thư điện tử backupmail.vnn.vn
Bản ghi NS
Bản ghi NS dùng để khai báo máy chủ tên miền cho một tên miền. No cho biết các thông tin về tên miền quản lý, do đó yêu cầu có tối thiểu hai bản ghi NS cho mỗi tên miền.
Cú pháp của bản ghi NS
IN NS
Ví dụ:
Vnnic.net.vn IN NS dns1.vnnic.net.vn
Vnnic.net.vn IN NS dns2.vnnic.net.vn
Với khai báo trên, tên miền vnnic.net.vn sẽ do máy chủ tên miền có tên dns.vnnic.net.vn quản lý. Điều này có nghĩa, các bản ghi như A, CNAME, MX … của tên miền cấp dưới của nó sẽ được khai báo trên máy chủ dns1.vnnic.net.vn. và dns2.vnnic.net.vn.
Bản ghi PTR
Hệ thống DNS không những thực hiện việc chuyển đổi từ tên miền sang địa chỉ IP mà còn thực hiện chuyển đổi địa chỉ IP mà còn thực hiện chuyển đổi địa chỉ IP sang tên miền. Bản ghi PTR cho phép thực hiện chuyển đổi địa chỉ IP sang tên miền. Cú pháp của bản ghi PTR:
101.57.162.203.in-addr.arpa IN PTR www.vnnic.net.vn
Bản ghi PTR trên cho phép tìm tên miền www.vnnic.net.vn khi biết địa chỉ IP (203.162.57.101) mà tên miền trỏ tới.
PHÂN LOẠI DNS SERVER VÀ ĐỒNG BỘ DỮ LIỆU GIỮA CÁC DNS SERVER
Phân loại DNS server
Có ba loại DNS server sau:
Primary server
Nguồn xác thực thông tin chính thức cho các domain mà nó được phép quản lý.
Thông tin về tên miền do nó được phân cấp quản lý thì được lưu trữ tại đây và sau đó có thể được chuyển sang cho các secondary server.
Các tên miền do primary server quản lý thì được tạo và sửa đổi tai primary server và được cập nhật đến các secondary server.
Primary server nên đặt gần với các client để có thể phục vụ truy vấn tên miền một cách dễ dàng và nhanh hơn.
Secondary server:
DNS được khuyến nghị nên sử dụng ít nhất là hai DNS server để lưu cho mỗi một zone. Primary DNS server quản lý các zone và secondary server sử dụng để lưu trữ dự phòng cho primary server. Secondary DNS server được khuyến nghị dung nhưng không nhất thiết phải có. Secondary server được phép quản lý domain nhưng dữ liệu về tên miền (domain) ,nhưng secondary server không tạo ra các bản ghi về tên miền (domain) mà nó lấy về từ primary server.
Khi lượng truy vấn zone tăng cao tại primary server thì nó sẽ chuyển bớt tải sang cho secondary server .Hoặc khi primary server gặp sự cố không hoạt động được thì secondary server sẽ hoạt động thay thế cho đến khi primary server hoạt động trở lại.
Secondary server nên được đặt ở gần với primary server và client để có thể phục vụ cho việc truy vấn tên miền dễ dàng hơn. Nhưng không nên cài đặt secondary server trên cùng một mạng con (subnet) hoặc cùng một kết nối với primary server. Để khi primary server có kết nối bị hỏng thì cũng không có ảnh hưởng đến secondary server.
Primary server thường xuyên thay đổi hoặc thêm vào các zone mới. Nên DNS server sử dụng cơ chế cho phép secondary lấy thông tin từ primary server và lưu trữ nó. Có hai giải pháp lấy thông tin về các zone mới là lấy toàn bộ (full) hoặc chỉ lấy phần thay đổi (incremental)
Caching-only server:
Tất cả các DNS server đều có khả năng lưu trữ dữ liệu trên bộ nhớ cache của máy để trả lời truy vấn một cách nhanh chóng. Nhưng hê thống DNS còn có một loại Caching-only server.Loại này chỉ sử dụng cho việc truy vấn, lưu giữ câu trả lờ dựa trên thông tin có trên cache của máy và cho kết quả truy vấn. Chúng không hề quản lý một domain nào và thông tin mà nó chỉ giới hạn những gì được lưu trên cache của server.
Lúc ban đầu khi server bắt đầu chạy thì nó không lưu thông tin nào trong cache. Thông tin sẽ được cập nhật theo thời gian khi các client server truy vấn dịch vụ DNS. Nếu bạn sử dụng kết nối mạng WAN tốc độ thấp thì việc sử dụng caching-only DNS server là giải pháp hữu hiệu cho phép giảm lưu lượng thông tin truy vấn trên đường truyền.
Caching-only có khả năng trả lời các câu truy vấn đến client. Nhưng không chứa zone nào và cũng không có quyền quản lý bất kì domain nào. Nó sử dụng bộ cache của mình để lưu các truy vấn của DNS của client. Thông tin sẽ được lưu trong cache để trả lời các truy vấn đến client.
Đồng bộ dữ liệu giữa các DNS server( Zone transfer)
Các phương pháp đồng bộ dữ liệu giữa các DNS server
Do đề phòng rủi ro khi DNS server không hoạt động hoặc kết nối bị đứt người ta khuyên nên dùng hơn một DNS server để quản lý một zone nhằm tránh trục trặc đường truyền. Do vậy ta phải có cơ chể chuyển dữ liệu các zone và đồng bộ giữa các DNS server khác nhau. Có hai cách để đồng bộ dữ liệu giữa các DNS server là primary server và secondary server như : Truyền toàn bộ zone(all zone transfer) và truyền phần thay đổi (Incremental zone transfer)
Truyền toàn bộ zone (all zone transfer ): Khi một DNS server mới được thêm vào mạng thì nó được cấu hình như một secondary server mới cho một zone đã tồn tại. Nó sẽ tiến hành nhần toàn bộ dữ liệu từ primary server. Đối với các DNS server phiên bản đầu tiên thường dùng giải pháp lấy toàn bộ các cơ sở dữ liệu khi có các thay đổi trong zone.
Truyền phần thay đổi(Incremental zone): Theo giải pháp này là chỉ truyền những những dữ liệu thay đổi của zone . Đồng bộ dữ liệu này được miêu tả chi tiết trong tiêu chuẩn RFC 1995. Nó cung cấp giải pháp hiệu quả cho việc đồng bộ những thay đổi, thêm, bớt của zone.
Cơ chế hoạt động đồng bộ dữ liệu giữa các DNS server
Với trao đổi IXFR zone thì sự khác nhau giữa số serial của nguồn dữ liệu và bản sao của nó. Nếu cả hai đều có cùng số serial thì việc truyền dữ liệu của zone sẽ không thực hiện.
Nếu số serial cho dữ liệu nguồn lớn hơn số serial của secondary server thì nó sẽ thực hiện gửi những thay đổi của bản ghi nguồn (Resource record – RR) của zone ở primary server.
Để truy vấn IXFR thực hiện thành công và các thay đổi được gửi thì tại DNS server nguồn của zone phải được lưu giữ các phần thay đổi để sử dụng truyền đến nơi yêu cầu của truy vấn IXFR. Incremental sẽ cho phép lưu lượng truyền dữ liệu ít và thực hiện nhanh hơn.
Zone transfer sẽ xảy ra khi có những hành động sau xảy ra:
Khi quá trình làm mới của zone đã kết thúc (refresh exprire )
Khi secondary server được thông báo zone đã thay đổi tại nguồn quản lý zone
Khi thêm mới secondary server
Tại secondary server yêu cầu chuyển zone
Các bước yêu cầu chuyển dữ liệu từ secondary server đến DNS server chứa zone để yêu cầu lấy dữ liệu về zone mà nó quản lý.
Khi cấu hình DNS server mới, thì nó sẽ gửi truy vấn yêu cầu gửi toàn bộ zone (all zone transfer request (AXFR) ) đến DNS server chính quản lý dữ liệu của zoneDNS server chính quản lý dữ liệu của zone trả lời và chuyển toàn bộ dữ liệu về zone cho secondary server (destination) mới cấu hình.
Để xác định có chuyển dữ liệu hay không thì nó dựa vào số serial được khai báo bằng bản ghi SOA.
Khi thời gian làm mới (refresh interval ) của zone đã hết, thì DNS server nhận dữ liệu sẽ truy vấn yêu cầu làm mới zone tới DNS server chính chứa dữ liệu zone.
DNS server chính quản lý dữ liệu sẽ trả lời truy vấn và gửi lại dữ liệu. Trả lời truy vấn dữ liệu gồm số serial của zone tại DNS server chính.
DNS server nhận dữ liệu về zone và sẽ kiểm tra số serial trong trả lời và quyết định xem có cần truyền dữ liệu không.
Nếu giá trị của số serial của Primary Server bằng với số serial lưu tại nó thì sẽ kết thúc luôn. Và nó sẽ thiết lập lại với các thông số cũ lưu trong máy.
Nếu giá trị của số serial tại Primary Server lớn hơn giá trị serial hiện tại DNS nhận dữ liệu. Thì nó kết luận zone cần được cập nhật và cần đồng bộ dữ liệu giữa hai DNS server
Nếu DNS server nhận kết luận rằng zone cần phải lấy dữ liệu thì nó sẽ gửi yêu cầu IXFR tới DNS server chính để yêu cầu truyền dữ liệu của zone.
DNS server chính sẽ trả lời với việc gửi những thay đổi của zone hoặc toàn bộ zone
Nếu DNS server chính có hỗ trợ việc gửi những thay đổi của zone thì nó sẽ gửi những phần thay đổi của nó (Incremental zone transfer of the zone).
Nếu DNS server chính không hỗ trợ thì nó sẽ gửi toàn bộ zone (Full AXFR transfer of the zone )
LẬP TRÌNH MẠNG TRONG .NET FRAME WORK
Socket là một giao diện lập trình ứng dụng (API) mạng, thông qua giao diện này chúng ta có thể lập trình điều khiển việc truyền thông giữa hai máy sử dụng các giao thức mức thấp là UDP, TCP,…
Socket là sự trừu tượng hoá ở mức cao, có thể tưởng tượng nó như là thiết bị truyền thông hai chiều gửi – nhận dữ liệu giữa hai máy tính với nhau
Các loại socket
Socket hướng kết nối (TCP Socket)
Socket không hướng kết nối (UDP Socket)
Raw Socket
Hình 2.1 Socket hướng kết nối (TCP Socket)
Đặc điểm:
Có một đường kết nối ảo giữa hai tiến trình.
Một trong hai tiến trình phải đợi tiến trình kia yêu cầu kết nối.
Có thể sử dụng để liên lạc theo mô hình Client/Server.
Trong mô hình Client/Server thì Server lắng nghe và chấp nhận một yêu cầu kết nối.
Mỗi thông điệp gửi đều có xác nhận trở về.
Các gói tin chuyển đi tuần tự.
SOCKET KHÔNG HƯỚNG KẾT NỐI (UDP SOCKET)
Đặc điểm:
Hai tiến trình liên lạc với nhau không kết nối trực tiếp.
Thông điệp gửi đi phải kèm theo địa chỉ của người nhận.
Thông điệp có thể gửi nhiều lần.
Người gửi không chắc chắn thông điệp tới tay người nhận.
Thông điệp gửi sau có thể đến đích trước thông điệp gửi trước đó.
CÁC LỚP HỖ TRỢ ĐƯỢC XÂY DỰNG TỪ LỚP SOCKET
Lớp TCP Client:
Để đảm bảo độ tin cậy trong các ứng dụng mạng, người ta còn dùng một giao thức khác, gọi là giao thức có kết nối: TCP (Transport Control Protocol). Trên Internet chủ yếu là dùng loại giao thức này, ví dụ như Telnet, HTTP, SMTP, POP3,… để lập trình theo giao thức TCP, MS.NET cung cấp hai lớp có tên là TCPClient và TCPListener.
Các thành phần của TCP Client
- Phương thức khởi tạo
Bảng 2.1 Các phương thức khởi tạo
- Một số thuộc tính:
Bảng 2.2 Một số thuộc tính
- Một số phương thức:
Bảng 2.3 Một số phương thức
Lớp TCPListener
TCPListener là một lớp cho phép người lập trình có thể xây dựng các ứng dụng Server (ví dụ như SMTP server, FTP server, DNS server, POP3 server hay server tự định nghĩa …). Ứng dụng server khác với ứng dụng Client ở chỗ nó luôn luôn thực hiện lắng nghe và chấp nhận các kết nối đến từ Client.
Các thành phần của lớp TcpListener:
Phương thức khởi tạo:
Bảng 2.4 + Phương thức khởi tạo TcpListener
Các phương thức khác:
Bảng 2.5 Các phương thức khởi tạo TcpListener khác
Lớp UDP Client:
Giao thức UDP (User Datagram Protocol hay User Define Protocol) là một giao thức phi kết nối (connectionless) có nghĩa là một bên có thể gửi dữ liệu cho bên kia mà không cần biết là bên đó đã sẵn sang hay chưa? (nói cách khác là không cần thiết lập kết nói giữa hai bên khi tiến hành trao đổi thông tin). Giao thức này không tin cậy bằng giao thức TCP nhưng tốc độ lại nhanh và để cài đặt. Ngoài ra, với giao thức UDP ta còn có thể gửi các gói tin quảng bá (Broadcast) cho đồng thời nhiều máy.
Trong .NET, lớp UDPClient đóng gói các chức năng của giao thức UDP.
Bảng 2.6 Các phương thức của lớp UDP Client
SOCKET KHÔNG ĐỒNG BỘ:
Sử dụng Socket không đồng bộ:
Để lập trình không đồng bộ với Socket chúng ta sử dụng các phương thức cho việc sử dụng bất đồng bộ.
Các phương thức cho việc lập trình bất đồng bộ được chia làm 2 loại, thương bắt đầu bằng Begin và End:
Phương thức bắt đầu bằng Begin, bắt đầu một chức năng và được đăng ký với phương thức AsyncCallback
Bắt đầu bằng End chỉ chức năng hoàn thành khi AsyncCallback được gọi.
Để chấp nhận kết nối bất đồng bộ ta sử dụng phương thức BeginAccept() và EndAccept(), như sau:
IAsyncResult BeginAccept(AsyncCallback callback, object state)
Socket EndAccept(IAsyncResult iar);
Để thiết lập kết nối theo cách bất đồng bộ chúng ta sử dụng phương thức BeginConnect() và EndConnect().
Để gửi dữ liệu bất đồng bộ dùng phương thức BeginSend() và EndSend()
Để nhận dữ liệu với giao thức hướng kết nối dùng phương thức BeginReceive() và EndReceive()
Để nhận dữ liệu bất đồng bộ với giao thức không hướng kết nối dùng phương thức BeginReceiveFrom() and EndReceiveFrom()
Sử dụng các phương thức Non-Blocking
Để lập trình bất đồng bộ chúng ta có thể sử dụng các phương thức Non-blocking như phương thức Poll() và phương thức select:
Phương thức Poll(): bool Poll(int microseconds, SelectMode mode);
SelectRead: Poll() trả về true nếu một trong những điều kiện sau được thoả
Nếu phương thức Accept() thành công
Nếu có dữ liệu trên socket
Nếu kết nối đã đóng
SelectWrite: Poll() trả về true nếu thoã một trong những điều kiện sau:
Phương thức Connect() thành công
Nếu có dữ liệu trên Socket để gửi
SelectError: Poll() trả về true nếu một trong những điều kiện sau được thoả:
Nếu phương thức Connect() thất bại
Nếu có dữ liệu ngoài băng thông chuẩn gửi đến nhưng thuộc tính OutOfBandInline không được thiết lập là true.
Phương thức Select(): Socket.Select(IList checkRead, IList check Write, IList check Error, int microseconds)
2.2 Giao thức ICMP và lệnh PING
Giao thức ICMP
Giới thiệu về giao thức ICMP
Thuật ngữ ICMP được viết tắt bởi Internetwork Control Message Protocol là một giao thức hoạt động trên layer 2 - Internetwork trong mô hình TCP/IP hoặc layer 3 - Network trong mô hình OSI cho phép kiểm tra và xác định lỗi của Layer 3 Internetwork trong mô hình TCP/IP bằng cách định nghĩa ra các loại thông điệp có thể sử dụng để xác định xem mạng hiện tại có thể truyền được gói tin hay không. Trong thực tế, ICMP cần các thành phần của mọi gói tin IP để có thể hoạt động được.
Thỉnh thoảng một gateway hoặc một máy đích sẽ liên lạc với máy nguồn để đưa ra những thông điệp lỗi về tiến trình xử lý các gói tin. Đó là mục đích chính của giao thức này. ICMP sử dụng với một mục đích đơn giản là hỗ trợ cho sự hoạt động của giao thức IP.
Trong khi truyền các gói tin Ping, cũng được biết đến như các gói tin ICMP echo requests, và ICMP echo replies. ICMP bao gồm rất nhiều các loại thông điệp khác nhau cho những mục đích đa dạng khác nhau.
Bảng 2.7 Các loại thông điệp quan trọng và thường sử dụng
Mỗi thông điệp của ICMP có chứa một trường Type và một trường Code. Trường Type là trường biểu diễn các loại thông điệp còn trường Code chứa các thông điệp con (subtype). Cho ví dụ, có nhiều người cho rằng có hai loại thông điệp được đưa ra khi sử dụng câu lệnh Ping như: ICMP Echo Request và ICMP echo Reply, nhưng thực tế, hai loại thông điệp đó thuộc cùng một loại thông điệp là Echo và khác Code (Request và Reply). Các loại thông điệp của ICMP như sau:
ICMP Unreachable: Khi một thiết bị thực hiện việc truyền một gói tin đến máy đích nhưng không thực hiện được thì thiết bị đó sẽ gửi lại một thông điệp là ICMP Unreachable. Để trợ giúp cho việc xác định nguyên nhân chính của việc gói tin đó không thể gửi được, thì thông điệp ICMP Unreachable sẽ bao gồm một trọng năm giá trị Code để biểu diễn nguyên nhân việc truyền dữ liệu không thành công. Cho ví dụ: trong hình sau máy VNE_1 đang cố gắng kết nối đến Web server, Web server này được gọi là Web.
Hình 2.2 Ví dụ về gởi nhận ICMP
Bảng 2.8 Những loại Code của thông điệp ICMP Unreachable
Time Exceeded ICMP Message: Thông điệp ICMP Time Exceeded đưa ra thông báo cho một máy nguồn khi một gói tin mà nó gửi bị huỷ bỏ bởi vì thời gian truyền gói tin quá dài. Khi truyền dữ liệu trên mạng thì các gói tin truyền cần phải được định nghĩa thời gian truyền, để ngăn cản việc gói tin đó được truyền mãi sẽ gây ra lặp vòng, mỗi một gói tin đều có một IP header trong đó có một trường được gọi là TTL (Time to Live) - trường này sẽ định nghĩa ra một giá trị hop (tức là số router) mà gói tin có thể đi qua. Khi gói tin đi qua một router thì giá trị trường TTL này sẽ được giảm đi 1, cứ như vậy cho đến khi nào gói tin đó bị router giảm giá trị trường TTL xuống giá trị 0 thì gói tin đó sẽ bị huỷ và router thực hiện việc huỷ gói tin đó sẽ gửi một thông điệp ICMP Time Exceeded cho máy nguồn.
ICMP Redirect: Thông điệp ICMP Redirect cho phép một router gateway nói cho một máy nào đó biết về một router tốt hơn có thể được sử dụng trong quá trình truyền dữ liệu đến một máy đích nào đó. Để có thể thực hiện được điều đó, một ICMP Redirect sẽ được gửi từ router gateway đến máy đó và nói cho máy đó biết về địa chỉ IP về router tốt hơn kia.
2.2.1.2 Cấu trúc bản tin ICMP
Bản tin ICMP được mang trong phần dữ liệu của gói tin IP. Mặcdù mỗi bản tin ICMP có dạng riêng của nó, nhưng chúng đều bắt đầu với ba trường sau:
Bảng 2.9 Cấu trúc bản tin ICMP
Type
Code
Checksum
Messeage
Hình :
Type (8bit): Là một số nguyên 8bit để xác định thông điệp.
Code (8bit): Cung cấp thêm thông tin về kiểu thông điệp.
Checksum(16bit) : ICMP sử dụng thuật giải checksum như IP, nhưng ICMP checksum chỉ tính đến thông điệp ICMP.
Các thông điệp ICMP thông báo lỗi luôn luôn bao gồm phần đầu và 64bit đầu tiên của packet gây nên lỗi. Lý do có thêm phần đầu này cùng với phần đầu packet là để cho phép nơi nhận xác định chính xác hơn những giao thức nào và chương trình ứng dụng có trách nhiệm đối với packet.
2.2.2 Lệnh PING
Khái niệm
Ping, viết tắt của Packet Internet Grouper (Groper), là một công cụ cho mạng máy tính sử dụng trên các mạng TCP/IP (chẳng hạn như Internet) để kiểm tra xem có thể kết nối tới một máy chủ cụ thể nào đó hay không, và ước lượng khoảng thời gian trễ trọn vòng để gửi gói dữ liệu cũng như tỉ lệ các gói dữ liệu có thể bị mất giữa hai máy. Công cụ này thực hiện nhiệm vụ trên bằng cách gửi một số gói tin ICMP đến máy kia và lắng nghe trả lời.
XÂY DỰNG CHƯƠNG TRÌNH
CÁCH THỨC HOẠT ĐỘNG .
Giới thiệu WHOIS
Chương trình WHOIS giúp cho quản trị viên hệ thống để có thể lấy được thông tin về địa chỉ IP hoặc tên miền mà mình quản trị. Việc sử dụng hệ thống WHOIS đã phát triển thành nhiều loại mục đích khác nhau.
Hỗ trợ an ninh và sự ổn định của Internet bằng cách cung cấp các điểm liên hệ với các nhà khai thác mạng và các quản trị viên, bao gồm cả các ISP, và máy tính xác nhận các đội ứng phó sự cố.
Xác định tình trạng đăng ký tên miền.
Hỗ trợ các cơ quan thực thi pháp luật trong điều tra cho thực thi pháp luật quốc gia và quốc tế, bao gồm, ví dụ, chống khủng bố liên quan đến tội phạm hình sự và trong việc hỗ trợ các thủ tục hợp tác quốc tế. Ở một số nước, các tổ chức phi chính phủ chuyên ngành có thể tham gia vào công tác này;
Hỗ trợ trong việc chống lạm dụng sử dụng công nghệ thông tin truyền thông;
Tạo điều kiện để giúp chống xâm phạm, lạm dụng và trộm cắp sở hữu trí tuệ tên miền theo quy định của pháp luật nhà nước các điều ước quốc tế;
Đóng góp cho sự tự tin của người dùng trong Internet như một phương tiện đáng tin cậy và hiệu quả thông tin và truyền thông và là một công cụ quan trọng để thúc đẩy thương mại điện tử bằng cách giúp người dùng xác định người hoặc tổ chức chịu trách nhiệm về nội dung và dịch vụ trực tuyến
Hỗ trợ các doanh nghiệp, các tổ chức khác và người sử dụng trong cuộc chiến chống gian lận, tuân thủ pháp luật liên quan và bảo vệ lợi ích của công chúng.
Lịch sử
Khi Internet đã xuất hiện trong các mạng ARPANET , chỉ có một tổ chức mà xử lý tất cả các đăng ký tên miền, đó là DARPA . Quy trình đăng ký được thành lập trong RFC 920. WHOIS được tiêu chuẩn hoá đầu những năm 1980 để phục vụ cho lĩnh vực liên quan đến đăng ký tên miền. Vì đăng ký tất cả đã được thực hiện bởi một tổ chức trong thời gian đó, một máy chủ trung tâm đã được sử dụng cho các truy vấn WHOIS. Tìm kiếm này lên làm như vậy thông tin rất dễ dàng.
Đến năm 2005, đã có rất nhiều nhà cung cấp dịch vụ mạng so với những năm 1980. Điều này đã dẫn đến một mạng lưới phức tạp của các đăng ký tên miền và các hiệp hội đăng ký, đặc biệt là quản lý của cơ sở hạ tầng Internet mà đã trở nên quốc tế. Như vậy, thực hiện một truy vấn WHOIS trở nên hết sức cần thiết. vWHOIS trở nên rất phổ biến với người dùng Internet hiện nay.
Các giao thức WHOIS
Các giao thức WHOIS có nguồn trong giao thức ARPANET NICNAME và dựa trên giao thức NAME/FINGER, được mô tả trong RFC 742 (1977). NICNAME/WHOIS lần đầu tiên được mô tả trong RFC 812 vào năm 1982 bởi Ken Harrenstien của Trung tâm Mạng lưới thông tin SRI International .
WHOIS ban đầu được thực hiện trên chương trình điều khiển mạng (NCP), nhưng hàng sử dụng chính của nó khi TCP/IP được chuẩn hoá trên toàn bộ các ARPANET và sau đó là mạng Internet.
Đặc tả quá trình WHOIS
Kết nối với các máy chủ dịch vụ
TCP: dịch vụ cảng 43 thập phân
NCP: ICP sang thập phân 43 socket, thành lập hai kết nối 8-bit
Gửi một "dòng lệnh" duy nhất, kết thúc với .
Nhận được thông tin để đáp ứng với các dòng lệnh. Các
server đóng kết nối của nó ngay sau khi sản lượng
hoàn thành.
Hiện tại, dịch vụ WHOIS thường được truyền đi bằng cách sử dụng Transmission Control Protocol (TCP). Các Server lắng nghe các yêu cầu trên được biết đến cổng 43. Client là các ứng dụng đơn giản mà thiết lập một kênh thông tin liên lạc đến máy chủ, truyền tải một hồ sơ văn bản với tên Domain hoặc IP để được truy vấn .Có thể để truy vấn một máy chủ WHOIS bằng cách sử dụng giao thức Telnet.
Referral Whois (RWhois) là một mở rộng của giao thức Whois. RWhois mở rộng các khái niệm về Whois như khả năng mở rộng nhờ thiết kế phân cấp, có khả năng tạo ra một hệ thống với kiến trúc hình cây. Truy vấn được chuyển đến máy chủ WHOIS qua nhiều node khác nhau.
Các chuẩn của WHOIS được miên tả trong các RFC
RFC 812 – NICNAME/WHOIS (1982, đã cũ)
RFC 954 – NICNAME/WHOIS (1985, đã cũ)
RFC 3912 – WHOIS protocol specification (2004, hiện tại đang sử dụng)
Hình 3.1 Cách thức hoạt động của Whois
Chương trình hoạt động dựa vào mạng internet, đầu tiên client sẽ gửi yêu cầu đến máy chủ whois, sau đó máy chủ này sẽ tìm kiếm trong cơ sở dữ liệu của mình xem có thông tin được yêu cầu hay không, nếu có thì máy chủ sẽ gửi trả thông tin được yêu cầu về cho client, nếu không thì máy chủ này sẽ gửi yêu cầu của client đến các máy chủ khác trên mạng internet, sau đó khi nhận được thông tin trả về từ các máy chủ khác thì máy chủ whois sẽ gửi trả yêu cầu về cho client.
Hoạt động của lệnh ping
Hình 3.2Ví dụ về Ping
- Nếu nhận được thông báo "Host Alive", điều này có nghĩa là host không còn hoạt động.
- Ping gởi một ICMP message "echo request" đến host. Nếu nhận được một ICMP message "echo reply" của host, ping sẽ thông báo host còn hoạt động. Nếu không nhận được ICMP message "echo reply" của host, ping sẽ thông báo host này đã ngừng hoạt động!
- định dạng của ICMP "echo request" và "echo reply" có dạng như sau:
Bất cứ lúc nào host nhận được một ICMP request message, nó sẽ phản hồi trở lại với một identifier và số sequence number. Trong hầu hết các hệ thống Unix, trường indentifier được đặt số Process ID của tiến trình gởi gói packet đi. Vì vậy, nếu ping cùng một lúc nhiều lần đến một hệ thống Unix, giá trị indentifier nhận được trong mỗi lần ping sẽ khác nhau.
Trường sequence number có giá trị mặc định là 0. Giá trị này sẽ được tăng một sau mỗi lần hệ thống phản hồi ICMP request message của chương trình ping. Ping sẽ in ra giá trị sequence number của mỗi lần nhận packet, điều này cho chúng ta biết được các gói packet có gặp lỗi hay không.
VIẾT CHƯƠNG TRÌNH
Để viết được chương trình với các chức năng trên yêu cầu trước hết là phải nắm được lý thuyết về mạng máy tính (DNS, giao thức ICMP, gói PING) ngôn ngữ lập trình C# và kỹ thuật lập trình socket.
WHOIS
Chương trình sử dụng hai thư viện của hệ thống.
using System.Net.Sockets;
using System.IO;
Sử dụng một đối tượng TcpClient để kết nối đến máy chủ, network streams cho giao tiếp giữa Server và Client, stream readers và writers đảm nhiệm gởi dữ liệu đi và nhận dữ liệu về. Vì vậy cần khai báo:
TcpClient tcpc;
BufferedStream bfwhois;
NetworkStream nswhois;
StreamWriter swgoi;
StreamReader swnhan;
Đồng thời khai báo hai server WHOIS, một server cho truy vấn thông tin tên miền và một IP cho truy vấn thông tin Domain
//khai bao whois server lay thong tin domain
string whoisserverdm = "whois.internic.net";
//khai bao whois server lay thong tin ve ip
string whoisserverip = "whois-servers.net";
Phần code còn lại sẽ được đặt trong sự kiện của button.
Bắt đầu tạo mới TCP Client với thông số tên của WHOIS server đã khai báo, tạo mới Netword stream và gởi yêu cầu đến WHOIS server
//bắt đầu
// Nếu combobox chọn WHOIS (index=1) thì thực hiện
if (cbb_select.SelectedIndex == 0)
{
try
{
//Tạo mới TCP client với thông số Server WHOIS domain đã khai báo
tcpc = new TcpClient(whoisserverdm.ToString(), 43);
//tạo mới networkstream
nswhois = tcpc.GetStream();
//tạo mới và cài đặt buffer
bfwhois = new BufferedStream(nswhois);
swgoi = new StreamWriter(bfwhois);
//goi yêu cầu lấy thông tin DOMAIN đến WHOIS server
swgoi.WriteLine(txt_ip.Text);
swgoi.Flush();
}
catch
{
MessageBox.Show("Không thể kết nối tới máy chủ \r\n Vui lòng kiểm tra kết nối!");
}
//xóa txt_respont để chứa dữ liệu mới
txt_respont.Clear();
try
{
//tạo mới stream nhận dữ liệu từ who is server
swnhan = new StreamReader(bfwhois);
// tạo mảng thongtinnhan để chứa thông tin domain
}
catch
{
MessageBox.Show("Không thể kết nối tới máy chủ \r\n Vui lòng kiểm tra kết nối!");
}
}
Ghi kết quả nhận được từ WHOIS server vào mảng.
string[] mang1 = new string[1024];
int i = 0;
string thongtinnhan1;
try
{
while ((thongtinnhan1 = swnhan.ReadLine()) != null)
{
mang1[i] = thongtinnhan1;
i = i + 1;
}
//đóng TCP client
tcpc.Close();
Tương tự, lấy thông tin của IP bằng cách gởi IP đến WHOIS server.
// Tương tự bắt đầu lấy thông tin iP
//Lấy IP từ domain nhập ở txt_text
IPAddress[] iphost = Dns.GetHostAddresses(txt_ip.Text);
tcpc = new TcpClient(whoisserverip.ToString(), 43);
//tạo mới networkstream
nswhois = tcpc.GetStream();
//cài đặt buffer
bfwhois = new BufferedStream(nswhois);
swgoi = new StreamWriter(bfwhois);
swgoi.WriteLine(txt_ip.Text);
swgoi.Flush();
txt_respont.Clear();
swnhan = new StreamReader(bfwhois);
string thongtinnhan;
txt_respont.Text = txt_respont.Text + "---- THÔNG TIN VỀ DOMAIN----" + "\r\n";
Tạo vòng lặp để xuất các thông tin đã nhận được. Đối với thông tin về Domain, chỉ cần xuất kết quả đã lưu trong mảng. Đối với thông tin về IP sẽ xuất trực tiếp nếu nhận không rỗng.
//Xuất thông tin DOMAIN lúc trước đã lưu vào mảng ra //txt_respont
for (i = 0; i < mang1.Length; i++)
{
if (mang1[i] != null)
txt_respont.Text = txt_respont.Text + mang1[i] + "\r\n";
}
//Xuất thông tin IP nhận được từ WHOIS server
txt_respont.Text = txt_respont.Text + "\r\n" + "------THÔNG TIN VỀ IP------" + "\r\n";
while ((thongtinnhan = swnhan.ReadLine()) != null)
txt_respont.Text = txt_respont.Text + thongtinnhan + "\r\n";
}
tcpc.Close();
}
catch
{
MessageBox.Show("Không tìm thấy mấy chủ!");
}
//Kết thúc WHOIS
PING
Để kiểm tra xem một host nào đó có tồn tại hay không và đo thời gian đáp ứng của nó chúng ta thường sử dụng lệnh “Ping”, gửi một thông điệp “Ping” thông qua giao thức Internet Control Message Protocol (ICMP) với một Raw socket.
Một thông điệp “Ping”giao tiếp với một thiết bị cụ thể tại một địa chỉ IP cụ thể, gửi một thông điệp thử nghiệm và yêu cầu được đáp ứng lại.
Mặc dù thông điệp “Ping” đơn giản hơn so với các thông điệp khác nhưng hiện thực một tiện ích “Ping” trong .NET đòi hỏi một lượng lớn mã lệnh networking mức thấp và phức tạp. Thư viện lớp .NET không có sẵn giải pháp nào mà thay vào đó cần phải sử dụng Raw socket.
Dựa vào kiến thức về ICMP, PING và kỹ thuật lập trình socket bằng ngôn ngữ lập trình C# chúng ta có thể xây dựng chương trình như sau:
Những thư viện cần sử dụng:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
Tạo lớp ICMP:.
Bảng 3.1 Các yếu tố dữ liệu chung trong lớp ICMP
Khởi tạo biến:
public byte Type;
public byte Code;
public UInt16 Checksum;
public int MessageSize
public byte[] Message = new byte[1024];
public ICMP()
{
}
Mặc dù không phải là một phần của gói ICMP nhưng biến MessageSize được thêm vào mô tả kích thước thực tế của biến đổi độ dài tin nhắn cho biến. Nếu không có nó thì sẽ khó khăn để xác định làm thế nào để xây dựng lại các tin nhắn thành phần từ các gói tin nhận được.
Để xây dựng một gói tin ICMP mới, chỉ cần tạo một đối tượng ICMP mới và gán các giá trị thích hợp cho các yếu tố dữ liệu.
ICMP packet = new ICMP();
packet.Type = 0x08;
packet.Code = 0x00;
packet.Checksum = 0;
Đoạn mã này cho thấy một ví dụ của việc tạo ra phần đầu của một gói tin ICMP Echo Request. Các Echo Yêu cầu gói thể hiện một kịch bản phổ biến mà chúng ta sẽ chạy vào khi tạo một gói tin ICMP. Kể từ khi gói Echo Yêu cầu xác định các thành phần trong gói tin ICMP. Đến đây có 2 lựa chọn để thực hiện:
Thứ nhất: Tạo một lớp (class) khác cho trường Echo Request và nhận mảng byte từ lớp đó.
Thứ hai: Chuyển đổi trường Message thành mảng byte và đặt trong các phần tử dữ liệu.
Xây dựng đối tượng ICMP: Với các biến là các trường cơ bản của gói PING gồm: Type, Code, Checksum, MessageSize. Sau khi gửi một gói ICMP, rất có thể sẽ nhận được một gói ICMP trả về. Để làm cho nó dễ dàng hơn để giải mã các nội dung của gói tin, nên tạo dựng một lớp ICMP có thể mất một mảng byte ICMP và đặt giá trị vào các yếu tố dữ liệu thích hợp.
public ICMP(byte[] data, int size)
{
Type = data[20];
Code = data[21];
Checksum = BitConverter.ToUInt16(data, 22);
MessageSize = size - 24;
Buffer.BlockCopy(data, 24, Message, 0, MessageSize);
}
Raw socket trả về toàn bộ gói tin IP. Điều này có nghĩa là phải bỏ qua những thông tin tiêu đề IP trước khi có thể trích xuất các thông tin gói ICMP. Vì vậy, bắt đầu của các thông tin ICMP, yếu tố Type, nằm ở vị trí 20 trong mảng byte. Các yếu tố dữ liệu trong các gói tin ICMP này sau đó được xuất byte bằng byte vào các phần tử ICMP thích hợp.
Sau khi tạo đối tượng ICMP mới với các dữ liệu gói tin nhận được, chúng ta có thể tham khảo các yếu tố dữ liệu cá nhân:
int recv = ReceiveFrom(data, ref ep);
ICMP response = new ICMP(data, recv);
Console.WriteLine("Received ICMP packet:");
Console.WriteLine(" Type {0}", response.Type);
Console.WriteLine(" Code: {0}", response.Code);
Int16 Identifier = BitConverter.ToInt16(response.Message, 0);
Int16 Sequence = BitConverter.ToInt16(response.Message, 2);
Console.WriteLine(" Identifier: {0}", Identifier);
Console.WriteLine(" Sequence: {0}", Sequence);
stringData = Encoding.ASCII.GetString(response.Message, 4,
response.MessageSize - 4);
Console.WriteLine(" data: {0}", stringData);
Để lấy dữ liệu hai yếu tố đầu tiên của gói ICMP nhận được dễ dàng, những gì chúng ta phải làm là đọc các giá trị của nó từ các yếu tố của lớp ICMP. Trích xuất các trường dữ liệu từ phần message sẽ ít phức tạp hơn. Bởi vì trong 2 byte đầu tiên tạo thành các số nguyên không dấu, và 2 byte thứ hai là các số nguyên không dấu của trường Sequence, có thể sử dụng lớp BitConverter để gán các giá trị từ các byte thích hợp. Phần còn lại của các yếu tố message sẽ được giao cho trường message của gói Echo Reply.
Tạo gói tin ICMP
Sau khi một đối tượng ICMP mới được tạo ra và các gói thành phần dữ liệu đã được xác định, chúng ta muốn gửi gói tin đến một thiết bị mạng từ xa. Không may, chúng ta không thể trực tiếp gửi các đối tượng ICMP trong một phương thức SendTo, nó phải được biến thành một mảng byte.
Sử dụng lớp Helper, cách dễ nhất để gửi một đối tượng phức tạp trên toàn mạng là tạo ra một phương pháp chuyển đổi từng phần tử dữ liệu vào một mảng byte và ghép các mảng byte thành một mảng byte lớn. Điều này đã được thực hiện bằng cách sử dụng phương pháp Buffer.BlockCopy (): Tạo phương thức getBytes.
public byte[] getBytes()
{
byte[] data = new byte[MessageSize + 9];
Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);
Buffer.BlockCopy(Message, 0, data, 4, MessageSize);
return data;
}
Khi một mảng byte dữ liệu được tạo ra để chứa dữ liệu vừa được chuyển đổi thành phần của đối tượng ICMP. Mỗi phần tử dữ liệu được chuyển đổi sang một mảng byte sử dụng phương pháp BitConverter và được đặt trong mảng byte dữ liệu cho phương thức getBytes. Khi tất cả các yếu tố dữ liệu đã được chuyển vào mảng byte, nó chứa một gói tin ICMP đúng định dạng, có thể được gửi đến một thiết bị mạng từ xa.
IPHostEntry iphe = Dns.Resolve(textBox1.Text);
IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0);
EndPoint ep = (EndPoint)iep;
Vì ICMP không sử dụng cổng, chúng ta có thể sử dụng một giá trị bằng “0” cho tham số cổng khi tạo các đối tượng IPEndPoint cho địa chỉ đích.
Tạo phương thức Checksum ICMP
Cách dễ nhất để tính giá trị tổng kiểm tra các gói dữ liệu là tạo ra một phương pháp tự chứa để tính tổng kiểm tra và đặt nó trong lớp ICMP được sử dụng bởi các chương trình ứng dụng ICMP.
public UInt16 getChecksum()
{
UInt32 chcksm = 0;
byte[] data = getBytes();
int packetsize = MessageSize + 8;
int index = 0;
while (index < packetsize)
{
chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));
index += 2;
}
chcksm = (chcksm >> 16) + (chcksm & 0xffff);
chcksm += (chcksm >> 16);
return (UInt16)(~chcksm);
}
Bởi vì giá trị tổng kiểm tra ICMP sử dụng số 16-bit, thuật toán này nhằm đọc khối 2-byte của gói ICMP tại một thời gian (sử dụng ToUInt16 () của lớp BitConverter) và thực hiện các phép tính số học cần thiết về các byte. Giá trị trả về là một số nguyên không dấu 16-bit.
Để sử dụng giá trị tổng kiểm tra trong một chương trình ứng dụng ICMP, đầu tiên điền vào tất cả các yếu tố dữ liệu, cài đặt các phần tử Checksum bằng “0”. Tiếp theo, gọi phương thức getChecksum () để tính tổng kiểm tra các gói tin ICMP, và sau đó đặt các kết quả trong các yếu tố checksum của gói tin:
packet.Checksum = 0;
UInt16 chcksum = packet.getChecksum();
Sau khi các phần tử Checksum được tính toán, gói dữ liệu được sẵn sàng để được gửi tới máy đích sử dụng phương thức SendTo ().
Sau khi hoàn thành chúng ta có đoạn mã sau.
class ICMP
{
public byte Type;
public byte Code;
public UInt16 Checksum;
public int MessageSize;
public byte[] Message = new byte[1024];
public ICMP()
{
}
public ICMP(byte[] data, int size)
{
Type = data[20];
Code = data[21];
Checksum = BitConverter.ToUInt16(data, 22);
MessageSize = size - 24;
Buffer.BlockCopy(data, 24, Message, 0, MessageSize);
}
public byte[] getBytes()
{
byte[] data = new byte[MessageSize + 9];
Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);
Buffer.BlockCopy(Message, 0, data, 4, MessageSize);
return data;
}
public UInt16 getChecksum()
{
UInt32 chcksm = 0;
byte[] data = getBytes();
int packetsize = MessageSize + 8;
int index = 0;
while (index < packetsize)
{
chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));
index += 2;
}
chcksm = (chcksm >> 16) + (chcksm & 0xffff);
chcksm += (chcksm >> 16);
return (UInt16)(~chcksm);
}
}
Tạo phương thức gửi dữ liệu.
Tạo Raw socket: Kiểu socket “SocketType.Raw”, sử dụng giao thức ICMP “ProtocolType.Icmp”.
sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);
Tạo IPHostEntry: Dữ liệu gửi đi được lấy từ textBox1.
IPEndPoint: Gửi địa chỉ từ IPHostEndtry với post bằng “0”.
IPHostEntry iphe = Dns.Resolve(textBox1.Text);
IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0);
EndPoint ep = (EndPoint)iep;
Tạo gói tin ICMP và gán các thông số cho các trường của gói tin.
ICMP packet = new ICMP();
packet.Type = 0x08;
packet.Code = 0x00;
packet.MessageSize = data.Length + 4;
int packetsize = packet.MessageSize + 4;
Tạo vòng lặp While gửi dữ liệu và hiển thị trạng thái PING
while (i<=5)
{
packet.Checksum = 0;
Buffer.BlockCopy(BitConverter.GetBytes(i), 0, packet.Message, 2, 2);
UInt16 chcksum = packet.getChecksum();
packet.Checksum = chcksum;
pingstart = Environment.TickCount;
sock.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);
try
{
data = new byte[1024];
recv = sock.ReceiveFrom(data, ref ep);
pingstop = Environment.TickCount;
elapsedtime = pingstop - pingstart;
updatelist("reply from: " + ep.ToString() + ", seq: " + i + ", time = " + elapsedtime + "ms");
}
catch (SocketException)
{
updatelist("Requet time out");
}
i++;
}
Sau khi hoàn thành ta có đoạn mã sau
sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);
IPHostEntry iphe = Dns.Resolve(textBox1.Text);
IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0);
EndPoint ep = (EndPoint)iep;
ICMP packet = new ICMP();
int recv, i = 1;
packet.Type = 0x08;
packet.Code = 0x00;
Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2);
byte[] data = Encoding.ASCII.GetBytes(textBox1.Text);
Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length)
packet.MessageSize = data.Length + 4;
int packetsize = packet.MessageSize + 4;
while (i<=5)
{
packet.Checksum = 0;
Buffer.BlockCopy(BitConverter.GetBytes(i), 0, packet.Message, 2, 2);
UInt16 chcksum = packet.getChecksum();
packet.Checksum = chcksum;
pingstart = Environment.TickCount;
sock.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);
try
{
data = new byte[1024];
recv = sock.ReceiveFrom(data, ref ep);
pingstop = Environment.TickCount;
elapsedtime = pingstop - pingstart;
updatelist("reply from: " + ep.ToString() + ", seq: " + i + ", time = " + elapsedtime + "ms");
}
catch (SocketException)
{
updatelist("Requet time out");
} i++;
}
GIỚI THIỆU CHƯƠNG TRÌNH.
Chương trình có tên là Whois, được xây dựng bằng ngôn ngữ lập trình C# và ứng dụng kỹ thuật lập trình socket với với 3 modun tương ứng với 3 chức năng chính:
Lấy thông tin về 1 domain đang tồn tại với tính năng WHOIS,
Kiểm tra xem host có hoạt động hay không với tính năng PING,
Lấy thông tin về alias và IP của domain nào đó với DNS Address Resover
Hình 3.3 Giao diện chính của chương trình.
Hình 3.4 Các tính năng chính của chương trình
Hình 3.5 Kết quả thông tin về domain khi truy vấn domain quantrimang.com
Các thông tin chính được WHOIS server cung cấp khi chương trình gởi truy vấn với giá trị là tên domain:
+ Registrar: Nơi đang duy trì tên miền
+ Whois server: Nơi chứa thông tin whois chi tiết, ta dùng thông tin này cho bước 2 (lấy thông tin chi tiết)
+ Name server: cho biết server quản lý DNS của tên miền
+ Status: Cho biết tên trạng thái tên miền
+ Creation Date: Ngày đăng ký
+ Updated date: ngày cập nhật cuối (như renew, đổi DNS, đổi whois, ...)
+ Expiration date: ngày hết hạn
Hình 3.6 Kết quả khi truy vấn domain 2mit.org
Kết quả nhận được thể xác định 4 nhóm thông tin liên hệ là:
+ Registrant: Thông tin đăng ký
+ Administration: Thông tin quản trị tên miền
+ Technical: Thông tin kỹ thuật
+ Billing: Thông tin thanh toán
Với các thông tin: Tên, địa chỉ, điện thoại, fax, email, nước, ... Trong đó thông tin email là cần thiết nhất.
Hình 3.7 Demo tính năng PING
Hình 3.8 Demo tính năng DNS Address Resover
KẾT LUẬN
Kết quả đạt được
Vì lý do về thời gian và kỹ năng lập trình còn hạn chế nên chương trình chỉ hoàn thiện được với 3 tính năng: PING, WHOIS, DNSAddressResover.
Hạn chế
Tuy đã rất cố gắng song tính năng TraceRoute vẫn chưa thể hoạt động được.
Hướng phát triển
Trong thời gian tới nhóm sẽ cố gắng hoàn thiện chương trình với đầy đủ những tính năng như dự tính và phát triển thêm một vài tính năng khác như: DNSRecord, IPRevert….
TÀI LIỆU THAM KHẢO
Tài liệu tiếng Việt
Ths Nguyễn Vũ, Slide bài giảng Lập trình mạng nâng cao, Cao đẳng CNTT Hữu Nghị Việt Hàn.
Tài liệu tiếng Anh
Richard Blum, C# Network Programming Sybex © 2003
Jason Cole, Helen Foster, Network programming in .NET with C# and VB.NET, Digital Press, 2008,
Geetanjalin, Balasubramaniam, C# Project Professional, NIIT
Internet