内网穿透前置知识–TCP/IP协议

笔者近期由于实际需要,对内网穿透进行了一些研究,故撰写本系列文章,希望将本过程中的一些经验和踩过的雷记录下来,以便后续查阅,也造福后人。

首先在内网穿透教程之前需要科普一些基础知识,如果你对网络知识有基本的了解,可以跳过这些前置知识,直接翻阅后续的FRP实操部分。

一、什么是TCP/IP协议族?

翻阅一下维基百科(https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F),不难得到:互联网协议套件(英语:Internet Protocol Suite,缩写IPS)是网络通信模型,以及整个网络传输协议家族,为网际网络的基础通信架构。它常通称为TCP/IP协议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。因为该协议家族的两个核心协议:TCP(传输控制协议)和IP(网际协议),为该家族中最早通过的标准[3]。由于在网络通信协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又称为TCP/IP协议栈(英语:TCP/IP Protocol Stack) 。

看着很晦涩,说人话就是,TCP/IP 是用于因特网 (Internet) 的通信协议,是对那些计算机必须遵守以便彼此通信的的规则的描述。更加通俗地说,就是遵守这个协议的计算机都可以接入Internet,就好比全球的人都说英语,就可以互相无障碍地交流。

这个网络协议包含四层,分别是应用层、传输层、网络层和网络接口层,每一层各自具有不同的职责。Linux内核就是按照这套网络模型实现网络协议栈的。

二、TCP/IP分层

2.1 应用层(Application Layer)

这是最上层的,也是平时我们能直接接触到的。我们使用的各种应用程序(Application)都在应用层实现。应用层只需要专注于为用户提供应用功能,例如HTTP、FTP、DNS等。

应用层工作在操作系统中的用户态,而传输层及以下层工作在内核层。

2.2 传输层(Transport Layer)

接收来自应用层的数据包,为应用层提供网络支持,知名的TLS加密就在这一层实现。

传输层有两个传输协议,TCP和UDP。

传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

大部分应用使用的是 TCP 传输层协议,它相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些能够保证数据包能可靠地传输给对方。

而用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)是一个简单的面向数据包的通信协议。

相比TCP,机制简单得多,只负责发送数据包,而不保证数据包的可靠送达。也因为如此,UDP数据包头更为精简,实时性更好,往往被大部分对实时性要求较高的网络游戏采用。当然,在应用层对UDP数据包实现TCP的特性也是可以的,这就是最近新兴的QUIC协议,由Google首创。

由于篇幅问题,本文暂不深入展开关于TCP和UDP数据包的格式规范。

2.3 网络层(Internet Layer)

这一部分负责传输,最常使用的是 IP 协议(Internet Protocol)。这一层会在接收传输层数据包的基础上,额外在数据包头加入IP报文,这用于指定数据包目的地。

现在常用的IP协议有两种,分别是IPv4和IPv6。

此处以IPv4为例,v6和v4的基本规则是大同小异的。

对于 IPv4 协议, IP 地址共 32 位,分成了四段,每段是 8 位。每个IP地址包含两部分,一个是网络号,另一个是主机号。网络号标识此IP地址属于哪个子网,主机号标识此IP地址属于子网下的哪个主机。

这两个部分是通过子网掩码计算得到的。最常见的子网掩码是255.255.255.0,这也是家庭环境中的常见子网掩码。我们假设存在这样一个IP:192.168.100.123。首先我们将两者转为二进制,子网掩码的二进制形式为11111111.11111111.11111111.0,IP的二进制形式为11000000.10100010.01100100.01111011。将子网掩码和IP进行按位与运算,可以得到网络号,即11000000.10100010.01100100.00000000,十进制表示为192.168.100.0,剩下的位数就是主机号,即123。

除了寻找目的地,IP协议的另一个作用就是查找路由。数据包传输需要在链路上经过一系列路由器和交换机等中继设备,每个节点都需要通过路由表查找数据包的下一条路径。在这个过程中,每个节点根据预先编写好的路由表或者根据Dijkstra算法生成的路由表查找目标子网的路径,然后对数据包进行转发。

2.4 网络接口层 (Link Layer)

网络接口层的作用是在网络层数据包的前部加上一个MAC数据头,封装成完整的数据帧并通过物理链路完成发送。

在以太网中,每个物理连接的子网使用MAC标识每个设备的物理地址,而不能通过IP直接找到对方的地址。通常,在以太网中,设备通过ARP协议获取同一子网下其他设备的MAC地址。在powershell中,我们可以通过

arp -a

命令获取当前子网其他设备的MAC地址。

总的来说,网络接口层主要提供物理链路上的寻址和传输。

一览图片:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

You might also like