从浏览器到服务器:TCP 段的网络传输之旅

本文以简化的网络架构为例,详细介绍了当你在浏览器中输入网址(例如www.google.com)并按下回车键后,TCP段的完整传输过程。我们将探讨DNS解析、ARP、TCP/IP封装、PAT和路由如何协同工作,将数据从个人电脑通过局域网和广域网发送到谷歌的服务器。需要注意的是,本文为了便于学习,展示的是一个基础案例,而实际应用中的网络实现往往更为复杂。

在这里插入图片描述

1. DNS解析:将域名转换为IP地址

当你输入www.google.com这样的域名时,浏览器首先需要将其解析为IP地址才能发起通信,步骤如下:

  1. 系统会检查本地DNS缓存,包括/etc/hosts文件或操作系统缓存。
  2. 如果在本地缓存中未找到对应记录,就会向电脑中配置的DNS服务器(通常由互联网服务提供商或路由器提供)发送DNS查询请求。
  3. DNS服务器会返回对应的IP地址(例如142.250.190.132)。
  4. 此时,浏览器已准备好与目标IP地址建立TCP连接。

2. 准备建立TCP连接

在发送数据包之前,系统需要做一些准备工作:

  1. 源IP地址:网卡的IP地址。
  2. 目的IP地址:从DNS服务器获取到的IP地址。
  3. 源MAC地址:网卡的MAC地址。
  4. 目的MAC地址:
    • 如果目标设备与本机在同一子网,可通过ARP协议获取其MAC地址。
    • 如果目标设备在不同子网(通常情况如此),数据包必须经过默认网关转发,因此需要获取网关的MAC地址。

系统如何获取网关的MAC地址:通过ARP(地址解析协议)

  1. 利用子网掩码判断目标设备是否在子网外。
  2. 如果是,发送ARP广播:“谁拥有192.168.1.1这个IP地址?”
  3. 网关会回复其MAC地址。
  4. 个人电脑会将该MAC地址缓存起来,以便后续进行帧封装。

3. 数据封装:四层协议栈

  1. 应用层(HTTP消息):
    • 例如,GET / HTTP/1.1请求。
  2. 传输层(TCP段):
    • 添加源端口和目的端口(例如,40000 → 443,443是HTTPS的默认端口),源端口是操作系统分配的动态端口(1024-65535,例如40000)。
    • 必要时对数据进行分段。
  3. 网络层(IP数据包):
    • 添加源IP地址和目的IP地址。
    • 其他字段:TTL(生存时间)、校验和等。
  4. 数据链路层(以太网帧):
    • 添加源MAC地址和目的MAC地址。
    • 包含一个带有FCS(帧校验序列)的尾部,用于错误检查。

最后,完整的以太网帧会被发送到局域网交换机。

4. 通过交换机发送到网关(第二层)

交换机维护着一张MAC地址表。例如:00:1A:2B:3C:4D:5E → Gi0/1, VLAN 10,表示拥有该MAC地址的设备连接在Gi0/1端口。

  1. 当交换机从某个端口接收到帧时,会检查源MAC地址与该端口的映射关系是否存在于表中。如果不存在,就将该映射添加到表中。
  2. 交换机检查网关的目的MAC地址是否存在于表中。
  3. 如果不存在,交换机就会将帧从除源端口之外的所有端口发送出去。网关收到广播帧后,会回复其MAC地址(例如00:1A:2B:3C:4D:5E)。交换机随后会将这个MAC地址与端口的映射记录到表中,这样后续发往网关的帧就可以直接转发(不再需要广播)。

5. 网关执行PAT(端口地址转换)

如果个人电脑使用私有IP地址,边缘路由器(PAT设备)必须进行地址转换:

  • 源IP地址:从私有IP地址(例如192.168.1.100)转换为路由器的公网IP地址(例如203.0.113.10)。
  • 源端口:替换为临时的公网端口(例如50000)。
  • PAT表条目:192.168.1.100:8080 → 203.0.113.10:50000。

之后,路由器会将修改后的IP数据包转发到广域网。

6. 广域网中的路由器:寻找最短路径

路由表的构建方式有两种:手动配置(静态路由)或通过动态路由协议自动生成(例如,用于内部网络的OSPF协议、用于互联网服务提供商之间通信的BGP协议)。这些协议通过交换路径信息来找到最佳路由。每台广域网路由器都维护着一个路由表数据库,该数据库将目的IP网络映射到:

  • “下一跳”路由器(路径中的下一台路由器)。
  • 出接口(用于发送数据包的物理端口)。
  • 度量值(例如跳数、带宽、延迟),用于确定“最佳”路径。

