数据包在客户端和服务端,以及网络设备间如何传输的?
声明:文章中图片来自于网络收集,整体流程自己梳理。
目录
问题:如下socket客户端请求数据包如何传输的?
拓扑环境
数据包在分层间传输
网络分层L2/L3/L4
数据包收发-在各分层间变化
各层头部中-核心信息
数据包在不同设备间传输
客户端数据包发送流程
DNS域名解析
添加L4 tcp头
添加L3 ip头
添加L2 eth头
中间设备-二层交换机
中间设备-三层路由器
路由器和交换机区别
路由器收包流程
路由器发包流程
服务端数据包接收流程
校验L2 eth头中目的mac
判断L3 ip头中目标ip
判断L4 tcp头中目标port
iptables-介入数据包处理流程
VMware-不同网络模型
Brigde-桥接模式:默认使用VMnet0
NAT模式 :默认使用VMnet8
Host-Only-仅主机模式:默认使用VMnet1
-
问题:如下socket客户端请求数据包如何传输的?
import socket
import ssl
import requests
# 伪代码展示底层流程
def send_request():# 解析 URLurl = 'http://www.test.com'host = 'www.test.com'port = 80# 创建 socket 连接s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 对于 HTTPS,使用 SSL/TLS# s = ssl.wrap_socket(s)# 连接到服务器s.connect((host, port))# 构造 HTTP 请求request = "GET / HTTP/1.1\r\nHost: www.test.com\r\n\r\n"# 发送请求s.send(request.encode())# 接收响应response = s.recv(4096)print(response.decode())# 关闭连接s.close()
# 使用 requests 库发送请求
response = requests.get('http://www.test.com')
-
拓扑环境
https://cloud.tencent.com/developer/article/1607505
浏览器客户端设备 与 web服务器设备间通信:


-
数据包在分层间传输
https://gitee.com/ixiaohuzi/CS-Base/blob/main/network/1_base/how_os_deal_network_package.md
https://blog.csdn.net/weixin_44471703/article/details/123307928
https://www.cnblogs.com/qishui/p/5437301.html
-
网络分层L2/L3/L4


-
数据包收发-在各分层间变化
以web客户端浏览器发包,服务端收包为例,介绍数据包在网络协议栈各层之间处理情况:

数据包发送时:
- 添加L4 tcp头,主要是填充源port和目的port。
- 添加L3 ip头,主要是填充源ip和目的ip。
- 添加L2 以太头,主要是填充源mac和目的mac。
数据包接收时:
- 判断L2 以太头,目的mac是否为本机的,是则交给上层处理,否则丢弃数据包。
- 判断L3 ip头,目的ip是否为本机的,是则交给上层处理,否则转发或者丢弃数据包。
- 判断L4 tcp头,目的port是否为本机侦听socket的,是则交给上层处理,否则拒绝连接。
各层头部中-核心信息
- 一个完整的数据包格式:

- L2以太网帧头:包含源和目的mac。

- L3 ip头:包含源ip和目的ip。

- L4 tcp头:包含源port和目的port。

-
数据包在不同设备间传输
客户端数据包发送流程
DNS域名解析
客户端请求时,优先做域名解析,得到服务器ip:
[root@VScan /]# curl www.test.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx 172.18.110.105!</title>
</head>
<body>
<h1>Welcome to nginx 172.18.110.105!</h1>
</body>
</html>
先查找hosts文件中域名对应的服务器ip:
[root@VScan /]# cat /etc/hosts
172.18.110.105 www.test.com
未配置静态hosts文件,则请求DNS服务器获取域名对应的服务器ip:
[root@VScan /]# cat /etc/resolv.conf
nameserver 114.114.114.114
添加L4 tcp头
添加L4 tcp头,核心是填充源port和目的port信息:

