CS144 知识笔记一(网络概述)
目录
NAT
出现原因
具体操作
反向连接(中介服务器实现NAT穿透)
TCP/IP协议族 四层模型
四层概述
和OSI模型对应关系
数据链路层和网络层的配合
IP协议的特殊性
网络层 IP协议
IP协议概述
IP协议为何设计的如此简单?
IP协议提供的功能
IPv4数据头格式
分组交换
基本概述
两个优点
路由跳转
传输层 TCP协议
三次握手
VPN技术(封装原则)
虚拟网卡具体工作流程
虚拟网卡和代理的区别
NAT
出现原因
IPv4地址只有2^32(42亿)个,随着全球人口激增,上网设备也大幅度增加,加上每个人上网设备有多个(电脑,手机,平板等),给每个设备分配一个独立公网IP不可行。为了解决IPv4地址枯竭的问题,NAT允许一个局域网共享一个公网IP。
NAT也为局域网提供了基础的安全隔离,将局域网和公网之间适当的隔离。在局域网内部,可以随意使用私有网络,而不必向ISP申请更多的独立IP。
具体操作
NAT更多的是担任一个中间人的作用,当局域网内有计算机A想要和公网上的服务器B申请服务时,发生如下过程:
1.计算机A将带有自己的私有IP和端口(例如192.168.1.100:1234)的数据包发送给NAT,NAT将计算机A的私有IP转化成当前局域网持有的公网IP,将端口号转换成目前尚未分配的端口号(例如:198.51.100.1:5555),之后在公网上发送该数据包,目标IP和端口号不变。并且在NAT中建立192.168.1.100:1234 -> 198.51.100.1:5555的映射。
2.在计算机A和服务器B的连接结束前该映射都不会取消,也就是该端口号不会分配给局域网中的其他计算机(公网IP就1个,实际上是用同一个公网IP的不同端口号区分不同计算机,或者NAT不止持有1个公网IP,这里就用IP:端口号区分不同计算机)。当服务器B收到消息后会发送数据包给NAT,发送地址为198.51.100.1:5555,NAT查询映射表,得知是给局域网中的A发送的,于是将数据包发送给A。当A和B的连接断开时,NAT取消该映射,该IP:端口的组合可以重新分配给局域网内的其他计算机。
具体来看就是局域网内的计算机上网都是借靠NAT的公网IP来实现的。
反向连接(中介服务器实现NAT穿透)
上述说了,NAT后的计算机A想要连接公网上的服务器/计算机需要借助NAT的帮助。这就导致了NAT后的计算机具有“很容易出去,很难接受外来的直接连接”。
为什么很容易出去?因为NAT后的计算机知道要去目的地的公网IP,所以正常发送,经过NAT转换自己IP即可到达。
很难接受外来的直接连接?因为计算机躲藏在NAT之后,只知道NAT的公网IP,不清楚计算机在局域网中的情况,况且在计算机主动出去前,计算机甚至还没被NAT分配公网IP:端口号,这就更增加了外部的直接连接了。
为了解决此问题,一个有效的方式是设置一个中介服务器,实现反向连接。考虑如下情况,用户A和B都在各自局域网内,前都有NAT,两者想要建立P2P的连接。

具体流程如下:
1.设置中介服务器Relay,当用户A和B想要连接时,首先先和中介服务器建立连接(这属于出去,所以很容易)。
2.当用户A想要和B建立连接时,他会首先向中介服务器发送“想要和B建立连接”的数据包,中介服务器收到数据包后,转发给B。
3.由于“想要和B建立连接”的数据包上有用户A转换后的公网IP和端口,所以由B在公网上发送“想要和A建立连接”的数据包,该数据包中包含源地址(用户B经NAT转换后的公网IP和端口)和目的地址(用户A经NAT转换后的公网IP和端口)。
4.用户A收到来自用户B的连接请求,两者建立连接。
可以发现,最初是用户A想要和用户B建立连接,但最终是由用户B向用户A发送的建立连接的请求,顾名“反向链接”。
此外,还有端口转发的方式,即设置某个端口(如2756),任何IP的这个端口来到之后,直接转发数据包到局域网内的某个计算机上,相当于该端口被该计算机占据。
TCP/IP协议族 四层模型
四层概述
TCP/IP协议族大体分为四层,从底层到上层,分别是数据链路层,网络层,传输层和应用层。

数据链路层:负责路由器之间的数据传输工作。
网络层:统一采用互联网协议(Internet Protocol)即IP协议,负责主机端对端的传输。
传输层:包括TCP(Transimition Control Protocol 控制传输协议)和UDP(User Datagram Protocol 用户数据包协议)。由于IP为尽力而为的传输,不保证可靠性,所以传输层负责传输过程中的一些可靠性服务。
应用层:应用层接口。
其中相邻层之间是服务和被服务的关系,即下层为上层提供接口和服务。在发送数据时,只需要从上层往下层传播,对数据依次包装,到目的地后,由下层往上层依次解包装提供数据,同层之间相互交流。如下图所示:

