• [常见问题汇总帖] 在虚拟机中ebpf程序跟踪socket得到的源IP地址和目的ip地址一样
    在虚拟机上进行编译和执行,得到的结果源地址IP和目的地址IP是一样的,网络用的桥接模式。在user程序中进行对百度的ping操作。而且监控网口改成了我自己的网口。但是得到的就有我虚拟机的地址,socket源和目的地址都是。这是负责储存信息的结构体,在map中作为键key。这是给结构体中源和目标地址赋值的操作函数部分。这是map,值为包的数量和大小的结构体。这是user态的输出。像是端口,协议号,包数和数据大小都能正常输出,就是这个源地址和目的地址是一样的。然后我把源和目的地址改成定值1和2.输出就是1和2,感觉这是对的(没有ping百度,是连接的vscode,走22端口)然后我又去看了这个struct __sk_buff的偏移量,确实也是不一样的,源地址n1的偏移量26,目的地址n2的偏移量30,理应得到两个不同的内容才对。这俩load_word函数得到的理应是不同的值才对。但输出的确实是同一个值。但输出就是一样的,就怀疑是struct __sk_buff结构体里面填充的源和目的地址是一样的。这个程序就是源码目录下/samples/bpf/sockex3.我不能理解为什么,也许是我没理解到程序在做什么,求救大佬指导。
  • [问题求助] 如何用int _sockops(struct bpf_sock_ops *ctx)函数实现对tcp套接字状态的跟踪啊。
    使用c语言ebpf和int _sockops(struct bpf_sock_ops *ctx)函数,map随意我是初学者,死活写不出来,求教大佬们。
  • 华为IP骨干网方案的主要优势
    随着5G、云、AI时代的来临,华为聚焦业务需求,面向运营商客户推出智能骨干解决方案,突破传统IP骨干网限制,帮助运营商客户解决现有骨干IP网络面临的带宽利用率低,业务体验差、部署低效、运维复杂等问题。随着新时代的到来,骨干IP网络更加注重大容量、流量优化、可靠性和高效运维,并具备向下一代运营商软件定义网络的演进能力。智能骨干解决方案致力于打造最佳商用体验的骨干网,提升运营商网络竞争力。波分复用技术:华为的IP骨干网方案采用了波分复用技术,使得网络管道具有"硬隔离"的特性,提高了网络的安全性和可靠性。带宽保障:华为的IP骨干网方案支持FlexE网络切片技术,实现不同业务流量间的硬隔离,为关键业务提供100%可承诺的带宽保障。时延承诺:华为的IP骨干网方案通过SRv6技术实现了可编程路径、确定性节点、路径及时延,使得网络的时延可以被精确控制,从而提高了网络服务的质量。业务高可靠:华为的IP骨干网方案通过iFIT技术实现了业务质量的可视化,使得网络故障的定位周期从天缩短到分钟,提高了网络运维的效率。网络弹性:华为的IP骨干网方案基于Fabric架构,实现了网络承载层和业务层的解耦,使得网络可以按需扩展,提供大容量、无阻塞的综合服务。面向未来的演进能力:华为的IP骨干网方案具备向下一代运营商软件定义网络的演进能力,使得网络可以适应未来的业务需求和技术发展以上就是华为IP骨干网方案的主要优势,这些优势使得华为的IP骨干网方案在实际应用中表现出优秀的性能和可靠性
  • IPv4和ipv6的区别
    网络层是OSI(开放系统互联)模型中的第三层,主要负责在源主机和目标主机之间传送数据包。网络层的主要功能是逻辑寻址和路由选择,即确定数据包从源主机到目标主机的最佳路径。这一层最著名的协议就是IP协议,包括IPv4和IPv6。IPv4:IPv4,即互联网协议版本4,是互联网协议(IP)的第四版,也是第一个被广泛使用,构成现今互联网技术的基石的协议。IPv4使用32位(4字节)地址,因此地址空间中大约有43亿个地址。然而,由于地址分配的不均衡以及地址资源的浪费,IPv4地址在2011年就已经分配完毕。IPv4地址由网络号和主机号两部分组成,常用的表示方法有点分十进制表示法。IPv4包头长20字节,包含版本、首部长度、服务类型、总长度、标识符、标志位、片偏移、生存时间、协议、头部校验和、源IP地址和目标IP地址等信息。IPv6:IPv6,即互联网协议版本6,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议。IPv6使用128位(16字节)地址,极大地扩展了地址空间,解决了IPv4地址耗尽的问题。IPv6还改进了IPv4的一些缺点,如安全性、自动配置等。IPv6地址由8组16位的16进制数表示,各组之间用冒号(:)分隔。IPv6包头长40字节,比IPv4包头更加复杂,但提供了更多的功能。IPv6支持即插即用和无状态地址自动配置,使得网络(尤其是局域网)的管理更加方便和快捷。此外,IPv6还增强了组播支持以及对流的支持,这使得网络上的多媒体应用有了长足发展的机会,为服务质量(QoS)控制提供了良好的网络平台。IPv6中加入了对自动配置的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。总的来说,网络层是互联网通信的关键部分,而IP协议(包括IPv4和IPv6)则是网络层的核心协议。随着网络技术的发展和互联网规模的扩大,IPv6已经逐渐取代IPv4成为主流的网络协议。
  • 互联网七层协议:深入理解与代码实现
    一、引言当我们谈论互联网时,经常会听到“TCP/IP协议族”或“OSI七层模型”等术语。这些模型和协议是构建和运行互联网的基础。其中,OSI(开放系统互联)七层模型是一个理论框架,用于描述和理解网络通信的复杂过程。本文将深入探讨这七层协议,帮助读者更好地理解它们的工作原理,并通过代码示例展示如何在实际应用中运用这些协议。二、OSI七层模型概述OSI七层模型将网络通信过程划分为七个独立但相互关联的层次。每一层都负责特定的功能,并与相邻的层次进行交互。以下是这七层的简要概述:物理层(Physical Layer):负责传输原始比特流,如电压、电缆、接口等物理特性。 数据链路层(Data Link Layer):处理数据在单个链路上的传输,包括错误检测、物理寻址等。 网络层(Network Layer):负责数据包在网络中的路由和转发,实现不同网络之间的通信。 传输层(Transport Layer):确保数据在源端和目的端之间的可靠传输,包括流量控制、错误恢复等。 会话层(Session Layer):建立、管理和终止会话,负责数据交换的同步。 表示层(Presentation Layer):处理数据的格式和表示,如加密、压缩、编码转换等。 应用层(Application Layer):提供网络服务和应用程序接口,如HTTP、FTP、SMTP等。 三、各层详解与代码实现物理层 物理层负责将数字信号转换为模拟信号进行传输,或者反之。这一层通常由硬件设备(如网卡、路由器、交换机等)实现,不涉及软件编程。因此,在此不再提供代码示例。数据链路层 数据链路层主要负责将数据封装成帧,并通过物理链路进行传输。在此过程中,还需要进行错误检测和处理。常见的数据链路层协议包括以太网(Ethernet)、点对点协议(PPP)等。以下是一个简单的Python代码示例,演示如何使用数据链路层的功能:python import socketimport structdef send_ethernet_frame(dest_mac, src_mac, payload):构建以太网帧头部ethertype = b'\x08\x00' # IPv4header = dest_mac + src_mac + ethertype将负载数据封装成帧frame = header + payload发送以太网帧sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)sock.bind(('eth0', 0))sock.send(frame)sock.close() 网络层 网络层负责将数据包从源主机路由到目标主机。它使用IP协议(Internet Protocol)来实现这一功能。在Python中,可以使用socket库来进行网络层的编程。以下是一个简单的示例:python import socketimport structdef send_ip_packet(dest_ip, payload):构建IP头部version = 4header_length = 5ttl = 64protocol = socket.IPPROTO_TCP # TCP协议src_ip = socket.gethostbyname(socket.gethostname()) # 获取本机IP地址packet_length = len(payload)ip_header = struct.pack('!BBHHHBBH4s4s', version, header_length, ttl, protocol, packet_length, src_ip, dest_ip)将负载数据封装成IP数据包packet = ip_header + payload发送IP数据包sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, protocol)sock.sendto(packet, (dest_ip, 0))sock.close() 传输层 传输层负责在源端和目的端之间建立可靠的连接,并确保数据的顺序和完整性。常见的传输层协议包括TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。以下是一个使用TCP协议的Python代码示例:python import socketimport threadingimport timedef server_program(): #启动服务器函数定义部分开始host = socket.gethostname() #获取本地主机名称并赋值给变量host #端口号赋值给变量port 注:变量port用于存储服务器所使用的端口号,便于客户端连接时调用此端口号进行连接通信。同时,该端口号可以根据需要进行修改。但需要注意的是,端口号范围为065535之间的整数,且01023之间的端口号已被系统占用,一般选择1024之后的端口号进行使用。否则可能会出现端口被占用导致无法启动服务器的问题。同时,为了保证服务器的正常运行,需要确保该端口号未被其他程序占用。可以使用netstat -an命令查看当前系统所有网络连接信息以及所占用的端口号情况。如果发现所需使用的端口号已被占用,则需要更换其他端口号进行使用。另外,为了避免出现服务器启动失败的情况,最好在启动服务器之前先关闭该端口号的其他占用程序。可以使用taskkill /f /t /im 程序名称.exe命令关闭指定程序的所有进程。例如,如果要关闭占用端口号为8080的程序的进程,可以使用taskkill /f /t /im 程序名称.exe /pid 进程ID命令进行关闭。其中,“程序名称”为占用端口号的程序的名称,“进程ID”为进程的ID号,可以在任务管理器中查看。另外需要注意的是,在执行该命令时需要以管理员身份运行命令提示符窗口,否则可能会出现权限不足导致无法关闭进程的情况。可以使用鼠标右键点击命令提示符图标并选择“以管理员身份运行”来打开命令提示符窗口。同时,如果需要频繁地启动和关闭服务器来进行测试或演示等操作,则可以使用批处理脚本来执行以上操作。可以将以上命令写入一个文本文件中并将文件后缀名改为“.bat”,然后双击运行该批处理脚本即可快速启动或关闭服务器。例如,可以创建一个名为“start_server.bat”的批处理脚本来启动服务器,其中包含以下命令:python server.py其中,“server.py”为包含服务器程序的Python脚本文件名可以根据需要进行修改。,而客户端则使用变量port所存储的端口号进行连接通信。同时,为了方便客户端进行连接测试或演示等操作,可以在服务器程序中添加一些提示信息或交互功能来提高用户体验性。例如可以在服务器程序中添加以下代码来实现当客户端连接成功时向客户端发送欢迎信息并等待客户端发送消息的功能:connection, address = server_socket.accept() print(f"Connected by {address}") connection.send('Welcome to the server!'.encode()) while True: data = connection.
  • [技术干货] TCP/IP协议中的序号、确认与重传机制:深入理解与实践
    一、引言当我们谈论网络通信,尤其是基于TCP/IP协议的网络通信时,我们经常会听到“序号”、“确认”和“重传”这些术语。这些机制是TCP协议中确保数据可靠传输的关键部分。在本篇博客中,我们将深入了解这些概念,并通过代码实践来进一步理解它们的工作原理。二、TCP的序号机制序号的作用在TCP协议中,每个字节都被赋予一个唯一的序号。这些序号由发送端分配,并在数据包中传输到接收端。序号的主要目的是确保数据包的顺序性和完整性。由于网络中的数据包可能经过不同的路径到达接收端,序号可以帮助接收端按照正确的顺序重新组合数据包,从而还原原始数据流。序号的生成与管理发送端使用一个称为“序列号”的32位计数器来生成序号。每当发送端发送一个数据包时,它都会增加序列号的值。接收端则根据接收到的数据包的序号来判断数据包的顺序,并据此进行数据处理。三、TCP的确认机制确认的作用TCP的确认机制用于确保数据的可靠传输。当接收端成功接收到一个数据包时,它会返回一个确认信号(ACK)给发送端。这个确认信号包含了接收端期望接收的下一个数据包的序号。发送端收到确认信号后,就知道之前发送的数据包已经被成功接收,并可以继续发送后续的数据包。确认的实现方式确认信号是通过TCP数据包中的ACK标志位来实现的。当ACK标志位被设置为1时,表示该数据包是一个确认信号。确认信号中还包含一个32位的确认号字段,用于指示接收端期望接收的下一个数据包的序号。四、TCP的重传机制重传的作用由于网络中存在各种可能导致数据包丢失的因素,如网络拥堵、传输错误等,发送端可能需要重传丢失的数据包。重传机制是TCP协议中确保数据可靠传输的另一个关键部分。当发送端在一个特定的超时时间内未接收到确认信号时,它会认为数据包丢失并重传该数据包。超时时间的计算重传机制的核心是超时时间的计算。发送端使用一个称为“往返时间”(RTT)的估计值来计算超时时间。RTT是发送端发送一个数据包到接收到对应的确认信号所需的时间。发送端根据RTT的估计值和当前的网络状况动态调整超时时间,以适应网络的变化。五、代码实践:模拟TCP的序号、确认和重传机制为了更深入地理解TCP的序号、确认和重传机制,我们可以通过代码来模拟这些过程。以下是一个简单的Python示例,演示了如何模拟TCP的发送端和接收端之间的通信过程:发送端的实现:import socket import time # 定义数据包的大小和超时时间 PACKET_SIZE = 1024 TIMEOUT = 1 # 秒 # 创建socket对象并连接到接收端 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('localhost', 8000)) # 发送数据并等待确认信号 for i in range(10): # 发送10个数据包 data = f"Packet {i}" client_socket.send(data.encode()) start_time = time.time() while True: if time.time() - start_time > TIMEOUT: print(f"Timeout: Resending packet {i}") client_socket.send(data.encode()) # 重传数据包 start_time = time.time() # 重置超时计时器 ack = client_socket.recv(PACKET_SIZE).decode() if ack == f"ACK {i}": # 接收到正确的确认信号 print(f"Packet {i} acknowledged") break接收端的实现:```python import socket import threading创建socket对象并监听连接请求server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 8000)) server_socket.listen(1) print("Server is listening...")处理连接请求和数据接收的函数def handle_connection(client_socket): for i in range(10): # 接收10个数据包并发送确认信号 data = client_socket.recv(PACKET_SIZE).decode() print(f"Received packet {i}: {data}") client_socket.send(f"ACK {i}".encode()) # 发送确认信号 client_socket.close()等待客户端连接并创建线程处理连接请求和数据接收client_socket, address = server_socket.accept() print(f"Accepted connection from {address}") client_thread = threading.Thread(target=handle_connection, args=(client_socket,)) client_thread.start()``` 六、总结与展望(续)通过以上的代码实践,我们可以更深入地理解TCP协议中的序号、确认和重传机制是如何工作的。这些机制共同确保了数据的可靠传输,使得基于TCP/IP协议的网络通信成为可能。然而,实际的网络通信环境可能更加复杂和多变,如网络拥堵、丢包率高等情况都可能影响TCP的性能。因此,研究和优化TCP协议的性能仍然是网络领域的一个重要研究方向。未来,随着技术的不断发展,我们可能会看到更多创新的解决方案来提高TCP/IP协议的效率和可靠性,以满足不断增长的网络需求。同时,我们也应该关注网络安全问题,保护我们的数据和隐私不受侵犯。通过对TCP/IP协议的深入学习和实践,我们可以更好地理解网络的工作原理,并为未来的网络发展做出贡献。
  • TCP的可靠性
    TCP的可靠性 TCP(传输控制协议)是一种面向连接的协议,它提供了数据的可靠传输。这是通过一系列机制实现的,包括序号、确认和重传。序号:TCP将传输的数据分割为TCP认为最适合发送的数据块,并为每一个数据块赋予一个序号。接收端的TCP将这些数据块重新组合成原始数据流。确认和重传:当接收端成功收到数据,它会返回一个确认信号(ACK)给发送端。如果发送端在一个特定的超时时间内未接收到确认,它会重传数据。流量控制:TCP还使用滑动窗口机制进行流量控制。发送端维护一个窗口来控制未被确认的数据量,从而防止发送端发送过多数据而接收端来不及处理。IP的效率 IP(互联网协议)主要负责在网络层进行数据包的路由和转发。IP协议的高效率主要体现在以下几个方面:无连接:IP协议是无连接的,这意味着每个IP包都独立于其他包进行路由。这种机制使得IP网络可以高效地处理大量并发连接。路由:IP使用路由算法将数据包从源端发送到目的端。这些算法考虑了网络的状态和拓扑,以最有效的路径发送数据包。分包与组装:IP协议可以将大数据包分割成多个小包进行传输,然后在接收端将这些小包重新组装成原始的大数据包。这种分包与组装机制提高了网络的灵活性和效率。
  • [技术干货] TCP/IP协议:深入解析与网络编程实践
    一、引言TCP/IP协议是现代互联网的基础,它使得各种设备和系统都可以互相通信和交换信息。TCP/IP代表传输控制协议/互联网协议,它是一个协议族,包含了一系列用于网络通信的协议。这些协议在OSI(开放系统互联)模型的不同层次上工作,共同实现了网络中的数据传输。二、TCP/IP协议族应用层应用层是TCP/IP协议族中的最高层,负责处理应用程序之间的通信。常见的应用层协议包括HTTP、FTP、SMTP等。这些协议定义了数据的格式和传输规则,使得应用程序可以通过网络发送和接收数据。传输层传输层负责在源端和目的端之间传输数据。它主要有两个协议:TCP和UDP。TCP是面向连接的协议,提供了可靠的数据传输服务;而UDP是无连接的协议,不提供可靠性保证,但传输速度较快。网络层网络层负责将数据包从源端发送到目的端。它使用IP协议,将数据包封装成IP数据包,并通过路由选择将数据包发送到正确的目的地。数据链路层数据链路层负责在相邻的两个网络设备之间传输数据。它使用MAC地址来识别设备,并使用以太网协议等将数据封装成帧进行传输。三、TCP编程实践下面是一个简单的TCP服务器和客户端的示例代码,使用Python编写:TCP服务器import socket # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 8000)) # 开始监听连接请求 server_socket.listen(1) print('Server is listening...') # 等待客户端连接 client_socket, address = server_socket.accept() print('Accepted connection from', address) # 接收并处理客户端发送的数据 while True: data = client_socket.recv(1024) if not data: break print('Received data:', data.decode()) client_socket.send('Data received.') # 关闭连接 client_socket.close() server_socket.close()TCP客户端import socket # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect(('127.0.0.1', 8000)) print('Connected to server.') # 发送数据并接收服务器的响应 client_socket.send('Hello, server!') print('Server response:', client_socket.recv(1024).decode()) # 关闭连接 client_socket.close()四、总结与展望TCP/IP协议是现代互联网的基础,它使得各种设备和系统都可以互相通信和交换信息。通过对TCP/IP协议的深入解析和网络编程实践,我们可以更好地理解网络的工作原理,并掌握网络编程的基本技能。未来,随着技术的不断发展,TCP/IP协议也将不断演进和完善,为我们的生活和工作带来更多的便利和可能性。同时,我们也应该关注网络安全问题,保护我们的数据和隐私不受侵犯。
  • [问题求助] 请问这个问题怎么解决
    用opengauss连接Java时出现 connection to ip refused.Check that the hostname and port are ect and that the postmaster is accepting TCP/IP connections.
  • [问题求助] 请问这个问题怎么解决?
    用opengauss连接java时出现:relation “***”does not exist on dn_6001
  • [问题求助] ensp中交换机vlan设置问题
     采用按照接口来分的 vlan,以及不同vlan之间使用 vlanif 配置进行互相通信 整个结构如下:  如图可见,这是在交换机LW7中添加了vlan2 的ip地址(也就是默认网关地址),相应的在LW5中也添加了vlan4 的默认网关地址  ​ 此时PC4和PC1能够互相通信,LW7中的路由表:   但当一旦删除LW7中的vlan2默认网关地址时,双方便不能再进行通信,LW7路由表中也少了vlan2的部分。 所以这是为什么呢?初学小白有点不太明白 
  • [技术干货] TCP协议发送/接收数据实现
     TCP 协议 (传输控制协议) TCP 协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,再传输数据。它提供了两台计算机之间的可靠无差错的数据传输。在 TCP 连接中必须要明确客户端与服务器,由客户端向服务器发送连接请求,每次连接的创建都需要经过 “三次握手” 三次握手:TCP 协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠  第一次握手:客户端向服务器发出连接请求,等待服务器确认 第二次握手:服务器向客户端回送一个响应,通知客户端收到连接请求 第三次握手:客户端再次向服务器发送确认信息,确认连接 完成三次握手,连接建立后,客户端和服务器可以开始数据传输,由于这种面向连接的特性。TCP 协议可以保证传输数据的安全,所以应用十分广泛,比如:文件上传、文件下载、浏览页面 三次握手示意图 四次挥手示意图 发送端 Demo package tcp;  import java.io.*; import java.net.InetAddress; import java.net.Socket;  /**  * TCP 发送数据步骤  * 1.创建客户端socket对象  * 2.获取输出流,写数据  * 3.释放资源  */ public class ClientDemo {     public static void main(String[] args) throws IOException {         // 创建客户端socket对象         // 创建流套接字并将其连接到指定IP地址的指定端口号         Socket socket = new Socket(InetAddress.getByName("192.168.31.162"),9002);         // 获取输出流,写数据         System.out.println("input you data");         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));         // 封装输出流对象         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));         String line ;         //获取输出流,写数据;         while ((line = br.readLine()) != null){             // 获取输出流对象             bw.write(line);             bw.newLine();             bw.flush();         }         // 释放资源         socket.close();     } } 接收端 Demo package tcp;  import java.io.*; import java.net.Socket; import java.net.ServerSocket; /**  * TCP 接收数据步骤  * 1.创建服务端socket对象  * 2.监听客户端连接,返回一个socket对象  * 3.获取输入流,读数据,并把数据显示在控制台  * 4.释放资源  */ public class ServerDemo {     public static void main(String[] args) throws IOException {         // 创建服务端socket对象         ServerSocket serverSocket = new ServerSocket(9002);         // 监听客户端连接,返回一个socket对象         Socket socket = serverSocket.accept();         // 获取输入流,读数据,并把数据显示在控制台         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));         String line;         while ((line = br.readLine()) != null){             System.out.println(line);         }         // 释放资源         serverSocket.close();     } } run 控制台  注:启动客户端服务必须先启动服务端服务,否则会抛出异常 转自链接:https://learnku.com/articles/68081
  • [问题求助] SDC APP怎么和公网地址建立tcp连接
    使用SDC的tproxy.paas.sdc服务,为啥只能连接和摄像头同个网段的地址,没法访问公网IP
  • [技术干货] 网络参考模型与标准协议
    网络参考模型OSI(Open System Interconnect),即开放式系统互连。OSI参考模型,是ISO组织在1985年研究的网络互连模型,该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层):7.应用层对应用程序提供接口6.表示层进行数据格式的转换,以确保一个系统生成的应用层数据能够被另外一个系统的应用层所识别和理解。5.会话层在通信双方之间建立、管理和终止会话。4.传输层建立、维护和取消一次端到端的数据传输过程。控制传输节奏的快慢,调整数据的排序等等。3.网络层定义逻辑地址;实现数据从源到目的地的转发。2.数据链路层将分组数据封装成帧;在数据链路上实现数据的点到点、点到多点方式的直接通信;差错检测。1.物理层在媒介上传输比特流;提供机械的和电器的规约。因为OSI协议栈比较复杂,且TCP和IP两大协议在业界被广泛使用,所以TCP/IP模型成为了互联网的主流参考模型,目前我们常用的是TCP/IP对等模型。三者的对应关系如下图所示: 标准协议在TCP/IP对等模型中,常用协议如下: 应用层HTTP(Hypertext Transfer Protocol,超文本传输协议):是互联网应用最为广泛的一种网络协议,用来访问在网页服务器上的各种页面。FTP(File Transfer Protocol,文件传输协议):是一个从一台主机传送文件到另一台主机的协议,用于文件的“下载”和“上传”。Telnet(Telecommunication Network Protocol,电信网络协议):是数据网络中提供远程登录服务的标准协议。为用户提供了在本地计算机上完成远程设备工作的能力。SSH(Secure Shell,安全外壳):允许在本地计算机和远程计算机之间建立安全渠道,以保护网络不受诸如IP地址欺诈、简单口令截取等攻击。SNMP(Simple Network Management Protocol,简单网络管理协议):该协议允许远程用户查看和修改网元的管理信息。DNS(Domain Name Service,域名称解析服务):用于实现从主机域名到IP地址之间的转换。传输层TCP(Transmission Control Protocol,传输控制协议):为应用程序提供可靠的面向连接的通信服务。目前,许多流行的应用程序都使用TCP。UDP(User Datagram Protocol,用户数据报协议):提供了无连接通信,且不对传送数据包进行可靠性的保证。网络层 IP(Internet Protocol,互联网协议):将传输层的数据封装成数据包并完成源站点到目的站点的转发,提供无连接的、不可靠的服务。 IGMP(Internet Group Management Protocol,因特网组管理协议):负责IP组播 成员管理的协议。它用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。 ICMP(Internet Control Message Protocol,网际报文控制协议):基于IP协议在网 络中发送控制消息,提供可能发生在通信环境中的各种问题反馈。通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。ARP(Address Resolution Protocol,地址解析协议):根据已知的IP地址解析获得其对应的MAC地址。 
  • [技术干货] 什么是IPsec?
    IPsec(Internet Protocol Security)是为IP网络提供安全性的协议和服务的集合,它是VPN(Virtual Private Network,虚拟专用网)中常用的一种技术。 由于IP报文本身没有集成任何安全特性,IP数据包在公用网络如Internet中传输可能会面临被伪造、窃取或篡改的风险。通信双方通过IPsec建立一条IPsec隧道,IP数据包通过IPsec隧道进行加密传输,有效保证了数据在不安全的网络环境如Internet中传输的安全性。什么是IPsec VPN?VPN(Virtual Private Network,虚拟专用网)是一种在公用网络上建立专用网络的技术。它之所以称之为虚拟网,主要是因为VPN的两个节点之间并没有像传统专用网那样使用端到端的物理链路,而是架构在公用网络如Internet之上的逻辑网络,用户数据通过逻辑链路传输。按照VPN协议分,常见的VPN种类有:IPsec、SSL、GRE、PPTP和L2TP等。其中IPsec是通用性较强的一种VPN技术,适用于多种网络互访的场景。IPsec VPN是指采用IPsec实现远程接入的一种VPN技术,通过在公网上为两个或多个私有网络之间建立IPsec隧道,并通过加密和验证算法保证VPN连接的安全。IPsec VPNIPsec VPN保护的是点对点之间的通信,通过IPsec VPN可以在主机和主机之间、主机和网络安全网关之间或网络安全网关(如路由器、防火墙)之间建立安全的隧道连接。其协议主要工作在IP层,在IP层对数据包进行加密和验证。相对于其他VPN技术,IPsec VPN安全性更高,数据在IPsec隧道中都是加密传输,但相应的IPsec VPN在配置和组网部署上更复杂。IPsec是如何工作的?IPsec的工作原理大致可以分为4个阶段:识别“感兴趣流”。网络设备接收到报文后,通常会将报文的五元组等信息和IPsec策略进行匹配来判断报文是否要通过IPsec隧道传输,需要通过IPsec隧道传输的流量通常被称为“感兴趣流”。协商安全联盟(Security Association,以下简称SA)。SA是通信双方对某些协商要素的约定,比如双方使用的安全协议、数据传输采用的封装模式、协议采用的加密和验证算法、用于数据传输的密钥等,通信双方之间只有建立了SA,才能进行安全的数据传输。识别出感兴趣流后,本端网络设备会向对端网络设备发起SA协商。在这一阶段,通信双方之间通过IKE协议先协商建立IKE SA(用于身份验证和密钥信息交换),然后在IKE SA的基础上协商建立IPsec SA(用于数据安全传输)。数据传输。IPsec SA建立成功后,双方就可以通过IPsec隧道传输数据了。IPsec为了保证数据传输的安全性,在这一阶段需要通过AH或ESP协议对数据进行加密和验证。加密机制保证了数据的机密性,防止数据在传输过程中被窃取;验证机制保证了数据的真实可靠,防止数据在传输过程中被仿冒和篡改。如图所示,IPsec发送方会使用加密算法和加密密钥对报文进行加密,即将原始数据“乔装打扮”封装起来。然后发送方和接收方分别通过相同的验证算法和验证密钥对加密后的报文进行处理得到完整性校验值ICV。如果两端计算的ICV相同则表示该报文在传输过程中没有被篡改,接收方对验证通过的报文进行解密处理;如果ICV不相同则直接丢弃报文。IPsec加密验证过程隧道拆除。通常情况下,通信双方之间的会话老化(连接断开)即代表通信双方数据交换已经完成,因此为了节省系统资源,通信双方之间的隧道在空闲时间达到一定值后会自动删除。IPsec的3个重要协议- IKE/AH/ESPIKE(Internet Key Exchange,因特网密钥交换)IKE协议是一种基于UDP的应用层协议,它主要用于SA协商和密钥管理。IKE协议分IKEv1和IKEv2两个版本,IKEv2与IKEv1相比,修复了多处公认的密码学方面的安全漏洞,提高了安全性能,同时简化了安全联盟的协商过程,提高了协商效率。IKE协议属于一种混合型协议,它综合了ISAKMP(Internet Security Association and Key Management Protocol)、Oakley协议和SKEME协议这三个协议。其中,ISAKMP定义了IKE SA的建立过程,Oakley和SKEME协议的核心是DH(Diffie-Hellman)算法,主要用于在Internet上安全地分发密钥、验证身份,以保证数据传输的安全性。IKE SA和IPSec SA需要的加密密钥和验证密钥都是通过DH算法生成的,它还支持密钥动态刷新。AH(Authentication Header,认证头)AH协议用来对IP报文进行数据源认证和完整性校验,即用来保证传输的IP报文的来源可信和数据不被篡改,但它并不提供加密功能。AH协议在每个数据包的标准IP报文头后面添加一个AH报文头,AH协议对报文的完整性校验的范围是整个IP报文。ESP(Encapsulating Security Payload,封装安全载荷)ESP协议除了对IP报文进行数据源认证和完整性校验以外,还能对数据进行加密。ESP协议在每一个数据包的标准IP报头后方添加一个ESP报文头,并在数据包后方追加一个ESP尾(ESP Trailer和ESP Auth data)。ESP协议在传输模式下的数据完整性校验范围不包括IP头,因此它不能保证IP报文头不被篡改。AH和ESP可以单独使用,也可以同时使用。AH和ESP同时使用时,报文会先进行ESP封装,再进行AH封装;IPsec解封装时,先进行AH解封装,再进行ESP解封装。IPsec使用的端口IPsec中IKE协议采用UDP 500端口发起和响应协商,因此为了使IKE协商报文顺利通过网关设备,通常要在网关设备上配置安全策略放开UDP 500端口。另外,在IPsec NAT穿越场景下,还需要放开UDP 4500端口。而AH和ESP属于网络层协议,不涉及端口。为了使IPsec隧道能正常建立,通常还要在网关设备上配置安全策略放开AH(IP协议号是51)和ESP(IP协议号是50)服务。IPsec VPN和SSL VPN对比IPsec和SSL是部署VPN时最常用的两种技术,它们都有加密和验证机制保证用户远程接入的安全性。从以下几个方面对IPsec VPN和SSL VPN进行对比:OSI参考模型工作层级OSI定义了网络互连的七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。IPsec工作在网络层,它直接运行在IP(Internet Protocol,互联网协议)之上。而SSL工作在应用层,是一种应用层协议,它加密的是HTTP流量,而不是直接加密IP数据包。IPsec和SSL的工作层级配置部署IPsec VPN通常适用于Site to Site(站点到站点)的组网,要求站点分别部署VPN网关或远程用户安装专用的VPN客户端,因此配置部署复杂度和维护成本都比较高。但SSL VPN通常适用于Client to Site(客户端到站点)的组网,只要求远程用户使用支持SSL的标准浏览器安装指定插件即可进行访问,通过数据中心部署VPN网关进行集中管理和维护,因此配置部署更简单,维护成本相对较低。IPsec VPNSSL VPN安全性IPSec工作在网络层,对站点间传输的所有数据进行保护。IPSec VPN要求远程用户安装专用的VPN客户端或在站点部署VPN网关设备,用户访问会受到客户端或网关在用户认证规则、安全策略规则或内容安全过滤方面的检查,因此安全性更高。而SSL VPN不要求安装专用客户端或接入站点部署网关设备,更容易受到安全威胁的影响。访问控制IPsec工作在网络层,不能基于应用进行细粒度的访问控制。而SSL VPN在精细化访问控制上更灵活,网络管理员可以将网络资源根据不同的应用类型划分为不同的资源类型,每一类资源的访问权限不同。