【Linux | 计网】TCP协议深度解析:从连接管理到流量控制与滑动窗口
目录
前言:
1、三次握手和四次挥手的联系:
为什么挥手必须要将ACK和FIN分开呢?
2.理解 CLOSE_WAIT 状态
CLOSE_WAIT状态的特点
3.FIN_WAIT状态讲解
3.1、FIN_WAIT_1状态
3.2、FIN_WAIT_2状态
3.3、FIN_WAIT状态的作用与意义
4.理解 TIME_WAIT 状态
4.1.TIME_WAIT 状态存在的意义:
4.2.为什么是 TIME_WAIT 的时间是 2MSL?
5.流量控制:
5.1.概念:
5.2.流量控制的具体流程:
6.滑动窗口
6.1.滑动窗口的工作流程
6.2.关于滑动窗口的灵魂三问
6.3.滑动窗口的底层理解(更深层)
6.4.那么如果出现了丢包, 如何进行重传?
情况一: 数据包已经抵达, ACK 被丢了
情况二: 数据包就直接丢
前言:
上一篇文章讲解了TCP连接管理的基本机制(三次握手和四次挥手),接下来我们更深层次的理解TCP为何能高效安全的通信。【Linux | 计网】TCP协议详解:从定义到连接管理机制-CSDN博客
1、三次握手和四次挥手的联系:
其实四次挥手本质上与三次握手的流程一样的。此话怎讲?
三次握手的本质,其实也是4次握手,只不过中间两次被合并了(ACK和FIN合并了)!
为什么挥手必须要将ACK和FIN分开呢?
挥手的时候可以将ACK和FIN一起发送吗
在三次握手的时候,可以直接将SYN和ACK进行合并发送,
但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
客户端想要断开连接发送FIN,服务器收到之后发送ACK应答,但是服务器在大多数情况下是不会立刻断开连接,因为可能还有业务没有处理完,所以ACK和FIN之间一定有一个时间差,这就导致了ACK不能和FIN一起发送
我们在挥手流程图有这样几个状态,分别是
TIME_WAIT , CLOSE_WAIT,FIN_WAIT。
2.理解 CLOSE_WAIT 状态
CLOSE_WAIT 状态存在的意义:
CLOSE_WAIT是连接被动关闭方在收到对方发送的FIN请求后,发送ACK确认进入的状态。在这个状态下,应用程序可能还有未处理的数据需要发送,因此需要等待应用程序处理完这些数据后,才能发送FIN请求来关闭连接。如果应用程序没有及时关闭连接,可能会导致大量的CLOSE_WAIT状态,从而消耗系统资源。CLOSE_WAIT状态表示被动关闭方正在等待关闭,没有真正关闭。
CLOSE_WAIT状态的特点
- 双向关闭的一部分:TCP连接是双向的,需要两端都同意关闭连接才能完全关闭。CLOSE_WAIT状态表示本地端(即接收ACK的一端)已经收到了对方的关闭请求,并发送了确认,但还在等待本地端的应用程序或系统发送关闭请求以完成连接的关闭。
- 等待远程FIN报文:在CLOSE_WAIT状态下,本地端会等待远程端发送FIN报文来关闭连接。如果远程端没有发送FIN报文,本地端就会一直保持在这个状态。
对于服务器上出现大量的 CLOSE_WAIT 状态, 原因就是服务器没有正确的关闭socket, 导致四次挥手没有正确完成. 这是一个 BUG. 只需要加上对应的 close 即可解决问题.
3.FIN_WAIT状态讲解
FIN_WAIT状态是TCP(传输控制协议)连接关闭过程中的一个重要状态,它分为FIN_WAIT_1和FIN_WAIT_2两个阶段。以下是关于FIN_WAIT状态的详细解释:
3.1、FIN_WAIT_1状态
- 定义:当TCP连接中的一方(主动关闭方)发送了FIN报文(表示希望关闭连接),并收到了对方的ACK报文(确认报文)后,该连接就会进入FIN_WAIT_1状态。
- 特点:在FIN_WAIT_1状态下,主动关闭方等待对方的关闭请求(即对方的FIN报文)。此时,连接仍然处于半关闭状态,即主动关闭方已经停止发送数据,但仍然可以接收数据。
- 超时处理:如果在FIN_WAIT_1状态下超时(即没有收到对方的FIN报文),TCP可能会重新发送FIN报文以尝试关闭连接。
3.2、FIN_WAIT_2状态
- 定义:当主动关闭方收到对方的FIN报文,并回复了ACK报文后,连接就会从FIN_WAIT_1状态进入FIN_WAIT_2状态。
- 特点:在FIN_WAIT_2状态下,主动关闭方等待对方再次发送ACK报文来确认连接的关闭。此时,连接已经完全停止数据传输,但还需要等待对方的确认才能完全关闭。
- 超时处理:与FIN_WAIT_1状态类似,如果在FIN_WAIT_2状态下超时(即没有收到对方的确认ACK报文),TCP也可能会重新发送ACK报文以尝试完成连接的关闭。
3.3、FIN_WAIT状态的作用与意义
- 保证连接可靠关闭:通过FIN_WAIT状态,TCP连接可以确保双方都能正确地关闭连接,避免出现连接未完全关闭而导致的资源泄露或数据丢失等问题。
- 提高连接安全性:在FIN_WAIT状态下,TCP连接会等待对方的确认报文,以确保双方都已经正确地处理了关闭连接的请求。这有助于提高连接的安全性,防止因一方突然关闭连接而导致另一方无法及时释放资源或处理数据。
4.理解 TIME_WAIT 状态
4.1.TIME_WAIT 状态存在的意义:
TIME_WAIT是主动关闭方在完成最后一次ACK发送后的状态。这个状态存在的目的是为了确保连接被动关闭方能够收到最后一个ACK确认包,同时防止在网络中延迟的数据包影响新连接的建立。
现在做一个测试,首先启动 server,然后启动 client,然后用 Ctrl-C 使 server 终止,这时马上再运行 server, 结果是:
这是因为,虽然 server 的应用程序终止了,但 TCP 协议层的连接并没有完全断开,因此不能再次监听同样的 server 端口,因为这个端口的应用程序终止了!
- TCP 协议规定,主动关闭连接的一方要处于 TIME_ WAIT 状态,等待两个MSL(maximum segment lifetime)的时间后才能回到 CLOSED 状态.
- 我们使用 Ctrl-C 终止了 server, 所以 server 是主动关闭连接的一方, 在TIME_WAIT 期间仍然不能再次监听同样的 server 端口;
- MSL 在 RFC1122 中规定为两分钟,但是各操作系统的实现不同, 在 Centos7 上默认配置的值是 60s
4.2.为什么是 TIME_WAIT 的时间是 2MSL?
- 首先我们要清楚MSL 是 TCP 报文的最大生存时间, 因此 TIME_WAIT 持续存在 2MSL 的话
- 就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);
- 同时也是在理论上保证最后一个报文可靠到达(假设最后一个 ACK 丢失, 那么服务器会再重发一个 FIN. 这时虽然客户端的进程不在了, 但是 TCP 连接还在, 仍然可以重发 LAST_ACK);
解决 TIME_WAIT 状态引起的 bind 失败的方法:
在 server 的 TCP 连接没有完全断开之前不允许重新监听, 某些情况下可能是不合理的。
- 服务器需要处理非常大量的客户端的连接(每个连接的生存时间可能很短, 但是每秒都有很大数量的客户端来请求).
- 这个时候如果由服务器端主动关闭连接(比如某些客户端不活跃, 就需要被服务器端主动清理掉), 就会产生大量 TIME_WAIT 连接.
- 由于我们的请求量很大, 就可能导致 TIME_WAIT 的连接数很多, 每个连接都会占用一个通信五元组(源 ip, 源端口, 目的 ip, 目的端口, 协议). 其中服务器的 ip 和端口和协议是固定的. 如果新来的客户端连接的 ip 和端口号和 TIME_WAIT 占用的链接重复了, 就会出现问题!
使用 setsockopt()设置 socket 描述符的 选项 SO_REUSEADDR 为 1, 表示允许创建端口号相同但 IP 地址不同的多个 socket 描述符。
5.流量控制:
5.1.概念:
接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应.
因此 TCP 支持根据接收端的处理能力, 来决定发送端的发送速度. 这个机制就叫做流量控制(Flow Control);
5.2.流量控制的具体流程:
- 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段, 通过 ACK 端通知发送端;
- 窗口大小字段越大, 说明网络的吞吐量越高;
- 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;
- 发送端接受到这个窗口之后, 就会减慢自己的发送速度;
- 如果接收端缓冲区满了, 就会将窗口置为 0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端.
那如果对方的窗口大小一直不更新呢?那么发送方有没有策略可以让对方抓紧向上交付接收缓冲区的数据呢
- 标志位中的PSH标志位: 提示接收端的应用程序应立即从TCP缓冲区中读取数据。
如果对方返回的窗口大小一直是0,发送方可以使用PSH标志位催促接收方赶紧处理!就算对方的窗口大小没有为0,发送方也可以使用PSH,让对方抓紧进行数据交付!
6.滑动窗口
现在有两个个问题需要解决:
- 上面讲的流量控制可以根据通过对方的接收能力调节发送速度,那么具体是如何调节发送速度的呢?
- 超时重传:超时时间以内,已经发送的报文不能被丢弃,而是保存起来,这是保存在哪里的?
滑动窗口就是解决上述的问题!
刚才我们讨论了确认应答策略, 对每一个发送的数据段, 都要给一个 ACK 确认应答. 收到 ACK 后再发送下一个数据段. 这样做有一个比较大的缺点, 就是性能较差。 尤其是数据往返的时间较长的时候,下图就是串行传输,性能较差。
既然这样一发一收的方式性能较低, 那么我们一次发送多条数据, 就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了)
6.1.滑动窗口的工作流程
- 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图的窗口大小就是 4000 个字节(四个段).
- 发送前四个段的时候, 不需要等待任何 ACK, 直接发送;
- 收到第一个 ACK 后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
- 操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;
- 窗口越大, 则网络的吞吐率就越高;
这个窗口会将缓冲区划分为三个部分:
- 窗口左边:已经发送,已经确认的数据。
- 窗口:暂时不需要应答,可以直接发送的数据。
- 窗口右边:等待发送的数据。
上图滑动窗口的大小就是4000,当主机A收到了来自主机B的确认应答之后,滑动窗口就开始向右移动了!
6.2.关于滑动窗口的灵魂三问
- 滑动窗口滑动的方向只能向右滑吗?
按照我们上图是不能向左的,但是概念定义中是可以向左滑动的!- 滑动窗口的大小是一成不变的吗?
不是,滑动窗口可以根据对方的接收能力动态改变,也就是流量控制!- 滑动窗口的大小可以为0吗?
当然可以,当对方的接受能力为0时,那么滑动窗口就为0了!
6.3.滑动窗口的底层理解(更深层)
我们现在已经知道滑动窗口在接受ACK确认信号之后,是会向右移动的,并且滑动窗口的大小是会改变的,那么我们是怎么控制这个滑动窗口移动和改变大小的呢?
我们在做算法的题目时,也会有滑动窗口这种类型的题目,我们在做这类题的时候,通常都是定义两个指针来控制滑动窗口的移动和大小控制。
同理,我们这也是同样的思想,利用两个指针来控制滑动窗口的移动和大小控制!
但是有个问题,按这样来说,那么滑动窗口肯定会走到数组边缘啊?其实这个发送缓冲区是一个环形队列,并不是一个简单的大数组。环形队列就不会出现越界!
win_start = ack_seq; //前指针
win_end = win_start + win; //后指针
这个win可以根据应答的窗口大小,动态改变,这样不就进行了流量控制了吗!
6.4.那么如果出现了丢包, 如何进行重传?
这里分两种情况讨论.
情况一: 数据包已经抵达, ACK 被丢了
这种情况下, 部分 ACK 丢了并不要紧, 因为可以通过后续的 ACK 进行确认;
比如我们丢失了1001的ACK,但是后续会接受到2001的ACK,就默认代表我们已经成功接受2001前的所有数据!
情况二: 数据包就直接丢了
- 当某一段报文段丢失之后, 发送端会一直收到 1001 这样的 ACK, 就像是在提醒发送端 "我想要的是 1001" 一样;
- 如果发送端主机连续三次收到了同样一个 "1001" 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;
- 这个时候接收端收到了 1001 之后, 再次返回的 ACK 就是 7001 了(因为 2001 -7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;
这种机制被称为 "高速重发控制"(也叫 "快重传机制").
快重传机制是为了提高效率,而超时重传机制是用来兜底的!所以我们根本不用担心丢包的问题!
相关文章:
【Linux | 计网】TCP协议深度解析:从连接管理到流量控制与滑动窗口
目录 前言: 1、三次握手和四次挥手的联系: 为什么挥手必须要将ACK和FIN分开呢? 2.理解 CLOSE_WAIT 状态 CLOSE_WAIT状态的特点 3.FIN_WAIT状态讲解 3.1、FIN_WAIT_1状态 3.2、FIN_WAIT_2状态 3.3、FIN_WAIT状态的作用与意义 4.理解…...
go语言的成神之路-筑基篇-对文件的操作
目录 一、对文件的读写 Reader 接口 Writer接口 copy接口 bufio的使用 ioutil库 二、cat命令 三、包 1. 包的声明 2. 导入包 3. 包的可见性 4. 包的初始化 5. 标准库包 6. 第三方包 7. 包的组织 8. 包的别名 9. 包的路径 10. 包的版本管理 四、go mod 1. 初始…...
两道数据结构编程题
1.写出在顺序存储结构下将线性表逆转的算法,要求使用最少的附加空间。 解:输入:长度为n的线性表数组A(1:n) 输出:逆转后的长度为n的线性表数组A(1:n)。 C语言描述如下(其中ET为数据元素的类型):…...
【Qt】QDateTimeEdit控件实现清空(不保留默认时间/最小时间)
一、QDateTimeEdit控件 QDateTimeEdit 提供了一个用于编辑日期和时间的控件。用户可以通过键盘或使用上下箭头键来增加或减少日期和时间值。日期和时间的显示格式根据设置的格式显示,可以通过 setDisplayFormat() 方法来设置。 二、如何清空 我在使用的时候&#…...
12、字符串
1、字符串概念 字符串用来存储一组字符,因此需要字符数组来存。 C语言中字符串的表示 C语言里面字符串只能用字符数组来存 字符串要求这个数组的末尾必须至少有一个\0 char ch1[] {a,b,c}; // 不是字符串 char ch2[5] {h,e,l,l,o}; // 不是字符串 char…...
DPDK用户态协议栈-Tcp Posix API 1
和udp一样,我们需要实现和系统调用一样的接口来实现我们的tcp server。先来看看我们之前写的unix_tcp使用了哪些接口,这边我加上两个系统调用,分别是接收数据和发送数据。 #include <stdio.h> #include <arpa/inet.h> #include …...
【人工智能-科普】图神经网络(GNN):与传统神经网络的区别与优势
文章目录 图神经网络(GNN):与传统神经网络的区别与优势什么是图神经网络?图的基本概念GNN的工作原理GNN与传统神经网络的不同1. 数据结构的不同2. 信息传递方式的不同3. 模型的可扩展性4. 局部与全局信息的结合GNN的应用领域总结图神经网络(GNN):与传统神经网络的区别与…...
LabVIEW实现UDP通信
目录 1、UDP通信原理 2、硬件环境部署 3、云端环境部署 4、UDP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 8、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利…...
[pdf,epub]228页《分析模式》漫谈合集01-45提供下载
《分析模式》漫谈合集01-45的pdf、epub文件提供下载。已上传至本号的CSDN资源。 如果CSDN资源下载有问题,可到umlchina.com/url/ap.html。 已排版成适合手机阅读,pdf的排版更好一些。 ★UMLChina为什么叒要翻译《分析模式》? ★[缝合故事]…...
Kafka的消费消息是如何传递的?
大家好,我是锋哥。今天分享关于【Kafka的消费消息是如何传递的?】面试题。希望对大家有帮助; Kafka的消费消息是如何传递的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中,消息的消费是通过消费…...
二分查找(Java实现)(1)
二分查找(Java实现)(1) leetcode 34.排序数组中查找元素第一个和最后一个位置 题目描述: 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如…...
力扣103.二叉树的锯齿形层序遍历
题目描述 题目链接103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1ÿ…...
Search with Orama
1.前言 在不久之前,我把 DevNow 的搜索组件通过 Lunr 进行了重构,从前端角度实现了对文章内容的搜索,但是在使用体验上,感觉不是特别好,大概有如下几个原因: 社区的文章数量比较少,项目的 Com…...
一万台服务器用saltstack还是ansible?
一万台服务器用saltstack还是ansible? 选择使用 SaltStack 还是 Ansible 来管理一万台服务器,取决于几个关键因素,如性能、扩展性、易用性、配置管理需求和团队的熟悉度。以下是两者的对比分析,帮助你做出决策: SaltStack&…...
计算机类大厂实习春招秋招开发算法面试问答练习题
计算机类大厂实习春招秋招开发算法面试问答练习题 下面有十个非常重要且常问,面试者却注意不到的问题,我们一个个来看,一个个来学。 线程创建到删除过程中,底层是怎么实现的 1.线程创建 线程创建是线程生命周期的起点。在操作系统中,线程可以通过多种方式创建,但无论哪…...
【热门主题】000068 筑牢网络安全防线:守护数字世界的坚实堡垒
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…...
RPC与HTTP调用模式的架构差异
RPC(Remote Procedure Call,远程过程调用)和 HTTP 调用是两种常见的通信模式,它们在架构上有以下一些主要差异: 协议层面 RPC:通常使用自定义的二进制协议,对数据进行高效的序列化和反序列化&am…...
计算机网络之传输层协议UDP
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之传输层协议UDP 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 目…...
Uniapp 微信小程序内打开web网页
技术栈:Uniapp Vue3 简介 实际业务中有时候会需要在本微信小程序内打开web页面,这时候可以封装一个路由页面专门用于此场景。 在路由跳转的时候携带路由参数,拼接上web url,接收页面进行参数接收即可。 实现 webview页面 新…...
阅读方法论
选择固有缺陷,选项是对比出来的...
373. 查找和最小的 K 对数字
参考的这个博客: https://zhuanlan.zhihu.com/p/457239781 然后看这个代码我想到了另外一种方法,就是一步一步往里加元组 ( i , j ) (i,j) (i,j),看代码就知道了,不过需要做一步去重,去重不能用 i n t [ ] int[] int…...
常用函数的使用错题汇总
目录 new/delete malloc/free1. 语言和类型2. 内存分配3. 内存释放4. 安全性和类型安全5. 其他特性总结 线程停止文件流 new/delete malloc/free malloc/free 和 new/delete 是 C/C 中用于动态内存管理的两种方式,它们有一些重要的区别。以下是这两种方式的比较&…...
uniapp手机端一些坑记录
关于 z-paging-x 组件,在ios上有时候通过弹窗去粗发它reload时会触发闪退,可能是弹框插入进去导致的DOM 元素已经被移除或者不可用,解决办法是加上他自带属性 :showRefresherWhenReload"true" 加上showRefresherWhe…...
2024学习之前端微信小程序开发教程,从入门到精通-含基础+实战+源码code
目录 一、简单介绍 二、课程需知 三、内容编排 1、小程序基础 起步式 目录结构 小程序框架 场景值 逻辑层 视图层 组件 视图容器 基础内容 表单组件 导航 媒体组件 Api 路由 界面 交互 网络 数据缓存 自定义组件 2、项目实战 …...
netconf 代码架构
NETCONF(Network Configuration Protocol)是一种基于 XML 的网络配置管理协议,主要用于在网络设备之间进行配置管理、状态监控和操作。它被设计为一种可扩展的协议,并且在自动化网络管理中扮演着重要角色。NETCONF 通过安全的通信…...
蒙特卡洛方法(Monte Carlo,MC)
目录 1 序言 2 Monte Carlo法计算积分 3 最优化计算Monte Carlo法 1 序言 蒙特卡罗方法(Monte Carlo)是由冯诺依曼和乌拉姆等人发明的,“蒙特卡罗”这个名字是出自摩纳哥的蒙特卡罗赌场,这个方法是一类基于概率的方法的统称。是一种应用随机数来进行…...
python学习笔记8-函数2
参数传递 传不可变对象 & 传可变对象 def func(b):print(id(a), a) #140737041872600 234print(id(b), b) #140737041872600 234a 234 func(a)def func(b):print(id(a), a) #1413554098560 [343]print(id(b), b) #1413554098560 [343]a [343] func(a)def func(b):b.appe…...
电商项目高级篇06-缓存
电商项目高级篇06-缓存 1、docker下启动redis2、项目整合redis3、redis改造三级分类业务 缓存 流程图: data cache.load(id);//从缓存加载数据 If(data null){ data db.load(id);//从数据库加载数据 cache.put(id,data);//保存到 cache 中 } return data;在我们…...
使用 `aircrack-ng`扫描、获取握手包
使用 aircrack-ng 工具集来扫描 5GHz WiFi 网络的过程与扫描 2.4GHz 网络类似,但需要注意一些特定的配置和命令。以下是一个详细的步骤指南,帮助你在 5GHz 频段上扫描 WiFi 网络并捕获握手包。 ### 前提条件 1. **操作系统**:通常在 Linux 系…...
基于大数据python 酒店数据分析可视化大屏系统(源码+LW+部署讲解+数据库+ppt)
!!!!!!!!! 很对人不知道选题怎么选 不清楚自己适合做哪块内容 都可以免费来问我 避免后期給自己答辩找麻烦 增加难度(部分学校只有一次答辩机会 没弄好就延迟…...
网站搭建免费/免费网页制作网站
矩阵的二次型、行列式、特征值、迹和秩 一个mn维矩阵是一种含有mn个元素的多变量表示。在数学中,经常希望使用一个数或标量来概括多变量表示。其中,矩阵的性能指标就是这类典型的例子。本节将介绍概括矩阵性质的几个重要的标量指标,它们分别…...
怎么在ppt上做网站/深圳网站优化哪家好
为什么80%的码农都做不了架构师?>>> 本地安装了一个WebLogic,只能在局域网内访问,怎样从外网也能访问到本地的WebLogic呢?本文将介绍具体的实现步骤。 1. 准备工作 1.1 安装Java 1.7及以上版本 执行命令java -version…...
wordpress设置固定链接/百度地图的精准定位功能
一、硬件材料 1*ESP8266 NodeMcu开发板 1*0.91寸OLED液晶显示模块 二、硬件接线图...
响应式网站排名/网络网站推广选择乐云seo
1、C工程的组成c程序是由一个或者多个.c文件和.h文件组成的。其中 .c文件是c源代码文件,是程序具体实现的部分。.h文件时C的头文件,用来声明.c文件中函数的。也可以申明自定义的数据。如下图,我定义了一个宏:#define kAD_MAX_DIM …...
网站开发需求/什么是seo标题优化
[彻底解决 configparser 中文乱码问题,让你的 Python3 代码更加优雅] Python3 configparser 是一个非常重要的模块,它可以帮助我们读取和写入配置文件,很多项目都会用到这个模块。但是在使用过程中,我们可能会遇到中文乱码的问题,这给我们的编码工作带来了很大的困扰。 …...
做网站接广告赚钱吗/广东seo推广公司
什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 FireBug和FirePath组合使用。 Css Selector使用方法 1、Css Selector支持ID、Class的定位…...