路由决策过程:

  1. 检查IP头部:TTL、校验和等。
  2. 最长前缀匹配:将目的IP地址与最具体的网络进行匹配。
  3. 选择最佳路径:基于成本最低的度量值。
  4. 更新头部:
    • 递减TTL值。
    • 将目的MAC地址替换为下一跳路由器的MAC地址。
  5. 转发到下一跳路由器。

这个过程会逐跳重复,直到数据包到达目标所在的本地互联网服务提供商。

7. 最终交付与解封装

最后一台路由器确定该数据包属于某个直接连接的局域网段:

  1. 它将帧转发到交换机或直接转发到服务器。
  2. 服务器接收到帧后开始解封装:
    • 数据链路层 → 网络层 → TCP段 → HTTP消息。
  3. 该消息最终由应用程序(例如Nginx或Apache等Web服务器)处理。

8. 服务器如何响应

服务器的响应遵循与请求相同的封装过程,但源IP地址、目的IP地址以及源端口、目的端口是反向的(例如,源IP地址:谷歌服务器的IP地址;目的IP地址:经过PAT转换后的个人电脑私有IP地址)。

  • 服务器生成响应并发送回去。
  • 在第一台路由器(PAT网关)处,利用PAT表进行映射:203.0.113.10:50000 → 192.168.1.100:8080。
  • 路由器相应地重写IP地址和端口字段,并将数据包转发回个人电脑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89417.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCIE - 云计算拿下后的职业选择如何规划?

Hello!大家好,小编是一名专注 IT 领域的资深探索家。我们聊聊HCIE - 云计算,这个认证作为华为认证体系中云计算领域的专家级认证,标志着持有者具备企业级云架构设计、复杂云平台运维及跨场景技术落地能力。但认证本身只是职业进阶…

1-创建Vue3项目

创建Vue3项目前提 已安装 18.3 或更高版本的 Node.js vue 官网 https://vuejs.org/ 创建一个 Vue 应用 ① 新建项目目录,使用 VSCode 打开 VSCode 可安装 Vue-Official 插件协助开发 ② 执行 create vue 指令创建 vue 应用 npm create vuelatest这一指令将…

Codex,Copilot 是什么

Codex是什么 Codex 是 OpenAI 研发的一款专注于代码生成的大型语言模型,它可以根据自然语言描述自动编写程序代码,在软件开发、自动化测试等领域展现出了强大的应用潜力。下面为你详细介绍: 1. 核心功能 代码生成:Codex 能够依据自然语言指令生成代码,像函数、类或者完整…

Typecho插件开发:自定义表单验证规则addRule实战指南

文章目录 Typecho表单验证进阶:为插件和主题添加自定义addRule验证规则 引言 一、Typecho表单验证基础 1.1 Typecho表单系统概述 1.2 addRule方法解析 二、自定义验证规则实现 2.1 创建自定义验证类 2.2 注册自定义验证规则 2.3 使用自定义验证规则 三、高级验证场景实现 3.1 …

数据分布是如何影响目标检测精度的

文章目录一、研究背景与目标模型效果提升数据集优化二、研究问题明细各方向的关联性与核心逻辑1. 高质量数据集的高效筛选与主动学习应用2. 基于推理结果的数据补充与增强方向优化3. 多类别场景下目标尺度与模型精度的关联性4. 损失函数与数据增强对精度的量化影响5. 目标类型专…

Python 网络爬虫 —— 代理服务器

