traceroute
là một công cụ bạn có thể sử dụng để theo dõi lộ trình của các gói tin từ máy tính của bạn đến máy tính khác. Nó cho phép bạn xem từng bước mà các gói của bạn thực hiện trên đường đi
Ví dụ, sau đây là kết quả của việc chạy traceroute
từ máy tính của tôi ở Massachusetts tới “ví dụ. com”
Bạn có thể thấy rằng phải mất 8 bước để chuyển từ máy tính của tôi đến IP đích [93.184.216.34
] và bạn có thể thấy thời gian liên quan cho ba lần thử khác nhau cho mỗi bước. Nếu muốn, chúng tôi có thể lập bản đồ các IP này để xem đường dẫn vật lý sơ bộ của các gói của chúng tôi;
traceroute
có thể thực hiện được nhờ tác dụng phụ của các tính năng trong Giao thức Internet [IP]. Mỗi bao gồm một số lĩnh vực
Một trong các trường trong tiêu đề là giá trị "Thời gian tồn tại" hoặc TTL. Các
Thời gian để sống là một dấu hiệu của giới hạn trên về thời gian tồn tại của một datagram internet. Nó được thiết lập bởi người gửi gói dữ liệu và giảm tại các điểm dọc theo tuyến nơi nó được xử lý. Nếu thời gian tồn tại bằng 0 trước khi gói dữ liệu internet đến đích, thì gói dữ liệu internet sẽ bị hủy. Thời gian để sống có thể được coi là giới hạn thời gian tự hủy
Về lý thuyết, điều này sẽ được đo bằng giây, đại diện cho bộ hẹn giờ tự hủy thực sự, nhưng trên thực tế, TTL thực sự phản ánh số bước nhảy mà gói vẫn có thể thực hiện trên đường đến đích. Tại mỗi bộ định tuyến dọc theo đường dẫn của gói, giá trị này sẽ giảm đi và nếu nó bằng 0, gói sẽ không đi xa hơn và thông báo lỗi ICMP được trả về cho người gửi. Điều này giúp ngăn chặn hành vi ngoài ý muốn trong một mạng phức tạp, chẳng hạn như vòng lặp vô hạn. Không có TTL, bạn có thể tưởng tượng các gói mồ côi và bị mất sẽ được chuyển tiếp vô thời hạn
Tin nhắn được gửi lại cho người gửi ban đầu bao gồm một số thông tin cơ bản và cùng với tin nhắn, địa chỉ của bộ định tuyến đã gửi nó cũng hiển thị
đường theo dõi
traceroute
tận dụng chức năng TTL giảm dần này theo cách thông minh để khám phá mạng. Giả sử chúng ta đang cố theo dõi lộ trình đến C
trong mạng sau
traceroute
dựa vào thao tác nhân tạo TTL của các gói gửi đi, gửi dần các gói có giá trị TTL tăng dần. Nó bắt đầu với TTL là 1;
Sau đó, traceroute
có thể gửi một gói đến đích với chỉ số TTL là 2 và gói này sẽ chuyển đến bộ định tuyến thứ hai dọc theo đường dẫn trước khi ICMP được gửi lại
Mỗi gói sẽ đi xa hơn gói trước một bước nhảy và bằng cách điều chỉnh bộ định tuyến ở độ sâu của mỗi bước nhảy và theo dõi các bộ định tuyến mà nó nhận được tin nhắn trên đường đi, nó có thể xây dựng lại một đường dẫn thô đến máy chủ đích
Triển khai cơ bản sẽ như thế nào?
Để tạo lại điều này, chúng tôi sẽ muốn viết một số mã thực hiện như sau
- Lấy IP đích của đích mẫu, nói “ví dụ. com”
- Tạo một ổ cắm cho phép nó gửi các gói UDP
- Tạo một ổ cắm mà trên đó nó sẽ nghe các thông báo ICMP
- Khởi tạo các biến vòng lặp để theo dõi bước nhảy hiện tại
- Trong một vòng lặp khi chúng tôi chưa đến đích
- Gửi một gói có TTL tăng dần
- Nhận một gói ICMP đến
- Theo dõi bước nhảy hiện tại và địa chỉ của thông báo ICMP đã nhận
Điều đó nghe có vẻ không tệ lắm. Tất cả đều khá dễ tiếp cận và trong Python, nó có thể trông giống như thế này
import socket
DESTINATION = 'example.com'
DESTINATION_PORT = 33434
MESSAGE = 'foo'
def main[]:
# Get the destination ip address.
destination_ip = socket.gethostbyname[DESTINATION]
print['Tracing the route to {0}'.format[destination_ip]]
# Prepare a socket to send UDP packets.
sending_socket = socket.socket[socket.AF_INET, socket.SOCK_DGRAM]
sending_socket.setsockopt[socket.SOL_SOCKET, socket.SO_REUSEADDR, 1]
# Prepare a socket to listen for ICMP messages.
# Note: the middle argument _may_ be SOCK_RAW, but since I'm running this
# on a mac, I had to use SOCK_DGRAM to avoid needing root privileges.
# See //apple.stackexchange.com/questions/312857/how-does-macos-allow-standard-users-to-ping.
receiving_socket = socket.socket[
socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_ICMP]
# Show the ICMP header, since that's where the router address is.
receiving_socket.setsockopt[socket.SOL_IP, socket.IP_HDRINCL, 1]
# Initialize the variables we'll use for seeing if we're done and keeping
# track of the current hop.
received_ip = None
current_hop = 1
while received_ip != destination_ip:
# Set the socket's TTL to the current hop so that the packet just
# reaches it before being stopped.
sending_socket.setsockopt[
socket.IPPROTO_IP, socket.IP_TTL, current_hop]
# Attempt to send a UDP packet to the destination ip.
sending_socket.sendto[bytes[MESSAGE, 'utf-8'],
[destination_ip, DESTINATION_PORT]]
# Receive any incoming ICMP packet. We can ignore the first return
# value from recvfrom, which would be the included data.
_, addr = receiving_socket.recvfrom[1500]
received_ip = addr[0]
print['Current hop {0}: ICMP message received from {1}'.format[
current_hop, received_ip]]
current_hop = current_hop + 1
if __name__ == '__main__':
main[]
chúng ta đi thôi. Nếu tôi tiếp tục và chạy cái này, tôi sẽ nhận được như sau
blog: $ python3 content/posts/toy-traceroute/toy_traceroute.py
Tracing the route to 93.184.216.34
Current hop 1: ICMP message received from 10.1.10.1
Current hop 2: ICMP message received from 96.120.66.197
Current hop 3: ICMP message received from 24.124.212.221
Current hop 4: ICMP message received from 96.108.45.74
Current hop 5: ICMP message received from 96.110.22.85
Current hop 6: ICMP message received from 69.241.119.54
Current hop 7: ICMP message received from 152.195.232.129
Current hop 8: ICMP message received from 93.184.216.34
blog: $
Điều này khớp chính xác với con đường mà traceroute
đã khám phá trước đó, điều này rất thú vị. Chúng tôi đã dò thành công tuyến đường giữa máy tính của tôi và máy chủ đích
Các biến chứng làm cho nó thú vị
Có nhiều cách để cải thiện chương trình cơ bản này, bao gồm ít nhất những cách sau
- thời gian. mỗi bước nhảy mất bao lâu?
- Điều gì sẽ xảy ra nếu chúng tôi gửi nhiều lần thử để có nhiều mẫu thời gian hơn?
- Chúng ta phải làm gì nếu một bước nhảy không phản hồi?
traceroute
xử lý những vấn đề này, nhưng thật thú vị khi nghĩ về cách bạn tự giải quyết vấn đề
Cũng có một vài trường hợp thú vị về truy tìm tuyến đường nói chung
- Điều gì xảy ra nếu một bộ định tuyến bỏ các gói UDP?
- Điều gì sẽ xảy ra nếu hai yêu cầu tiếp theo đi theo một đường dẫn khác qua mạng?
Xem mọi thứ hoạt động như thế nào thông qua một vấn đề về đồ chơi
traceroute
là một trường hợp sử dụng đơn giản nhưng thông minh của một tính năng tích hợp sẵn của internet và thật thú vị khi xem nó hoạt động như thế nào thông qua một ví dụ cơ bản