计算机网络
常见的网络协议
网络接口层
- 数据帧的封装/解封装(添加/移除MAC地址)
- 物理寻址(MAC地址)
- 错误检测(如CRC校验)
- 数据链路控制(如以太网、PPP协议)
网络层
IP:定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。目前 IP 协议主要分为两种,一种是 IPv4,另一种是较新的 IPv6
ARP:解决的是网络层地址和链路层地址之间的转换问题
ICMP:用于传输网络状态和错误消息的协议,常用于网络诊断和故障排除,ping工具
NAT、OSPF、RIP、BGP
传输层
TCP UDP 端口寻址、流量控制、拥塞控制、数据分段
应用层
HTTP SMTP POP3 FTP(基于TCP协议)SSH(基于TCP协议)DNS(基于UDP协议)
Ping命令原理
- DNS 解析(如果目标是域名)
- 如果
ping
的目标是域名(如www.example.com
),系统会先通过 DNS 查询 获取其 IP 地址。 - 如果目标是 IP 地址(如
ping 8.8.8.8
),则跳过 DNS 解析。
- 如果
- 构造 ICMP Echo Request
- 操作系统生成一个 ICMP Echo Request 报文,填充目标 IP 地址、标识符、序列号等。
- 发送 ICMP 报文
- 通过 IP 层 封装 ICMP 报文,并通过 网络接口 发送出去。
- 等待 ICMP Echo Reply
- 目标主机收到 ICMP Echo Request 后,如果可达,会返回 ICMP Echo Reply。
- 如果目标主机不可达(如宕机、防火墙阻止 ICMP),则不会返回响应。
- 计算 RTT 并显示结果
DNS的流程
DNS是为了通过域名获取IP地址
- 检查本地缓存
- 向本地DNS服务器发起查询(递归查询)
- 如果本地DNS服务器没有,向根域名服务器发送迭代查询
- 本地 DNS 服务器将 IP 地址返回给客户端(浏览器),并缓存该记录(以便下次查询更快)
递归查询 和 迭代查询,它们的核心区别在于 查询责任 和 查询过程 的不同,DNS 服务器 只返回它能提供的最佳答案,不保证能查到;客户端(或本地 DNS 服务器)向 DNS 服务器发起请求,要求 直接返回最终结果(IP 地址)
输入URL到打开网页全流程
- 在浏览器中输入指定网页的 URL
- 浏览器通过 DNS 协议,获取域名对应的 IP 地址
- 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求
- 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容
- 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器
- 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示
- 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求
拥塞控制
- 慢启动:每当接收到一个ACK确认包,cwnd值就会增加。具体来说,cwnd在每个RTT(Round-Trip Time)内呈指数级增长,直到达到一个阈值(ssthresh),进入拥塞避免阶段;
- 拥塞避免:当cwnd达到ssthresh时,窗口增长由指数级转为线性增长,每个RTT内cwnd增加一个MSS;
- 快速重传:如果发送方连续收到三个相同的ACK确认包,意味着可能有一个数据包丢失,发送方将立即重传该丢失的数据包,而不需要等待超时;
- 快速恢复:在收到三个重复ACK后,cwnd将减半,而不是重置为1 MSS,并进入拥塞避免阶段,而不是重新进入慢启动。
滑动窗口&停止等待协议
滑动窗口:允许发送方在未收到确认(ACK)的情况下连续发送多个数据包,从而提高网络传输效率,同时避免接收方缓冲区溢出。
发送窗口:发送方可以发送但尚未确认的数据范围
接收窗口:接收方当前可用的缓冲区空间,用于告知发送方还能接收多少数据
停止等待协议:每发一个数据包,必须等待 ACK,效率低。
TCP 和 UDP 的区别
- TCP面向连接,UDP是无连接的,即发送数据之前不需要建立连接
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达,UDP尽最大努力交付,即不保 证可靠交付
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的 UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
- TCP首部开销20字节,UDP的首部开销小,只有8个字节
- TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP如何实现可靠传输
确认、重传、流量控制、拥塞控制
确认:接收方收到数据后,向发送方发送ACK,ACK号表示笑一个期望收到的字节序号
重传:发送方没有收到ACK或者收到三次重复的ACK,认为数据丢失,重传;(超时重传和快速重传)
流量控制:接收方通过 TCP 头部窗口字段告知发送方剩余缓冲区大小
拥塞控制
http过程,和https区别
TLS握手(加密通信)
一个局域网A和B两个主机文件传输
A和B之间不知道对方的IP
- 主机A通过广播或组播发送一个请求消息(例如包含文件名或唯一标识符),询问是否有主机B愿意接收文件。
- 主机B监听广播/组播消息,收到后回复自己的IP地址给主机A。
- 主机A和主机B建立直接连接(如通过TCP/UDP)传输文件
一个数据包完整的传输过程
数据包传输的完整过程
应用层:定义应用程序如何通信(如 HTTP、HTTPS、FTP、DNS)
HTTP/HTTPS:如果你访问网页,浏览器会通过 HTTP(明文)或 HTTPS(加密)发送请求。
DNS:如果访问域名(如 example.com
),需要先通过 DNS 查询获取 IP 地址。
传输层:提供端到端的通信,确保数据可靠传输(或快速传输)。
协议示例:TCP(传输控制协议):面向连接,可靠传输(如网页、文件下载),UDP(用户数据报协议):无连接,适用于实时应用(如视频流、在线游戏)。
网络层:负责数据包的路由和寻址(IP 地址)
IP:IPv4 或 IPv6,负责数据包的寻址和路由。
ICMP:用于网络诊断(如 ping
)。
数据链路层:在相邻节点间传输数据帧,处理 MAC 地址,ARP,将 IP 地址解析为 MAC 地址。
物理层:通过物理介质(如电缆、光纤、无线电波)传输比特流。
三次握手&四次挥手
利用linux下的natstate可以看tcp的状态
- 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认;
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入SYN_RECV状态;
- 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手
SYN携带序列号完成客户端和服务端数据包排号的同步
断开一个 TCP 连接则需要“四次挥手”,缺一不可
- 第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务端的数据传送。然后客户端进入 FIN-WAIT-1 状态。
- 第二次挥手:服务端收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。
- 第三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
- 第四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待2MSL后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了
在TCP四次挥手中,主动关闭方(如客户端)发送最后一个
FIN
后,会进入TIME_WAIT
状态,并等待对方的ACK
确认,如果对方未收到ACK
(例如ACK丢失),对方会重传FIN
。此时若主动关闭方已关闭连接,将无法响应重传的FIN
,导致对方无法正常关闭,等待2MSL的时间足够让重传的FIN
到达
子网划分/子网掩码
需要留出网络位和广播位
IO多路复用
- 传统阻塞IO:每个连接一个线程/进程,资源消耗大
- IO多路复用:一个线程监听多个IO事件(如socket可读、可写),减少线程/进程数量,提高并发能力
http对称加密
- HTTP
- 明文传输:数据以普通文本形式传输,容易被窃听、篡改或中间人攻击(如劫持流量、注入恶意内容)。
- 无加密:敏感信息(如密码、支付信息)直接暴露在传输过程中。
- HTTPS
- 加密传输:通过 SSL/TLS 协议对数据进行加密,即使被截获也无法直接读取内容。
- 身份验证:服务器通过数字证书验证身份,防止伪装成合法网站(如钓鱼攻击)
非对称加密速度太慢,堆成加密无法完成密钥交换
通过非对称加密实现身份验证和密钥交换,又保证了传输效率通过对称加密处理实际数据
GET:幂等(可以缓存) POST:非幂等(不可缓存)