- 创建一个socket连接时,使用五元组区分(即协议,源ip源port,目的ip目的port),使用 netstat 命令可以查看此连接的五元组信息。
- 源port选择:操作系统通常会从此连接上未使用的端口范围即 1024 到 65535 中选择一个port。
- 目的port:即客户端请求的服务器port。
添加L3 ip头
添加L3 ip头,核心是填充源ip和目的ip信息:
- 源ip选择:系统的网络协议栈会根据目的ip匹配路由表,确定发送数据包的出口网络接口,并将该接口的IP地址作为源IP。

- 目的ip:由应用层决定,通常通过直接配置或者DNS解析获得。
添加L2 eth头
添加L2 eth头,核心是填充源mac和目的mac信息:
- 源mac:使用之前路由匹配得到的出口网络接口,使用此网卡上mac作为源mac。
- 目的mac选择:
客户端和服务端处于同一网段,则通过arp获取目标主机的mac,作为目标mac。
客户端和服务端处于不同子网,则客户端通过arp请求获取网关的mac地址,作为目标mac。

中间设备-二层交换机
MAC地址学习:
- 交换机每个端口收到数据包后,记录源MAC地址与此端口的映射关系(即mac表),作为后续转发数据的依据。
数据包转发:通过数据包中目标mac查找自己的mac表,决定将该数据包转发到哪个端口。
- 如果交换机的MAC地址表中存在目标MAC地址的记录,交换机会将数据包转发到对应的端口。
- 如果MAC地址表中没有目标MAC地址的记录,交换机会将数据包广播到所有端口(除了接收端口),直到找到目标设备。
中间设备-三层路由器
路由器中nat模式,端口映射,三层交换机等功能省略介绍。
路由器和交换机区别
路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;
二层交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 IP 地址。
路由器收包流程
检查数据包L2头中目的mac,看看是不是发给自己网卡的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
根据数据包L3头中目标ip匹配自己的路由表,以找到相匹配的记录,知晓将数据包转发给哪个网卡。
- 将数据包中目标ip和路由表中每个条目的子网掩码做与运算,得到的结果与对应条目的目标地址比较是否相等,相等就会作为候选转发目标,如果不匹配就继续与下个条目进行路由匹配。
- 路由表中表项选择时,会选择最长前缀匹配的项,一个目的地址可能与多个表项匹配。子网掩码最长的即最长前缀匹配,与目的地址的高位匹配得最多的表项。
举例说明,路由表中有两项:
192.168.20.16/28 eth1
192.168.0.0/16 eth2
在要查找目标ip 192.168.20.19 的时候,这两个表项都“匹配”。
这种情况下,前缀最长的路由就是192.168.20.16/28,因为它的子网掩码(/28)比其他表项的掩码(/16)要长。
故数据包从 eth1 发出去。
- 找不到匹配项时,就会选择默认路由,即作为默认网关。
路由器发包流程

- 路由表项中网关列,是一个网关ip,说明数据包还未抵达终点,还需继续转发给此ip的网关设备。
- 路由表项中网关列,如果网关为空,则 IP 头部中的目标 IP 地址就是要转发到的目标设备,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点。
- 上面得到了 IP 地址之后,
在网络包传输的过程中,数据包中源IP和目标IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。
改写数据包中源MAC 地址,改为此路由匹配项得到的端口上的MAC地址。目的mac根据上面ip决定,如果是网关则为网关的mac,否则为对应设备的mac。
路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询此IP对应的mac地址,如果找不到则发送 ARP 查询请求。mac不存在则通过 ARP 协议根据 IP 地址得到对应的 MAC 地址,并将查询的结果作为目标 MAC 地址。
服务端数据包接收流程
校验L2 eth头中目的mac
判断L2 eth头中目标mac,为本机的mac则去除以太头,交由上层处理,否则丢弃此包。
判断L3 ip头中目标ip
判断L3 ip头中目标ip,为本机的ip则去除ip头,交由上层处理。不为本机ip,如果启用了转发机制,则查找路由表将数据包转发出去。
# cat /etc/sysctl.conf| grep net.ipv4.ip_forward
net.ipv4.ip_forward=1
判断L4 tcp头中目标port
判断L4 tcp头中目标port,为本机的socket侦听port,交由此侦听port的服务处理。未找到侦听port则回复 TCP RST拒绝连接。
-
iptables-介入数据包处理流程

