计网速通基础
网络互联模型

OSI:上应用,下物理,中传输,表示会话,网络链路
关于数据包的封装过程:除了在数据链路层需要再数据头尾都要添加信息,其他层只需要添加头信息。
MAC地址
6字节,例:11-22-33-44-55-66
前3字节厂商表示是谁,后三字节由厂商自定义
使用ARP协议(数据链路层),由源主机进行广播,包中目标地址为 FF-FF-FF-FF-FF-FF,目标主机通过包中的目标 IP 信息确认是否回复,回复带有自己的 MAC 地址并将源主机 MAC 地址记录在 MAC 表中。回复也是 ARP 包但不再是广播。
网络线缆
双绞线:
全双工
同种设备用交叉线,不同设备用直通线。
双绞线线序:
A 绿,B 橙。
T568A - 绿蓝橙棕
T568B - 橙蓝绿棕
白色在前,3 5 (线)交换(位置)
同轴电缆:
半双工,非重点
ICMP 协议
网络层
用于 ping 命令
集线器
工作在物理层,单纯的转发数据,会将收到的数据包从其他的端口广播出去。
网桥
两个口,会记住左右口存在哪些 MAC 地址,初步的避免了广播风暴。
交换机
二层交换机:
集线器 + 网桥,具备给每个网口记录 MAC 地址的能力,会在使用的过程中逐步将网口与 MAC 地址一一对应。
所连接的设备仍然在同一网段,仍然没有完全避免广播风暴。
路由器
具备跨网段能力,可通过设置 IP 地址链接多个网段,同时隔绝每个网段的广播。
作为网关可以将一个网段的数据包转发到另外一个网段中。
路由:
当出现非直连网段(也就是该网段不是接在本路由器上而是通过另外一台路由器连接本路由器时)需要使用静态路由、动态路由。
静态路由:管理员手动添加
网络配置目标网络的网络 IP。
子网掩码默认。
下一跳设置与目标网络连接的路由器地址
单独某台主机的专属路由表:设置子网掩码全1
多网段路由表:参考超网做法
默认路由器:网络地址和子网掩码全0
动态路由:
路由选择协议(RIP、OSPF等)自动获取路由信息。
IP地址
IPv4:32bit(4字节),已经耗尽(并非)。
IPv6:128bit(16字节),你倒是拿货出来用啊。
默认IPv4:
32bit 分为4段,每段用十进制表示,用”.”分割。
两部分组成:网络标识,主机标识
通过 IP 地址 & 子网掩码可判断是否在同一网段。(实际上,是通过目标主机 IP 与上子网掩码来判断是否处于同一网段的)
A类地址:网络ID 0 开头,占用 8 bit。 1 ~ 126 内网:10.0.0.0 ~ 10.255.255.255
B类地址: 网络ID 10 开头,占用 16 bit。 128 ~ 191 内网:172.16.0.0.0 ~ 172.31.255.255
C类地址:网络ID 110 开头,占用 24 bit。 192 ~ 224 内网:192.168.0.0 ~ 192.168.255.25
子网掩码:
用来节约 IP 地址的利用,可以隔绝广播。
每划分 2^n 网段,就要从主机位占用 n 个 bit 。
变长子网划分:就是在同网段的基础上采用不同的子网掩码,再通过 IP 地址可以确认其主机所在的网段长度。
每多一个网段都会损失两个可用网络地址。
超网:
将默认子网掩码向左移动一位,可以使处于连续(网络会以二进制0结尾开始) IP 地址的网段合并(如192.168.0.0 和192.168.1.0)。
数据包的传输过程
在跨网段数据包的传输过程中,只有 MAC 地址会发生变化,而 IP 地址始终保持不变。
ISP
Internet 服务提供商,电信联通这些。
我们的宽带都是通过 ISP 连接到的 Internet。
NAT
用于私网 - 公网 - 私网这一路线。
会在私网边界设备上替换包中的源 IP 地址为设备的公网 IP。
静态转换:
手动配置 NAT 映射表,私网 IP 映射公网 IP 一一对应。
一对一转换
动态转换:
定义外部地址池,动态随机转换
一对一转换
PAT:
日常使用
多对一
采用端口多路复用,通过端口号标识不同的数据流
通过设置私网IP:端口 + 公网IP:端口的形式转换表。
如果端口冲突会使用随机端口,但会记录转换关系。
在实际使用中我们会考虑 CGNAT(运营商级NAT)
其会维护数百个公网 IP 与端口号对应的映射表,为了溯源,会为每个用户分配固定的端口号范围。
而 NAT 表会使用一种叫五元组复用的手段:
1 | |
通过目标 IP 来实现端口的复用
网络分层

