计算机网络知识点
概览
OSI 七层模型:应用层、表示层、会话层、传输层、网罗层、数据链路层、物理层
TCP/IP 四层模型:应用层、传输层、网络层、网络接口层
-
应用层,直接服务于用户。唯一运行在用户态的层:HTTP、FTP、Telnet、DNS、SMTP、DHCP
-
传输层,应用层的技术支持。应用层数据超过 MSS 会将其切分成 TCP 段,传输层报文中包括了端口号,用于区分报文属于哪个应用:TCP、UDP
-
网络层,负责数据在网络中的传输,即寻址和路由。超过 MTU 会切分,IP地址代表网络号和主机号:IP、ARP、ICMP
-
传输层,关注链路级别的传输
应用数据转换到传输块的过程:
访问网站的过程
- 解析 URL
- DNS 查询服务器 IP 地址(本地域名服务器->根域名服务器->顶级域名服务器)
- 操作系统协议栈,包括传输层和网络层协议实现
- TCP 建立连接(SYN_SEND、SYN_RECE、ESTABLISHED)
- 基于端口的 TCP 可靠传输
- 基于地址的 IP 定位传输
- 头部加上发送和接收方的 MAC 头部,ARP 查找接收端的 MAC
- 网卡,帧校验符
- 交换机,以太网设备,基于 MAC 地址表转发,没有缓存就广播
- 路由器,和网卡类似,各个端口都具有 MAC 和 IP。通过路由表确定要到目的地 IP 需要走哪个端口,并替换帧的源、目标 MAC
在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的(前提:没有使用 NAT 网络的),一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输
校验过程:MAC 地址、IP 地址、序列号、端口
- TCP 四次挥手(FIN_WAIT_1、FIN_RECE、FIN_WAIR_2、LAST_ACK)
Linux 实现数据包收发
发送
NAPI 机制:不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序,然后 poll 的方法来轮询数据
DMA 技术:将网络包写入到指定的内存地址,接着网卡向 CPU 发起硬件中断,当 CPU 收到硬件中断请求后,根据中断表,调用已经注册的中断处理函数
硬中断先把收到的数据存在内存中,暂时屏蔽 CPU 中断,后续软中断统一处理先前的数据
接收
- 将用户待发送的数据从用户态拷贝到内核态 sk_buff 内存,并将其加入到发送缓冲区;
- 克隆一份 sk_buff 的副本,用于网络层传输,传输层保留原始 sk_buff 直到接收到 ACK,以保证可靠传输;
- 当 IP 层发现数据包大于 MTU 时,会申请额外的 sk_buff,并将原来的数据包拆分成多个小的 sk_buff;
应用层 HTTP
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」
字段
- Content-Length:HTTP 协议,通过设置回车符、换行符作为 HTTP header 的边界;通过 Content-Length 字段作为 HTTP body 的边界。这两个方式都是为了解决“粘包”的问题。
HTTP 缓存技术:
- 强制缓存,缓存如果没有过期浏览器就直接使用;
- 协商缓存,304状态码,表示直接使用本地已过期的缓存,因为服务器数据未更新
HTTP/1.0
- 无状态;
- 每发起一个请求,都要新建一次 TCP 连接;
HTTP/1.1
- 长连接,复用 TCP 连接
- 基于管道传输,可以同时发出多个请求,而不需要等到收到前一个个请求的响应,再发送下一个请求。解决了请求的对头阻塞问题,但依然存在 HTTP 层的队头阻塞问题。
请求的对头阻塞:前一个请求结束后才能处理下一个请求;
HTTP 层队头阻塞:服务端需要按顺序响应收到的请求,如果服务端处理某个请求消耗的时间比较长,那么只能等响应完这个请求后, 才能处理下一个请求;
TCP 层队头阻塞:一旦发生丢包,就会阻塞住所有的 HTTP 请求;
HTTP/2
- 头部压缩
- 二进制格式数据代替报文
- 并发传输,多个请求复用一个 TCP 连接,解决了HTTP 层的队头阻塞,但依然存在 TCP 层的队头阻塞问题
- 服务端主动推送
- 二进制帧格式传输
HTTP/3
- 提出了 QUIC 传输层协议代替 tcp。QUIC 是基于udp实现的,在无连接的基础上实现了可靠和安全
- 更快的请求多路复用,解决 TCP 层队头阻塞问题
- 建立连接更快
HTTPS
- 在 HTTP 的基础上
- 在三次握手后,还需要 SSL/TLS 的握手过程,使得报文能够加密传输;
- 使用时需要向 CA 申请数字证书,来保证服务器的身份是可信的;
- 加密传输
- 混合加密【机密性,防窃听】:建立连接用非对称加密:数字签名,通过「私钥加密,公钥解密」的方式,来确认消息的身份;传输数据用对称加密:一个密钥,信息传输;
- 摘要算法【完整性,防篡改】:用摘要算法(哈希函数)来计算出内容的哈希值,哈希值是唯一的,且无法通过哈希值推导出内容;
- 数字证书【防冒充】:通过第三方 CA 保证服务器的公钥私钥没有被别人替换过
- 【TLS 握手阶段】RSA算法
- 客户端向服务器索要并验证服务器的公钥
- ClientHello 客 ==> 服:随机数 Client Random、TLS 版本号、密码套件;
- SeverHello 服 ==> 客:随机数 Server Random、TLS 版本号 ACK、使用密码套件 RSA、数字证书;
- 双方协商生产「会话秘钥」
- 客户端回应 客 ==> 服:获取 CA 证书中的服务器公钥确认服务端数字证书、「会话秘钥」加密通信通知、公钥加密随机数 pre-master key;
- 服 ==> 客;三个随机数算出会话密钥,双方都通知对方后续请求都使用会话密钥加密通信;
- 双方采用「会话秘钥」进行加密通信
- 客户端向服务器索要并验证服务器的公钥
传输层 TCP
负责为应用层提供网络支持,实现应用到应用的数据传输
TCP :面向连接的、可靠的、基于字节流的
三次握手
四次挥手【closed_wait;last_ack】
- 首先确认客户端不会再发送请求给服务端
- 然后服务端在发送完数据后,再向客户端发送断开连接
为什么这么设计?因为TCP是双向通信的可靠的协议,需要确保客户端和服务端都有收发数据包的能力;为后续传输做准备:序列号
流量控制、超时重传、拥塞控制
拥塞控制:慢开始(每经过一个传输轮次,拥塞窗口 cwnd 就加倍)、拥塞避免(慢开始门限 ssthresh)、快重传(连续收到三个重复确认就立即重传对方尚未收到的报文段,不等待重传计时器到期)、快恢复
网络层 IP
负责路径传输过程中路径和节点的选择,实现设备到设备的数据传输
寻址能力:网络号+主机号(子网掩码)
路由:数据包每到达一个节点,通过路由算法决定下一步走哪条路径
分片重组:以太网的 MTU(最大传输单元)是 1500 字节。在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS 也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于 MTU 的数据报文
网络协议
DNS:域名解析
NAT:私有网络与公共网络之间转换 IP 地址
ICMP:传输控制信息(不用于传输应用层数据),以帮助管理和维护网络
DHCP:自动为网络中的设备分配 IP 地址及其他网络配置参数,如子网掩码、网关和 DNS 服务器
ARP:下一跳的 MAC 地址
IGMP:组播
命令ip router
查看路由表