和OSI模型对应关系
其中OSI模型是国际标准化组织(ISO)七层网络模型,由于当时网络已将发展起来了,业界中四层模型已将市场基本占满故七层模型最终没有推广起来。其中对应关系如下:这里认为视频有点问题,其中传输层应该仅和7层中的4传输层对应、应用层应该和7层中的5,6,7层(会话层、表示层和应用层)相对应、网络层和3层网络层对应以及数据链路层和1,2层(物理层和数据链路层)相对应,具体如下图:

数据链路层和网络层的配合
在传输过程中,经过各个路由器节点,其中大部分都是数据链路层和网络层在配合。具体流程如下图:

从一个路由器接受到数据包之后,将其数据链路层拆解,拿到其中网络层的信息,随后根据路由转发决定下一个去哪,包装其数据链路层,发送到下一个路由器。
IP协议的特殊性
意识到在所有层中网络层时最特殊的,所有网络服务必须经过IP协议,原因是其他层都有不同的协议,而网络层仅有IP协议,如下图所示:

网络层 IP协议
IP协议概述
IP协议属于网络层,需要承接传输层送过来的数据,在其加上IP头部,送到数据链路层。
IP协议为何设计的如此简单?
在上述中我们提到IP协议是不可靠的(不保证全部送达,不保证按序送达),尽力而为(仅在必要时才丢弃)的服务,但也说过,IP协议是所有网络必须遵守的协议,那么为什么IP协议要设计的这么简单?原因如下;
- 简单,简洁,和最小化:为了使网络更快、更简洁和更低的成本去维护网络。有观点认为只有当IP协议越简单最终网络也会越简洁、快、可靠和低成本。(感觉和数学/物理的某些观点吻合,物理在总结规律时,往往以简洁为终极目标。)
- 端到端原则:在可能的情况下,尽可能在端侧实现更多的特性。传输层就是在端到端实现传输控制,相比于在“过程”中实现特性,在端侧实现显然会更容易和可维护。(毕竟如果在“过程”中实现的话就要保证网络中的所有路由器都要支持该功能,这显然不是一个好主意)
- 允许上层实现不同程度的可靠性服务。这个的意思是很多服务完全没必要可靠,例如视频通话,当丢包时,人们往往期待下一帧的画面而不是重传当前丢失帧的画面。所以可以理解为将“传输可靠”作为一种选择保留供上层去选择实现。(TCP和UDP)
IP协议提供的功能
在尽可能简洁的情况下,网络设计师也尽可能使IP协议提供极可能多的功能,如下:
- 尝试阻止数据包在网络中死循环。IP添加的字段中有TTL(生存时间)字段,该字段每经历路由器的一跳就少1,当值为0时,路由器会认为该数据包在网络中陷入死循环,将其丢弃。
- 当数据包过长时,为了下层数据链路层的兼容(例如以太网要求数据长度最大不能超过1500字节),IP会将数据包分开,进行分组转发。
- IP数据报头部字段有检验和,检验IP头部在传输过程中是否出错,出错则直接丢弃。尽可能的减少错误数据包在网络中流通。
- 允许不同版本IP协议共存,IPv4和IPv6。由于IPv4已经耗尽,目前正在逐渐向IPv6过渡。
- IP协议在IP数据头有一些保留位,供新的功能开发。
IPv4数据头格式
不需要记住详细的记字段位置,了解有哪些字段以及他们的作用即可。

- Source IP Address 源IP地址和Destination IP Address 目的IP地址。
- Protocol ID表示的是传输层的协议号,当数据包送到目的主机后,该主机的网络层在解析数据包时根据此ID号决定给哪个传输层,常见的TCP:6和UDP:17。
- Time to Live TTL生存时间和Checksun检验和上文提到过。
- Version指示当前字段是IPv4:4还是IPv6:6。
- Total Packet Length 数据包总长度,包括IP头和数据段,最大长度2^16 = 64KB.
- Packet ID、Flags和Fragment Offset这些字段在数据包分组时起到作用,具体后面会详细讲解。
- Header Length表示IP头的长度(IP头的长度非固定,是可选的),Type of Service表示当前数据包选的服务(紧急/非紧急)。
- 剩下的OPTIONS 则表示保留字段,可选可不选。PAD则表示IP数据头部分必须是4字节对齐,不足补0.
分组交换
基本概述
IP的数据包是一个自包含的数据,它本身就携带了到达目的地所必须的信息,不需要额外的信息去帮助指示。所以如果将IP数据包分组,那么路由完全可以不在乎一组数据包的情况,而是只关注单个数据包的发送情况即可。
两个优点
- 只需关注单个数据包的传输,而不需关心同组数据包的传输情况。
- 可以充分利用网络资源,提高并发和共享效率。并发指的是多个数据包同时在不同路由器上转发,共享指的网络资源统计复用,每个用户根据其他用户的使用情况,都会获得资源的统计份额。例如只有一个用户在网络上时,该用户独享网络传输资源,当多个用户在网络上时,这些用户均分网络资源。
路由跳转
每个路由器上都有一个路由转发表,上面记录了什么IP地址跳转下一个路由器的地址。
传输层 TCP协议
三次握手
TCP在端和端初次建立连接时会经历三次握手,分别是
- Client向Server发送的Synchronize同步消息,“SYN”报文。
- Server向Client发送的Synchronize and Acknowledge响应同步消息即承认客户的同步,“SYN ACK”报文。
- 最后是Client向Server发送的Acknowledge通过确认服务器的同步消息,客户发送同步回应,“ACK”报文。

