尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

计算机网络篇2:网络传输流程:数据从你的电脑到对方手机,中间发生了什么?

计算机网络篇2:网络传输流程:数据从你的电脑到对方手机,中间发生了什么? 你点下发送对方几秒内就收到了。这一来一回背后数据经历了封装、传输、解包三大步。这篇文章用快递这条主线把网络传输流程一次讲透。全文没有一句废话每节都埋了知识拓展。一、先解决世界观互联网为什么不只是一台大型计算机很多新手有个朴素的想法网络这么厉害干脆把全世界所有电脑合成一台超级计算机不就完了为什么要搞这么多台先看看网络是怎么一步步长出来的阶段形态说明独立模式每台计算机孤军奋战数据不共享各干各的网络互联几台连在一起开始数据共享局域网LAN更多机器通过交换机、路由器连起来覆盖一栋楼、一个园区广域网WAN远隔千里的机器连起来覆盖全球就是今天的互联网为什么不搞一台巨型计算机物理上不现实电脑分布在全球各地厂商不同、系统不同谁也没法把它们物理合并。管理上不可行一台巨型机 单点故障 单一管理者没有任何公司能垄断全世界的算力。本质区别互联网是分布式巨型机是集中式。 知识拓展集中式 vs 分布式集中式如银行早期的单主机所有计算集中在一台机器终端只负责显示。好处是好管坏处是主机一挂全挂。分布式如互联网每台机器独立又协作单点坏了不影响全局。你今天刷的网页、发的消息背后都是分布式系统在支撑。二、开局一张图网络传输的完整旅程一句话概括网络传输流程发送方数据从应用层出发每经过一层就套一个报头封装最后由网卡发出去接收方数据从网卡进来每经过一层就撕掉一个报头解包最后交给应用程序。用快递打比方全文沿用这条主线你的消息内容 箱子里的货物每一层加上的报头 一张张快递单路由器中转分拣站发快递时货物被一层层打包收快递时再一层层拆箱——网络传输一模一样。三、局域网传输同城快递靠 MAC 找人同城快递重点就一句话这单是发给谁的3.1 认识网卡和 MAC 地址每台电脑要上网得有一块网卡Network Interface Card。网卡上烧录着一个全球唯一的编号MAC 地址。长度 48 位6 个字节用十六进制加冒号表示如08:00:27:03:fb:19出厂时确定正常情况下不变作用在同一条链路上唯一标识一台设备 知识拓展MAC 真的一点都不能改吗 常规理解出厂定死但技术上它只是网卡/系统里的一个配置项很多网卡驱动支持手动改 MAC俗称MAC 欺骗虚拟机里的 MAC 还可能重复冲突。所以MAC 固定是设计约定不是绝对铁律。用ifconfigLinux或ipconfigWindows就能查看本机网卡信息——IP 地址、MAC 地址、子网掩码都在这ifconfig //Linux ipconfig //Windowseth0: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500 inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 ether 08:00:27:03:fb:19 txqueuelen 1000inet是 IPether是 MAC。3.2 以太网原理一条共享的大马路IEEE 802.3以太网二层数据链路层通信依靠 MAC 地址完成局域网(共享宽带)内设备联络但是以太网本身不负责跨网段通信。以太网是局域网的主流技术标准由 IEEE 802 系列制定802.3 就是以太网。早期以太网里所有设备连在同一条线路上本质像一条大马路任何时刻只允许一台机器往路上发数据主机收到一个帧先看目标 MAC是发给我的就收不是就丢弃3.3 碰撞为什么多台设备会卡单台不卡这就是卡顿的真相两台机器同时发数据信号互相干扰 →数据碰撞多台设备共享网络时碰撞频繁碰撞后要等待重发感知就是卡只有一台设备独享网络时没人抢马路不碰撞、不卡那碰撞了怎么办以太网有一套成名机制CSMA/CD载波监听多路访问/冲突检测先听再发马路空着才发否则等着边发边检一旦发现碰撞立刻停止指数退避随机等一小段时间再重发等待时长随重试次数指数翻倍防止大家又同时抢线 知识拓展有没有天生不碰撞的方案——令牌环网 既然碰撞这么烦能不能从根上避免IBM 的令牌环网就是这套思路网上有一个令牌不断绕圈谁拿到令牌谁才有权发言永不碰撞。但代价是要等令牌、实现复杂、成本高最后被更简单便宜的以太网淘汰。 这也侧面说明一个道理简单、便宜有时比完美更重要。3.4 交换机把大马路变成独立车道既然没有交换机的以太网是一个完整的碰撞域所有主机共享带宽、随时可能碰撞那么一个很自然的问题就是能不能把一个大的碰撞域拆成几个小的让不同组的主机同时发送数据而互不干扰这正是交换机要解决的问题 —— 它通过端口隔离和 MAC 地址学习把每个端口变成独立的碰撞域从而突破共享以太网的性能瓶颈。下面我们就来讲交换机是如何做到这一点的。 知识拓展抓包为什么能抓到别人的包 在共享式以太网集线器时代所有帧会发给网上的每一台机器主机靠目标 MAC 决定收不收。如果网卡开启混杂模式Wireshark 就是这么干的就来者不拒把别人的包也收下分析——这就是抓包的本质。四、跨网络传输异地快递靠 IP 指路同城快递靠门牌号MAC就够异地快递得先知道这单该发往哪个城市——IP 地址出场。4.1 IP 地址动态的你在哪IPv4 是 32 位4 字节整数写成点分十进制如192.168.1.10每段范围 0~255作用在整个互联网范围标识一台主机回答一个经典疑问没联网时电脑有 IP 吗联网后的 IP 是路由器给的吗没联网就没有 IP联网后IP 通常由DHCP 协议动态分配——家庭环境里 DHCP 服务一般就搭在路由器上所以你可以直观理解成路由器给的路由器从地址池里挑一个空闲 IP租给你租期到了还可能换于是得出一条关键对比IP 是你在哪是动态的MAC 是你是谁相对固定。4.2 路由器转发剥开、看路、重新封装跨网络时数据要经过一个或多个路由器。路由器在每一跳只干三件事解包剥掉链路层的快递单帧头取出 IP 目标地址查路由表决定这个包该往哪个方向转下一跳是谁重新封装换上新的快递单新的源/目标 MAC转发出去于是有了网络传输最经典的一句话路由过程中MAC 地址每一跳都在变IP 地址从头到尾不变。IP 是目的地负责从起点到终点的路径规划全程不变MAC 是下一站只负责这一跳怎么走每过一个路由器就换一批 知识拓展换乘地铁 把一次跨城传输想成坐地铁换乘IP 是从我家到对方家的最终目的地每一站的 MAC 是当前这站下车后该走哪个出口。每换乘一次你都要重新看站牌查路由表、换乘票换 MAC但目的地从来没变。 知识拓展路由器怎么知道下一跳的 MAC——ARP 路由器知道目标的 IP但它发出去的是帧帧头得填目标 MAC。这时用到ARP 协议在本地广播谁是 192.168.1.x目标机器回一句我是我的 MAC 是 xx:xx:xx:xx:xx:xx。查到的结果会缓存下次直接用。4.3MAC和IP在传输过程中的联系与区别MAC 地址是网卡出厂固化的硬件身份工作在数据链路层只在同一个局域网内部有效用来识别当前链路上的具体设备无法穿越路由器传到外网IP 地址是网络层的逻辑地址由路由器或运营商动态分配、可以随时变化但同一时刻在同一网络范围内具有唯一性负责全球互联网的寻址定位。二者在传输中紧密配合同一局域网内主机通过 ARP 协议用 IP 查询到对方 MAC 后封装以太网帧直接交付真正寻址靠 MAC跨网段时主机把帧的目标 MAC 填成网关路由器的 MAC路由器收到后拆掉旧 MAC 头部、查路由表确定下一跳、再用 ARP 获取下一跳 MAC 并重新封装转发如此一路接力 ——整个过程中 IP 头部源 IP 和目标 IP从头到尾保持不变而 MAC 地址每经过一台路由器就被重写一次IP 代表最终要送达的地址MAC 只代表当前这一段链路的交接对象。4.4 跨网段通信中的路由器封装与解封装过程用户 A 与跨网段的用户 B 通信时主机 A 判断目标不在同一局域网完成数据封装后将二层帧发送给路由器路由器收到帧后剥离链路层 MAC 帧头读取 IP 报文内的目的 IP 查询路由表随后使用新的源 MAC 和目的 MAC 对 IP 报文重新封装并转发整个传输过程中源 IP、目的 IP 始终保持不变仅每一跳的 MAC 地址发生变化数据到达用户 B 后逐层解封装最终交付上层应用。这个过程五、核心机制封包与解包报头 有效载荷流程讲完了回到最核心的机制——数据到底是长什么样地在网络上跑的。5.1 报文 报头 有效载荷报头header对应协议层的结构体字段记录这层协议需要的信息有效载荷payload真正要传的数据结论报文 报头 有效载荷不同层的报文名字不一样层报文名称传输层段segment网络层数据报datagram链路层帧frame发送时每层加一个头封装接收时每层剥一个头解包再根据报头里的上层协议类型字段把数据交给正确的上层协议。5.2协议栈的封装与解封装你发送的你好并不是电脑直接发给对方的——主机之间通信本质是两个协议栈在对话。数据要依次穿过应用层、传输层、网络层、数据链路层最后由网卡发出对方再反向一层层送回应用层。发送发送过程叫封装每一层都在上一层数据前面加上自己的协议报头就像套娃一样应用层数据 → 加传输层报头 → 加网络层报头 → 加链路层报头 → 网卡发出为什么必须自上而下因为数据要贯穿整个操作系统和协议栈而OS 是网卡的管理者应用层不能跳过中间层直接找硬件。接收接收过程叫解封装方向正好相反每一层先分离自己的报头和有效载荷再把载荷交给上一层对应的协议直到应用层拿到原始数据。有意思的是每一层协议都以为自己在和对方同层直接通信——这是一种虚拟的直接通信实际上数据都要经过下面各层的封装和解封装才能到达。5.2.1三个关键细节报头的两个能力能分离报头和有效载荷能指明该把载荷交给上层哪个协议。不是我的就丢弃数据链路层发现目标地址不是自己直接丢弃不往上送。入线与出线数据从网卡进协议栈叫入线从协议栈送到网卡叫出线。总结封装与解封装就是网络数据的一次打包—运输—拆包之旅。发送方层层加报头接收方层层拆报头每一层各司其职最终让数据准确无误地从一台电脑到达另一台电脑。5.3 协议的本质双方都认识的结构体所谓协议就是通信双方都认识的一种结构化的数据类型。用 C 语言表达最直观——只要收发双方用同一份结构体定义就天然有了共识// 约定的协议结构体收发双方都有同一份定义 struct protocol { int a; int b; int c; };真实的网络协议头也是同一套路比如简化的以太网帧头和 IP 报头// 以太网帧头简化 struct eth_hdr { unsigned char dst_mac[6]; // 目标 MAC unsigned char src_mac[6]; // 源 MAC unsigned short ether_type; // 上层协议类型0x0800 表示 IP }; // IP 报头简化 struct ip_hdr { unsigned char version_ihl; // 版本 头部长度 unsigned char tos; // 服务类型 unsigned short total_len; // 整个数据报长度 unsigned short id; // 分片标识 unsigned short frag_offset; // 分片偏移 unsigned char ttl; // 生存时间防止包无限转圈 unsigned char protocol; // 上层协议6TCP17UDP unsigned short check_sum; // 校验和 unsigned int src_ip; // 源 IP unsigned int dst_ip; // 目标 IP }; 知识拓展TTL 字段 IP 头里的ttl生存时间每过一个路由器减 1减到 0 直接丢弃。相当于给数据包设了个寿命防止它因为路由环路在网络里永远转圈。5.4 为什么协议要分层——高内聚、低耦合软件分层的两大好处网络协议同样适用高内聚每一层只专心干自己那件事——链路层管帧、网络层管寻址、传输层管可靠传输低耦合层与层只通过定义好的接口打交道某一层内部怎么改不影响其他层所以当传输介质从双绞线换成光纤只需要动物理层/链路层应用层代码一行都不用改——这就是分层最大的红利。 知识拓展为什么实际用 5 层而不是 OSI 的 7 层 教科书常讲 OSI 七层模型但它偏理论。会话层、表示层的功能在实际中很难单独落地工程上最终收敛为TCP/IP 五层模型物理/链路/网络/传输/应用这也是操作系统内核和网卡真正实现的分层。六、硬件是怎么访问协议的有读者会好奇协议是软件网卡是硬件数据到底怎么从软件层一路落进网线里的一条完整链路应用程序 → socket 接口 → 内核协议栈传输→网络→链路→ 网卡驱动 → 网卡硬件 → 网线协议栈是操作系统内核里的软件替应用层代跑封装网卡驱动是内核与硬件之间的翻译官内核把封装好的帧交给驱动驱动把数据写进网卡缓冲区网卡再按物理层规则电信号/光信号发出去接收方向刚好反过来网卡收到信号 → 中断通知内核 → 驱动把数据交给内核协议栈 → 一层层解包 → 最后交给应用程序 知识拓展socket 与端口号 数据到达目标主机后怎么知道要交给哪个进程靠端口号。IP 标识主机端口号标识进程IP 端口号 socket套接字可唯一标识互联网上的一个进程{源IP, 源端口, 目标IP, 目标端口}这个四元组能唯一标识一段通信所以网络通信的本质其实是进程间的通信。你写网络编程本质就是用 socket 系统调用让两个进程隔着网络对话。七、总结一句话记住网络传输流程把全文压缩成一句话数据从应用层出发每层套一个头封装→ 靠 MAC 走完局域网、靠 IP 跨过路由器MAC 每跳在变IP 始终不变→ 到达目标主机后每层剥一个头解包→ 按端口号交给目标进程。三个记忆锚点封装 套头解包 撕头中间靠上层协议类型字段接力IP 是目的地你在哪MAC 是下一站你是谁路由器剥开重新封装所以 MAC 变、IP 不变如果这篇文章帮你理清了网络传输的主线欢迎点赞收藏。下一篇可以深入 TCP 三次握手或者用 Wireshark 抓包实战把本文讲的每一层头部亲手拆开看一遍——亲眼看到比读十遍都管用。
返回列表