ARTICLE DETAIL

资讯详情

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

网络通信核心:从DNS解析到TCP握手,一次看懂原理与排障

网络通信核心:从DNS解析到TCP握手,一次看懂原理与排障 1. 从一次网页打开过程看透网络通信的全貌很多刚接触网络通信的人第一个困惑永远是同一个我明明只按了一下回车屏幕上怎么就开始转圈了这背后到底是哪台机器、哪段线路、哪个协议在干活与其背一堆抽象概念不如直接顺着一次网页请求往下走。等你看完这一段再回头学分层模型、IP地址、TCP握手会轻松得多。1.1 地址解析浏览器如何找到服务器你在浏览器里输入域名比如 example.com浏览器首先干的事不是发数据而是查“这个域名对应的IP地址是多少”。IP地址才是网络上真正能找到那台服务器的门牌号域名只是给人记的别名。这个查询动作叫 DNS 解析背后会走一条递归链先问本机配置的 DNS 服务器本地没有缓存的话再去问根域名服务器、顶级域名服务器、权威域名服务器。这里有个最常见的坑很多人以为网络慢是宽带问题实际上一半以上是 DNS 解析慢。Windows 下可以用nslookup example.com直接看解析耗时Linux 下可以用dig。我遇到过一台电脑打开网页转圈但别的设备正常最后发现是系统里的 DNS 被改成了一个响应很慢的地址。排查方向对了问题几分钟就能定位。1.2 数据封装应用、传输、网络、链路各层都做了什么拿到IP地址之后浏览器开始构造请求。这个请求不是一次性“丢”出去的而是像寄快递一样从里到外套了好几层盒子。应用层写出 HTTP 请求内容传输层给这段内容加上“端口信息”和“可靠传输控制”网络层加上“源IP和目标IP”链路层再加上“源MAC和目标MAC”。每一层都会增加一个头这个过程叫封装。这些“盒子”到目标机器后对方会从最外面的盒子开始一层层拆开看到HTTP请求内容再交给服务器程序处理。这个拆包过程叫解封装。理解这一点特别重要网络通信不是把一根管子接上然后就传字节流而是数据包带着多层“快递面单”每层只认自己负责的那张面单。很多抓包初学者看不懂数据包就是因为不知道界面里一列列的 Ethernet、IP、TCP、HTTP 其实对应着这几层盒子。1.3 数据怎么经过路由器到达目标路由与转发的基本逻辑数据包从你的电脑出发第一站通常是家里的路由器。路由器干的事和快递中转站一样看一眼目标IP查自己的路由表判断“这个IP应该从哪个口往哪转”。如果你的目标地址和内网地址不在同一网段它会从 WAN 口发出去交给运营商网络里更大的路由器一路一跳一跳地转发直到到达目标服务器所在的机房。这里有个概念容易混淆交换机负责在同一个局域网内按MAC地址转发数据路由器负责在不同网络之间按IP地址决定路径。家里用的无线路由器其实是“路由NAT交换机无线AP”四合一设备所以才显得能干所有事。真正的核心逻辑是每个路由器只告诉数据包“下一步往哪走”但数据包上带着完整的起始地址和目标地址这样它才能保证最终到达目的地。1.4 服务端返回与连接关闭一次完整会话的时间线服务器收到请求后会按同样的封装方式反向构造响应。数据包再经过一堆路由器返回你的电脑。但这中间还藏着两个细节。第一浏览器和服务器在正式发HTTP数据之前会先建立一个TCP连接这个连接要经历三次握手。第二由于网络报文可能走不同路径先发出的包不一定会先到所以传输层要用序号把数据块按顺序重新排好。等到响应全部到齐浏览器开始渲染页面。等所有资源都下载完了TCP连接会通过四次挥手优雅地关闭。如果你用开发者工具看“Waterfall”时间线能看到大部分时间其实花在等待服务器响应而不是传输上。这说明网络通信的链路很长任何一个环节变慢——DNS、TCP握手、首包响应、丢包重传——都会体现在用户体感上。2. 有真名有网名OSI七层模型与TCP/IP四层模型为什么必须分清很多初学者被两套模型搞晕教材上写OSI七层实际上用TCP/IP四层。我自己刚学的时候也背过“物理层、数据链路层、网络层、传输层、会话层、表示层、应用层”但背完就忘。后来做排障才真正理解模型不是用来背的是用来定位问题的。2.1 两种模型各自的来历和设计初衷OSI模型是国际标准化组织在1980年代提出的参考模型目标是把网络通信这个复杂系统拆成七个互相独立的层每一层只和上下层交互。这样设计的好处是某一层升级或替换不影响其他层。但它的缺点是过于理想化很多层在实际协议里根本没有独立实现所以现在更常用的是TCP/IP四层模型。TCP/IP模型是互联网实际使用的协议栈把七层压缩成四层链路层、网络层、传输层、应用层。会话层和表示层的工作被塞进了应用层物理层和数据链路层被合成一层。实际工作中你只需要把“OSI七层”当成认知框架把“TCP/IP四层”当成调试工具两头都不耽误。2.2 每一层到底管什么事表格式对照为了不空谈我把两层模型和典型协议、设备、排障命令放到一起看层别OSI模型TCP/IP模型典型协议典型设备排障切入点应用层应用层/表示层/会话层应用层HTTP、DNS、SMTP、FTP电脑上的程序抓包看HTTP状态码传输层传输层传输层TCP、UDP四层负载均衡netstat看连接状态网络层网络层网络层IP、ICMP路由器ping测通断、tracert测路径链路层数据链路层/物理层链路层Ethernet、Wi-Fi交换机、网卡看协商速率、看接口灯这张表不是用来死记的而是帮你建立“问题出在哪一层”的感觉。比如网页打不开如果 ping 网关都不通那问题基本在链路层或网络层如果 ping 网关通、ping 域名不通先怀疑 DNS如果一切都通但网页转圈再看 TCP 建立和 HTTP 响应。每一层都有对应工具这就是模型的价值。2.3 数据封装和解封装每一层怎么添加或剥离头部数据从应用层往下走每经过一层就加一个头部。以 HTTP 请求为例传输层加上TCP头里面有源端口、目标端口、序号、确认号网络层加上IP头里面有源IP、目标IP、TTL等链路层加上以太网头里面有源MAC、目标MAC和类型字段。到达对端后从链路层开始逐层剥离直到应用层读原始数据。我特别想提醒一点如果你用 Wireshark 抓包看到的每个数据包其实是多层头部“叠加”在一起的二进制数据。Wireshark 的“Packet Details”面板把每一层头都解析成了可读字段。初学者总喜欢看 TCP 层的 Flags实际上最该先看 IP 层的源地址和目标地址是不是预期的这决定了数据包是不是真的发对了地方。2.4 三层交换机、四层负载均衡这些设备术语的含义设备名称里的“几层”就是指它工作在模型中的哪一层。二层交换机只能看懂 MAC 地址在同一广播域内做转发三层交换机具备路由功能能看懂 IP 地址四层负载均衡能根据 TCP/UDP 端口分发流量七层负载均衡还能解析 HTTP 请求里的 URL做更精细的转发。理解这个对面试和实战都有用。曾经有个同事问我为什么负载均衡设备前面还要加交换机我说负载均衡要收流量、加工、再转发性能有瓶颈交换机只是无脑转发不用计算。两层设备在链路中的角色完全不同这不是高低级之分而是分工不同。3. IP地址、端口与NAT我们以为在找电脑其实在找“门牌号窗口”如果你想跟另一台设备通信光知道它在哪个网段还不够还得知道具体是哪个程序在等数据。IP地址负责找机器端口号负责找机器上的“窗口”。但现实比这复杂一点因为全球IPv4地址有限绝大多数设备并没有公网IP它们躲在路由器后面共享一个出口。这个机制叫NAT是理解家庭网络和公司网络的关键。3.1 IPv4地址为什么越来越少保留地址和公网地址的区分IPv4 地址长度是32位总共约43亿个地址。这个数量在互联网早期看似足够但今天根本不够分。于是 IP 地址被分成了公网地址和私网地址。私网地址有专门的保留段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。这些地址可以在局域网内部随便用但出了自己的路由器就不能直接用于公网路由。这就引出一个常见误会我家路由器显示的IP是 192.168.1.1是不是说明我有公网IP不是。路由器上的 192.168.1.1 是内部管理地址真正出公网时流量会被路由器的 NAT 功能把源地址改写成运营商分配的公网IP。如果你想确认自己有没有公网IP最好的办法是去另一个网络环境里访问你路由器WAN口显示的那个IP。3.2 子网掩码和网关怎么判断两台机器是否在同一局域网子网掩码的作用是告诉你“哪些IP属于同一个小圈子”。比如 192.168.1.0/24 的掩码是 255.255.255.0表示前24位是网络部分后8位是主机部分。两台机器只要网络部分相同就在同一局域网可以不经路由直接互通。反之要通信就必须通过网关。排查时我经常用route print或ip route看路由表。有一次一个服务器能访问别的机器但无法上外网看路由表发现缺一条默认路由所有出公网的包不知道该往哪送。加上0.0.0.0/0 via 网关之后立刻恢复。别小看默认网关缺了它你所有离开本地网段的通信都会失败。3.3 端口号到底扮演什么角色为什么说“端口不是物理口”端口是一个16位的数字范围0到65535。服务器进程会监听某个端口例如Web服务通常监听80或443远程登录服务通常监听22。客户端在发起连接时会向目标端口发请求同时自己动态占用一个高位端口用于接收响应。所以一条TCP连接的唯一定义其实是五元组源IP、源端口、目标IP、目标端口、协议。经常有人把端口和网口混在一起说“是不是网口不够了”。其实一个IP上的65536个端口完全可以独立使用端口是软件层面的概念。你可以在同一台服务器上用不同的端口跑多个网站这就是为什么 8080、8443 这类端口在开发环境里那么常见。3.4 NAT转换过程家里多台设备如何共用一个公网IP及其带来的P2P问题NAT网络地址转换的原理是路由器维护一张映射表当内网设备 192.168.1.100:5000 访问外网服务器路由器会把这个源地址改成自己的公网IP同时分配一个新的源端口比如 45000。返回的数据包到达路由器后路由器根据端口找映射表把目标地址改回 192.168.1.100:5000再发进局域网。这个机制对普通上网完全透明但它会带来一个问题外网主动往里连很困难。因为路由器不知道应该把入站流量送给哪台内网设备除非提前配置端口映射或 DMZ。这也是很多家庭监控摄像头需要“P2P穿透”才能远程访问的原因。P2P穿透本质上就是让内网设备先主动向外网服务器打一个洞再借用这个洞建立双方通信。理解NAT映射表你就明白为什么有些设备能通、有些不能通。4. TCP可靠传输的底细三次握手、序号确认和重传TCP是互联网上最核心的传输协议HTTP、FTP、SSH、邮件全都跑在它上面。它的最大卖点是“可靠”数据不丢、不乱序、不重复。但可靠不是白来的它依靠一套复杂的机制包括连接建立、序号确认、滑动窗口、拥塞控制和重传。这一章我们拆开讲顺便解决几个高频疑问。4.1 三次握手为什么要三次能不能两次三次握手的过程并不难背客户端发 SYN服务器回 SYNACK客户端再回 ACK。但很多人问为什么不是两次我讲一个场景你就明白了。假如客户端发了一个 SYN 因为网络延迟很久没到服务端客户端超时后重发一个 SYN这次服务端正常回复并建立了连接。可如果前一个迟到的 SYN 后来也到了服务端不知道这是个旧包还以为是新的客户端请求于是等客户端确认。如果只有两次握手服务端在收到第一个迟到 SYN 时就会盲目建立一条新连接浪费资源。有了第三次 ACK服务端可以识别出这是旧包不建立连接。所以“三次握手”不是形式而是双方就“序号同步”达成共识的最低次数。它既让客户端确认服务端能收包也让服务端确认客户端能发包同时完成初始序号协商。4.2 序号与确认号数据包怎么保证不丢不重TCP 发送的每一个字节都有一个序号。比如客户端发出的第一个字节序号是1数据总长1000字节那么下次发送就从序号1001开始。接收方收到后会回一个 ACK确认号表示“我已经收到某某序号之前的所有数据请从下个序号开始发”。用一串连续的序列号接收方可以检测出有没有缺口缺了就主动要求重传。排障时我看到很多丢包问题都是改配置文件盲目调超时时间。实际上丢包率指标比超时时间重要得多。Linux 可以用ss -s看 TCP 连接统计如果重传率很高优先检查物理链路丢包而不是继续调内核参数。TCP重传机制只是兜底治不了高丢包的病根。4.3 滑动窗口与拥塞控制为什么网速会忽快忽慢接收方不能无限接收数据它的缓冲区有限所以会在 TCP 头里告诉发送方“我的窗口大小还剩多少”。发送方按窗口大小发送数据这叫流量控制。如果某台机器内存不足接收窗口会变小网速自然下降。还有一个维度是拥塞控制网络里的中间设备也可能拥堵发送方发现丢包或延迟变大时会主动降低发送速率避免把网络打垮。这就能解释一个现象同一根宽带白天快晚上慢不一定运营商限制可能是高峰期路由器队列拥塞TCP 自动降速。家里网络体验差的时候我会先看路由器统计里的连接数和丢包趋势。连接数爆满、CPU跑满再好的带宽也白搭。4.4 挥手阶段与TCP连接状态TIME_WAIT堆积如何处理断开连接需要四次挥手因为 TCP 是全双工的双方各自要独立关闭自己的数据通道。主动关闭方发送 FIN对方回 ACK 后再发 FIN主动关闭方最后再回一个 ACK。但主动关闭方在发出最后一个 ACK 后会进入 TIME_WAIT 状态等待一段时间默认 2MSL约1-4分钟然后才彻底关闭。TIME_WAIT 的目的是处理网络上残留的重复包防止它们干扰新连接。高并发服务器上大量短连接会堆积 TIME_WAIT常见调整思路是开启tcp_tw_reuse并配合tcp_timestamps但对负载均衡和后端连接来讲配置要结合连接模式来判断。我见过有人盲目开启tw_recycle旧内核参数导致 NAT 环境下连接异常这个参数现在已经不建议启用。先看你的连接模式再决定怎么调内核参数。5. 网络变慢变卡的排障思路从Ping到抓包按链路逐段定位这一章可能最贴近日常。你会遇到“网络特别慢”“网页加载失败”“丢包严重”等描述但用户说不清楚到底哪一层出了问题。如果一上来就抓包效率很低。正确的思路是从范围、链路、流量三个维度逐段隔离让问题自己现形。5.1 先分清问题范围单机、局域网还是出口链路排障第一步永远不是敲命令而是确认范围。是不是只有一台设备卡是不是只有某个时段卡是不是有线不卡、无线卡这个步骤一般10秒就能判断能过滤掉一半问题。如果只有一台电脑卡先 ping 网关看延迟。如果网关都延迟高那问题很可能在无线或本机网卡。如果 ping 网关正常、ping 外网IP延迟高问题在出口链路。如果 ping 域名延迟高但 ping 对应IP正常问题在 DNS。范围判断越清楚后面的命令就越有针对性。别上来就抓包那只会让你被一堆无关流量淹没。5.2 常用命令行工具到底看什么指标ping、tracert、nslookup、netstat、pathping我把常用工具按“看什么”整理下ping 目标IP判断网络通不通和RTT延迟但它只发ICMP包不能代表TCP业务体验。tracert/traceroute看从本机到目标经过了哪些跳数哪一跳开始延迟飙升或丢包。pathpingWindows下比 tracert 更实用会采集每个节点的丢包和延迟但耗时较长。nslookup/dig看DNS解析结果和解析耗时。netstat -an看本机建立的TCP连接状态有没有大量 SYN_SENT、TIME_WAIT。ss -sLinux下看协议统计快速判断重传、异常连接。常见误区是拿 ping 通不通来判断服务是否可用。ICMP 通不代表 TCP 端口通服务进程占用过高照样会拒绝连接。真正稳的做法是测真实业务端口Windows 用Test-NetConnection 目标IP -Port 443Linux 用nc -vz 目标IP 443。这两个工具能直接告诉你“端口通不通”。5.3 抓包排查案例一个网页打开缓慢的问题定位全过程讲一个真实案例。有段时间内部系统打开页面需要七八秒其他公网网页都很快。第一反应是服务器慢但开发说访问量很低。我按链路逐段查本机 ping 内网网关正常ping 服务器IP正常TCP 连接建立也很快但 HTTP 请求发出后迟迟等不到响应。于是用 Wireshark 在服务器侧抓包重点看 TCP 层有没有大量重传。抓包结果显示一个诡异现象服务器发的数据包有很多重复 ACK客户端不断请求重传缺失的包。继续对比才发现服务器和客户端之间有一个防火墙设备在做“应用层检测”这个设备把 TCP 流量拆开重组导致处理不过来触发了重传。绕开或调整防火墙策略后问题消失。这个案例说明抓包不是看有没有包而是对比时序、序号和重传率才能定位是链路丢包还是中间设备惹的祸。5.4 无线干扰与MTU误配置两个最容易被忽视的瓶颈家用和办公网络里无线干扰是最大隐形杀手。同一个 Wi-Fi 信道里设备太多信号会互相踩踏。可以定期用手机上的 Wi-Fi 分析工具看哪几个信道占用高然后把路由器信道改成空一点的。也别迷信“信号满格”我见得很频繁的情况是设备显示 -50dBm但实际速率只有几十兆因为周边射频环境太脏。另一个坑是 MTU最大传输单元配置错误。PPPoE 拨号网络通常建议 MTU 设为 1492比以太网的 1500 少 8 字节。如果路由器用了默认 1500有些网站会呈现“打开异常、图片加载不出来、QQ能上但浏览器不行”的状态。排查方法是在本机用 ping 带-f -l参数测最大不分片包大小再调整路由器 MTU。问题不大但猜不到就会折腾很久。6. 家庭组网中容易被忽视的通信细节带宽单位、双频与网线等级前五章讲的是原理最后一章落回日常。很多人家里的网络不好不是宽带不够快而是设备规划和线路细节出了问题。作为经常帮朋友调网络的人我总结了几条最容易被忽略的细节。6.1 100M宽带为什么下载只有10MB/sbit和Byte的换算运营商说的“100M”指的是 100Mbps也就是每秒100兆比特。普通下载工具显示的是 MB/s也就是每秒兆字节。1字节等于8比特所以理论上 100Mbps 的下载峰值是 12.5MB/s去掉协议开销和线路损耗能跑到 10MB/s 就不错了。那些推荐“千兆路由器”的人说的也是千兆比特每秒换算下来理论下载约 110MB/s。很多人被这个单位坑了以为升级到500M后下载能到500MB/s。实际只到60-70MB/s就觉得运营商偷工减料。我的建议是测速时直接用 Speedtest它会同时标注 Mbps 和 MB/s省得自己换算。也别拿无线路由器的协商速率来判断宽带快慢Wi-Fi 的协商速率是空中接口速率实际吞吐通常只有协商速率的一半左右。6.2 路由器双频合一到底好不好如何分配设备双频路由器会同时提供 2.4GHz 和 5GHz 两个频段。2.4GHz 穿墙好但干扰大速率慢5GHz 速度快穿墙差。所谓“双频合一”是让设备自动选择频段听着省心实际操作里经常出问题很多智能家居只支持2.4GHz手机又总挂在不稳定的5GHz信号上频繁切换反而卡顿。我个人的做法是关掉“双频合一”给两个频段分开设置Wi-Fi名称。手机、笔记本、电视连5GHz智能摄像头和插座连2.4GHz。这样才能保证高速设备不吃低速设备的亏。当然如果你家面积大得放两台路由器最好把主路由和副路由之间的回程链路走有线别用无线Mesh回程无线中继会让整网延迟和速率都受损耗。6.3 网线类别与协商速率为什么换了千兆路由器还是百兆速度这是一个特别经典的问题路由器换了千兆的、光猫也换了千兆口但电脑链路速度显示只有100Mbps。原因多数是网线不合格或没接对8根线。百兆网络只用到1、2、3、6四根线千兆必须用到全部8根。如果面板模块或水晶头只接了4根线协商速率永远锁死在100Mbps。检查办法很简单Windows下看网络适配器的“速度”字段Linux下用ethtool eth0看 Speed。如果显示 100Mb/s先换一根正规六类线试还不行就检查水晶头和面板模块的线序。顺便说一句线序不是只看颜色而是1-2、3-6、4-5、7-8要按568B标准绞合对应很多改造施工只保证颜色通不保证线对关系结果就是千兆变百兆。6.4 最后一点实践经验如何规划家里的网络通信如果把家里的网络当成一个迷你版互联网来规划你的排障就会变得很简单。规划顺序是光猫运营商入口→ 路由器NAT与DHCP→ 交换机可选→ 各房间网线 → 无线AP或Mesh子节点。每一跳都留有测试点哪一段出问题就替换到哪一段。固定设备能走有线就走有线尤其是电视、电脑和NAS无线留给手机平板这类不方便插线的设备。我自己装修时在电视墙、书桌、每个房间都预埋了双网线主线备用一条到现在都觉得值。哪怕现在用不上以后摄像头、NAS、IPTV都可能需要独立线路。没有网线的房间也预留了吸顶AP的接线位。这样即使未来宽带提速线路依然够用不用重新砸墙。网络通信不只是一堆协议也体现在这些看得见的线缆和面板上。把基础设施做好后面的问题自然少。
返回列表