ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

网络八股Day02:TCP三次握手、HTTP状态码与HTTPS原理精讲

网络八股Day02:TCP三次握手、HTTP状态码与HTTPS原理精讲 “八股Day02”——如果你不是准备面试的人看到这个标题大概率会愣一下。所谓八股指的就是面试里反复出现的那批基础题TCP三次握手、HTTP状态码、DNS解析、缓存机制。说难不难但每次以为自己会了被面试官追着问两句就露馅。Day02是我给自己定的每日复习计划的第二天今天的内容集中在了计算机网络目标很直接把这些高频八股背明白也把它背后的原理讲清楚。这篇笔记适合三类人看正在准备技术面试的求职者想系统过一遍网络基础的开发同学以及背了八股但一追问就卡壳的人。我不会只把答案贴出来还会把面试官的追问方向、我在实际验证中的发现一并写进来尽量做到“背一份顶三份”。1. 今天啃哪块把网络八股过成体系1.1 为什么第二天就安排网络基础网络八股跟算法题不一样它不依赖刷题量而依赖“能不能把零散概念串成线”。比如三次握手单独问基本都能答出来状态码单独问也能背出几个常见的。但一旦面试官问“从输入URL到页面展示中间发生了什么”好多人立刻乱了因为这道题要求你把DNS、TCP、HTTP、浏览器渲染全部逻辑串起来。我第二天就安排网络原因很实际网络层是几乎所有技术岗位的公共考点后端、客户端、测试、运维都会涉及。而且网络概念是很多系统设计题的底层地基比如“如何设计一个高可用网关”“为什么RPC用长连接而HTTP接口用短连接”这些题答得好不好很大程度上取决于你对传输层和应用层的理解深度。另外我也发现面试官问网络题通常分三个层次第一层是让你背结论比如三次握手发几个报文第二层是让你讲原理为什么不能是两次第三层是结合场景比如线上出现大量TIME_WAIT怎么排查。Day02的整理就按这三个层次来先保证结论记得住再往下挖原理最后落到实际排查手段。1.2 四层还是七层先搭好分层的框架网络八股里第一个高频问题永远是“OSI七层模型和TCP/IP四层模型”。七层从上到下是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层而实际开发中更常用的是四层模型把OSI的上三层合并为应用层下面数据链路层和物理层合并为网络接口层。为什么要分层我用一个类比帮自己记忆寄快递。你只需要写好地址应用层快递公司负责运输路径规划网络层物流车实际跑在公路上链路层和物理层。你不需要关心公路是水泥路还是柏油路这就是分层的好处——上层不需要关心下层的实现细节每层可以独立演进。面试中容易出问题的是协议归属HTTP、FTP、SSH、DNS都属于应用层协议TCP和UDP在传输层IP、ICMP在网络层。有个容易被忽略的点是HTTPS里的TLS/SSL它位于应用层与传输层之间本质上为应用层数据加了一层安全保护如果面试官问“TLS属于哪一层”可以说“会话层或表示层但从实际角度看它跑在传输层之上、应用层之下”。能把这个位置说清楚印象分会好不少。2. TCP连接管理三次握手、四次挥手与高频追问2.1 三次握手每一次交互都在确认什么TCP三次握手的标准流程背起来不难但面试官真正想看的是你理不理解为什么要有这一步。第一次握手客户端发送SYN报文随机生成一个初始序列号seqx进入SYN_SENT状态。可以理解为客户端在说“喂我要发数据了你听得到吗”第二次握手服务端收到SYN回复SYNACK报文自己随机生成seqy确认号ackx1进入SYN_RCVD状态。意思是“我听得到你能听到我吗”第三次握手客户端收到服务端回复再发一个ACK报文acky1双方进入ESTABLISHED状态。意思是“我听到了开始正常通信”。为什么必须是三次而不是两次很多人背的答案是“防止失效的请求连接服务端”但完整的理解应该是TCP是对称的双工协议连接建立后双方都需要确认对方的收发能力都正常。第一次握手服务端能确认客户端的发送能力和自己的接收能力第二次握手客户端能确认服务端的发送能力和自己的接收能力但服务端此时并不知道客户端有没有收到自己的SYN只有第三次握手完成服务端才知道客户端的接收能力正常。还有一个很经典的解释我特别喜欢。如果只有两次握手某个旧的SYN报文滞留在网络中客户端已经超时重传并正常通信完旧SYN又跑到服务端服务端一心软就建立连接白白浪费资源。三次握手后服务端发出SYNACK客户端发现这条连接不是我想要的就不会再回ACK服务端等不到第三次握手自然放弃。所以“三次”不是拍脑袋定的而是保证双方状态一致的最小次数。2.2 四次挥手为什么断开比建立多一次四次挥手的过程同样高频主动关闭方发出FIN报文表示“我的数据发完了准备关闭”进入FIN_WAIT_1。被动关闭方回复ACK表示“知道了但我还有数据没发完”进入CLOSE_WAIT。被动关闭方处理完数据后发出FIN表示“我也发完了可以关闭了”进入LAST_ACK。主动关闭方回复ACK进入TIME_WAIT等待2MSL后彻底关闭被动方收到ACK后直接关闭。为什么关闭需要四次而不是三次核心原因是全双工特性。建立连接时SYN和ACK可以在一个报文里合并因为服务端没什么其他事要做可以先回应再说。但断开时被动方收到FIN很可能还有数据要发送不能立刻关闭连接只能先回ACK表示“收到你的关闭请求”等自己的数据都发完了再发FIN。也就是说两个方向的关闭是独立的所以正常至少四个报文。有一个思考题值得准备如果被动方收到FIN时已经没有数据要发了能不能合并ACK和FIN减少到三次理论上是能的但TCP规范把它设计成独立的两个步骤实际网络里也经常看到某些实现不会合并。所以如果面试官这么追问你可以说“如果条件允许可以合并但TCP标准不强制实际抓包中经常看到分开的ACK和FIN”。2.3 面试追问点SYN Flood、半连接队列与TIME_WAIT谈完握手和挥手面试官通常会追加几个进阶问题这几个点我建议不要死背而是理解它们之间的逻辑。SYN Flood攻击的原理是攻击者发送大量SYN报文但不回第三次握手的ACK服务端的半连接队列被塞满正常用户的连接请求就无法处理。防护思路主要几个方向启用SYN Cookie不分配完整的连接资源等收到ACK再分配限制单位时间内SYN的接收速率适当调大半连接队列长度。面试时能把“半连接队列”和“全连接队列”区分开很加分SYN请求先进入半连接队列三次握手完成后才进入全连接队列应用进程accept的时候才真正从全连接队列取连接。TIME_WAIT则出现在四次挥手后的主动关闭方要等2MSL才能关闭。为什么要等两个原因一是确保最后一个ACK能到达对方如果ACK丢了被动方会重发FIN主动方还能再回应二是让本连接产生的旧报文在网络中消逝避免这些报文干扰之后同端口的新连接。我见过很多候选人一听到“大量TIME_WAIT怎么处理”张口就是改内核参数。实际经验是先分析业务是短连接还是长连接优先考虑用连接池复用连接从根本上减少关闭次数再考虑开启SO_REUSEADDR让端口快速重用最后才是调低TIME_WAIT等待时间或开启tcp_tw_reuse。顺序反了面试观感会差很多。下面把这一块常见的追问整理成速查表方便复习时对照面试追问考察意图建议回答要点为什么两次握手不行是否理解连接建立的本质服务端无法确认客户端接收能力且无法识别失效连接请求SYN报文丢了会怎么样是否了解超时重传客户端超时重传SYN并触发指数退避大量TIME_WAIT怎么处理是否具备实战经验优先连接复用再考虑端口重用最后调内核参数大量CLOSE_WAIT说明什么是否能定位问题被动关闭方应用层没有调用close大概率是代码里没关闭连接3. HTTP层状态码、协议演进与HTTPS握手3.1 HTTP报文结构与状态码速记HTTP报文分请求和响应两类结构都是“起始行 头部字段 空行 消息体”。请求的起始行是请求行方法、URL路径、HTTP版本响应的起始行是状态行HTTP版本、状态码、原因短语。状态码这块我建议不要单个去记而是按类别总结出规律1xx请求已被接收继续处理。常见的是100 Continue大请求体分阶段发送时用。2xx成功。200表示OK201表示创建成功204表示成功但响应体为空。3xx重定向与缓存。301是永久重定向302是临时重定向304表示命中本地缓存不用重新下载。4xx客户端错误。400参数错误、401未认证、403禁止访问、404找不到、429请求过于频繁。403和401的区别是高频考点401说你没登录或者没带凭证403说你登录了但没有权限。5xx服务端错误。500服务器内部错误、502网关收到上游非法响应、503服务暂不可用、504网关等不到上游响应。面试中经常把502和504放一起问都是网关层面的错误。502对应“网关与上游之间通信失败或上游返回了无法解析的内容”504对应“网关等上游响应等超时了”。一个人说“上游挂了”另一个人说“上游慢了”这是两种完全不同的排障方向。3.2 HTTP/1.1到HTTP/3每次升级都在解决什么问题HTTP版本演进是这两年网络八股里几乎必考的内容而且问得很细。HTTP/1.1时代一个TCP连接同一时刻只能处理一个请求请求按顺序发前一个没响应完后面的请求就得排队等待这就是队头阻塞。虽然keep-alive让连接可以复用但也只是省了握手开销没有解决队头阻塞。HTTP/2的核心改动是引入二进制分帧层把一个TCP连接切成多个流stream每个流承载独立的请求和响应多个流可以并发传输。这样应用层的队头阻塞被解决掉了配合头部压缩HPACK和服务器推送性能提升明显。但HTTP/2仍然跑在TCP之上TCP本身的丢包重传机制会带来新的问题如果其中一个流的数据包丢了TCP要等待重传后续所有流都会被阻塞这就是TCP层的队头阻塞。到了HTTP/3干脆换基底直接基于UDP实现QUIC协议在用户空间自己做可靠传输、流量控制和拥塞控制。这样丢包只影响对应的流其他流不受牵连还能做到连接迁移手机从WiFi切到4G连接不重建再加上0-RTT握手首次请求就能省一个往返时间。面试时能说出“HTTP/2解决了应用层队头阻塞但没解决TCP层队头阻塞所以HTTP/3用QUIC来绕开TCP”这个层次基本就抓住要点。3.3 HTTPS连接建立非对称加密为什么搭配对称加密HTTPS HTTP TLS面试官只要问到HTTPS大概率会追一句“为什么握手用非对称加密、传输用对称加密”。这个问题我建议从目标倒推HTTPS要保证机密性、完整性和身份认证。完整性和身份认证靠数字证书和数字签名机密性靠加密。TLS握手大致流程以TLS1.2经典流程为例客户端发送ClientHello带上支持的TLS版本、加密套件列表和客户端随机数。服务端返回ServerHello选定加密套件附上服务端随机数和证书。客户端验证证书的有效性包括是否在有效期内、域名是否匹配、是否由受信任的CA签发验证通过后生成预主密钥用服务端证书里的公钥加密并发送给服务端。服务端用自己的私钥解密得到预主密钥。双方根据客户端随机数、服务端随机数和预主密钥各自推导出相同的会话密钥。之后所有业务数据都用会话密钥做对称加密传输。为什么是“非对称对称”组合因为非对称加密的公钥私钥机制能安全地把密钥种子传给对方但速度慢加解密都涉及大数运算对称加密速度快适合大流量数据传输但问题是怎么安全地协商出同一个密钥。TLS的做法恰恰是用非对称加密来协商种子再用对称加密来跑数据各取所长。这里有个加分项值得记下来。传统的RSA密钥交换不支持前向保密因为私钥一旦泄露之前抓包记录的所有密文都能被解开。现在普遍使用ECDHE密钥交换它的核心思路是双方各自生成临时密钥对交换部分参数后独立计算出相同的会话密钥私钥泄露也不影响历史流量。TLS1.3更是直接废弃了RSA密钥交换默认使用ECDHE。能把“前向保密”这个词说出来说明你理解的不只是流程而是设计动机。4. 一条URL的完整旅程综合题的标准答法4.1 DNS解析先从浏览器缓存问起“输入URL后发生了什么”是八股综合题的顶点。我的建议是把答题框架拆成几段每一段都能跟面试官展开聊。第一步一定是DNS解析。DNS解析的完整链路是浏览器DNS缓存 → 操作系统DNS缓存可能包括hosts文件 → 本地DNS服务器ISP或公司内网 → 根DNS服务器 → 顶级域DNS服务器(.com等) → 权威DNS服务器。浏览器本身缓存时间很短操作系统缓存次之真正负责递归查询的是本地DNS服务器。这里有一个递归与迭代的区别本地DNS服务器代替客户端连续问多个服务器这个过程叫递归查询根服务器或顶级域服务器只告诉本地DNS“你下一步去问谁”自己不做转发这个过程叫迭代查询。面试还常问“DNS用TCP还是UDP”。普通DNS查询用UDP 53端口因为查询和响应报文都很小UDP一个来回搞定开销远低于TCP。但如果响应报文超过512字节DNS会改用TCP此外区域传送zone transfer也必须走TCP。回答的时候把“为什么平时用UDP、什么情况切TCP”讲清楚这道题就算答全了。4.2 从TCP到渲染把每一步讲清楚DNS拿到服务器IP之后浏览器开始跟服务器建立TCP连接也就是前面背过的那套三次握手。如果网址是HTTPSTCP建立后还要再加一次TLS握手这一步可以顺带提一句“TLS握手是在TCP连接建立后进行的”说明你清楚两层协议的前后关系。连接建立好浏览器发送HTTP请求。这个请求经过应用层、传输层、网络层、链路层逐层封装每一层加上对应的头部信息经过路由器和交换机最终到达服务器。服务器处理请求后返回HTTP响应浏览器收到响应后开始处理。如果是HTML页面浏览器会调用HTML解析器把字节流解析成DOM树同时解析CSS生成CSSOM树再合并成渲染树最后经过布局、绘制把页面呈现出来。这个过程会提到JavaScript阻塞、关键渲染路径等概念但我建议先不要展开太深除非面试官明确研究方向是前端。后端岗位面试中把处理流程讲到“拿到HTML开始构建DOM树、渲染页面”就足够剩余时间留给面试官追问。4.3 这道题想拿高分关键在补充优化点我见过很多候选人把“输入URL后发生了什么”从头背到尾但分数一般因为他们只会线性叙述不会穿插优化点。反观答得好的候选人会在各个节点主动给出可优化的方向。DNS阶段可以说用户量大的站点一般会接入CDNDNS解析到CDN节点IP而不是源站IP静态资源就近返回。TCP和TLS阶段可以说开启TCP Fast Open可以跳过部分握手往返TLS会话复用能省下调换密钥材料的开销TLS1.3的0-RTT能把握手延迟压缩到一次往返甚至零往返。HTTP请求阶段可以说强缓存和协商缓存能避免重复请求HTTP/2多路复用能减少连接数量HTTP/3适合弱网场景。渲染阶段可以说静态资源压缩合并、图片懒加载、preload/prefetch等。能主动带出两三个优化点面试官就能判断你不是背八股而是真的用这些知识做过优化。这个思路同样适用于其他技术面试题不要做答案的复读机要做知识的搬运工——把背过的知识点跟实际场景挂上钩。5. 实操复盘我踩过的坑和验证套路5.1 用Wireshark把三次握手“看”明白八股背得再熟都不如亲手抓一次包来得踏实。我自己的经验是找个远程服务器用Wireshark抓包过滤条件设置为tcp.flags.syn 1 || tcp.flags.fin 1再配合tcp.port 443或者80端口就能清清晰晰看到一次完整连接的三次握手和四次挥手。第一次操作时有个坑如果抓的是本机回环地址localhost很多TCP行为会被内核优化合并报文看不太清楚。比如某些系统上握手包发得特别快抓到的可能不是标准的三个报文。所以建议用一个网络有少量延迟的远程服务器来抓效果直观得多。抓到之后重点看两样东西一是序列号的变化规律理解ack seq 1到底是怎么算的二是四次挥手中主动方的TIME_WAIT状态持续了多长时间。还可以用curl -v查看HTTP层的请求和响应头跟Wireshark的包做对照哪一层负责什么一目了然。这种东西看一次要比背十遍都管用。5.2 面试被追问时这样答才不慌最后分享几个面试现场的经验。第一次被面试官追问“然后呢”的时候很多人会慌其实追问恰恰说明面试官在给机会他想看你的知识边界和思考方式。第一遇到不会的问题先别急着说“不知道”。你可以说“这个概念我记得不是特别清楚但基于我对相关机制的理解它可能是因为……”。基于常识的推断比沉默更有价值。第二答网络题要主动分层面试官问你TCP就谈传输层问HTTP就谈应用层不要一上来把DNS和渲染全倒一遍。第三诚实永远是底线。某个细节确实不记得就明说“这块我没有深入实践过”然后补充一个相关但不编造的知识点这是我见过最稳妥的处理方式。我自己的体会是八股之所以被称为八股是因为很多人只背答案不问为什么。但当你花点时间把每次握手、每次挥手、每次状态码背后的设计逻辑理清楚这些内容就不再是死知识而是一套可以迁移到实际排障中的思维框架。Day02把网络这块过完我对后续几天的复习更有信心了——不是因为我记住了更多答案而是我知道该往哪个方向做更深的理解。
返回列表