IP 数据包结构

版本:
0b0100:IPv4
0b0110:IPv6
首部长度:
二进制乘以4才是最终长度。(20 ~ 60)
总长度:
占 16 bit
首部+数据的长度之和,最大值是65535
由于帧的数据不能超过1500字节,所以过大的 IP 数据需要分片。
每一片都有自己的网络层首部。
标识:
占16 bit
当数据包过大而进行分片时,同一个数据包的所有片的标识都是一样的。
片偏移:
占13 bit
乘以8:字节偏移
标志:
标识是否分片。
位1保留
位2为1表示不允许分片
位3为1表示不是最后一片

传输层

TCP:传输控制协议
UDP:用户数据报协议
UDP数据格式:

首部仅有8个字节,TCP 首部至少20个字节。
UDP长度:占 16 bit ,首部长度+数据的长度
TCP:

数据偏移:
占4 bit ,取值范围0x0101 ~ 0x1111
乘以4:首部长度(20字节 ~ 60字节)
标志位:
URG=1,当前报文紧急指针有效。
ACK=1,确认号字段才有效果。
RST=1,标明连接出现严重差错,必须释放连接然后重新建立。
SYN=1、ACK=0,标明这是一个建立连接的请求。
SYN=1、ACK=0,同意建立连接。
ACK=1,完成确认连接。
FIN=1,数据发送完毕,要求释放连接。
序号:
4 字节,用来确认这是哪次发的一组包。
实际上该值会是一个4字节大数,如果遇见多次数据包同属于一个组合,可以通过简单的减法来确认是否真的是同一个组合。
确认号:
4字节,期望对方下一次发送的包。
窗口:
2字节,流量控制,告知窗口大小
选项部分:
SACK:可选重发
可靠传输:(连续)ARQ+滑动窗口协议
流量控制:
通过设置窗口接收回复大小来调整数据包发生的流量大小
拥塞控制:
慢启动、拥塞避免、快速重传、快速恢复
连接管理:
建立连接:
三次握手
C:SYN=1,ACK=0
S:SYN=1,ACK=1
C:SYN=0,ACK=1
这个时候会确定随机序号 seq 的初始值
确定窗口大小和,一些额外协议如SACK(处于可选字段)。
释放连接:
C:FIN=1,ACK=1
S:ACK=1
S:FIN=1,ACK=1
C:ACK=1
如果遇见某方强制端口会出现RST的包,此时仍然可以正常关闭连接
常见端口

