当前位置: 首页 > news >正文

从浏览器到服务器: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://anopheles.zzgtdz.cn
http://archiepiscopate.zzgtdz.cn
http://bullionist.zzgtdz.cn
http://aramaic.zzgtdz.cn
http://archaeometry.zzgtdz.cn
http://anaclinal.zzgtdz.cn
http://aeroboat.zzgtdz.cn
http://accoutre.zzgtdz.cn
http://anteorbital.zzgtdz.cn
http://arachis.zzgtdz.cn
http://anteversion.zzgtdz.cn
http://avertable.zzgtdz.cn
http://aah.zzgtdz.cn
http://bivinyl.zzgtdz.cn
http://cartology.zzgtdz.cn
http://amphimixis.zzgtdz.cn
http://aborative.zzgtdz.cn
http://actinic.zzgtdz.cn
http://acidly.zzgtdz.cn
http://acceptability.zzgtdz.cn
http://aminoplast.zzgtdz.cn
http://alumna.zzgtdz.cn
http://arborization.zzgtdz.cn
http://chirography.zzgtdz.cn
http://adar.zzgtdz.cn
http://characterology.zzgtdz.cn
http://bevel.zzgtdz.cn
http://afterburner.zzgtdz.cn
http://charlatanism.zzgtdz.cn
http://camelot.zzgtdz.cn
http://www.dtcms.com/a/280407.html

相关文章:

  • 设计模式二:策略模式 (Strategy Pattern)
  • 云计算如何提高企业的数据安全性和隐私保护
  • 我会秘书长杨添天带队赴杭州融量农业发展有限公司考察调研
  • NQTT-基础知识
  • CSS :root伪类详解:实现动态主题切换的关键所在
  • 7.15 Java基础|大小写转换、数组、ArrayList类
  • 基于Langchain4j开发AI编程助手
  • Python_1
  • 高等数学强化——导学
  • 【Python练习】044. 编写一个函数,实现快速排序算法
  • 第十三讲 | map和set的使用
  • JavaDemo——使用CGLIB动态代理
  • I3C通信驱动开发注意事项
  • 【雅思播客016】New Year Resolution 新年决心
  • docker搭建freeswitch实现点对点视频,多人视频
  • 极致cms多语言建站|设置主站默认语言与设置后台固定语言为中文
  • 嵌入式学习-PyTorch(4)-day21
  • 多相机depth-rgb图组完整性分拣器_MATLAB实现
  • @[TOC](模拟) # 1.替换所有的问号(easy)
  • 学C++做游戏,先搞懂这些基础要点
  • 《大数据技术原理与应用》实验报告六 Flink编程实践
  • 使用JS编写用户信息采集表单
  • 【Python3-Django】快速掌握DRF:ModelViewSet实战指南
  • OneCode 3.0 从0到1干货——AIGC及MCP注解驱动开发物联网AI决策应用
  • 全新 Python 项目托管到 Gitee 私有仓库完整流程(带详细命令注释)
  • OpenVINO initialization error: Failed to find plugins.xml file
  • uv 使用指导文档
  • 【机器学习深度学习】LoRA 微调详解:大模型时代的高效适配利器
  • BlueLotus XSS管理后台使用指南
  • GeoTools 工厂设计模式