ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

百度核心网络研发校招笔试详解:从TCP状态机到epoll全考点复盘

2026/8/29 23:13:54 拓冰建站 浏览量
百度核心网络研发校招笔试详解:从TCP状态机到epoll全考点复盘 提到百度2019校招核心网络研发工程师笔试题第二批很多准备网络方向的应届生第一反应是“又要背一遍TCP状态机和BGP选路规则”。但你要是真把这些题做一遍、复盘一遍会发现它根本不是靠背能解决的它考的是你能不能像一个真正做网络基础设施的工程师一样把一个协议机制、一个系统瓶颈、一个异常场景拆到最底层再从底层推回方案。这篇文章我就结合自己当年备考和后来辅导学弟学妹的经验把这类笔试背后的考察逻辑、高频考点和复习方法完整拆一遍希望能帮你少走弯路。这篇文章适合三类人正在准备大厂网络研发岗校招的应届生想从普通后端转网络方向的中级开发以及想系统梳理自己网络知识体系的从业者。我会尽量用“实战视角”来讲不只列知识点还会说明为什么这些知识点会出现在笔试里、它们对应什么样的真实工程场景。1. 这份笔试的定位核心网络研发到底在筛选什么样的人1.1 “核心网络研发”和普通后端研发的分水岭先说一个很多人容易忽略的前提。校招投递的时候“网络研发工程师”和“核心网络研发工程师”看起来差不多实际上差别很大。普通后端研发的笔试考察重点是业务开发能力Redis、MySQL、消息队列、分布式事务这些是主角而核心网络研发岗位对应的往往是数据中心网络、骨干网、流量调度、网络设备、协议栈优化这类方向笔试自然会往网络协议栈深处扎。我根据对这类岗位的了解总结出三个明显特点。第一不考偏题怪题但会把基础概念往深处问。比如TCP三次握手普通岗可能只问“为什么是三次”核心网络研发岗会给你一个半连接队列被打满的场景让你分析现象、定位原因、给出防御手段。看似同一个知识点考察的认知深度完全不是一个量级。第二协议细节占比非常高。网络通信协议、路由协议、Linux网络栈相关的题目能占到整张卷子的四成以上。这部分不会简单让你写“TCP是面向连接的、可靠的”而是会问到滑动窗口的具体行为、拥塞控制的触发条件、BGP选路时的属性比较顺序。第三系统与网络结合紧密。会有综合题把socket编程、内核收包路径、高并发设计串在一起考察的是你有没有“全链路视角”——从一个数据包到达网卡到应用进程读到数据中间每一步发生了什么你能不能讲清楚。想明白这三点你就知道备考重点不应该放在刷一大堆偏难怪算法题上而应该先把网络协议体系搭建起来再往深挖。1.2 “第二批”意味着什么题型结构可以怎么预判校招笔试题分批次出是常规操作主要为了防泄题和应对不同批次的投递节奏。第二批和第一批相比整体难度和题型结构通常不会大改但具体题目一定会换血。所以与其去搜所谓“原题”不如把题型的分布规律搞清楚按模块准备。我从经验上推测这份卷子大概率分为三个部分网络基础与协议以选择题、填空题为主覆盖TCP/IP协议族、路由协议、DNS、HTTP等重点考察概念理解的准确性。系统与编程以简答题和手写代码题为主考察socket编程模型、Linux网络I/O、基础算法和边界处理能力。综合设计与开放题给一个场景比如“设计一个支撑百万长连接的网关”考察架构设计、方案取舍和表达能力。这三块的分数占比通常协议基础最高编程次之设计题决定上限。很多同学只刷算法题忽略协议细节这恰恰是本末倒置。算法题是基础门槛过了就行能拉开差距的是你能不能把TCP拥塞控制、BGP选路、epoll底层原理这种问题讲出层次感。2. 传输层与协议细节状态机、窗口、重传机制怎么考2.1 TCP状态机最熟悉的考点也是丢分最狠的地方传输层是网络研发笔试的重中之重TCP状态机基本必考。但它的考法不会只是让你默写“SYN、SYNACK、ACK”或者“FIN、ACK、FIN、ACK”的标准流程而是给一个具体场景让你分析状态迁移的细节。我见过的典型问法有一个TCP连接建立过程中如果服务端收到大量只有SYN、没有后续ACK的请求会发生什么怎么防护主动关闭连接的一方为什么要进入TIME_WAIT而且需要等待2MSL如果TIME_WAIT连接过多会带来什么问题如果客户端发送FIN之后服务端一直没有回复ACK客户端的TCP状态会卡在哪里这些场景题的背后考的是你对状态机迁移条件的准确记忆。TIME_WAIT是最典型的例子。它存在的原因有两个一是让网络中延迟的旧数据包自然消亡避免污染后续新建的连接二是确保最后一次ACK能到达对端如果对端没收到会重发FIN此时主动关闭方需要处于一个能响应这个重发FIN的状态。很多人理解到第一层就停了考试时如果题目问“为什么TIME_WAIT是2MSL而不是更长或更短”就答不出来。这里要补充的是MSL是报文段最大生存时间2MSL能保证一个方向上延迟的报文和对应ack都从网络中消失这是“安全”的最小值。我备考时用过的一个笨方法现在还是推荐。找一张空白的纸手动默写完整的TCP状态机把每一个状态迁移条件、主动方和被动方的动作、涉及的内核参数比如tcp_max_tw_buckets、tcp_fin_timeout全部标注出来。默写两三遍之后再遇到场景题你会很快定位到具体状态和字段而不是凭感觉猜。另外有一个很容易被忽略的细节TCP状态机的考法经常会把主动方和被动方身份互换。比如客户端主动关闭时客户端进入TIME_WAIT这大家都会。但如果题面改成“服务端主动关闭连接此时服务端会进入什么状态”很多人就会答反。千万别把“TIME_WAIT一定在客户端”这种经验当成规律TCP状态机只区分主动方和被动方不区分谁是客户端谁是服务端。2.2 拥塞控制从Reno到CUBIC再到BBR拥塞控制也是必考区域而且它比状态机更考验对机制的理解。常见的考法有这么几个层次。最基础的慢启动、拥塞避免、快重传、快恢复分别是在什么条件下触发的慢启动的cwnd是如何增长的ssthresh在快重传之后变成多少这些必须答得又快又准属于送分题但如果含糊不清后面的大题也容易崩。进阶的丢包时TCP Reno和CUBIC的表现有什么不同为什么CUBIC要刻意弱化RTT对窗口增长的依赖这背后涉及“相同瓶颈带宽下不同RTT的流应该尽量公平”的设计思想。CUBIC的窗口增长函数是三次函数窗口增长只与时间相关而不是每收到一个ACK就增长所以不同RTT的流能更接近收敛公平。更高层次的区分度题是BBR。出题人会问传统基于丢包的拥塞控制算法在高速长距离链路上为什么表现不好这里要回答到点子上丢包并不一定代表网络发生了拥塞。在深队列网络中路由器缓冲区可能已经堆积了大量数据包但尚未发生丢包发送端依然在拼命增加窗口等到缓冲区填满触发丢包再剧烈降窗这就造成了带宽利用率的锯齿形波动。BBR改变思路不靠丢包反馈而是显式地建模网络路径的带宽上限和最小RTT然后以此控制发送速率和发送量。能把这一层逻辑讲清楚阅卷人一看就知道你对拥塞控制的理解不是背出来的。建议复习时把发送窗口随时间变化的锯齿图画一遍并标注清楚cwnd、ssthresh、rwnd三者的关系。这是笔试图和面试手撕的共同基本功。2.3 UDP相关别以为不考很多人在复习时把重点全压在TCP上UDP基本不怎么看这其实是个误区。核心网络研发的场景里DNS、视频传输、QUIC都大量使用UDP笔试不会放过这个点。关于UDP的题目通常集中在三处为什么UDP比TCP快这个问题要答出UDP没有连接建立、没有拥塞控制、没有可靠重传所以开销小、延迟低。但也要补充UDP本身不保证可靠交付快是建立在牺牲可靠性上的。哪些场景适合UDP实时音视频、在线游戏、DNS查询这些要求低延迟、能容忍偶发丢失的场景。如果让你基于UDP实现一个可靠传输协议需要解决哪些问题这是开放题核心考点是序列号设计、确认机制、重传策略超时重传还是选择性重传、去重处理、乱序重排、流量控制和拥塞控制。能把这些维度都覆盖到基本就满分。第三类题目其实是在考你对TCP机制的理解深度。你如果真的理解TCP为什么可靠就能把可靠传输的那些要素抽出来像搭积木一样搭到UDP上。笔试里遇到这种题不要着急动笔先在草稿纸上列清楚维度再展开回答。3. 网络层与路由从IP分片到BGP选路3.1 IP子网划分基础计算题为什么总有人丢分网络层的计算题比如子网划分、CIDR合并、可用主机数、网络地址和广播地址的计算一般以选择题出现难度不大。但我见过太多人在这种题上丢分原因只有一个题目太简单直接心算结果在“可用地址数要不要减二”这种细节上出错。比如一个/23的网段总地址数是512个但网络地址和广播地址不能用所以可用主机地址是510个。如果题面再限定“去掉网关占用”还要再减一。这些细节很细但很能反映一个工程师是否严谨。关于IP分片笔试偶尔会考一个1500字节的IP数据包如果MTU变成1000字节会被分成几片每片的标志位和片偏移是多少这个知识点不需要每个数字都背但你需要理解分片的计算逻辑——片偏移的单位是8字节所以每个分片的数据部分长度必须是8的整数倍。把计算逻辑理清楚随便出什么数字都能算出来。子网和分片这类题目我的建议是无论多简单都在草稿纸上画一下二进制动一次笔胜过心算十次。不要觉得这是小题就不重视网络研发笔试的胜负往往就是选择题里错的这一两个细节。3.2 路由协议RIP、OSPF、BGP的横向对比路由协议是这个岗位笔试的特色题普通后端一般不会考这么深。常见考法是把RIP、OSPF、BGP放在一起对比或者单独深挖某一个。对比类的考点可以整理成一张表协议算法类型基于什么协议适用范围核心特点RIP距离向量UDP端口520小型网络最大跳数15收敛慢度量只看跳数OSPF链路状态IP协议号89中型/大型内部网络SPF算法收敛快支持区域划分BGP路径向量TCP端口179AS之间策略丰富选路属性多承载路由量大这张表里最容易出追问的是BGP。很多教材只说“BGP基于TCP”但笔试会问为什么。回答思路是BGP需要在AS之间传递大量路由条目可靠性要求高TCP能提供面向连接的可靠传输而且TCP的端口号机制方便BGP维护会话状态和keepalive保活。另一方面BGP的设计目标是策略路由而不是寻找最短路径它提供大量路径属性如AS_PATH、LOCAL_PREF、MED来支持灵活的选路策略。关于BGP选路顺序常见问题当到达同一个目的地有多条路径时BGP按照什么顺序比较属性比较重要的几个顺序是优先选择LOCAL_PREF高的路径LOCAL_PREF相同选AS_PATH短的AS_PATH相同选MED小的随后是eBGP优先于iBGP、IGP metric等。能把这个顺序完整默写出来是基本要求。OSPF这边则常考LSA类型、区域类型、SPF计算的基本过程。这里有个关键点OSPF为什么需要区域因为SPF计算是CPU密集型的网络规模大了整个区域里每个路由器都要维护全量的链路状态数据库计算开销巨大。划分区域后骨干区域负责跨区域路由非骨干区域内部收敛极大减轻了路由器负担。能答出这一层就不只是会背LSA了。3.3 NAT、隧道与SDN理解“映射”和“封装”两种基本手法网络层还有几个概念经常被一笔带过但实际工作和笔试中都可能出现。NAT的考法最常见的是给你一张内外网地址映射表让你推演一个数据包经过NAT设备后源IP、源端口、目的IP、目的端口分别变成了什么。这需要理解NAPT的映射逻辑——多台内网主机共用一个公网IP靠端口号区分不同连接。写答案时一定要把“方向”弄清楚出方向改源地址和源端口入方向根据映射表还原同时把校验和的变化想清楚。隧道的考法主要是VXLAN和GRE。记住一句话隧道就是封装。把一个二层帧或者三层包装进另一个协议里传输在另一个网络里“挖洞”走。VXLAN为什么要用24位的VNI因为传统VLAN只有12位也就是4096个隔离网络在云数据中心里完全不够用VXLAN通过Overlay技术把隔离网络扩展到1600万个。SDN则更容易以概念辨析题出现问OpenFlow的基本思想或者“传统网络和SDN网络在转发决策上有什么不同”。核心答题点是“控制平面与转发平面分离”。传统网络每台设备独立计算转发路径SDN则把控制逻辑集中到控制器转发设备只按流表执行动作。这个概念不算难但很多人会把SDN和“用软件做网管”混为一谈答偏。这三个内容的共同内核值得单独记一下NAT是映射隧道是封装SDN是控制与转发分离。理解了内核往里填细节就会很快。4. Linux网络栈与系统编程笔试里的“实操感”4.1 socket服务端编程模式select、poll、epoll到底差在哪这一部分核心网络研发的笔试会明显比普通后端更细。socket编程模式是必考主要围绕I/O多路复用展开。先是一个基础问法写一个高并发socket服务端你会选择哪种I/O模型为什么这里要能区分阻塞I/O、非阻塞I/O、I/O多路复用和异步I/O。高并发场景下阻塞I/O的问题是每个连接要占一个线程线程上下文切换开销会拖垮CPUI/O多路复用通过一个线程同时监听大量fd的事件解决了连接数多但活跃连接少的问题。紧接着就是三件套对比select、poll、epoll。考点包括select的fd_set是位图大小受FD_SETSIZE限制通常为1024每次调用都需要把整个fd_set从用户态拷贝到内核态。poll用pollfd数组替代了位图没有1024的限制但依然存在全量拷贝和线性扫描的问题。epoll则使用事件驱动机制通过epoll_ctl注册fd内核维护一棵红黑树就绪事件通过回调机制放入就绪链表epoll_wait只返回就绪的fd不再需要线性扫描。笔试进一步会追问epoll_wait返回之后为什么通常要配合非阻塞I/O为什么ET模式边缘触发下要循环读直到返回EAGAIN这两个问题其实指向同一个原理epoll的LT模式是只要有数据就持续通知ET模式只在状态变化时通知一次。如果采用ET模式但没有把fd设置为非阻塞那么循环读的时候最后一次read因为缓冲区空了会阻塞在那里整个线程就卡死了。而设置了非阻塞之后read会立刻返回EAGAIN说明读完了可以退出循环。理解了这套逻辑你就不需要死记“ET要配合非阻塞”这个结论。这里还有一个加分点什么是惊群效应多进程或者多线程同时调用epoll_wait等待同一个fd时事件到来所有进程都被唤醒但只有一个能处理事件其他进程重复唤醒造成浪费。解决思路是SO_REUSEPORT允许多个socket绑定同一个端口内核将连接分发到不同进程或者利用EPOLLEXCLUSIVE唤醒其中少数进程。在笔试里能答出惊群效应和一种解决方式就已经超过大多数人了。4.2 内核收发包路径从网卡中断到socket接收队列还有一类题是我当年复习时觉得最吃力的也是核心网络研发岗的“身份标识”——Linux内核收发包路径。题目通常以流程问答题出现问一个数据包从网卡接收到应用程序read到数据经历了哪些步骤。标准的路径是这样的网卡收到数据帧通过DMA把数据写入内存中的ring buffer避免CPU拷贝。网卡触发硬中断告知CPU有新数据到达。硬中断处理程序做必要处理后唤醒软中断softirq因为硬中断上下文不宜做过多工作。ksoftirqd内核线程或当前进程的软中断上下文处理收包NAPI机制下采用轮询方式批量读取ring buffer的包。数据包进入协议栈依次经过链路层eth_type判断、网络层IP解析、路由查找、传输层TCP/UDP端口匹配、指针定位。TCP层处理序列号、确认号、窗口等逻辑数据最终放到对应socket的接收队列。唤醒正在阻塞等待该socket的进程用户态调用read系统调用数据从内核缓冲区拷贝到用户态缓冲区。笔试考这个流程不只是为了确认你看过书它背后的设计思路才是重点。为什么要分硬中断和软中断因为硬中断优先级高处理太长时间会拖累整个CPU软中断可以延后处理且可以被多路复用。为什么要引入NAPI因为高流量下如果每个包都触发一次硬中断中断风暴会消耗大量CPUNAPI在中断触发后切换为轮询模式批量收包再切回中断模式兼顾低延时和高吞吐。会了这条路径之后很多延伸题也就能答了。比如问网卡多队列RSS为什么提升性能可以答多队列让不同流的数据包分散到不同的CPU核心处理避免单核成为瓶颈。问CPU亲和性为什么对网络吞吐有影响可以答软中断处理可以在特定CPU上执行减少缓存抖动和锁竞争。这些高层问题其实都是收发包路径的派生考点。4.3 零拷贝、用户态协议栈与DPDK进阶分水岭这部分属于进阶考点如果你目标是高分或者后面还想冲一下核心网络研发的面试值得花时间研究。零拷贝的考题通常会围绕sendfile和mmap展开。理解起来可以对比普通读写的流程普通readwrite数据要经过磁盘/网卡→内核缓冲区→用户缓冲区→内核socket缓冲区→网卡中间至少要经历两次CPU拷贝和四次用户态/内核态切换。而sendfile利用DMA把数据从磁盘传到内核缓冲区再通过DMA从内核缓冲区直接传到网卡避免了用户态拷贝大幅减少CPU开销。笔试如果考零拷贝很可能会问“sendfile适合什么场景”——适合从文件到socket的传输比如静态文件服务器如果是应用程序需要修改数据再发出去那就得用mmap或者普通读写。用户态协议栈和DPDK则是更“硬核”的考点。这两个词背后有一个共同的问题内核协议栈在大流量高并发场景下遇到了瓶颈比如系统调用开销、锁竞争、内存拷贝、中断处理。解决方案是绕过内核让应用进程直接接管网卡。业界常见的方案就是DPDK配合大页内存、无锁队列、轮询模式驱动把收包延迟做到极低。这类题如果作为开放题出现不会要求你说出完整的实现细节但你要能说清楚“为什么需要它”和“它解决了什么问题”。答题逻辑是先讲内核协议栈的瓶颈再讲轮询模式代替中断模式、用户态驱动代替内核驱动、大页内存减少TLB miss这三点核心技术最后再提一下应用场景比如负载均衡、防火墙、高性能网关。能讲到这个深度说明你已经有网络研发的实战思维了。5. 系统设计与编程题如何组织高并发网络服务5.1 设计题从“会写代码”到“会做架构”综合设计题是笔试里最能拉开差距的部分。常见的场景包括设计一个支持百万长连接的即时消息网关、设计一个负载均衡系统、设计一个数据中心内部的流量调度方案。这类题目没有标准答案但阅卷时看的点非常明确。我总结下来得分的关键在于四个方面。一看需求分析。不要一上来就画架构图先写清楚场景的规模连接数是多少每秒消息量是多少延迟要求在什么范围可用性要求是几个9。比如设计一个百万长连接的网关光是“百万连接”这个数字就决定了单机方案不可行必须按多机水平扩展来设计每台机器还要考虑文件描述符上限、内存占用、CPU核数。二看分层架构。成熟的方案基本都是接入层、逻辑层、存储层三层分离。接入层负责维持海量长连接做协议解析、心跳保活、流量分发逻辑层负责业务逻辑必须无状态化方便水平扩容存储层/状态层负责保存会话状态、离线消息等通常用Redis或分布式KV解决。这三层讲清楚比堆十个中间件名字强得多。三看单点与容灾。设计题里一定要主动考虑接入层如果挂了怎么办状态层怎么容灾解决方案无非是主备切换、多副本、数据冗余。不要等阅卷人来问你自己在方案里写出来就是加分项。四看网络协议细节的落地。这是网络研发岗设计题和普通后端设计题最大的区别。比如长连接保活你要设计心跳超时多长时间超时后怎么清理连接连接迁移时怎么把原来机器的连接状态同步过去。再比如负载均衡算法你是用一致性哈希还是最少连接数还是加权轮询都要结合场景说明理由。我个人的经验是设计题一定要答案结构化先列出“需求分析、总体架构、核心模块、容灾方案、关键问题”五个小节每小节写三五行条理清楚。阅卷时间有限结构化答案比长篇大论更容易拿分。5.2 手写代码题常考的方向不是难题而是边界正确编程题方面网络研发岗的笔试不会出特别偏的算法。我见过的常见方向包括实现一个带过期时间的LRU缓存判断一个字符串是否是合法的IPv4地址把IPv4地址字符串转换成32位整数再排序实现一致性哈希的节点查找过程用两个队列模拟栈或用栈模拟队列解析一段TCP报文头按字段提取出源端口、目的端口、序号等这些题有一个共同特点逻辑不复杂但边界条件极多。以“判断IPv4地址是否合法”为例看起来很简单真正写起来要考虑这些情况字符串为空、有前导零、数字超过255、段数不是4、含非数字字符、前后有空格、存在连续的点号。我记得有一年笔试题就专门考这种“简单题”大部分人在LeetCode刷习惯了难题反而在这种题上因为边界不清丢分。写这类代码题时我的建议是先不急着写主逻辑把所有边界条件列出来写成注释再在注释的指导下填代码。这样即使时间不够阅卷人也能看到你的思路是完整的。下面是一个判断IPv4地址合法性的参考骨架重点看边界条件的处理方式。bool is_valid_ipv4(const char* ip) { if (ip NULL) return false; int seg_start 0, seg_count 0, len strlen(ip); if (len 0) return false; for (int i 0; i len; i) { if (i len || ip[i] .) { // 段为空非法 if (i seg_start) return false; // 段长度超过3非法 if (i - seg_start 3) return false; // 段内不能有前导零除非段本身就是 0 if (ip[seg_start] 0 i - seg_start 1) return false; // 把段内字符累加成数字并判断范围 int num 0; for (int j seg_start; j i; j) { if (ip[j] 0 || ip[j] 9) return false; num num * 10 (ip[j] - 0); } if (num 0 || num 255) return false; seg_count; seg_start i 1; // 段数不能超过4 if (seg_count 4) return false; } } return seg_count 4; }实际笔试时不要求写这么完整但这个思路值得借鉴先用注释把边界条件列清楚再写实现。相比直接上手写这样写出来的代码错误率明显更低。5.3 与网络相关的“半算法”题前缀树与AC自动机还有一种题我很喜欢因为它是“算法网络场景”的交叉比如设计一个高效的关键词过滤系统用于网络内容安全检测你会怎么实现这种题通常考察前缀树Trie或AC自动机。前缀树的思路比较容易理解把一批关键词插入一棵树中从根节点到某个标记节点的路径表示一个关键词。匹配时从头遍历待检测文本的每个字符沿着树往下走能匹配到就说明命中了关键词。相比把每个关键词逐个做字符串匹配前缀树的匹配复杂度只跟文本长度有关跟关键词数量无关这个优势在大规模词库场景下非常关键。笔试中如果考Trie一般会让你手写插入和查询。这里有一个很实用的细节插入时在节点里用is_end标记一个关键词的结束。查询时要区分“存在以当前字符为结尾的词”和“只是一个前缀”否则会出现把“apple”当成“app”的误判。AC自动机则是Trie的进阶版它在Trie的基础上加了失败指针能够在一次扫描中同时匹配多个关键词而不需要回溯。这个题目如果只是笔试能写出Trie版本已经够用如果面试被问到了再提一下AC自动机的失败指针和多模式匹配就是明显的加分项。关键是要把“为什么用Trie而不是哈希表”讲清楚——哈希表适合精确匹配单个词但在前缀匹配和同时匹配多个词的时候Trie和AC自动机效率更高、内存也更可控。6. 复盘建议从这份笔试题看如何高效备考6.1 复习优先级协议基础排在纯算法前面把这整份卷子的考点放在一起看精力分配的逻辑很清晰。协议基础最优先。TCP状态机、拥塞控制、路由协议、Linux网络栈这部分分值最高区分度最大而且可以通过短期密集复习快速提分。建议拿出复习总时间的一半以上砸在这里。网络编程次之。epoll、socket编程模型、零拷贝这部分需要动手写代码来巩固。只看书效率很低建议自己在Linux环境里写一个小型echo服务器再用epoll改成高并发版本这个过程远比背十篇博客有用。系统设计排第三。架构思维靠长期积累考前突击效果有限但只要平时有意识训练“需求分析→分层架构→容灾设计”的思考框架还是能在笔试中拿到基础分。纯算法排在最后。每天保持手感即可不要花大量时间在偏题怪题上。网络研发岗的算法题普遍是门槛性质不追求极限优化追求的是边界正确。我见过不少算法刷得很猛的同学在协议细节题上栽了跟头。原因很简单算法题大家都会刷协议细节很多人懒得深挖而笔试恰恰要用协议细节来筛选人。想清楚这一点复习方向就不会跑偏。6.2 资料与工具看什么书、用什么环境备考资料方面我的搭配建议如下理论框架以《计算机网络自顶向下方法》为主这本书结构清晰适合先搭起完整的知识框架。协议细节可以看《TCP/IP详解》卷一不用全读重点读TCP、IP、IGMP这几章配合具体的RFC查漏补缺。Linux网络栈方面《深入理解Linux网络技术内幕》讲得很全但偏厚时间不够可以读网上整理好的内核网络路径源码导读。网络编程看《Unix网络编程》卷一这本是经典中的经典select/poll/epoll的差异、socket选项都讲得很细。系统设计部分把一致性哈希、正向代理/反向代理、负载均衡、高可用网关这些基本模式过一遍不需要读完整的架构书。实操环境一定要准备一台Linux机器虚拟机也行。重点做三件事第一用tcpdump和ss观察TCP连接的状态变化比如主动建连、主动关闭看看TIME_WAIT和CLOSE_WAIT到底长什么样第二用nc或自写socket程序测试不同I/O模型的行为第三用strace跟踪一个socket程序看它到底调用了哪些系统调用。这些实操看起来简单但对理解笔试理论题帮助巨大。我当年就是为了搞清楚TIME_WAIT在一台服务器上反复建连再断开然后ss -tan看状态瞬间就理解了这个状态为什么会是网络服务端的常见问题。6.3 容易踩的坑这里集中说几个第一个坑忽略选择题里的计算题。子网划分、二进制换算、TCP头部长度、IP头部长度的计算每年都有人因为心算丢分。别嫌麻烦草稿纸上写一笔稳一分。第二个坑把八股文背得太死不关心场景。笔试和面试一样更看重你在具体场景里的分析和应用。比如背“TCP可靠传输靠序号、确认、重传”是基础但笔试会让你分析一个丢包场景你需要把它转化成“收到三个重复ACK触发快重传ssthresh减半进入快速恢复”这样具体的动作描述。能完成这种翻译才说明你真的理解。第三个坑代码题不列边界条件就动手。网络研发岗的代码题往往在字符串解析上设坑IP、端口、掩码、协议头的解析都是重灾区。宁可慢一点先把边界条件在注释里写全再写主逻辑这样正确率会高很多。第四个坑设计题没有结构想到哪写到哪。阅卷人看的是你的思维框架而不是零散的点。按“需求分析、总体架构、核心模块、容灾方案、关键问题”这个结构来写即使具体技术选型不完美分数也不会低。再补充一点做复盘的时候不要只看自己做对了什么更要看每道题背后的出题意图。为什么出题人要在TCP状态机上做文章因为真实网络问题里连接异常、半开连接、大量TIME_WAIT都是日常运维中必然会遇到的问题。为什么考epoll的ET模式因为高性能网络服务器的开发真的会因为你把一个fd设成阻塞而卡死整个线程。想清楚了这些“为什么”备考就不会只是为了讨好笔试而是在真的积累工程能力。我到现在还记得当年做这类网络研发笔试题时最焦虑的不是不会做而是知识点明明见过但不够深。后来想明白了一个道理校招笔试的本质不是筛选“知道的人”而是筛选“能建立完整链路认知的人”——知道一个概念很简单能准确描述概念在链路中的位置、它上下游的事件、它失效时的表现才是真本事。这份百度2019校招核心网络研发工程师笔试题第二批之所以值得反复咀嚼正是因为它处处都在用这种方式考你。如果你也是正在备考的应届生我有一个很朴素的建议找一套题先不看任何答案模拟真实笔试时间做一遍然后对每个错题写一小段“出题意图分析”说明这道题想考察你的什么能力再针对性地补知识。这个方法我后来指导过几个学弟学妹反馈都很好。备考路上容易迷茫但只要你把每一次练习都当成一次链路梳理方向就不会偏。