DNS
域名系统
可以使用 UDP 也可以使用 TCP
53 号端口
请求过程:
在所有的 DNS 服务器中都有根域名服务器的地址。
在本地 DNS 没有解析数据的时候会向根服务器发送解析请求。
根服务器收到请求后会告知对应下属 DNS 服务器的地址来进一步解析。
下属服务器会继续告知下属服务器的地址继续请求解析。
这样知道找到对应的记录为止。
DHCP
动态主机配置协议
基于 UDP
客户端是 68 端口,服务器是 67 端口。
分配过程:
DISCOVER:发现服务器
客户端发广播包(源 IP:0.0.0.0,目标 IP:255.255.255.255,目标MAC:FF-FF-FF-FF-FF-FF
OFFER:提供租约
服务器返回可以租用的 IP 地址,以及租期、子网掩码、网关、DNS。
可能存在多个 DHCP 服务器提供租约
REQUEST:选择 IP 地址
客户端选择一个 OFFER,发送广播包进行回应。
ACKNOWLEDGE:确认
被选中的服务器发送ACK数据包确认
DHCP 可以镜像跨网段分配,需要使用 DHCP 中继代理。
自动续约:
客户端在租期不足时自动向 DHCP 服务器发送 REQUEST 信息申请续租。
HTTP
超文本传输协议
使用 TCP 协议
使用 URL 来标记具体的资源。就是网址。
HTML
超文本标记语言,编写网页用的。
版本:
HTTP/0.9
只支持 GET 请求,不支持请求头响应头。
HTTP/1.0
支持 POTS、HEAD等请求方法,支持请求头、响应头,支持更多数据类型。
每次请求完成后都马上断开 TCP 连接。
HTTP/1.1(最经典、使用最广泛)
支持 PUT、DELETE 等请求方法
采用持久 TCP 连接,多个请求共用一个 TCP 连接。
HTTP的标准:
RFC(请求意见稿)
提出修改 HTTP 的意见,需要权威审核。
报文格式:


ABNF:一直描述响应头的语言
请求方法:
GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH
GET:常用于读取操作,参数直接怕拼接在 URL 后面(长度有限制)
POST:常用于添加、修改、删除,放在请求体中(长度无限制)
HEAD:请求得到于 GET 相同的响应,但没有响应体
比如可以下载一个大文件之前,先获取其大小。
OPTIONS:获取服务器支持的请求方法
PUT:对已存在的资源进行覆盖
PATCH:对资源进行修改(不存在则创建)
DELDTE:用于删除指定资源
TRACE:请求服务器回显其收到的请求信息,用于测试
CONNECT:创建沟通隧道,用于 HTTPS
头部字段:
请求头字段:有关要获取的资源或客户端本身消息的消息头
响应头字段:有关响应的补充消息,比如服务器本身的信息
实体头字段:有关实体主体的更多信息,比如主体长度或 MIME 类型
通用头字段:同时适用请求和响应消息,但与消息主体无关的消息头
请求头字段:



响应头:



状态码
信息响应:100 ~ 199
成功响应:200 ~ 299
重定向:300 ~ 399
客户端错误:400 ~ 499
服务器错误:500 ~ 599
常见:
100 Continue
请求的初始部分服务器已经收到,并且服务器没有拒绝,客户端应该继续发送剩余的请求,如果客户端以及发送完成,那么就忽略这个请求
200 OK
请求成功
302 Found
请求的资源被暂时的移动到了由 Location 头部指定的 URL 上。
304 Not Modifiee
说明无需再次传输请求的内容,也就是说可以使用缓存的内容
400 Bad Request
语法无效,服务器无法理解该请求
401 Unauthorized
由于缺乏目标资源要求的身份验证凭据
403 Forbidden
服务器有能力处理该请求,但是拒绝授权访问
404 Not Found
服务器端无法找到所请求的资源
405 Mehod Not Allowed
服务器禁止了当前的 HTTP 请求方法
406 Not Acceptable
服务器端无法提供与 Accept-Charset 以及 Accept-Language 指定的值相匹配的响应
408 Request Timeout
服务器想要将没有在使用的连接关闭
500 Internal Server Error
所请求的服务器遇到意外的情况并阻止请求
501 Not Impemented
请求的方法不被服务器支持,因此无法被处理
服务器必须支持 GET 和 HEAD
502 Bad Gateway
作为网关或代理角色的服务器,从上游服务器中接受到的响应是无效的
503 Service Unavailable
服务器尚未处于可以接受请求的状态
form提交
action:请求的 URL
method:请求方法(GET、POST)
enctype:POST 请求时,请求体的编码方式
application/x-www-form-urlencoded(默认值)
用 & 分隔参数,用 = 分隔键和值,字符用 URL 编码方式进行编码
multipart/form-data
文件上传时必须使用这种编码方式
跨域
常见与前后端分离的情况
比如前端需要访问后端的数据,而此时双方处于不同服务器上
此时需要后端专门设置Access-Conterol-Allow-Origin来允许跨域访问资源
Cookie
在客户端存储一些数据,硬盘中
关闭时会被销毁,但是可被延长寿命
Session
在服务器存储一些数据,内存中
默认存在 30 分钟
代理服务器
本身不生产内容
处于中间位置转发上下游的请求和响应
正向代理:代理的对象是客户端
多个客户端通过代理访问一个服务器
隐藏客户端身份
绕过防火墙
Internet 访问控制
数据过滤
反向代理:代理的对象是服务器
多个客户端通过代理访问多个服务器
隐藏服务器的身份
安全防护
负载均衡
代理服务器 - 相应的头部字段
Via:追加经过的每台代理服务器的主机名(或域名)
X-Forwarded-For:追加请求方的的 IP 地址
X-Real-IP:客户端的真实 IP 地址
CDN
内容分发网络
利用最靠近每位用户的服务器
更快跟可靠的将音乐、图片视频等资源文件(一般是静态资源)传递给用户
加密
对称加密
加解密同秘钥
DES
64 bit 明文 -> 56 bit 密钥 -> 64 bit 密文
密钥的长度是 64 bit,但每隔 7 bit 会设置一个用于错误检查的 bit。
3DES
将 DES 重复三次的算法
加密 -> 解密 -> 加密,每次使用不同的密钥
AES
密钥长度有 128、192、256 bit 三种
目前首选的对称加密算法
非对称加密
密钥分为加密密钥、解密密钥两种。
加密密钥:一般是公开的,也被成为公钥
解密密钥:不能公开,也被称为私钥
对应公钥加密的密文,只能用对应的公钥才能解密,反之依然。
混合密码系统
对称密钥缺点:配送不安全
非对称密钥缺点:加密解密速度慢
通过非对称加密解决对称加密的密钥配送问题,这就是混合密码系统
网络上的密码通信所用的 SSL / TLS 都运用了混合密码系统
数字签名
用于确定消息的发送者
将文本进行 sha1 等得到固定长度,然后通过私钥加密,将明文和密文一起发送,对方通过公钥解密后得到和明文一样的 sha1 内容后可验证成功数字签名。
证书
为了解决中间人攻击。
通过第三方机构(CA),事先每个人都有确认且正确的第三方机构公钥
各大浏览器或操作系统已经内置各大 CA 公钥
然后发送方安全的将自己的公钥送至第三方机构,第三方机构对该公钥添加发送方信息后加入数字签名,然后将发送方的公钥连同自己的数字签名发送给接收方
接收方收到证书后进行数字签名验证,成功则使用证书中的公钥与发送方发送数据、
HTTPS
超文本传输安全协议
默认使用 443 端口
HTTPS 是在 HTTP 的基础上使用 SSL/TLS 来加密报文,用于防范窃听和中间人攻击
TLS:
传输层安全协议
前身是 SSL(安全套接字)
目前最新的是 TLS 1.3
工作在应用层和传输层之间
OpenSSL
这是 SSL/TLS 协议的开源实现
生成私钥:openssl genrsa -out name.key
生成公钥:openssl ras -in name.key -pubout -out name.pem
通信过程:
TCP 三次握手
TLS 的连接
HTTP 的请求和响应
TLS 1.2:

1 Client Hello
TLS 的版本号
支持的加密组件(加密算法和密钥长度)列表
一个随机数
2 Server Hello
TLS 的版本号
从客户端中选择的加密套件
一个随机数
3 Certificate
服务器的公钥证书
4 Server Key Exchange
用以实现 ECDHE 算法(一种密钥交换算法)的其中一个参数 (Server Params)
为了防止伪造,Server Params 经过了服务器私钥签名
5 Server Hello Done
服务器协商结束
6 Client Key Exchange
实现 ECDHE 算法的另一个参数(Client Params)
更具 Server Params、Client Params计算出一个新的随机密钥串 Pre-master secret
通过这三个随机数生成一个主密钥
再通过主密钥衍生出其他密钥
7 Change Cipher Spec
告知服务器之后通信使用会话密钥加密
8 Finshed
包含连接至今全部报文的整体校验值(摘要),加密后发送至服务器
9 Change Cipher Spec
10 Finished
至此,客户端服务器都验证加密解密没问题
让 Wireshark 能解密流量:
设置用户变量 SSLKEYLOGFILE = 文件路径\ssl.log(浏览器会将 KEY 导出到这个文件)
重启系统
在 Wireshark 选择这个文件
编辑 -> 首选项 -> Protocols -> TLS
HTTP 协议的不足(HTTP/1.1)
同一时间,一个连接只能对应一个请求
针对同一个域名,大多数浏览器允许同时并发 6 个连接
只允许客户端主动发起请求
同一次会话的多次请求中,头信息会被重复传输
SPDY:
基于 TPC 的应用层协议,强制使用 SSL/TLS
在底层加入了 SPDY 层,其他所有服务端应用不需要做出修改
这就是后来的 HTTP/2
HTTP/2:
与 HTTP/1.1 兼容
特性:
使用二进制格式传输,将头信息变成头帧,消息体变成消息体帧
采用分块 + 多路复用的方式传输
在同一个 TCP 是完成双向数据流传输
存在帧头表示当前帧的大小和所属包
优先极和依赖关系:可以需要先被发送的资源部分
头部压缩:如果流 1 和流 2 头部信息大部分相同,那么只会发送流 2 不同的部分
服务器推送:服务器自动分析客户端可能的资源需求,主动发送可能需要的资源
问题:
队头阻塞:如果存在关键帧丢失,则会干扰后续的帧处理
握手延迟:还是得经历三次握手
为了解决这些问题,出现了 QUIC,也就是 HTTP/3 的基础。
HTTP/3:
基于 UDP 网络
使用 QUIC 来解决 UDP 传输不可靠的问题
特性:
连接迁移:
通过 Connection ID(连接ID)来标识一个连接
即使 IP 或者端口发生变化,只有 Connection ID 没有变化,那么连接仍然可以维持
比如:
将移动数据切换到 Wi-Fi 时,仍然能维持进行中的下载
问题:
与以前的版本相比,需要更多的 CPU 资源消耗量
暂时没有得到操作系统的内核级优化比起 TCP
对比图:

ARP
地址解析协议
通过 IP 地址获取 MAC 地址
RARP
逆地址解析协议
使用与 ARP 相同的报头结构
将 MAC 地址转换为 IP 地址
后来被 BOOTP、DHCP取代
ICMP
互联网控制消息协议
通常用于返回错误信息
WebSocket
HTTP 的特点就是通信只能由客户端发起。所以推送只能通过轮询来实现
为了节省轮询的资源,HTML5 出现了 WebSocket
其允许任意一方主动发起连接。
其与 HTTP 属于平级关系,都是应用层协议
WebSocket 使用 80(ws://)、443(wss://)
与 HTTP 不同的是,WebSocket 需要先建立应用层连接。而 HTTP 只需要传输层连接
建立连接:
首先需要借助 HTTP 协议来建立连接(也叫握手)
在头字段中首先需要:
Connection 设置为 Upgrade
表示客户端希望连接升级
Upgrade 必须设置 webscoket
表示希望升级到 WebSocket 协议
Sec-WebSocker-Version
表示支持的 Websocket 版本
Sec-WebSocket-Key 是客户端随机生成的字符串
服务器会将客户端的 Sec-WebSocket-Key 进行一定操作在返回给客户端
这样可以避免普通 HTTP 请求被误认为 WebSocket 协议
WebService
Web服务,是一种跨编程语言和跨操作系统平台的远程调用技术标准
比如:
天气预报、手机归属地查询、航班查询、物流查询
SOAP:
简单对象访问协议
HTTP + XML
WSDL:
Web服务描述语言
一个 XML 文档,用于描述 WebService 接口的细节
一般在 WebService 的 URL 后面跟上 ?wsdl 获取 WSDL 信息
HTTPDNS
通过 HTTP 协议向 DNS 服务器发送域名解析协议请求
避免基于 DNS 协议向运营商 Local DNS 发起解析请求的传统方式
避免 Local DNS 造成的域名劫持和跨网访问的问题
常用与移动互联网中
FTP
文件传输协议
格式:ftp://[user[:password]@]host[:port]/url-path
存在主动和被动模式
需要两个连接,数据连接和控制连接
主动模式:
服务器默认开启 21 号传输命令 20 号传输数据
被动模式:
服务器默认开启 21 号传输命令,但是随机开启一个端口传输数据
SMTP
简单邮件传输协议
基于 TCP
默认使用 25 号端口,SSL/TLS 使用 465 号端口
用于发送邮件
POP
邮局协议
基于 TCP
默认使用 110 端口,SSL/TLS 使用 995 端口
用于接收协议
VPN
虚拟私人网络
在公共网络上建立专用网络,进行加密通讯
与代理的区别:
需要安全专属的 VPN 客户端软件
而代理不需要
实现原理:
隧道协议:
PPTP:点对点隧道协议
L2TP:第二层隧道协议
IPsec:互联网安全协议
SSL VPN
网络爬虫
模拟人类行为使用浏览器,对页面做相关操作
常用:Python 的 Scrapy 框架
缓存
通常会缓存的情况是:GET 请求 + 静态资源
Ctrl + F5:可以强制刷新缓存
缓存 - 响应头
Cache-Control:设置缓存策略
- no-storage:不缓存数据到本地
- public:运行用户、代理服务器缓存数据到本地
- max-age:缓存的有效时间,单位秒
- no-cache:每次需要向服务器询问缓存是否有变化,再来决定如何使用缓存
Last-Modified:资源最后一次修改时间
ETag:资源的唯一标识(根据文件内容计算出来的摘要值)
if-None-Match:
如果上一次的响应头中有 ETag,就会将 ETag 的值作为请求头的值
如果服务器发现资源的最新摘要值与 if-None-Match 不匹配,就会返回最新的资源
否则返回 304
if-Modified-Since
如果上一次的响应头中没有 ETag,有 Last-Modified,就会将 Last-Modified 的值作为请求头的资源
如果时间晚于服务器文件时间则不修改,反之则反。
缓存使用流程:

IPv6
网际协议第 6 版
解决 IPv4 不足的问题
采用 128 bit,共 8 组,每组使用 : 隔开,使用 16 进制表示。
每组前面的 0 可以省略
2001:0db8:02de:0000:0000:0000:0000:0e13 == 2001:db8:2de:0:0:0:0:e13
可以使用双冒号取代一组 0 或者多组 0 ,但是只能出现一次:
2001:db8:2de:0:0:0:0:e13 == 2001:db8:2de::e13
::1 是本地回环地址(0:0:0:0:0:0:0:1)
首部格式:

只有 40 字节的固定首部
Version:版本号,占 4 bit
Traffic Class:交通类别,占 8 bit
标识数据包的类别或优先级,帮助路由器判断该包是否应该被丢弃
Payload Length:有效负载长度,占 16 bit
包括扩展头部、上传(传输层)数据的长度
Hop Limit:IPv4 TTL概念相同
Flow Label:流标签,占 20 bit
指示数据包属于哪个指定序列(流)
用数据包的源地址、目的地址、流标签标识一个流
扩展头部:
通过 Next Header 指针说明下一个头部的内容,占 8 bit
即时通讯
简称 IM,比如常见与 QQ、微信
常用协议:XMPP、MQTT、自定义协议