网络层

简介: 网络层

网络层是 OSI 模型中的第三层,负责在不同网络之间传输数据包。其主要任务是确定数据包的路由方式,以确保数据能够从源主机发送到目标主机。网络层使用 IP 协议来完成这些任务,IP 地址用于标识主机和网络,并确定数据包的路由路径。网络层还负责分段和重新组装数据包,以适应不同网络的最大传输单元(MTU)。

 

IP 地址

IP 地址是网络层中的关键概念,用于唯一标识网络上的每个主机和路由器。IPv4 地址由 32 位二进制数字组成,通常以点分十进制表示,如 192.168.1.1。IPv6 地址由 128 位二进制数字组成,以冒号分隔表示,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6 地址的引入是为了解决 IPv4 地址枯竭的问题。

 

IP 协议

IP 协议是网络层中最重要的协议之一,负责在网络之间传输数据包。它定义了数据包的格式和路由方式。IP 数据包包括头部和数据两部分,头部包含源地址、目标地址、数据包长度等信息。IP 协议提供的服务是不可靠的,数据包可能会丢失、重复、失序或损坏。为了解决这些问题,通常会与 IP 协议配合使用传输层的 TCP 协议或 UDP 协议。

 

IP 路由

IP 路由是网络层的一个重要功能,它确定数据包从源主机到目标主机的路径。路由器是网络层中负责转发数据包的设备,它根据目标地址和路由表来确定数据包的下一跳路由器。路由表存储了目的网络和下一跳路由器之间的映射关系。路由选择算法通常采用最短路径优先(Shortest Path First,SPF)或距离向量(Distance Vector)算法。

 

ICMP 协议

Internet 控制消息协议(Internet Control Message Protocol,ICMP)是一种网络层协议,用于在 IP 网络上发送错误消息和操作消息。它通常用于诊断网络故障和执行网络管理任务。常见的 ICMP 消息包括回显请求和回显应答,用于检测主机的可达性。

 

IP 地址分配

iP 地址分配是网络层管理中的重要任务。IPv4 地址通常由网络管理员手动分配或使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)自动分配。IPv6 地址通常通过无状态地址自动配置(Stateless Address Autoconfiguration,SLAAC)或 DHCPv6 分配。

 

VPN 和 NAT

虚拟专用网络(Virtual Private Network,VPN)是一种通过公共网络(如互联网)建立加密通道的技术,用于保护数据传输的安全性。网络地址转换(Network Address Translation,NAT)是一种将私有 IP 地址转换为公共 IP 地址的技术,用于解决 IPv4 地址不足的问题。

网络层在整个网络通信中起着至关重要的作用,它负责确定数据包的路径并实现不同网络之间的连接。通过深入了解网络层的功能和协议,可以更好地理解计算机网络的工作原理。

 

使用 Python 的 socket 库来手动构建和发送 ICMP 请求。以下是一个示例:

import socket
import os
import struct
import time
import select
 
ICMP_ECHO_REQUEST = 8
 
def checksum(source_string):
    sum = 0
    count_to = (len(source_string) // 2) * 2
    count = 0
 
    while count < count_to:
        this_val = source_string[count + 1] * 256 + source_string[count]
        sum += this_val
        sum &= 0xffffffff
        count += 2
 
    if count_to < len(source_string):
        sum += source_string[len(source_string) - 1]
        sum &= 0xffffffff
 
    sum = (sum >> 16) + (sum & 0xffff)
    sum += (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer
 
def create_packet(id):
    header = struct.pack('bbHHh', ICMP_ECHO_REQUEST, 0, 0, id, 1)
    data = struct.pack('d', time.time())
    my_checksum = checksum(header + data)
 
    header = struct.pack('bbHHh', ICMP_ECHO_REQUEST, 0, my_checksum, id, 1)
    return header + data
 
def send_icmp_request(destination_ip):
    icmp = socket.getprotobyname("icmp")
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
    
    packet_id = int((id(timeout) * time.time()) % 65535)
    packet = create_packet(packet_id)
    
    sock.sendto(packet, (destination_ip, 1))
    
    start_time = time.time()
    while True:
        ready = select.select([sock], [], [], 1)
        if ready[0] == []:
            print("Request timed out.")
            return
        
        time_received = time.time()
        rec_packet, _ = sock.recvfrom(1024)
        icmp_header = rec_packet[20:28]
        type, code, checksum, p_id, sequence = struct.unpack('bbHHh', icmp_header)
        
        if p_id == packet_id:
            bytes_in_double = struct.calcsize('d')
            time_sent = struct.unpack('d', rec_packet[28:28 + bytes_in_double])[0]
            print(f"Received ICMP response from {destination_ip} in {time_received - time_sent:.3f} seconds")
            return
 
if __name__ == "__main__":
    destination_ip = "8.8.8.8"
    send_icmp_request(destination_ip)


相关文章
|
1月前
|
算法 网络协议 网络架构
计算机网络-网络层:IP协议
【2月更文挑战第1天】
60 0
|
10月前
|
网络协议 网络架构
一文搞定网络层协议
本文详细的介绍了网络层的所有的细节,学习完本章小白将打下坚实的基础。
|
1月前
|
网络协议 网络架构
网络层 IP协议(1)
网络层 IP协议(1)
20 0
|
1月前
|
网络协议 网络安全 SDN
计算机网络——网络层(1)
计算机网络——网络层(1)
|
10月前
|
网络协议 算法 SDN
网络层
网络层
53 0
|
11月前
|
网络协议 算法 数据安全/隐私保护
网络层——IP协议(二)
网络层——IP协议
63 0
|
1月前
|
网络协议
网络层有哪些常见协议
网络层有哪些常见协议
|
6月前
|
网络协议 算法 网络安全
【计算机网络】网络层IP协议
【计算机网络】网络层IP协议
91 0
|
8月前
|
网络协议 网络架构
网络层哪些事?
网络层哪些事?
26 0
|
9月前
|
网络协议 算法 安全
【计算机网络】第4章 网络层
【计算机网络】第4章 网络层