计算机网络学习笔记
01 应用层
应用层功能
在应用进程之间传递报文(网络中交换和传输的数据单元),实现特定类型的数据交互,去执行特定的功能
HTTP 协议
超文本传输协议 负责发布和接收 HTML 页面和其他 Web 资源( Web 通信)。底层通信通过 TCP 协议实现,默认端口号 80
资源定位
HTTP 协议通过 URL 访问资源,URL 即 WEB 内容访问标识符,是一种具体的 URI (标识、定位任何资源的字符串),不仅唯一标识资源,而且提供定位该资源的信息
通用格式:
协议://IP地址或域名:端口号/文件路径?参数
http://localhost:443/student?id&name=mrjoker
连接方式
- HTTP/1.0
默认使用短连接:访问页面时,客户端和服务器之间每次 HTTP 操作都会单独使用一次 TCP 连接,传输完毕后自动关闭,客户端和服务器之间会建立多个 HTTP 会话,开销较大
- HTTP/1.1
默认使用长连接:访问页面时,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,直到 HTML 页面调用所有 web 资源传输完毕
长连接会在 HTTP 响应头标注:Connection:keep-alive
但 HTTP/1.1 时串行化处理所有 web 资源请求,一旦有请求无法正常加载,后续请求会被阻塞
- HTTP/2
增加了多路复用功能:让所有数据流共用一个连接。接收到客户端 HTTP 请求后,服务器会一次把所有需要的 web 资源打包发送。
- 即使有请求无法正常加载,也不会影响处理其他 web 资源请求
- TCP 连接在刚开始发送数据时会限制连接最大速度,集中发送能有效利用 TCP 连接
请求类型
HTTP 有四种常用类型:
- GET:请求服务器数据,请求参数直接附在 URL 上,不够安全,仅适用简单公开数据的请求和提交
- POST:向服务器提交数据,数据以表单形式提交,内容长度无上限,不会被浏览器记录
- PUT:修改服务器数据,慎用
- DELETE:删除服务器数据,慎用
HTTP 协议在正式通信前,可能发出 OPTION 请求:询问服务器当前网页所在域名是否在服务器许可名单中,以及可以使用哪些 HTTP 动词和头信息字段,只有得到肯定答复,浏览器才会发出正式的 XMLHttpRequest 请求,否则就会报错
主机识别
HTTP 协议是无状态协议,本身不保存请求和响应之间的通信状态
通信过后服务器将无法互相识别客户端,必须引入其他方式让服务器记录客户端信息
Session & Cookie
负责记录对方主机信息,HTTP 通信中相互识别,cookie 保存在客户端,session 保存在服务器端
- 客户端初次访问服务器,服务端自动创建 session 用来识别标识用户,然后在响应头 Set-Cookie 项向客户端返回 session ID
- 客户端再次访问服务器,在请求头 Cookie 项向服务器发送 session ID,服务器根据 ID 查询 Session 就可以识别用户
用户和通信详细信息通常记录在 session 中,cookie 中只保存 session ID,以避免信息泄漏,如果客户端 cookie 被禁用,需要利用 URL 重写把 session ID 直接附加在 URL 路径上
Token
token 和 session ID 功能相同,都用来在 HTTP 通信中识别用户,过期刷新:
- session ID 由服务器随机生成,保存在服务器 session 中,再次访问只需要直接对比,确认客户端身份
- token 由服务器根据用户 ID 和时间戳经过特定算法生成,服务器不保存,再次访问服务器要再次计算
cookie 本身不安全,浏览器中 token 除放在 cookie 外,可以放到 localStorage 存储。浏览器发送请求时,自动携带 session ID,发送 token 需要手动在代码中设置,由于浏览器加载 image 标签中地址会发送 session ID
因此使用 token 有效防止 CSRF 攻击
localStorage 和 sessionStorage 区别:localStorage 生命周期永久,要用户手动清除,否则永远存在,sessionStorage 生命周期时当前窗口或标签页,一旦窗口或标签页永久关闭,数据清空
HTTPS 协议
HTTP 协议用明文在互联网传输数据,易被黑客监听和截获,引入 HTTPS 协议,默认 443 端口
HTTPS 协议在应用层下加 SSL 层,使用 TLS 协议加密和解密数据包,在互联网传送数据会加密
加密方式
- 建立连接后数据采用对称加密:加密密钥和解密密钥一样
- 建立连接时协商密钥采用非对称加密:加和解密钥不同,两个密钥互相解密对方加密内容
服务器公开一个非对称加密密钥(公钥),保留一个对称加密密钥(私钥)
证书认证
服务器公钥由机构认证,CA把私钥加密服务器公钥和相应信息,生成数字证书,在客户端向 CA 查询时把证书发送给客户端核对
CA 根证书(含公钥)存储在用户浏览器中,访问网址自动比对服务器公钥
- 客户端向服务器发送信息,请求连接,说明算法,给出随机数 A
- 服务器端向客户端发送信息,同意连接,确认算法,给出证书和随机数 B
- 客户端向 CA 核对证书,确认得到公钥
建立连接
- 客户端向服务端发送公钥加密信息,给出随机数 C
- 服务器通过私钥解密信息,对信息 Hash 得到数字签名,向客户端发送私钥加密信息,返回数字签名
- 客户端通过公钥加密信息,核对数字签名,确认服务器收到随机数 C
双方按照对称加密方法,使用三个随机数生成的密钥进行数据交互
02 传输层
传输层功能
将应用层报文封装导传输层中,使用 TCP 或 UDP 协议建立两个主机进程之间端对端通信
传输层会自动对上层数据进行分用和复用:不同应用层报文封装成同一个传输层报文中传输,到达后拆分报文交付给应用层各个进程中。通信双方根据套接字(IP地址 + 端口号)相互识别
UDP协议
UDP 提供不可靠但高效,无连接服务
- 在传送数据之前不需要建立连接,远地主机收到 UDP 报文也不需要给任何确认,只检测报文检验和,出现错误直接丢弃
- 一般用于即时通信,语音,视频,直播
TCP协议
TCP 提供可靠,面向连接的服务
- 在传送数据之前必须先建立连接,数据传送结束后释放连接,传输过程中校验数据返回确认,保证可靠性
- 一般用于文件传输,发送接收邮箱,远程登录等场景
TCP连接
建立连接
建立TCP协议采用三次握手策略:SYN 时 TCP/IP 建立连接时用的握手信号,接收者到后以 ACK 信号响应
- 客户端向服务端 发送带有 SYN 标志的数据包 ,客户端请求连接
- 服务端向客户端 发送带有 STN/ACK 标志的数据包,客户端可以正常发送消息
- 客户端向服务端 发送带有 ACK 标志的数据包,服务端可以正常发送消息,建立连接
断开连接
断开 TCP 连接采用四次挥手,FIN 是TCP/IP 断开连接时使用的终止信号,接收者到后以 ACK 信号响应
- 客户端向服务端 发送带有 FIN 标志的数据包 客户端请求终止
- 服务端向客户端 发送带有 ACK 标志数据包 客户端不再发送消息,连接半关闭
- 服务端向客户端 发送带有 FIN 标志的数据包 服务端请求终止
- 客户端向服务端 发送带有 ACK 标志的数据包 服务端不再发送消息 连接关闭
TCP 可靠传输
编号和校验和`
编号
发送方将应用报文分割成 TCP 报文段,为每一个报文段进行编号,由接收方对数据包进行排序,把有序数据传送到数据层,如果收到重复报文段,直接丢弃
校验和
发送方计算 TCP 报文段全部数据检验和,保存在报文段首部,由接收方对数据包数据进行检验
如果收到错误报文段,丢弃报文段,返回错误消息等待重发
IP 协议校验和只校验首部, TCP 协议校验全部数据。
ARQ 协议
(自动重传请求)发送方发送报文段后,会等待接收方 ACK。如果接收到错误消息或等待超时,将重发这个报文段。用来实现可靠传输。
现在一般使用连续 ARQ 协议:维持一个发送窗口,可以连续发送出去多个报文段而不需要等待对方确认。接收方对按序到达的最后一个报文段发送确认,即表明之前的所有报文段都已经正确收到。提高信道利用率。
如果发送方连续发送了 5 条消息,其中 3 号消息丢失。接收方只会对前两个消息发送确认。发送方必须对后三条消息全部重传。
流量控制和阻塞控制
- 流量控制:减少数据发送,防止接收方过载导致数据无法处理。
- 拥塞控制: 减少数据发送,防止网络阻塞导致数据无法到达。
发送方允许连续发送的分组上限受以上两个因素制约,即 发送窗口 = min (接收窗口, 阻塞窗口)
。
- 接收窗口大小由 接收方返回的确认报文中的窗口字段设定。
- 拥塞窗口大小根据网络的拥塞程度动态变化,TCP 拥塞窗口变化采取了慢开始、拥塞避免、快重传 和 快恢复 四种策略。
03 网络层
网络层功能
路由器为中继系统连接不同结构网络,统一使用 IP 协议进行相互通信
传输层报文在网络层将被封装成IP 数据进行分组转发,路由器根据 IP 地址选择转发路由
路由选择协议
路由器通过查询路由表选择转发路由,当路由信息发生变化时,就需要路由器根绝路由选择协议动态更新路由表。
为方便选择转发路由,我们将互联网分为多个自治系统,在自治系统内可包含多个局域网。一个自治系统内所有网络一般都属于同一个行政单位,全部路由器在自治系统内都是联通的。
路由选择协议
路由器通过查询路由表选择转发路由,当路由信息发生变化时,就需要路由器根绝路由选择协议动态更新路由表。
为方便选择转发路由,我们将互联网分为多个自治系统,在自治系统内可包含多个局域网。一个自治系统内所有网络一般都属于同一个行政单位,全部路由器在自治系统内都是联通的。
域间路由
负责在自治系统之间选择路由传递 IP 数据报。
- BGP 协议
应用层协议,基于 TCP 实现。只负责选择一条尽可能好的路径,将 IP 数据报传达到目标自治系统内。
域内路由
负责在自治系统内选择路由传递 IP 数据报。
- RIP 协议
应用层协议,基于 UDP 实现。相邻路由器之间会定时交换全部路由表信息。路由器会根据到达目的地址的最少跳数(经过路由器数量)来选择最短路由,更新自己的路由表信息。
使用简单方便。但最大跳数只支持 15(16 表示不可达),不适用于大型互联网。且会出现 “坏消息传得慢” 现象。
- OSPF 协议
网络层协议,使用 IP 数据报传输。
- 相邻路由器之间会定时交互以确保对方可达(问候分组)。
- 路由器刚开始工作时,会和相邻路由器交换路由信息(数据库描述分组),缺少数据时向相邻路由器索要(链路状态请求分组)。
- 当链路状态发生变化时,路由器会向区域内的全部路由器发送路由表信息(链路状态更新分组),路由器收到后返回确认(链路状态确认分组)。
IP 协议
IP 协议是网络层核心协议,负责定义 IP 数据报的数据格式和传输规则,IP 协议无连接且不可靠,目前使用 IP
协议版本 IPv4
IP 数据报
IP 数据报由首部和数据两部分组成。
首部长度为 20 + 4N 字节,含有以下字段:
- 版本:4
- 首部长度 :(4 bit) 单位 4B ,首部最大长度为 60 字节。
- 总长度:(16 bit) 单位 1B ,IP 数据报最大长度为 65535 字节。
- 标识:(16 bit) 分片后的 IP 数据报使用同一个标识,以便组装。
- 标志:(3 bit) 标志是否允许分片,以及是否是第一个分片。
- 片偏移:(13 bit) 单位 8B ,标识分组分片后的偏移量,以便组装。
- 首部校验和:(16 bit)
- 生存时间 TTL:(8 bit) IP 数据报剩余寿命,每次转发后自减。
- 协议:(8 bit) 使用的上层协议,即数据报到达后交付者。1/ICMP 2/IGMP 6/TCP 17/UDP
- 源地址:(32 bit)
- 目的地址:(32 bit)
为什么分片:IP 数据报最大 65535 字节,但以太网帧限制为 1500 字节。
IP 地址
在 IPv4 协议使用 32bit 的 IP 地址标识主机。IP 地址由网络号和主机号两部分组成,分为以下几种类型:
- A 类地址 (1-126):8bit 网络号 + 24bit 主机号
- B 类地址 (128-191):16bit 网络号 + 16bit 主机号
- C 类地址 (192-223):24bit 网络号 + 8bit 主机号
- D 类地址 (224-239):多播地址
特殊地址
0.0.0.0
和127.0.0.0
表示当前主机255.255.255.255
表示当前网络的广播地址- 主机号全为 0 表示 指定网络本身: 例如
202.98.174.0
- 主机号全为 1 表示 指定网络的广播地址:例如
202.98.174.255
子网编码
为节省 IP 地址,IP 协议对网络内部进行了再划分,使一个网络号内部可以存储多个子网。IP 地址实际由网络号、子网号和主机号三部分组成。
在传输 IP 地址时,我们同样会发送 32bit 的子网掩码(前面全为 1 后面全为 0)来区分子网和主机。例如 IP 地址 136.34.5.56
的子网掩码为 255.255.255.0
,那么子网号就是 136.34.5.0
.
网址转换 NAT
为节省 IP 地址,IP 协议允许专用网络内部采用私有 IP 地址标识主机,整个专用网络共享一个公用 IP 地址。
多个本地主机在公网共用一个 IP 地址,必须通过端口号来相互区分。公网 IP 地址/端口号和私有 IP 地址/端口号的对应关系保存在负责连接内外网的 NAT 路由器中,在转发 IP 数据报时会自动读取传输层报文并进行 NAT 转换:
- SNAT 本地主机向公网发送请求时,NAT 路由器转发时会修改源地址和端口号,切换为公有。
- DNAT 公网向本地主机发送请求时,NAT 路由器转发时会修改目的地址和端口号,切换为私有。
为此 IP 协议划分出了专用的私有地址供专用网络内部使用,在公网中指向私有地址的 IP 数据报不会被转发。
- A 类私有地址 (10):例如
10.98.174.0
- B 类私有地址 (172.16-172.31):例如
172.16.0.1
- C 类私有地址 (192.168):例如
192.168.0.1
IPv6
最新版本的 IP 协议 IPv6 可以从根本上解决 IP 地址短缺问题,改用 128 bit 的全新 IP 地址标识主机。
辅助协议
ARP 协议
网络层协议,负责映射 IP 地址和 MAC 地址。
主机会维护一个映射表记录同网络各主机 IP 地址和 MAC 地址的映射关系,通过查询映射表在网路内部转发 IP 分组。如果未记录则在局域网内部广播 ARP 请求,由目的主机返回其 IP 地址和 MAC 地址的映射关系。
DHCP 协议
基于 UDP 的传输层协议,为网络中的主机分配 IP 地址。
- 主机启动时在网络内部广播 DHCP 发现消息:申请分配 IP 地址。
- 网络内部的 DHCP 服务器接收到消息后广播 DHCP 提供消息:提供可分配的 IP 地址。
- 主机接收到消息后广播广播 DHCP 请求消息:接受 IP 地址。
- 网络内部的 DHCP 服务器接收到消息后广播 DHCP 确认消息:分配 IP 地址。
ICMP 协议
网络层协议,负责报告差错和异常情况,也可以用于询问(ping 指令)。
当 IP 数据报传输出现异常时,会生成 ICMP 报文封装为 IP 数据报发回源主机报告异常情况。
- 数据分片后,只会对第一个分片的 IP 数据报报告差错。
- 封装 ICMP 报文的 IP 数据报出错后不会报告差错,防止 ICMP 报文泛滥。
- 组播 IP 数据报出现异常不会报告差错。
策略可以有效防止 Smurf 攻击:攻击者在网络散播错误源地址的 Ping 请求,导致大量机器向源地址返回 ping 回复使源地址主机瘫痪。
ICMP 报文的前 32 bit 信息是固定的,为 类型/编号/数据校验和。
04 网络接口层
网络接口层功能
数据链路层
将网络层交下来的 IP 数据报组装成帧,根据 MAC 地址建立网络中两个相邻节点间的点对点传输。
同时也会对传输帧进行基本的差错检测。如果发现差错数据链路层会直接丢弃出错的帧,以避免继续传输浪费网络资源。部分算法也可以对帧进行简单的纠错。
物理层
屏蔽具体传输设备的差异,实现相邻计算机节点之间比特流的透明传送。
介质访问控制
在局域网内,通常使用广播通信。可能会出现多个主机信号争用广播信道的情况。
信道划分
将广播信道按时间或空间划分,分配给多个信号使用。
- 频分复用
将物理信道的总带宽分割成多个子信道通信。如果通过光纤传输则叫做波分复用。
- 时分复用
将物理信道分割成多个时间片,轮流分配给多个信号使用。
- 码分复用
依靠编码将信号混合,既共享了时间又共享了空间。
随机访问
- CSMA/CD 协议
先听后发,边听边发。冲突停发,随机重发。
适用于网络状态良好的有线网络
- CSMA/CA 协议
发前广播,避免碰撞。
适用于网络状态不佳的无线网络
轮询访问
- 令牌传递协议
环形网络,交替传递令牌。持有令牌的主机才被允许在信道上传递信号。
适用于负载非常高的网络信道。