公司动态
数据包在OSI各层之间的封装与解封装过程
一、一个值得思考的问题当你在浏览器中输入一个网址按下回车到网页内容呈现在屏幕上——数据在这个过程中经历了什么大多数人知道数据从网线发出去到了服务器再回来。但很少有人能说清楚数据在发送端从应用层一路向下每一层做了什么到了接收端又是怎么恢复成原始数据的这就是封装与解封装的过程。二、封装自上而下逐层添加控制信息数据在发送端从应用层开始逐层向下传递。每一层在收到上层数据后会加上自己的控制信息通常是头部Header然后交给下一层。这个过程叫做封装Encapsulation。2.1 各层数据单位的名称变化在封装过程中数据在不同层级有不同的名称层级数据单位名称说明应用层数据Data用户原始数据传输层数据段Segment添加TCP/UDP头部网络层数据包Packet添加IP头部数据链路层数据帧Frame添加MAC头部和FCS尾部物理层比特流Bit转换为电信号或光信号2.2 一个完整的封装流程场景你访问一个网页浏览器构造了一个HTTP请求请求首页内容。第一步应用层应用层HTTP协议构造请求报文textGET /index.html HTTP/1.1 Host: www.example.com User-Agent: Chrome/...这段文本就是原始数据。应用层把这个数据交给下一层传输层。此时数据单位称为数据Data第二步传输层传输层收到数据后根据应用层的要求选择TCP或UDP协议。假设使用的是TCP协议。传输层做三件事将数据分割成适合传输的“数据段”添加TCP头部源端口、目的端口、序列号、确认号等将数据段交给网络层TCP头部包含的关键字段源端口Source Port浏览器动态分配的端口号目的端口Destination Port80HTTP或443HTTPS序列号Sequence Number数据段编号用于接收端重组确认号Acknowledgment Number确认已收到的数据标志位FlagsSYN、ACK、FIN等控制标志此时数据单位称为数据段Segment第三步网络层网络层收到数据段后进行以下操作在数据段前面添加IP头部查询路由表决定从哪个网卡发出IP头部包含的关键字段源IP地址Source IP发送设备的IP地址目的IP地址Destination IP接收设备的IP地址TTLTime to Live数据包的生存时间协议号Protocol标识上层使用的是什么协议6TCP17UDP此时数据单位称为数据包Packet第四步数据链路层数据链路层收到数据包后进行以下操作在IP包前面添加MAC头部在IP包后面添加FCS帧校验序列尾部MAC头部包含的关键字段源MAC地址发送网卡的MAC地址目的MAC地址接收端或下一跳路由器的MAC地址类型Type标识上层协议0x0800IPv40x0806ARPFCS尾部包含CRC校验码用于接收端检测数据是否在传输过程中出错。此时数据单位称为数据帧Frame第五步物理层物理层收到数据帧后将数据帧转换为比特流0和1的序列通过物理介质网线、光纤、WiFi发送出去。此时数据单位称为比特流Bit三、一个形象的类比封装过程可以用寄快递来理解网络层类比说明应用层数据信件内容你真正想说的话传输层TCP/UDP头部信封写上寄件人和收件人姓名端口号网络层IP头部快递面单写上寄件地址和收件地址IP地址链路层MAC头部尾部快递包装贴上快递单号MAC地址和防拆封条校验码物理层快递车运输实际运送信件内容逐层被封装最终变成可运输的包裹。接收端收到后逐层拆开最终取出信件内容。四、解封装自下而上逐层剥离控制信息数据到达接收端后过程完全反过来——从物理层开始逐层向上每层剥离对应的控制信息最终恢复原始数据。这个过程叫做解封装De-encapsulation。4.1 解封装流程第一步物理层物理层收到比特流将其还原为数据帧交给数据链路层。第二步数据链路层数据链路层做三件事检查FCS校验码确认数据在传输过程中没有出错如果校验通过剥离MAC头部和FCS尾部查看MAC头部中的“类型”字段确定上层协议IPv4→交给网络层此时数据还原为数据包Packet第三步网络层网络层做三件事检查IP头部确认目的IP地址是否为本机剥离IP头部查看IP头部中的“协议”字段确定上层协议6TCP→交给传输层此时数据还原为数据段Segment第四步传输层传输层做三件事检查TCP头部确认端口号根据序列号重组数据段剥离TCP头部此时数据还原为数据Data第五步应用层应用层收到原始数据根据协议HTTP解析请求或响应最终呈现给用户。五、完整过程示意图text发送端封装 接收端解封装 ┌─────────────┐ ┌─────────────┐ │ 应用层 │ │ 应用层 │ │ HTTP请求 │ │ HTTP请求 │ │ 原始数据│ │ 原始数据│ └──────┬──────┘ └──────▲──────┘ │ 添加TCP头部 │ 剥离TCP头部 ┌──────▼──────┐ ┌──────┴──────┐ │ 传输层 │ │ 传输层 │ │ TCP头部 │ │ TCP头部 │ │ 数据 │ │ 数据 │ └──────┬──────┘ └──────▲──────┘ │ 添加IP头部 │ 剥离IP头部 ┌──────▼──────┐ ┌──────┴──────┐ │ 网络层 │ │ 网络层 │ │ IP头部 │ │ IP头部 │ │ TCP头部 │ │ TCP头部 │ │ 数据 │ │ 数据 │ └──────┬──────┘ └──────▲──────┘ │ 添加MAC头部FCS │ 剥离MAC头部和FCS ┌──────▼──────┐ ┌──────┴──────┐ │ 数据链路层 │ │ 数据链路层 │ │ MAC头部 │ │ MAC头部 │ │ IP头部 │ │ IP头部 │ │ TCP头部 │ │ TCP头部 │ │ 数据 FCS│ │ 数据 FCS│ └──────┬──────┘ └──────▲──────┘ │ 转换为比特流 │ 还原为帧 ┌──────▼──────┐ ┌──────┴──────┐ │ 物理层 │ ──────网线/光纤────→ │ 物理层 │ │ 比特流 │ │ 比特流 │ └─────────────┘ └─────────────┘六、封装与解封装的关键点6.1 为什么要在每一层加头部每一层的头部包含了对等层通信所需的控制信息。这些信息只在发送端和接收端的同一层之间有意义。举例IP头部只在网络层之间有意义。传输层不关心IP头部的内容它只负责处理TCP头部。路由器的网络层在转发数据包时只需要查看IP头部中的目的IP地址和TTL值。路由器不关心TCP头部的内容。6.2 对等层通信的逻辑在OSI模型中发送端的第N层和接收端的第N层之间存在“逻辑通信”。它们通过协议进行对话但实际上数据经过了所有下层。形象理解两个公司的老板通过秘书传递文件。老板之间是逻辑通信实际传递靠秘书逐层传递。每个秘书只负责自己这一层的工作。6.3 数据在不同层级看到的范围不同应用层看到的是原始数据传输层看到的是端口号和数据网络层看到的是IP地址和数据数据链路层看到的是MAC地址和数据每一层只关心自己需要的控制信息对上层的数据内容“透明”。最后封装与解封装是网络通信中最基本、最重要的过程之一。发送端自上而下逐层添加控制信息接收端自下而上逐层剥离控制信息。每一层只处理自己负责的信息对上层数据内容不关心。这种分层设计确保了网络的灵活性和可扩展性。理解了这个过程你就能理解数据从你的电脑发出去经过路由器、交换机最终到达服务器中间每一步发生了什么。