- 五条链代表了不同的处理时机(即在数据包处理的哪个阶段),如:PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING执行什么规则。
- 五个表,只不过是对五条链设置的规则要存储在哪些表里(filter表/nat表/mangle表/raw表/security表),在匹配流量时要查表确定。
iptables介入数据包处理流程的5个阶段,对数据包做改写操作:
- PREROUTING 收到数据包后,对数据包做dnat,改写数据包中目的ip和port信息。多个内网服务共享一个外网ip对外提供服务。
- INPUT 对交由本机处理的数据包做检查,如限制特定的客户端ip访问本机服务。
- FORWARD 数据包不是给本机处理的,需要做转发处理,即数据包从本机的一个网络接口转发到另一个接口,可以过滤这些流量(允许对哪些ip或port的数据包做转发处理)。如将本机作为路由器使用,做数据包的转发。
- OUTPUT 用于检查本机生成并发送出去的流量。当数据包的源地址是本机时,允许或拒绝本机应用程序发起的流量。
- POSTROUTING 用于在数据包从本机离开时应用规则,通常用于源地址转换(SNAT),修改数据包的源ip和port信息地址。如客户端访问外网场景,将内网ip转为外网ip。
-
VMware-不同网络模型
【编辑】-【虚拟网络编辑器】-【更改设置】:根据应用场景添加网络设置不同的网络模型。

-
Brigde-桥接模式:默认使用VMnet0
应用场景:虚拟机与外部网络通信的场景,如虚拟机要访问互联网或与其他物理机器通信,虚拟机等同于宿主机类似的其他设备。
设置桥接网络连接到哪个物理网卡:

给虚拟机增加网卡时,设置网卡连接桥接模式网络,后续可以给此网卡配置此物理网卡所在的ip:

-
NAT模式 :默认使用VMnet8
应用场景:适合虚拟机访问外部网络,但无需外部访问虚拟机的场景。虚拟机通过宿主机的网络连接访问外部网络,但虚拟机不会直接暴露在外部网络中,宿主机负责进行网络地址转换。
查看NAT模式网络地址:

给虚拟机增加网卡时,设置网卡连接NAT模式网络,后续可以给此网卡配置此网段内的ip:

-
Host-Only-仅主机模式:默认使用VMnet1
应用场景:虚拟机与宿主机之间可以通信,但不能直接访问外部网络。
添加主机模式网络(即私有网络):

给虚拟机增加网卡时,设置网卡连接主机模式网络,后续可以给此网卡配置此网段内的ip:

