网络模型
OSI七层模型
物理层:规定物理介质之间的传输方式,电信号,光信号,建立,维护,断开物理连接。
数据链路层:在物理层的基础上建立数据链路,对数据进行分帧,差错校验,确保数据的可靠传输。有PPP(Point-to-Point协议),高级数据链路控制协议(HDLC High-level-Data-Control)
网络层:解决数据在网络上传输带问题,包括寻址,路由的选择。协议有IP协议,网关协议(ARP),路由协议()
传输层: 提供端到端的可靠传输服务,包括数据的传输控制,流量控制。主要协议有TCP,UDP协议
会话层:提供会话管理功能,负责建立,维护,结束会话。主要协议有NetBIOS,RPC
表示层: 负责数据格式的转化,确保应用层数据格式一致,还有数据的加密解密,如JPEG,MPEG
应用层: 各种程序之间的交互像电子邮箱,文件传输。协议:HTTP,FTP,SMTP,DNS
TCP/IP五层模型
三次握手,四次挥手
三次握手:请求连接→同意连接→确认连接(SYN→SYN+ACK→ACK)。
四次挥手:我没数据了→收到→我也没数据了→确认关闭(FIN+ACK→ACK→FIN+ACK→ACK)
三次握手
确认双方 “收发能力正常”,同步通信序列号,建立可靠的双向连接。
第一次握手(客户端发):客户端发SYN包(同步信号),告诉服务端 “我要连你,我的初始序列号是 X”
第二次握手(服务端回):服务端回SYN+ACK包,告诉客户端 “我收到了,我的初始序列号是 Y,确认你的序列号是 X+1”。
第三次握手(客户端发):客户端回ACK包,告诉服务端 “我收到你的序列号了,确认是 Y+1”
完成后,双方都知道 “对方能收能发”,可以开始传输数据。
四次挥手
双方协商 “没有数据要传输了”,优雅断开连接,避免数据丢失(TCP 是全双工通信,双方要分别确认)
第一次挥手(客户端发):客户端发FIN+ACK包,告诉服务端 “我没有数据要发了,请求关闭我的发送通道”
第二次挥手(服务端回):服务端回ACK包,告诉客户端 “我收到你的关闭请求了,等我处理完剩余数据”
第三次挥手(服务端发):服务端处理完数据后,发FIN+ACK包,告诉客户端 “我也没有数据要发了,请求关闭我的发送通道”。
第四次挥手(客户端回):客户端回ACK包,告诉服务端 “我收到你的关闭请求了,确认关闭”。
ARP协议
ARP(地址解析协议)是TCP/IP协议中网络层核心协议,核心作用是通过ip地址获得设备对应MAC地址。比如我想给局域网内的 192.168.143.196 发数据,你只知道对方的 IP,但不知道对方的 MAC 地址,就通过这个协议来获得对应的MAC地址、
只能工作在局域网,ARP是基于广播的,广播包不能跨越路由器。具有安全风险(ARP欺骗),因为ARP协议是没有身份验证机制的,攻击者可以伪造ARP响应包,篡改其他设备的ARP缓存表,解决方法可以使用路由器IP-MAC绑定,也就是路由器给局域网内所有的设备发一张身份证,只承认自己的绑定列表里面的设备信息,其他的都拒绝掉
工作流程:
发送ARP请求包(广播),询问谁是目标IP,把你的MAC地址告诉我
目标设备回复ARP响应包(单播),自己对比返回对应的MAC地址
更新本地ARP缓存表,有效期一般是2~10分钟,在这个时间通信就不需要发送ARP请求了
RARP协议是知道自己的MAC地址想要知道自己的IP地址,然后就向网络中发送RARP请求,返回自己的ip地址
MAC 地址只能是在一个局域网中,所以我们一般在网上传输的时候,比如给远方的电脑传输数据,我们的目标 ip 地址不会改变,但是传输过程中的 MAC 地址会不断改变,不断查询下一个路由器的MAC地址,直到最后到达目标ip所在的局域网,再通过ARP协议找到该电脑的 MAC地址,完成传输。
DNS协议
DNS(域名系统)是应用层协议,将域名转换为IP地址,DNS 不是一台服务器,而是全球分布式的服务器集群,分为 根服务器→顶级域服务器→权威服务器 三层,避免单点故障。
缓存机制:从浏览器到运营商,各级都会缓存解析结果,加速后续访问(比如你第一次访问 baidu.com 要查根服务器,第二次直接读本地缓存)。
交换机和路由器的区别
交换机只在局域网中工作,只认准MAC地址
路由器工作在互联网,认准ip地址,负责跨网段,不同网络之间传输
TCP如何保证数据传输可靠
数据可靠:数据必须送达,不丢失,不重复,无错误,不乱序
三次握手,四次挥手
校验和:每个报文段都携带校验码,接收方计算,校验码如果错误就丢弃重传
超时重传:若发送方在规定时间内未收到 ACK,立即重发该数据包,解决 “丢包” 问题。
乱序重排与去重:接收方根据序列号,将乱序到达的数据包重新排序,并丢弃重复的数据包(因重传产生)。
流量控制(滑动窗口):接收方通过通告 “接收窗口” 大小,限制发送方的速率,防止接收方缓冲区溢出导致数据丢失(解决 “收方处理不过来”)
拥塞控制(慢启动 / 拥塞避免):发送方根据网络状况动态调整发送速率,避免网络拥堵导致数据包大量丢失(解决 “网络扛不住”)
TCP的粘包和拆包问题
TCP 粘包 / 拆包因 TCP 是流式协议,受 MTU 限制(网络链路有最大传输单元比如以太网 MTU=1500 字节,超过就必须拆包;)、Nagle 算法(TCP 会攒小数据包,凑够一定大小再发,减少网络交互次数)、接收缓冲区等影响,导致发送的数据包被合并(粘包)或拆分(拆包),接收方无法识别包边界。
解决方案核心是给数据包加边界标识:
客户端发送 HTTP 请求时,在请求头里加上 Content-Length: 1024,告诉服务器:“我的请求体一共 1024 字节,你读到这么多就停”,从而计算出边界。
固定长度,按定长切割(简单但浪费空间)
分隔符,用特殊字符标记包结束(灵活但需避免字符冲突)
Http返回状态码 301 和 302 分别是什么意义?
301 永久重定向 资源永久迁移到新地址,原地址不再使用,浏览器会缓存重定向结果,下次直接访问新地址。301 是会被浏览器永久缓存的!如果不手动清除缓存会一直存在的。
302 Found 临时重定向 资源暂时在新地址,未来可能恢复原地址 浏览器不缓存重定向,每次都要先访问原地址再跳转;
长度前缀(最常用),先传数据长度再传内容,按长度解析。比如说约定:【4 字节长度】+【实际数据】,每次就先读取四个字节长度再去读实际数据
IPv4版本协议
该协议属于网络层,两大作用:编址:给设备一个全球唯一的 IP 地址 路由:让数据包经过路由器,跨网段、跨运营商送达目的地
一个 IP 必须拆成两部分,路由器只看网络位,网络位:你在哪个小区(网段),主机位:你家几楼几号
比如IP:192.168.1.100,子网掩码(就是告诉路由器或者电脑哪个是网络位,哪里是主机位,有255的都是网络位,比如我这个例子):255.255.255.0 其中 255.255.255 = 网络位 (前三段) 0 = 主机位(最后一段)路由器只关心:是不是 192.168.1.0 这个小区,然后最后的由网关或者交换机送到具体的设备上
NAT:出门翻译:把你电脑的私网 IP(比如 10.103.52.61),替换成公网 IP(比如 221.235.63.166),让数据包能在互联网上跑。回家翻译:把互联网回来的数据包,再从公网 IP 翻译回你的私网 IP,精准送到你电脑上
公网ip是全球唯一的,比如IPv4版本能分配42亿个公网ip,但是还是不够,于是就有了私网ip,比如我们的电脑手机,对外发送消息的时候,先使用DNS解析域名,获得目标的ip地址,然后通过网关+NAT技术转换到公网ip,通过公网ip在路由器上传递,然后接受到数据再原路返回。其中一个公网ip大约能有6万个左右的私网ip,每一个设备发送的时候就分配一个端口。
TCP的队头阻塞
TCP数据传输,会把数据拆成有序数据包,接收端按照顺序拼接成原始数据,但是如果中间有一个包没有传输到达,就会导致后面所有包都被堵住。
HTTP/1 有HTTP对头阻塞问题,请求只能一个个的发送,前面一个请求没有完成,下一个请求就不能发送。
HTTP/2 采用多路复用技术,解决了HTTP的对头阻塞问题,但是还是会有TCP队头阻塞
除了对头阻塞,TCP协议还有中间设备僵化即路由器 / 防火墙对 TCP 逻辑固化,很难升级新特性的问题
QUIC协议
QUIC = 可靠版 UDP + 内置 TLS 1.3 + 无阻塞多路复用 + 极速握手 + 连接迁移。
TLS 是传输层的安全协议,防止网络数据被窃听,篡改,冒充。
彻底解决队头阻塞:流级隔离,每一个请求都有自己的流,如果没有包丢了,只会卡住当前的流,其他的正常;乱序确认: TCP签收包必须从小到大签收,小的包没有收到就等待,但是QUIC协议采用乱序签收。
签收就是告诉发送方我收到了这个包,像TCP协议一定要按从小到大接受,那么如果中间缺少了2号包,哪怕接收到了3,4号包也不会签收,也只会告诉发送方我只收到了1号包。
Cookie,Session,Token的区别是什么(用进餐厅吃饭举例子)
Cookie存在于浏览器,走进餐厅,服务员给我一个纸条,我是3号,把这个纸条揣兜里,每次我喊服务员,把这个纸条给他看。也就是存储在浏览器的信息每次随着请求发送给服务器,只存储少量信息
Session = 餐厅前台的【会员登记本】,当我进入餐厅会给我一个卡号,然后把我的信息登录在前台的本子上,也就是服务器里面,每次都出示我的卡号展示我的信息,我客户端只用存储一个SessionId就可以
Token = 一张加密的【终身通行证】,存在于客户端,不用查本子,服务器不存任何信息,拿到token直接解密认证
在浏览器输入www.taobao.com回车之后发生了什么
URL解析,对URL进行自动编码,然后检查长度,之后根据URL查询浏览器是否缓存该界面
进行DNS查询,寻找ip地址。先查浏览器自己的小本本(浏览器缓存),再查电脑系统的地址本(hosts),再查家里路由器的地址本(路由器缓存),再查运营商的大地址本(ISP 缓存),最后实在找不到,就去问根域名服务器(全球总地址本),最终拿到:www.taobao.com 对应的 IP 地址(比如:123.123.123.123)
TCP 三次握手(建立连接)
报文封装 & 发送。类比:你写了一封信(HTTP 请求),要寄给淘宝:先套上「TCP 信封」,再套上「IP 信封」,最后套上「以太网信封」,然后通过家里的网关、路由器,一步步把信送到淘宝服务器手里
Nginx 负载均衡(淘宝的前台小姐姐),淘宝大厦有很多办公室(服务器),前台小姐姐(Nginx)看到你来了,就按顺序把你分配到空闲的办公室。请求先到淘宝的 Nginx 服务器(相当于前台),Nginx 用「轮询」算法(挨个来),把请求转发给后面的服务器,同时会带上你的真实 IP,方便后面知道是谁在访问
Servlet 容器接收请求(办公室前台),容器拆开 HTTP 请求,解析出:你要访问哪个页面、带了什么参数、用了什么浏览器,然后把请求交给 Spring MVC 框架处理
DispatcherServlet 分配任务(办公室主管),办公室主管(DispatcherServlet)看了你的请求,说:“哦,你要逛首页,去找首页 Controller;你要查订单,去找订单 Controller。”
根据你访问的路径(比如 /home 或 /cart),找到对应的拦截器和控制器(Controller)
Controller 执行业务逻辑,调用 Service 层去查
生成页面(组装展示内容),Controller 返回 ModelAndView(数据 + 页面模板),ViewResolver 解析后,生成最终的 HTML 视图,渲染成完整的响应报文,准备发回给你
浏览器接收响应,你收到淘宝寄回来的信,先看信封上的状态码(比如 200 = 成功,404 = 找不到),然后拆开信,把内容解码、缓存起来。
浏览器渲染页面,浏览器把 HTML、CSS、JS 渲染成你看到的彩色页面。
正向代理和反向代理
客户端(你)主动找代理,代理帮你访问目标服务器。正向代理是替客户端发起请求,隐藏用户真实 IP,常用于FQ、内网出网、上网审计
反向代理:用户不知道真实服务器,只访问代理,然后代理向后端服务器进行分发
什么是跨域访问问题,如何解决?
只要 协议 / 域名 / 端口 有一个不一样,就叫「跨域」,浏览器直接拦截请求。同源 = 三个全都一样:协议(http /https),域名(localhost / baidu.com),端口(8080 / 3000)
一个域就像是一个家,A家里面的不允许去B家里面拿东西,浏览器会直接拒绝访问,但是后端能随便去前端拿数据,因为浏览器管不着
要想解决跨域问题:后端自己打开门,使用@CrossOrigin(origins = "*")注释,也就是CORS机制,后端自己打开大门,让别人来拿
使用Nginx反向代理,前端和后端,全部伪装成一家人
xxx.主域名.com → 都是二级域名,不同二级域名,默认严格跨域,跨域本质看:浏览器认不认 “同一个站”,只认完整域名,不认主域名一家人。
CDN是啥
CDN = 全世界遍地开的「静态文件缓存仓库」,专门帮你加速加载图片、JS、CSS、视频。
就像很多连锁店除了总部还开了分店,我们拿东西去分店拿而不是直接去总部
CDN 就是把图片视频这些静态文件,提前放到全国各地,用户就近访问,打开网页飞快,还能保护源服务器。
什么是DNS污染?DNS劫持?
DNS劫持:比如我问DNS百度的ip是多少,正常会返回给你正确的ip,但是如果被DNS劫持就会返回给一个错误的ip地址,跳转到一个钓鱼网站
DNS污染:DNS返回的是正确的ip地址,但是中途这个正确的ip地址被修改了,导致也是拿到一个错误的ip
什么是“墙” ?
是一种网络屏蔽机制,防止用户访问特定资源
第一个手段:ip封锁,直接把一些ip拉进黑名单,当你要访问的时候,网关路由器直接丢弃这个数据包
第二个手段:DNS污染,返回给你错误的 ip地址,结果访问到别的服务器去了
Http报文有哪些部分?
请求报文
请求行: 请求方法(Get,Put,Post) URL Http版本 CRLF结尾
请求头部:由多个键值对组成,格式:首部字段名: 值 CRLF , 它是客户端和服务器之间的附加约定信息
Host:必带字段,指定请求的目标主机域名 / 端口,服务器用它区分同一个 IP 上的多个网站
Authorization:携带身份凭证(如 Token、密码),用来做登录 / 权限
Content-Type:告诉服务器「请求体的数据是什么格式」(只有 POST/PUT 带 Body 时才用)
Accept:告诉服务器「我能接受什么格式的响应」,服务器会优先返回匹配的格式
实体主体(Request Body)可选部分,GET 请求通常没有 Body,POST/PUT 等请求用来传数据(如 JSON、表单)
响应报文
状态行(Status Line),格式:版本 状态码 短语 CRLF
响应首部行(Response Headers),格式和请求头一致,也是 字段名: 值 CRLF
实体主体(Response Body)服务器返回的实际数据,如 HTML 页面、JSON 结果、图片二进制数据等
Http的 502 和 504 有什么区别
502 Bad Gateway 网关收到了上游服务器的无效 / 非法响应 上游服务器有回复,但回复的东西不对
504 Gateway Timeout 网关等了很久,上游服务器没给任何响应 上游服务器完全没回复,超时了
Socket 和WebSocket 的区别
Socket 不是协议,而是操作系统给网络编程提供的一套接口(API),它是对 TCP/IP 协议栈的封装。你可以把它理解成:Socket = IP 地址 + 端口 + 协议(TCP/UDP)
WebSocket 是 HTML5 推出的一种应用层通信协议,它的核心目标是解决 HTTP 协议「无状态、短连接」的痛点。HTTP 的问题:每次请求都要建立连接、传输、断开,无法实现服务器主动向客户端推送消息(比如聊天、实时通知、弹幕)。WebSocket 的解决方式:先通过 HTTP 握手建立连接(升级协议),连接建立后,变成一条持久的 TCP 长连接,客户端和服务器可以双向实时通信,直到一方主动断开。
各个端口对应的服务
Get 和 Post 请求有什么不同?
传参方式:GET 参数拼接在 URL 中,有长度限制;POST 参数放在请求体里,适合传大量或敏感数据。GET 请求的长度限制,业界通用说法就是 2KB 左右(约 2048 个字符),不同浏览器和服务器的上限略有差异,大多在 2KB~8KB 之间。
幂等与安全:GET 是幂等的,多次请求不改变服务器状态;POST 非幂等,可能影响服务器数据。GET 安全性较低,POST 相对更安全。
缓存机制:GET 请求默认会被浏览器缓存,POST 默认不缓存。它们的设计用途也不同,GET 主要用于查询,POST 主要用于提交数据。
Http 1.0 和 Http 1.1 和 Http 2.0有什么区别
HTTP/1.0:早期版本,简单但低效
无状态:服务器不保存任何请求信息,每次请求都是独立的。
默认短连接:每次请求 / 响应完成后,TCP 连接就会被立刻关闭。
要访问一个带图片的网页,浏览器要反复:建立 TCP 连接 → 请求 → 关闭连接,效率极低。
可以通过 Connection: keep-alive 强制开启长连接,但不是默认行为。
HTTP/1.1:1.0 的重大优化,现在仍广泛使用
默认持久连接(Keep-Alive)一个 TCP 连接上,可以连续发送多个请求 / 响应,不用每次都重新握手。大幅减少了 TCP 连接开销,页面加载速度明显提升。
支持流水线处理(Pipeline)客户端可以在前一个请求的响应到达之前,就发送下一个请求。但有个致命缺陷:队头阻塞(Head-of-line blocking)。解释:请求是排队发送的,但响应必须按顺序返回。如果前面的请求卡住了,后面的所有请求都会被堵住。
HTTP/2.0:彻底解决性能瓶颈,现代标准
二进制协议:x 是文本格式,解析效率低;2.0 用二进制帧传输,解析更快、更紧凑。
多路复用(Multiplexing),一个 TCP 连接上,可以同时并行处理多个请求 / 响应。,彻底解决了「队头阻塞」问题,哪个请求先处理完,哪个响应就先回来,互不影响。
头部压缩(HPACK),HTTP 请求头里有大量重复信息(比如 Cookie、User-Agent)。2.0 用专用算法压缩头部,大幅减少冗余数据传输,降低带宽消耗。
服务器推送(Server Push)服务器可以主动向客户端推送资源(比如提前推送网页需要的 CSS/JS),不用客户端再一个个请求,进一步提升加载速度。
Http 长连接是什么
HTTP 长连接是指客户端和服务器完成一次请求后,TCP 连接不会立即断开,而是保留复用,减少了频繁建立 / 关闭连接的开销。
开启方式上,HTTP/1.0 需要通过 Connection: keep-alive 手动开启,而 HTTP/1.1 默认就是长连接。
连接超时主要分两层:
应用层:服务器配置的 keepalive_timeout,连接闲置超时会主动关闭;
TCP 层:通过内核的 tcp_keepalive 机制,定期发探测包,超时无回应就丢弃连接。
Http 和 Https 的区别在哪?
HTTPS 是 HTTP 的安全增强版,它在 HTTP 的基础上加入了 SSL/TLS 协议,对传输数据进行加密。
两者的主要区别有:
安全性:HTTP 是明文传输,数据易被窃听和篡改;HTTPS 基于 SSL/TLS 加密传输,能有效防窃听、防篡改、防冒充。
端口不同:HTTP 默认使用 80 端口,HTTPS 默认使用 443 端口。
证书要求:HTTPS 需要服务器安装 SSL 证书,而 HTTP 不需要。
性能开销:HTTPS 因为加密解密操作,会比 HTTP 有一定性能开销。
Https 加密它用了非对称加密 + 对称加密的组合方式:
握手阶段(非对称加密):客户端和服务器通过服务器的公钥,安全协商出一个「会话密钥」。
传输阶段(对称加密):之后所有数据都用这个会话密钥进行加密 / 解密,效率高。
Https 是怎么建立连接的?
HTTPS 建立连接,就是客户端和服务器先通过非对称加密安全地协商出一个「会话密钥」,然后后面所有数据都用这个「会话密钥」做对称加密传输,既安全又高效。
用「寄快递」比喻整个流程我们把客户端比作「你」,服务器比作「银行」,数据比作「重要信件」,公钥是「银行的公开保险箱」,私钥是「银行的专属钥匙」。
① 客户端向服务器发起请求就像你先给银行打电话:“我要给你寄重要信件,咱们安全沟通一下?”
② 服务器返回数字证书(带公钥)银行给你寄了一个公开保险箱(公钥),附带了一份由权威机构盖章的「银行身份证书」,证明这个保险箱确实是银行的,不是骗子伪造的。
③ 客户端验证证书 + 加密随机码。你先核对证书:检查权威机构的盖章是否有效,确认这个保险箱真的是银行的,不是仿冒的。确认安全后,你自己生成一个随机密码(会话密钥),把它锁进银行给你的公开保险箱里,寄回给银行。(这个过程只有银行的专属钥匙能打开,别人拿到也没用)
④ 服务器用私钥解密得到会话密钥银行收到保险箱,用自己的 ** 专属钥匙(私钥)** 打开,拿到了你生成的随机密码。现在,只有你和银行两个人知道这个密码。
⑤ 双方用会话密钥加密通信接下来,你和银行之间所有的信件,都用这个随机密码加锁 / 解锁。你寄信时,用密码锁上;银行收到用密码打开。银行回信时,也用同一个密码锁上,你收到再用密码打开。就算中途信件被别人截走,没有这个随机密码,也完全打不开,只能看到一堆乱码。通信结束后,这个随机密码就会被销毁,下次沟通再重新生成新的密码,彻底杜绝泄露风险。
为什么要验证证书?防止中间人攻击。如果骗子伪造了一个假的公钥给你,你用它加密的会话密钥就会被骗子拿到,通信就被窃听了。验证证书就是为了确认公钥确实来自目标服务器。
为什么不直接用非对称加密传数据?非对称加密(公钥私钥)非常慢,不适合传大量数据。所以只用来协商出一个会话密钥,后面都用对称加密(快很多)。
为什么 Http 是无状态的?
HTTP 协议是无状态的,意思是服务器不会保留任何客户端请求的历史信息,每个请求都是独立的,处理当前请求时不依赖之前的请求。
这种设计让服务器实现简单、处理高效,但无法直接记录用户的上下文状态,比如登录态、购物车。因此实际开发中,我们会通过 Cookie、Session 或 Token 等机制来维持会话状态。
posted @
2026-01-07 10:58
Huangyien
阅读(
62 )
评论()
收藏
举报