实例:

在以上图片中,可以发现49,51,52是一个“三握手”,192.168.0.106:56388和128.148.32.12:80建立了连接,54,56,57,是一个“三握手”,55,59,60是一个“三握手”。这里发现浏览器和服务器建立了三个连接,原因是当浏览页面时浏览器往往会建立多个连接并行传输数据加快加载速度。这里再58可以发现是一个GET请求,用的应该是端口56389寄第二个连接,这点在61回应能看到。
封装原则的应用
虚拟网卡具体工作流程
VPN主要采用隧道技术,即通信双方通过密钥对通信内容进行加密,实现通信的私密性。也用于内网资源访问。这里主要讲解SSL/TLS类的VPN虚拟网卡的工作原理。接下来介绍一下步骤:
- 和VPN客户端连接,当客户端启动后,本机首先在公网上和VPN客户端(本机知道VPN客户端地址)建立连接。除了标准的TCP/UDP连接外,还需要进行SSL/TLS握手,在这期间两者协商好密钥,方便后续加密需求。
- 创建虚拟网卡。和VPN客户端成功握手后,VPN客户端会在操作系统内核中创建一个虚拟网卡TUN(隧道模式);这个网卡会被分配一个ip地址,地址来源于VPN服务器内部地址池;例如物理网卡IP是 192.168.1.100(家庭网络),而虚拟网卡tun被分配为10.8.0.5(公司内网地址)。
- 修改操作系统路由表。VPN客户端修改操作系统路由表,使得通往内网(公司)的流量通过虚拟网卡tun0发送,如下图所示: 
- 数据包捕获和封装。当应用程序试图访问公司资源时(10.1.2.3),操作系统根据目标IP在路由表中查找,发现应该去往tun0处,于是将数据包的源IP生成为10.8.0.1,目标ip生成为10.1.2.3,送往虚拟网卡处。虚拟网卡以送过来的数据包为载荷,先使用之前协商好的密钥对载荷进行加密,再添加新的传输层和网络层。这里添加新的传输层和网络层的目的是通过公网的隧道和VPN服务器进行通信。具体过程如下图所示: 1.[ 原始IP头 | 原始TCP头 | HTTP请求数据 ]源: 10.8.0.10 (你的VPN IP)目标: 10.1.2.3 (公司服务器) 2.# VPN客户端执行: 加密载荷 = 加密([原始IP头 | 原始TCP头 | HTTP请求数据], 会话密钥) 3.[ 新TCP/UDP头 | 加密载荷 ]源端口: 52431 (随机高端口)目标端口: 1194 (VPN服务器端口) 4.[ 新IP头 | 新TCP头 | 加密载荷 ]源: 192.168.1.100 (你的物理IP,家庭网络)目标: 203.0.113.1 (VPN服务器公网IP)
- 服务器端解密和转发。虚拟网卡对数据包进行封装后转发至真实物理网卡处,通过公网发送到VPN服务器端。服务器拿到数据包后拆解其新IP头和新TCP头,拿到加密载荷,通过之前协商的密钥进行解密,随后直接转发即可(这里只考虑到网络层,载荷加密前就已经是完整的网络层数据包了)。由于VPN服务器端在内网内部,所以能够正确转发该数据包。返回的数据包也按照此流程原路返回(在最开始时,服务器端给本机的虚拟网卡分配了IP地址,所以当返回的数据包来到服务器端时,解析目的IP地址结合自己的地址映射表,得知本机的公网IP,转发回去的数据包)。
虚拟网卡和代理的区别
系统代理模式没有虚拟网卡,两者的具体区别在于在代理模式下,代理模式下,代理服务器相当于一个中间人,本机只是将想要访问资源的信息发送给代理服务器,代理服务器需要解析应用层的信息,然后替你去干这个事情。而虚拟网卡则是无情的转发机器,原因便是虚拟网卡的存在,本机已经处理好了传输层、IP层相关事务,到VPN客户端时,它并不需要额外服务,无情转发即可。
我自己用的是Clash Verge,其中也有系统代理和虚拟网卡模式供我选择,如下:

这两者还有一个区别在于系统代理,它只监督你浏览器的特定端口,某些流量会绕过代理,直接发送(例如用VScode下载国外的包时),没有强制性。而我这里的虚拟网卡具有强制性如下图,它强制接管系统所有流量(通过修改路由表,迫使所有流量来到虚拟网卡处),随后可以进行配置,选择全局(即所有流量都通过VPN服务器端发送)、规则(特定流量通过VPN服务器端,其余流量还是本机物理网卡发送)。通过虚拟网卡模式,在Vscode处的项目连接github或者下载国外的包就方便多了。

