第一部分:键入网址到网页显示,期间发生了什么?
这是一道经典的"全链路"面试题。我们不仅要回答基础的网络流程,还要加入架构视角(负载均衡)来提升回答的深度。

1. 基础流程(快递发货)
-
解析 URL:浏览器把网址拆解为"域名"和"路径",确定"要去哪"和"要买什么"。
-
DNS 解析(查地址):
-
浏览器查询本地缓存 -> 本地 DNS 服务器 -> 根/顶级/权威域名服务器(递归查询)。
-
最终拿到目标服务器的 IP 地址。
-
-
TCP 三次握手(打电话确认):
- 客户端与服务器建立可靠连接,确认双方收发能力正常。
-
封装数据包(贴单运输):
-
HTTP:生成请求报文。
-
TCP:切分成 MSS 大小的段。
-
IP:贴上源地址和目的地址(宏观导航)。
-
MAC:通过 ARP 协议获取下一跳设备的 MAC 地址(微观导航,如发给网关)。
-
-
网络传输:数据包经过网卡转为电信号,通过交换机、路由器层层跳跃,最终到达阿里的机房入口。
2. 架构视角(进阶:流量是如何分发的?)
数据包到达机房后,并不是直接丢给某台服务器,而是先经过负载均衡(Load Balance):
-
第一道关(LVS - 四层负载均衡):
- 相当于"门口保安"。只看 IP 和端口,抗负载能力极强,直接把流量甩给后端的 Nginx 集群。
-
第二道关(Nginx - 七层负载均衡):
- 相当于"前台接待"。拆开包看 HTTP URL,根据业务逻辑(如
/user或/order)将请求分发给具体的应用服务器(如 Tomcat)。
- 相当于"前台接待"。拆开包看 HTTP URL,根据业务逻辑(如
3. 最终处理
-
服务器响应:应用服务器处理业务(查库、计算),生成 HTTP 响应,原路返回给客户端。
-
客户端渲染:浏览器拿到 HTML/CSS/JS,解析并绘制出页面展示给用户。
第二部分:GET 和 POST 的本质区别
别背长长的对比表格,面试中只需要抓住这 三个核心差异:
1. 语义不同(最本质)
-
GET :目的是获取 (Read) 资源。就像去餐厅看菜单,对服务器数据没有副作用。
-
POST :目的是提交 (Write) 数据。就像填单子下单,会改变服务器状态(如下订单、改库存)。
2. 参数位置不同
-
GET :参数拼接在 URL 后(如
?id=1)。- 比喻:像明信片,内容写在面上,谁都能看见。
-
POST :参数放在 Request Body 中。
- 比喻:像信封,内容装在里面,相对隐蔽。
3. 幂等性与缓存
-
GET :是幂等 的(请求 1 次和 10 次结果一样),所以浏览器敢缓存它。
-
POST :是非幂等 的(请求 10 次可能创建 10 个订单),所以浏览器不敢随便缓存,刷新时会弹窗警告。
第三部分:SYN Flood 攻击(TCP 安全)
这是一种利用 TCP 协议漏洞进行的 DoS(拒绝服务)攻击。
1. 攻击原理(占着茅坑不拉屎)
-
正常握手 :客户端发 SYN -> 服务端回 SYN+ACK(并分配资源,放入半连接队列) -> 客户端回 ACK(连接建立)。
-
SYN 攻击:
-
攻击者伪造大量不存在的 IP,疯狂向服务器发送 SYN 包。
-
服务器回复 SYN+ACK 后,傻傻地等待对方回 ACK。
-
因为 IP 是假的,永远不会有 ACK 回来。
-
后果 :服务器的半连接队列 (SYN Queue) 被这些假请求占满了,导致正常用户的 SYN 请求被丢弃,无法连接。
-
2. 解决方案
-
调大队列 :增加
tcp_max_syn_backlog参数,让候车室大一点。 -
减少重试 :减少
tcp_synack_retries,联系不到人就赶紧释放资源,别傻等。 -
TCP SYN Cookie(大招):
-
收到 SYN 时不分配内存(不进队列),而是根据 IP 计算一个加密的 Cookie 发回去。
-
只有客户端真带回了这个 Cookie,服务器才承认这是个有效连接。
-
第四部分:CDN(内容分发网络)
1. 核心理念
"空间换时间"。通过将内容缓存在离用户最近的地方,解决网络拥堵和延迟。
- 比喻 :京东物流模式。以前买东西都从北京发货(慢);现在京东在全国各省建了前置仓(边缘节点),你一下单,直接从本省仓库发货(快)。
2. 静态 vs 动态
-
静态资源(图片、CSS、JS):非常适合 CDN。长期缓存在边缘节点。
-
动态资源(API 接口、个人数据):通常不走 CDN 缓存,因为每个人、每一刻的数据都不一样,必须回源站查询。
3. 关键流程:回源 (Origin Pull)
-
用户请求资源,DNS 调度到最近的边缘节点。
-
命中:边缘节点有这个资源,直接返回(极速)。
-
未命中(回源) :边缘节点发现自己没有,它会向源站(主服务器)发起请求,拿到资源后转发给用户,并顺手缓存一份,下次别人要就有了。