虚拟网络设备:
GNS3是一款运行在Windows、Linux上的跨平台图形网络模拟器,可以模拟交换机路由器虚拟设备,连接VMware虚拟机的网卡搭建网络实验环境。https://blog.csdn.net/airenKKK/article/details/135888133
相关文章:
数据包在客户端和服务端,以及网络设备间如何传输的?
声明:文章中图片来自于网络收集,整体流程自己梳理。 目录 问题:如下socket客户端请求数据包如何传输的? 拓扑环境 数据包在分层间传输 网络分层L2/L3/L4 数据包收发-在各分层间变化 各层头部中-核心信息 数据包在不同设备…...
用Python实现Excel数据同步到飞书文档
目录 一、整体目标 二、代码结构拆解 三、核心逻辑讲解(重点) 1. 建立安全连接(获取access_token) 2. 定位文档位置 3. 数据包装与投递 四、异常处理机制 五、函数讲解 get_access_token() 关键概念解释 1. 飞书API访问…...
25林业研究生复试面试问题汇总 林业专业知识问题很全! 林业复试全流程攻略 林业考研复试真题汇总
25 林业考研复试,专业面试咋准备?学姐来支招! 宝子们,一提到林业考研复试面试,是不是就慌得不行,感觉老师会扔出一堆超难的问题?别怕别怕,其实林业考研复试就那么些套路,…...
js版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性
ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言,本文讲述Javascript[ECMAScript]版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]的新特性,帮助朋友们更好的熟悉和使用Javascript ES5 1.严格模式 use strict2.Object getPrototypeOf,返回一个对象的原…...
vxe-table实现动态列
vxe-table实现动态列 1.动态列解释2.解决步骤2.1将后端返回的动态列表头,按照格式拼接在固定列表头上2.2将后端返回的列表数据按照键值对格式组装 1.动态列解释 正常列表是有固定的列;我的需求是,最初只知道表格的固定两列,查询数…...
尚硅谷爬虫note009
一、jsonpath 1.安装 pip install jsonpath 2.使用 只能解析本地文件 .json文件 {"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century&qu…...
verilog笔记
Verilog学习笔记(一)入门和基础语法BY电棍233 由于某些不可抗拒的因素和各种的特殊原因,主要是因为我是微电子专业的,我需要去学习一门名为verilog的硬件解释语言,由于我是在某西部地区的神秘大学上学,这所…...
Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当今社会,随着人们生活水平的不断提高和健康意识的日益增强,健…...
正确清理C盘空间
一.系统清理 正确清理C盘空间主要是删除不需要的文件和应用程序,以释放磁盘空间。以下是一些常用的方法: 删除临时文件:在Windows搜索框中输入“%temp%”,打开临时文件夹,将其中的文件全部删除。 清理回收站…...
网站快速收录:如何设置robots.txt文件?
为了网站快速收录而合理设置robots.txt文件,需要遵循一定的规则和最佳实践。robots.txt文件是一个纯文本文件,它告诉搜索引擎爬虫哪些页面可以访问,哪些页面不可以访问。以下是如何设置robots.txt文件以助于网站快速收录的步骤和要点…...
python绘制年平均海表温度、盐度、ph分布图
python绘制年平均海表温度、盐度、ph图 文章目录 python绘制年平均海表温度、盐度、ph分布图前言一、数据准备二、代码编写2.1. python绘制年平均海表温度(主要)2.2. python绘制年平均海表盐度(选看)2.3. python绘制年平均海表ph&…...
网络空间安全(2)应用程序安全
前言 应用程序安全(Application Security,简称AppSec)是一个综合性的概念,它涵盖了应用程序从开发到部署,再到后续维护的整个过程中的安全措施。 一、定义与重要性 定义:应用程序安全是指识别和修复应用程序…...
HTTPS 通信流程
HTTPS 通信流程时序图: #mermaid-svg-HWoTbFvfih6aYUu6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-icon{fill:#552222;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-text{fill:#…...
全链路优化:如何让单点登录认证接口并发性能翻倍?
背景 最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下,Ngi…...
http代理IP怎么实现?如何解决代理IP访问不了问题?
HTTP代理是一种网络服务,它充当客户端和目标服务器之间的中介。当客户端发送请求时,请求首先发送到代理服务器,然后由代理服务器转发到目标服务器。同样,目标服务器的响应也会先发送到代理服务器,再由代理服务器返回给…...
设计模式教程:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)是设计模式中的一种行为型模式,它允许顺序访问一个集合对象中的元素,而无需暴露集合对象的内部结构。换句话说,迭代器模式提供了一个方法,能让你遍历集合中的元素,…...
AI Agent架构深度解析:从ReAct到AutoGPT,自主智能体的技术演进与工程实践
前言 觉得不错就点个赞吧!。 一、AI Agent技术架构演进图谱 (配图:AI Agent架构演进时间轴,标注关键技术节点) 1.1 三代架构对比分析 架构类型代表系统核心特征局限性反应式DeepBlue预置规则库无长期记忆认知式Wats…...
USC安防平台之地图临近资源列表
USC安防平台通过配置多层地图,并把相关的摄像机和门禁对象配置到数据上,用户可以方便的在地图上查看并操作。 但是对于大型的视频监控项目,同一个经纬度可能安装了很多台摄像机,这时候就需要显示同一个经纬度的临近资源列表&…...
Flutter 启动优化
Dart VM在Flutter中的作用是什么?它负责执行Dart代码,无论是JIT还是AOT模式都需要它。在JIT模式下,VM随应用一起运行,而在AOT模式下,代码已经被编译成机器码,VM可能不需要运行时存在?不过实际上…...
JavaScript数组方法reduce详解
JavaScript数组方法reduce详解 目录 JavaScript数组方法reduce详解一,前言二,核心语法三,案例1.求和2.找最大值3.数组转对象4.复合操作(同时实现 map filter) 四,常见错误1.空数组没有初始值2.没有返回累加…...
计算机毕业设计SpringBoot+Vue.js服装商城 服装购物系统(源码+LW文档+PPT+讲解+开题报告)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Web自动化中Selenium下Chrome与Edge的Webdriver常用Options参数
目录 引言 说明 Add_argument() 添加方式 常用参数 Add_experimental_option() 添加方式 常用方法 任务结束后仍然保持浏览器打开 禁用“Chrome 正受到自动测试软件的控制”提示 设置下载路径 禁用弹窗拦截 禁用图片加载 禁用 JavaScript 注意 引言 …...
现代未来派品牌海报徽标设计无衬线英文字体安装包 THANKS LAB
THANK LAB 是一种高级未来主义的软字体,将时尚的现代设计与光滑圆润的边缘相结合,营造出大胆而平易近人的美感。这款字体非常适合品牌、海报、标题、UI/UX 和科幻主题项目,旨在激发创造力。THANK LAB Futuristic Soft Font 完全支持拉丁字母、…...
《AI与NLP:开启元宇宙社交互动新纪元》
在科技飞速发展的当下,元宇宙正从概念逐步走向现实,成为人们关注的焦点。而在元宇宙诸多令人瞩目的特性中,社交互动体验是其核心魅力之一。人工智能(AI)与自然语言处理(NLP)技术的迅猛发展&…...
【算法通关村 Day6】二叉树层次遍历
树与层次遍历青铜挑战 理解树的结构 通过中序和后序遍历序列恢复二叉树是一个经典的二叉树构建问题。给定二叉树的中序遍历序列和后序遍历序列,我们可以利用以下步骤进行恢复。 思路: 后序遍历的特点: 后序遍历的最后一个节点是树的根节点…...
安全面试2
文章目录 简单描述一下什么是水平越权,什么是垂直越权,我要发现这两类漏洞,那我代码审计要注意什么地方水平越权:垂直越权:水平越权漏洞的审计重点垂直越权漏洞的审计重点 解释一下ssrf漏洞原理攻击场景修复方法 横向移…...
【JavaScript进阶】构造函数数据常用函数
目录 本章节用到的所有素材都可以找到:素材自取~~~~ 1、深入对象 1.1创建对象三种方式 1.2 构造函数 练习 利用构造函数创建多个对象 实例化执行过程 1.3实例成员&静态成员 2. 内置构造函数 2.1 Object 2.2 Array 练习 员工涨薪计算成本 2.3 St…...
在PiscTrace开发者版上直接处理图像色阶分布
在图像处理和计算机视觉中,色阶分布(或称灰度分布)是描述图像中像素强度分布的一个重要概念。它对于理解图像的亮度、对比度、纹理和细节等方面具有关键作用。通过色阶分布的分析,我们能够获得图像的整体信息,从而帮助…...
趣味数学300题1981版-十五个正方形
分析:移动两根变成11个正方形很简单: 移动4根变成15个正方形,分析: 一个田字格包含5个正方形,若要15个正方形需要3个田字格,如果3个田字格完全不重合,需要6*318根火柴。如果合并正方形的边&…...
Selenium实战案例1:论文pdf自动下载
在上一篇文章中,我们介绍了Selenium的基础用法和一些常见技巧。今天,我们将通过中国科学:信息科学网站内当前目录论文下载这一实战案例来进一步展示Selenium的web自动化流程。 目录 中国科学:信息科学当期目录论文下载 1.网页内…...