一、会话(Session)(一)核心逻辑HTTP 本身无记忆,每次请求独立。会话(Session) 就是为解决这问题,让客户端(浏览器)和服务器 “记住” 交互状态(比…

Vue在线预览Excel和Docx格式文件

前提:本次示例基于Vue2.x,所用插件为Vue-Office。 一、Vue-Office 插件简介 Vue-Office 是一个一站式解决方案,支持多种 Office 文件格式的在线预览,包括: Word(.docx)Excel(.xlsx、…

提升(Boosting)及 Python 示例

咱们结合这张图,把 “提升” 想象成 “做错题本 请老师补课” 的过程:第一波数据(最上面的圆圈):“第一次作业”假设你第一次做 100 道数学题(图中圆圈里的绿点白点代表不同的题),做…

【生产实践】Linux中NAS挂载丢失后提示“过旧的文件句柄”错误解决

太长不看版: 问题:nas挂载在系统里掉了,使用df或ls访问目录提示过旧的文件句柄解决过程: 和机房联系,发现NAS服务器重启了重新执行mount发现挂不上先umount掉当前挂载,再重新执行mount命令问题解决 umount …

JUnit4

JUnit4 介绍JUnit 是 Java 编程语言的单元测试框架,用于编写和运行可重复的自动化测试。JUnit 特点:JUnit 是一个开放的资源框架,用于编写和运行测试。提供注解来识别测试方法。提供断言来测试预期结果。JUnit 测试允许你编写代码更快&#x…

Python-TCP编程-UDP编程-SocketServer-IO各种概念及多路复用-asyncio-学习笔记

序 欠4前年的一份笔记 ,献给今后的自己。 网络编程 Socket介绍 Socket套接字 Python中提供socket.py标准库,非常底层的接口库。 Socket是一种通用的网络编程接口,和网络层次没有一一对应的关系。 协议族 AF表示Address Family,用于…

Mybatis-开发一个类似mybatisplus的mybatis扩展,该怎么入手?

开发一个类似mybatisplus的mybatis扩展,该怎么入手? 要开发一个类似于 MyBatis-Plus 的 MyBatis 扩展框架,你需要从以下几个核心方面入手,逐步构建出一个功能完整、易用性强、兼容性好的增强型 MyBatis 框架。🧱 一、整…

深入了解linux系统—— 信号的捕捉

前言 信号从产生到处理,可以分为信号产生、信号保存、信号捕捉三个阶段;了解了信号产生和保存,现在来深入了解信号捕捉。 信号捕捉 对于1-31号普通信号,进程可以立即处理,也可以不立即处理而是在合适的时候处理&#x…

twikitFKS: 基于 twikit 2.3.1 的改进版本

twikitFKS: 基于 twikit 2.3.1 的改进版本 项目概述 关于 twikit twikit 是一个优秀的 Twitter API 爬虫库,它的核心优势在于无需 API Key即可访问 Twitter 功能。通过网页爬虫技术,twikit 实现了: 发布推文和媒体内容搜索推文和用户获取…

C Primer Plus 第6版 编程练习——第9章(下)

7.编写一个函数,从标准输入中读取字符,直到遇到文件结尾。程序要报告每个字符是否是字母。如果是,还要报告该字母在字母表中的数值位置。例如,c和C在字母表中的位置都是3。合并一个函数,以一个字符作为参数&#xff0c…

如何用文思助手改好一篇烂材料

在日常工作中,我们常常会遇到这样的问题:因为工作要使用到之前写的文章再看发现内容杂乱无章、或者收到的一些返稿内容质量差,不修改无法使用。但其实它们可能只是缺少了系统性的梳理与打磨。今天我们就来聊一聊,如何对一些不满意…

VSCODE常规设置

摘要:用于新下载的vscode设置一些个人化的操作在 "Files: Auto Save" 下拉菜单中,选择你想要的自动保存模式。常见的选项包括:"off":禁用自动保存。 "afterDelay":在你停止编辑一段时间…

2025秋招突围战:AI智能监考如何重构远程笔试公平防线?

2025秋招季即将来临,企业校招规模预计突破百万量级,远程笔试成为主流筛选方式。然而,传统监考模式暴露出作弊行为难追溯、人力成本过高、数据维度单一等痛点,让HR陷入“效率与公平”的两难困境。牛客AI智能监考系统,通…

Python 基础语法与数据类型(十三) - 实例方法、类方法、静态方法

文章目录1. 实例方法 (Instance Methods)1.1 特点与语法1.2 实例方法示例2. 类方法 (Class Methods)2.1 特点与语法2.2 类方法示例3. 静态方法 (Static Methods)3.1 特点与语法3.2 静态方法示例4. 三种方法的对比总结总结练习题练习题答案创作不易,请各位看官顺手点…

Wireshark的安装和基本使用

文章目录一、Wireshark介绍二、Wireshark安装三、Wireshark讲解1.界面介绍(1)分组列表(2)分组详情(3)分组字节流一、Wireshark介绍 Wireshark 是一款开源的网络协议分析工具,能够捕获、过滤和分…