08.02_111期_Linux_NAT技术
NAT(network address translation)技术说明
IP报文在转发的时候需要考虑 源IP地址 和 目的IP地址,
IP报文每到达一个节点,就会更改一次IP地址和目的IP地址,其中节点是指主机、服务器、路由器
那么这个更改是如何进行的呢?
除了运营商的路由器,到达其它类型的路由器都需要将当前IP报文中的srcIP改成该路由器对应的WAN口IP
上述的操作会造成一个结果:
如果一个IP报文经过了广域网才到达数据接收方,那么该数据接收方接收到的IP报文的源IP地址都是公网IP
也就是说,由于所有在广域网上传播的IP报文的源IP地址都是运营商路由器的WAN口IP
所以运营商路由器的WAN口IP属于公网IP
这也使得私有IP是不会在广域网中的IP报文出现的(包括源IP 和 目的IP)
每次IP报文在到达一个 路由器时 都要进行如下操作
m1. 更改IP报文的源IP地址
m2. 让IP报文的目的IP地址和子网掩码按位与,确定是否是当前子网内部的IP地址
m2.1. 如果m2判定为否,则传给上一级路由器,转到m1
m2.2. 如果m2判定为是,则传给当前同一网络号的其它路由器
m2 中的判断是借助路由表完成的,路由表形如下图
把目的IP和不同的子网掩码进行按位与,判断是否是和destination这个网络号相同,
对于例1,判断到第二行,发现相同
如果在检查到default行之前,都是不同的,则判定为否,比如例2,
则直接交给default行,Gateway列的那个位置的元素 192.168.10.1
一般一台主机都有两种类型的网络接口:1. eth0本地以太网 2. lo本地环回
数据链路层规定当前报文中有效载荷的长度最大长度(MTU)是1500字节
所以网络层的IP协议对于这个要求将会对上传输层传过来的一个很大的报文进行分片处理
到达接收方之后,还要在接收方的网络层处做组装操作
将一个报文进行分片,将会增加丢包的概率,因为一旦丢失其中的一片,就意味着整个报文丢失了
那么在传输层的TCP协议中设计的滑动窗口,需要进行分段发送,
每一段都不能太大,要小于MSS(最大段尺寸)起码保证到数据链路层的时候不会出现超过1500字节的情况
由于UDP协议的存在,如果非要分片,那么分片的操作是什么?
首先明确一点,一个服务器端可能收到多个客户端的请求,
其中有些客户端的网络层进行了分片操作,另一些没有
通过(m5. 16位标识), (m6. 3位标志), (m7. 13位片偏移) 这三者就能够管理分片操作,
(m5. 16位标识)在不同的IP报文中是不同的,但在不同片的IP报文中是相同的
(m6. 3位标志) 中有三位,其中
第一位暂时不用
第二位如果为1,表示当前的IP协议对待将来会超出MTU的IP报文会直接丢弃
第三位如果为0,表示当前的IP报文是经过IP分片得到的某一片报文,而且这片报文不是最后一个
第三位如果为1,表示当前的IP报文是经过IP分片得到的最后一片报文,或者根本就没有进行分片
(m7. 13位片偏移)将发送方网络层的IP报文进行拆分,拆分成IP报头和有效载荷 这两部分
对于其中有效载荷这一部分来说,
(m7. 13位片偏移)就是每一片报文发送的数据在这个有效载荷中所在的位置
由于只有13位,而IP协议中规定了最大报文长度是2 ^ 16次方,
也就是说从传输层中传过来的报文可以接近这个数字,
那么此时13位二进制数可能无法直接表示传输层要求发的内容的偏移量
那么IP协议对这13位数进行的处理如下:
首先,要求每个分片的切开的位置都是有效载荷都是x,其中这个x是8的倍数
其次,发送方传输层在知道一个分片的起始位置之后,对这个位置右移3位,放到这里
最后,接收方传输层在收到每一个分片后都对这个位置的数左移3位,
注意:一旦传输层穿过来的数据经 网络层检查,发现不满足数据链路层的要求
那么就会进行分片,就有可能产生只有一片报文中装着应用层报头,传输层报头的,
而其他片没有其他层报头的情况
那么IP报头必须要能够判断如下问题:
Q1: 接收方确定传过来的报文是分片的吗?
Q2: 如果接收方得到的IP报文是分片的,在传输过程中是否丢了某些片?
对于Q1,记接收方收到的IP报文是δi,判断下述条件是否成立
条件ξ:δi的(m6. 3位标志)的第三位是1 || ((δi的(m6. 3位标志)的第三位是0) && (δi的(m7. 13位片偏移) > 0))
ξ成立,需要进行组装;条件不成立,不需要组装
对于Q2,ξ成立时,将所有分片按照δ1,...,δn的(m7. 13位片偏移)排升序,判断下述条件是否成立
条件γ:∀1 <= i < n,都有δi的(m7. 13位片偏移) * 8 + δi的报文长度 == δi+1的(m7. 13位片偏移) * 8 成立
γ成立,报文的所有分片都传到了,γ不成立,至少有一个,下面这个例子非常
数据链路层中局域网内部的通信大多采用以太网
数据链路层传输的数据帧的示意图,以太网帧格式,遵循MAC协议
由于除了有效载荷之外的所有内容的所占字节数不变,
所以通以太网帧去掉前14个字节,和后4个字节就能得到有效载荷,也就实现了报头和有效载荷的解包
考虑包括多个主机的以太网,
规定任何时刻都只能有一台主机的数据帧到这个局域网的传输通道中存在,而且在这个数据帧传输时,
所有局域网中的主机都会检查这个数据帧的目的MAC地址是否和自己数据链路层的MAC地址相同
也就是这个数据帧将会被所有主机的底层看到
交换机的功能:将局域网这个打的碰撞域分成多个小的碰撞域
考虑主机A 发送 数据帧给主机B,会有以下的问题出现
问题:如果主机A 和 主机B 的IP地址不在同一个网段,那么主机A在传输时是无法获得对方局域网内的某个地址的。 也就无法获得主机B的MAC地址,
但是由于数据链路层需要用MAC地址来确定当前的数据帧是否到达了目标主机,
那么到达主机B的局域网之后,需要用某种办法来解决这个问题。
办法:通过IP地址来形成MAC地址,保证到达目标主机的子网之后,还能准确在这个子网中找到目标主机
这种用IP地址来形成MAC地址的协议称为 ARP协议
注意:m1. 数据链路层实际上有两种协议:ARP协议和 MAC协议
m2. ARP协议的结果并不会交给上层,也就是ARP协议只会被MAC协议看到,不会被其他层的协议看到
主机A发送的数据帧δ已经来到了主机B所在局域网N对应的路由器,到达主机B之后将会执行如下操作
m1. 广播,路由器把δ传给N中的所有主机,只有N中IP地址和δ相同的那个地址会进行响应
m2. 通信
对于任意一台主机,
有可能会发送ARP请求给其他主机,然后收到ARP应答,
也有可能会收到来自其他主机的ARP请求
那么对于这台主机来说,怎么区分收到的是 ARP请求 还是 ARP应答?
考虑主机A 发送 数据帧给主机B,且局域网中还有主机C,ARP协议的具体操作过程:
s1: 主机A将
m1. 源IP:主机A的IP
m2. 源MAC地址:主机A的MAC地址
m3. 目的IP地址:主机B的IP地址
m4. 目的MAC地址:FFFFFFFFFFFF
m5. oper位:表明这个报文是一个ARP请求的报文
这些信息形成一个ARP报文,传给MAC层
s2: 在A主机的MAC层,在ARP报文的前面再添加报头,填写如下内容
n1. 目的MAC:FFFFFFFFFFFF(广播地址)
n2. 源MAC:本主机的MAC地址
n3. 帧类型为0806,表示这个帧是带有ARP报文的,
n4. CRC
s3: 主机B 和 主机C 都会收到S2中添加了ARP和MAC报头的报文δ,
每个主机在数据链路层看到δ之后,知道帧类型是0806,都会执行下面的操作
s3.1 主机B查看δ的ARP报文中(m5. oper位)是ARP应答位
s3.1.1 那么再看自己的IP 是不是和(m3. 目的IP地址)相同
如果不相同,则直接丢弃δ(比如主机C)
如果相同,准备对δ写应答(比如主机B)
s4: 主机B在得到δ之后,将填写新的ARP报文β,其中各项为:
m1. 源IP:主机B的IP地址
m2. 源MAC地址:主机B的MAC地址
m3. 目的IP地址:主机A的IP
m4. 目的MAC地址:主机A的MAC地址
m5. oper位:表明这个报文是一个ARP应答的报文
然后将β传到局域网中
s5: 在B主机的MAC层,在ARP报文的前面再添加报头,填写如下内容
n1. 目的MAC:主机A的MAC地址
n2. 源MAC:本主机的MAC地址
n3. 帧类型为0806,表示这个帧是带有ARP报文的,
n4. CRC
s5: 局域网中所有除了主机A的主机,都会看到β,然后在MAC层丢弃
主机A看到β后,现在MAC层看到帧类型是0806,传给ARP层
ARP层看到oper是ARP应答
s5.1 主机A查看β的ARP报文中(m5. oper位)是ARP应答位
s5.1.1 主机A将会发送真正的数据帧α,将α发往主机B
s6: α将不会有ARP层的报文,主机A将在α写下:
n1. 目的MAC:主机B的MAC地址
n2. 源MAC:本主机的MAC地址
n3. 帧类型为0800,表示这个帧不是带有ARP报文,
n4. CRC
s7. 主机A和B正常通信
每个主机的都会让ARP把当前的MAC地址和 IP地址之间的映射关系记录下来
可以在控制台输入 arp -a 命令查看这个映射关系
引入NAT转化表,就可以从公网获取报文到内网中
这是因为这个表标明了一个报文的源地址在到达运营商路由器前后的映射关系
即转换前的源IP地址(LAN口的地址) <----> 转换后的IP 地址(WAN口的地址)
注意:
m1. 端口号也要进行映射,
比如下图中的场景,两个报文α和β要到达的目的IP相同
发出α的主机 和 发出β的主机在同一个局域网,那么此时只有通过改变端口号,
以确保双向的映射都是唯一的
m2. 传输过程中经过的每一个路由器 都要维护一张NAT转化表
内网穿透:
A主机和B服务器建立好连接之后,中途的所有路由器都会这个连接维护NAT表
C主机就可以通过访问B服务器来访问A主机,
首先要在B服务器上部署一种 服务,部署的工作可以通过frp这个软件来实现
NAT和代理服务器的区别有哪些?
网络通信的本质就是进程间通信
进程间通信的本质就是 IO
站在进程的角度理解IO,输入输出实际上分别对应:
将数据从磁盘中刷新到内存,将数据从内存刷新到磁盘
IO应该如何理解?
刷新就是将内容进行拷贝,如果不满足条件,就进入阻塞等待状态
什么叫做高效的IO?
拷贝非常快,但是拷贝需要的条件满足的越晚,则等待的时间越长,效率越低。
所以需要减少等的比重来提高效率
五种IO模型:
m1. 阻塞IO
m2. 非阻塞IO IO不等待,但是会反复询问资源是否就绪
由于每次询问都会消耗CPU的资源,所以这种模型可能会导致CPU资源迅速被耗尽
m3. 信号驱动IO 如果资源准备就绪了,就会发送信号,通知可以进行IO
m4. 多路复用IO 向多个资源进行申请,一旦有一个资源就绪,就进行IO
m5. 异步IO 进程把等待资源的过程交给内核,直到资源准备好,内核就进行IO,然后进程再处理资源
前4种称为同步IO,第5种称为异步IO
同步IO:需要参与IO的过程
异步IO:无需参与IO的过程
非阻塞IO
一个文件描述符,可以设置其等待状态,默认的等待状态是阻塞IO
可以通过fcntl 这个函数新增一个 文件描述符 对应的 默认的等待状态
int fcntl(int fd, int cmd, ... /* args */); 具体的使用样例如下:
键盘输入内容之后在显示器中显示的示意如下,其中输入输出缓冲区是在 OS中存放的,
回显 是进行了如下操作之后的结果
s1: 用户通过键盘键入数据,
s2: 操作系统把这些数据读取到 输入缓冲区中,
s3: 操作系统再把这些数据给输出缓冲区拷贝一份
s4: 操作系统将输出缓冲区的内容刷新到显示器,显示器展示用户键入的数据
回显功能可以被关掉,也就是s3, s4没有进行
输入 ctrl + d 表明键盘输入结束
多路转接 select
为了等待多个fd,等该fd上面的新事件就绪,通知程序员,事件已经就绪,就可以进行IO拷贝了
select是一种多路转接方案
select只负责“等”,“等”的含义是
同时等待多个fd,只要有一个文件描述符说明当前已经等待就绪了
就会通知程序员,事件已经准备就绪了,之后的拷贝工作还是需要其他接口进行
select作为一种系统调用接口,其声明为:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
相关文章:
08.02_111期_Linux_NAT技术
NAT(network address translation)技术说明 IP报文在转发的时候需要考虑 源IP地址 和 目的IP地址, IP报文每到达一个节点,就会更改一次IP地址和目的IP地址,其中节点是指主机、服务器、路由器 那么这个更改是如何进行的呢? 除了…...
【2024蓝桥杯/C++/B组/小球反弹】
题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; (其中k1, k2为整数) Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x); 目标1:根据k1与k2的关系,找出一组最小整数组(k1, k2)ÿ…...
PHP中如何实现函数的可变参数列表
在PHP中,实现函数的可变参数列表主要有两种方式:使用func_get_args()函数和使用可变数量的参数(通过...操作符,自PHP 5.6.0起引入)。 1. 使用func_get_args()函数 func_get_args()函数用于获取传递给函数的参数列表&…...
串---链串实现
链串详解 本文档将详细介绍链串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南,读者将了解如何使用链串进行各种字符串操作。 1. 什么是链串? 链串是一种用于存储字符串的数据结构,它使用一组动态分配的节点来保存字符串中的…...
科技赋能生活——便携气象站
传统气象站往往庞大而复杂,需要专业人员维护,它小巧玲珑,设计精致,可以轻松放入背包或口袋,随身携带,不占空间。无论是城市白领穿梭于高楼大厦间,还是户外爱好者深入山林湖海,都能随…...
Golang——GC原理
1.垃圾回收的目的 将未被引用到的对象销毁,回收其所占的内存空间。 2.根对象是什么 全局变量:在编译器就能确定的存在于程序整个生命周期的变量。 执行栈:每个goroutine都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配…...
OpenStack概述
一、初识OpenStack OpenStack Docs: 概况 一)OpenStack架构简述 1、理解OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集&…...
机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测
总结:本文为和鲸python 可视化探索训练营资料整理而来,加入了自己的理解(by GPT4o) 原活动链接 原作者:vgbhfive,多年风控引擎研发及金融模型开发经验,现任某公司风控研发工程师,对…...
PS 2024 百种常用插件下载安装教程【免费使用,先到先得】
文章目录 软件介绍软件下载安装步骤 专栏推荐: 超多精品软件(持续更新中…) 软件推荐: PS 2024 PR 2024 软件介绍 PS常用插件 此软件整合了市面近百款ps处理插件,可实现:一键制作背景,一键抠图…...
逻辑推理之lora微调
逻辑推理微调 比赛介绍准备内容lora微调lora微调介绍lora优势代码内容 start_vllm相关介绍调用 运行主函数提交结果总结相应连接 比赛介绍 本比赛旨在测试参与者的逻辑推理和问题解决能力。参与者将面对一系列复杂的逻辑谜题,涵盖多个领域的推理挑战。 比赛的连接:…...
前端-防抖代码
//防抖debounce(fn, time 1000) {let timer null;return function (...args) {if (timer) clearTimeout(timer);timer setTimeout(() > {fn.apply(this, args);}, time);};},// 输入变化处理函数async inputChange(value) {if (!this.debouncedInputChange) {this.deboun…...
langchain 入门指南 - 让 LLM 自动选择不同的 Prompt
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 让 LLM 自动选择不同的 Prompt 在上一篇文章中,我们学会了如何让 langchain 来自动选择不同的 LLM Chain,以便回…...
web浏览器播放rtsp视频流,海康监控API
概述 这里记录一下如何让前端播放rtsp协议的视频流 项目中调用海康API,生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放,说明视频流有问题,唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的,即使…...
操作系统原理:程序、进程、线程的概念
文章目录 程序、进程、线程的概念程序(Program)进程(Process)线程(Thread)关系总结 在日常对操作系统的使用中,大家肯定对程序、进程和线程多少有所耳闻。作为操作系统的重要一部分,…...
Golang是如何实现动态数组功能的?Slice切片原理解析
Hi 亲爱的朋友们,我是 k 哥。今天,咱们聊一聊Golang 切片。 当我们需要使用数组,但是又不能提前定义数组大小时,可以使用golang的动态数组结构,slice切片。在 Go 语言的众多特性里,slice 是我们经常用到的数…...
SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门
第5关--------------------------------------------> 前端直接不会显示账号密码的打印;但是在接收前端的数据的那部分后端那里,会看前端传递过来的值是否正确,如果不正确,后端接收值那里就会当MySQL语句执行错误,…...
springboot项目里的包spring-boot-dependencies依赖介绍
springboot项目里的包’spring-boot-dependencies‘依赖 我们一般是在项目的pom dependencyManagement标签里引入spring-boot-dependencies,或者根spring-boot-starter-parent里也是继承了它,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本…...
C# 下的限定符运算详解(全部,任意,包含)与示例
文章目录 1.限定符概述2. 全部限定符运算(All)3. 任意限定符运算(Any)4. 包含限定符运算(Contains)总结 当我们在C#编程中需要进行条件判断或集合操作时,限定符(qualifiersÿ…...
消息队列RabbitMQ部分知识
1.简述RabbitMQ的架构设计 RabbitMQ 是一个开源的消息代理,采用了高级消息队列协议(AMQP),其架构设计主要包括以下几个关键组件和概念: 1.消息生产者( Producer): 负责发送消息到…...
看门狗应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
看门狗应用编程 看门狗应用编程介绍 看门狗定时器的基本概念 看门狗是一个可以在一定时间内被复位/重置的计数器 如果在规定时间内没有复位,看门狗计时器溢出会对CPU产生复位信号使系统重启 有些看门狗可以只产生中断信号而不会使系统复位 I.MX6UL/I.MX6ULL So…...
Bug 解决 | 本地项目上线后出现错误
目录 一、前言 二、原因分析 1、本地代码误发线上 2、环境差异 3、配置差异 4、资源路径差异 5、API 接口差异 6、用量差异 一、前言 大家好,我是小洪爱分享。在开发上线项目的过程中,我们经常会遇到一种让人头疼的情况。那就是开发好的项目功能…...
为什么我工作 10 年后转行当程序员?逆袭翻盘!
今天文章的主人公暂且称他为 A 君。不过 A 君有点特别,非科班,工作 10 年后才转行 iOS 程序员。今年 36 岁,目前在某行业头部企业任职前端负责人,管理 40 人的前端团队。 废话不多说,我们开始 A 君(为了描…...
见证中国数据库的崛起:从追赶到引领的壮丽征程《四》
见证中国数据库的崛起:从追赶到引领的壮丽征程《四》 四、未来展望:中国数据库的机遇与挑战新技术带来的机遇全球化竞争的挑战数据安全与隐私保护的挑战人才培养的持续挑战 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天,数据库作…...
OpenCV||超细节的基本操作
一、图像读取 retval cv2.imread(filename[, flags]) filename:需要读取的图片路径名,支持多种图片格式,如JPEG、PNG、TIFF等。flags:一个可选参数,指定加载图像的颜色类型。常用的值包括: cv2.IMGEAD_A…...
算法训练(leetcode)第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
刷题记录 *1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列 *1143. 最长公共子序列 leetcode题目地址 本题和718. 最长重复子数组相似,只是本题不要求连续,需要记录前面最长的子序列,在此基础上累计长度。 dp[i][j]…...
STM32——外部中断(EXTI)
目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断(External Interrupt,简称EXTI)是微控制器用于响应外部事件的一种方式,当外部事件发生时(如按键按下、传感器信号…...
MySQL多实例部署
1、软件包下载 //环境:一台rocky Linux虚拟机,并且做好的基本配置及时钟同步,使用Xshell连接 [rootmysql ~]# yum -y install tar lrzsz libncurses* libaio perl//将包文件拖进去 [rootmysql ~]# rz -E rz waiting to receive. [rootmysql…...
云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 【已去除流量主】
云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 已去除流量主。UI特别漂亮,实属精品代码。 【已测】云开发喝酒小程序3.6漂亮UI猜拳喝酒小程序 已去除流量主。 云开发(serverless)小程序无需服务器,注册一个小程序就可以直接上线…...
图论进阶之路-最短路(Floyd)
时间复杂度:O(n^3) 使用场景:当需要得知任意两个点的最短距离以及其路径时使用 准备:需要两个矩阵 一个记录最短距离(D) 一个记录最短路径的最后一个结点(P) 其核心在于不断的判断越过中间…...
安装sqllab靶机之后,练习关卡报403 forbidden
解决办法: 在nginx的conf文件中添加上访问index.php vim /usr/local/nginx/conf/nginx.conf 保存退出 再重启一下nginx,就完成了。 ./nginx -s reload...
顺德做网站公司/长沙网站seo推广公司
我们知道,程序就是指令加上数据的集合或者称为算法加上数据结构的集合。应用程序以源代码和二进制的形式存在:源代码是包含了整个应用程序的编程语言的所有代码的文本文件;二进制则是将源代码经过一系列的转换操作之后得到的可以直接执行的文…...
网站开发惠州/劳动局免费培训项目
Python-Dict&Set类型Python的另外两种重要的数据类型Dict和Set,可以快速按照关键字检索信息Dict - 字典list 和 tuple 可以用来表示顺序集合,例如,班里同学的名字:[Adam, Lisa, Bart]或者考试的成绩列表:[95, 85, …...
如何用ae做模板下载网站/谷歌浏览器下载官网
2019独角兽企业重金招聘Python工程师标准>>> 网络拓扑自动发现 -智能网管软件的基础 网络拓扑作为一种表示网络设备逻辑连接与物理连接之间关系的方法,通过它网络管理员可以很直观地掌握当前网络设备的运行状况,准确定位网络中的故障点&#…...
上海城乡建设中级职称报名网站/手机软文广告300字
如何在Word中绘制流程图?相信这个问题,许多人都知道,大多数人也都会。不过,还是有大多数人使用的方法却不是正确的方法。所以,今天易老师就来为大家讲一下如何正确的绘制流程图。用正确的方法绘制流程图,事…...
数字资产币币交易所网站开发/搜索引擎网站排名
,访问共享网盘显示 "服务器存储空间不足,无法处理此命令" 我找了个解决方案,整理了一下: 通过事件管理器,查看到系统有一个错误,事件ID 2011,服务器的配置参数"irps4tacksize"太小,无法让服务器使用本地设备请增加此参数的值 要解决…...
怎么看网站做的好不好/信息推广服务
Apache kafka 工作原理介绍 消息队列 消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上, 队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收…...