ARTICLE DETAIL

资讯详情

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

计算机网络学习路径:从数据包旅程到协议栈实战

计算机网络学习路径:从数据包旅程到协议栈实战 计算机网络这门课我前前后后啃过三遍。第一遍在大学课堂上老师对着PPT念OSI七层模型我背下了物理层、数据链路层、网络层、传输层、会话层、表示层、应用层考完试就忘得一干二净。第二遍是准备考研408的时候对着王道和湖科大的视频课硬啃把TCP三次握手、四次挥手的流程图默写了十几遍但真到了要抓包分析一个HTTP请求的时候还是不知道从哪下手。第三遍是工作以后线上服务突然出现大量TIME_WAIT连接排查了半天才发现是短连接没复用那一刻我才真正理解传输层那些状态机到底在说什么。所以这篇内容我想按自己的理解路径来聊计算机网络。不按教科书的章节顺序走而是从一个数据包从你的浏览器到服务器到底经历了什么这条主线出发把物理层到应用层的关键机制串起来。适合正在学计算机网络基础的同学、准备408考研的考生、以及像DevOps工程师这样需要排查网络问题的从业者。我会尽量把每个协议背后的为什么讲清楚而不是只告诉你是什么。1. 从输入网址到页面加载一条数据的完整旅程1.1 为什么先讲这条主线而不是先背分层模型大多数人学计算机网络的第一个障碍就是被OSI七层模型和TCP/IP四层模型搞晕。教科书上来就画两张对照表告诉你OSI是理论模型、TCP/IP是实际使用的模型然后让你背每一层的功能和协议。这种学法的问题在于你背了一堆名词但不知道它们之间怎么协作。我的建议是反过来——先跟着一个数据包走一遍完整路径遇到哪一层就讲哪一层。这样你脑子里有一条具体的路线图后面再补理论细节就有了挂靠的地方。假设你在浏览器地址栏输入了一个网址按下回车。接下来发生的事情大致是这样的浏览器先要解析这个域名对应的IP地址DNS查询然后和服务器建立TCP连接三次握手接着发送HTTP请求服务器处理后返回响应浏览器渲染页面。这整个过程涉及应用层、传输层、网络层、数据链路层和物理层。1.2 DNS解析为什么域名不能直接用来通信网络中的设备靠IP地址定位但人记不住一长串数字所以有了域名系统DNS。DNS的核心作用就是把人类可读的域名翻译成机器可路由的IP地址。DNS查询的过程是一个典型的递归加迭代的混合过程。你的计算机会先查本地缓存没有的话问本地DNS服务器本地DNS服务器如果也没有缓存就从根域名服务器开始逐级向下查询顶级域服务器、权威域名服务器最终拿到结果并缓存起来。这里有个容易被忽略的细节DNS默认使用UDP协议端口53。为什么用UDP而不是TCP因为DNS查询通常很小一个请求一个响应就完事了用TCP的话三次握手加四次挥手的开销比查询本身还大。但如果响应数据超过512字节比如DNSSEC场景就会切换到TCP或者使用EDNS0扩展。实操提示如果你用dig命令查一个域名加上trace参数可以看到完整的迭代查询过程对理解DNS层级结构非常有帮助。1.3 TCP三次握手为什么是三次而不是两次或四次拿到IP地址后浏览器要和服务器的80或443端口建立TCP连接。三次握手的过程大家都背过客户端发SYN服务端回SYNACK客户端再发ACK。为什么是三次核心原因是要让双方都确认对方的收发能力正常。两次握手的话服务端无法确认客户端是否收到了自己的SYNACK如果客户端没收到服务端却已经建立了连接就会白白浪费资源。四次握手则没必要因为服务端的SYN和ACK可以合并成一个报文发送。这里涉及一个关键概念序列号Sequence Number。TCP是可靠传输协议每个字节都有编号接收方通过确认号Acknowledgment Number告诉发送方我已经收到了哪些数据。初始序列号ISN不是从0开始的而是基于时间戳等因素生成的随机值目的是防止旧连接的延迟报文干扰新连接。1.4 HTTP请求与响应应用层的实际工作方式TCP连接建立后浏览器发送HTTP请求。一个典型的请求包含请求行方法、路径、版本、请求头Host、User-Agent、Accept等和可选的请求体。HTTP/1.1默认开启持久连接Connection: keep-alive一个TCP连接可以发送多个请求。但HTTP/1.1有个著名的问题叫队头阻塞——同一个连接上的请求必须按顺序处理前一个响应没回来后面的就得等着。HTTP/2通过多路复用解决了这个问题在同一个TCP连接上可以并行传输多个请求和响应。服务器处理完请求后返回响应包含状态码200、301、404、500等、响应头和响应体。浏览器根据响应内容决定是渲染HTML、下载文件还是跳转。2. 分层模型到底在分什么OSI与TCP/IP的对照理解2.1 分层的本质是关注点分离很多人觉得分层模型是人为制造的复杂度其实分层是软件工程中关注点分离原则在网络领域的体现。每一层只负责自己的事情上层不需要关心下层的实现细节。物理层负责在物理介质上传输比特流关心的是电压、接口、传输速率这些。数据链路层负责在直连的设备之间传输帧处理MAC地址、差错检测。网络层负责跨网络的路由和转发核心是IP协议。传输层负责端到端的可靠传输或高效传输核心是TCP和UDP。应用层直接面向用户程序HTTP、FTP、SMTP、DNS都在这一层。2.2 OSI七层与TCP/IP四层的对应关系OSI七层TCP/IP四层典型协议数据单元应用层应用层HTTP、DNS、SMTP报文表示层应用层SSL/TLS、JPEG—会话层应用层RPC、NetBIOS—传输层传输层TCP、UDP段网络层网络层IP、ICMP、OSPF包数据链路层网络接口层Ethernet、PPP帧物理层网络接口层双绞线、光纤比特OSI的表示层负责数据格式转换和加密会话层负责建立和管理会话。在TCP/IP模型中这些功能被合并到了应用层由应用程序自己处理。比如TLS加密在OSI里属于表示层但在TCP/IP里就是应用层的一部分。2.3 数据封装与解封装每一层加了什么数据从上往下传的时候每一层都会给数据加上自己的头部有时还有尾部这个过程叫封装。应用层的数据到了传输层加上TCP头变成段到了网络层加上IP头变成包到了数据链路层加上以太网头和帧尾变成帧到了物理层变成比特流发出去。接收方反过来做解封装每一层剥掉对应的头部把数据交给上层。这个过程中每一层的头部包含了该层协议需要的控制信息。比如TCP头里有源端口、目的端口、序列号、确认号、窗口大小IP头里有源IP、目的IP、TTL、协议类型。理解封装和解封装是理解网络协议栈的关键。你在Wireshark里抓包看到的每一层信息就是这些头部字段的实际值。3. 传输层的两个核心协议TCP与UDP的取舍逻辑3.1 TCP的可靠传输是怎么实现的TCP实现可靠传输靠的是几个机制的组合序列号和确认号、超时重传、滑动窗口、流量控制、拥塞控制。序列号和确认号是最基础的。发送方给每个字节编号接收方收到后回复确认号表示这个编号之前的数据我都收到了。如果发送方在一定时间内没收到确认就重传。滑动窗口机制允许发送方在没收到确认的情况下连续发送多个段提高了传输效率。窗口大小由接收方通过TCP头里的窗口字段告知这就是流量控制——防止发送方发得太快把接收方缓冲区撑爆。拥塞控制则是防止发送方发得太快把网络搞瘫。经典算法包括慢启动、拥塞避免、快重传、快恢复。慢启动阶段拥塞窗口从1个MSS开始每收到一个确认就翻倍指数增长到达慢启动阈值后进入拥塞避免改为线性增长检测到丢包时根据是超时还是重复确认分别采取不同策略。3.2 UDP为什么在实时场景下更受青睐UDP不保证可靠传输没有连接建立过程头部只有8个字节TCP是20字节起步。这些缺点在某些场景下反而是优点。实时音视频通话、在线游戏、直播推流这些场景对延迟极其敏感对少量丢包的容忍度反而较高。用TCP的话一个包丢了后面全得等着重传延迟抖动会非常明显。UDP丢了就丢了下一帧继续用户体验反而更流畅。DNS查询、DHCP、SNMP这些请求-响应模式的应用也常用UDP因为交互简单重传逻辑可以在应用层自己实现。经验之谈很多DevOps工程师在排查服务问题时看到大量UDP包丢失就紧张其实要先确认业务类型。如果是DNS查询丢包那确实要查如果是视频流少量丢包是正常的。3.3 TCP连接的状态机与TIME_WAIT问题TCP连接的生命周期可以用状态机来描述包括LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、LAST_ACK、TIME_WAIT、CLOSED等状态。四次挥手中主动关闭方在发送最后一个ACK后会进入TIME_WAIT状态等待2MSL报文最大生存时间的两倍才真正关闭。为什么要等两个原因一是确保最后一个ACK能到达对方如果对方没收到会重传FIN此时还能响应二是让本次连接的延迟报文在网络中消失避免干扰使用相同四元组的新连接。TIME_WAIT本身是正常现象但如果服务器上出现大量TIME_WAIT可能是短连接太多导致的。解决办法包括使用连接池、开启tcp_tw_reuseLinux下允许将TIME_WAIT状态的连接用于新连接、调整内核参数等。4. 网络层与数据链路层IP路由和MAC寻址的配合4.1 IP地址与子网划分的实用计算IP地址由网络号和主机号组成子网掩码用来区分这两部分。比如192.168.1.100/24前24位是网络号后8位是主机号这个子网可以容纳254台主机256减去网络地址和广播地址。子网划分的核心计算给定一个IP和掩码求网络地址就是把IP和掩码做按位与运算求广播地址就是把主机位全置1求可用主机数就是2的主机位数次方减2。举个例子10.0.0.0/8这个大网段如果要划分成多个子网可以借用主机位做子网位。借3位的话可以划分出8个子网每个子网有2的21次方减2台主机。实际工作中云环境的VPC划分、容器网络的CIDR分配都离不开这些计算。4.2 路由器如何决定下一跳路由器收到一个IP包后会提取目的IP地址然后查路由表。路由表的每条记录包含目的网络、掩码、下一跳和出接口。查找时遵循最长前缀匹配原则——在多个匹配的路由条目中选择掩码最长最具体的那条。比如路由表里有10.0.0.0/8和10.1.0.0/16两条记录目的地址是10.1.2.3的包会匹配第二条因为/16比/8更具体。如果路由表里没有匹配的记录就走默认路由0.0.0.0/0。默认路由通常指向ISP的网关这就是为什么你的家庭路由器只需要一条默认路由就能访问整个互联网。4.3 ARP协议IP到MAC的翻译官在同一个局域网内设备之间通信靠的是MAC地址不是IP地址。ARP协议的作用就是把IP地址解析成MAC地址。当主机A要发送数据给同一子网的主机B时它先查ARP缓存看有没有B的IP对应的MAC。没有的话就广播一个ARP请求谁是192.168.1.2请告诉192.168.1.1。B收到后单播回复自己的MAC地址。A把结果缓存起来后续通信直接用。ARP缓存有老化时间通常是几分钟到几十分钟。如果MAC地址变了比如换了网卡缓存过期后会自动更新。ARP欺骗攻击就是利用了这个机制攻击者伪造ARP响应把流量引到自己这里。防范方法包括使用静态ARP绑定、部署ARP防护功能等。5. 应用层协议的实际应用与排查思路5.1 HTTP协议的关键字段与状态码HTTP是应用层最常用的协议理解它的关键字段对排查问题至关重要。请求方法里GET和POST最常用GET用于获取资源参数在URL里POST用于提交数据参数在请求体里。PUT、DELETE、PATCH用于RESTful API的资源操作。状态码分五类1xx信息性、2xx成功、3xx重定向、4xx客户端错误、5xx服务端错误。实际工作中经常遇到的是301永久重定向、302临时重定向、304未修改缓存有效、400参数错误、401未认证、403无权限、404资源不存在、500服务端内部错误、502网关错误、504网关超时。排查HTTP问题时重点看请求头和响应头。Content-Type告诉对方body的格式Content-Length或Transfer-Encoding说明body的长度或传输方式Cache-Control控制缓存行为Set-Cookie和Cookie用于会话管理。5.2 HTTPS的加密过程简述HTTPS就是HTTP加上TLS加密。TLS握手过程大致是客户端发送ClientHello支持的加密套件、随机数服务端回复ServerHello选定的加密套件、随机数和证书客户端验证证书后生成预主密钥用服务端公钥加密发送双方用三个随机数生成会话密钥之后用对称加密通信。为什么要用对称加密传数据因为非对称加密计算开销大速度慢。TLS的巧妙之处在于用非对称加密安全地交换对称密钥然后用对称加密高效地传输数据。证书验证是HTTPS安全的基础。证书由受信任的CA签发包含公钥、域名、有效期等信息。客户端会检查证书是否过期、域名是否匹配、是否被吊销、签名是否有效。自签名证书会触发浏览器警告就是因为不在信任链里。5.3 用tcpdump和Wireshark定位网络问题排查网络问题抓包是最直接的手段。tcpdump适合在服务器上抓包Wireshark适合在本地分析。tcpdump的常用参数-i指定网卡-nn不解析域名和端口名-w保存到文件-r读取文件-c限制包数。比如抓取80端口的包tcpdump -i eth0 -nn port 80 -w http.pcap。Wireshark的过滤器分两种捕获过滤器BPF语法和显示过滤器。显示过滤器更常用比如http.request.method GET、tcp.port 443、ip.addr 192.168.1.1。排查TCP连接问题时重点看三次握手是否完成、有没有RST包、有没有重传。如果看到SYN发出后没有SYNACK可能是服务端没监听或防火墙拦截如果看到大量重传可能是网络质量差或拥塞如果看到RST可能是服务端主动拒绝或连接被中间设备重置。6. 给不同学习目标的实操建议6.1 准备408考研的复习路径408的计算机网络部分重点在传输层和网络层TCP和IP是绝对的核心。建议的复习顺序是先过一遍教材建立框架然后跟着视频课理解重点难点最后刷真题和模拟题。湖科大教书匠的视频课在考研圈口碑不错特点是讲解细致、板书清晰适合基础一般的同学。王道的数据结构、操作系统、计算机网络、计算机组成原理四本书是408的标配计算机网络部分覆盖全面题目难度适中。复习时要特别注意计算题子网划分、CRC校验、滑动窗口效率、TCP拥塞窗口变化、路由算法等。这些题目有固定的解题套路多练几遍就能掌握。6.2 DevOps工程师需要重点掌握的网络知识DevOps工程师日常打交道最多的网络知识包括DNS解析和排查、TCP连接状态分析、HTTP/HTTPS协议细节、负载均衡原理、容器网络模型、防火墙和iptables规则。实际工作中你可能会遇到这些场景服务间调用超时需要判断是网络问题还是应用问题容器无法访问外部服务需要检查网络策略和路由证书过期导致HTTPS失败需要更新证书DNS解析异常导致服务发现失败需要排查CoreDNS或resolv.conf配置。建议DevOps工程师重点掌握tcpdump、ss、netstat、dig、curl、openssl这些命令行工具它们在生产环境排查中比图形化工具更实用。6.3 期末复习的抓重点策略如果只是为了应付期末考试时间有限的情况下优先掌握这些OSI和TCP/IP模型的层次结构与各层协议、TCP三次握手和四次挥手、TCP和UDP的区别、IP地址分类和子网划分、常见应用层协议HTTP、DNS、FTP、SMTP的工作原理。计算题重点练子网划分、CRC校验、CSMA/CD的退避算法、滑动窗口协议效率计算。简答题重点背TCP可靠传输机制、拥塞控制算法、DNS解析过程、HTTP请求响应过程。实验课如果涉及抓包分析提前熟悉Wireshark的基本操作知道怎么过滤HTTP、TCP、DNS流量能看懂三次握手和四次挥手的包序列。计算机网络这门课光看书是学不会的。我的经验是每学一个协议就找一个实际场景去验证它。学DNS就用dig查几个域名学TCP就用tcpdump抓一次握手学HTTP就用curl加-v参数看请求响应头。把抽象的概念和具体的现象对应起来知识才真正属于你。
返回列表