【Linux网络】详解TCP协议(2)
小伙伴们大家好,本片文章将会讲解 TCP协议的三次握手和四次挥手 的相关内容。
如果看到最后您觉得这篇文章写得不错,有所收获,麻烦点赞👍、收藏🌟、留下评论📝。您的支持是我最大的动力,让我们一起努力,共同成长!
文章目录
- `1. 三次握手`
- ==<font color = blue><b>🎧1.1 从代码看三次握手🎧==
- ==<font color = blue><b>🎧1.2 三次握手的中间过程🎧==
- ==<font color = blue><b>🎧1.3 三次握手的中间状态🎧==
- ==<font color = blue><b>🎧1.4 三次握手一定要三次吗🎧==
- `2. 四次挥手`
- ==<font color = blue><b>🎧2.1 从代码看四次挥手🎧==
- ==<font color = blue><b>🎧2.2 四次挥手的中间过程🎧==
- ==<font color = blue><b>🎧2.3 四次挥手的中间状态🎧==
- ==<font color = blue><b>🎧2.4 四次挥手的原因🎧==
上一篇文章中,博主介绍了 :
- TCP 的确认应答机制;
- TCP 的捎带应答机制;
- TCP 的超时重传机制;
- TCP 的报头
建议将上一篇文章看完之后再来看这篇文章,链接如下:
【Linux网络】详解TCP协议(1)那么接下来正片开始:
1. 三次握手
🎧1.1 从代码看三次握手🎧
我们之前在客户端写的代码有以下几步:
- 创建一个套接字;
- 进行
connect()
建立链接,以下是它的接口介绍:int connect (int sockfd, const struct sockaddr *addr,socklen_t addrlen);
- 详细代码
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
connect(sockfd, serveraddr, serveraddr_len);
在服务器中写的代码有以下几步:
- 分配一个监听套接字;
- 绑定监听套接字的源地址和目标地址:
bind()
,以下是它的接口介绍:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 使监听描述符成为一个监听描述符:
listen()
,以下是它的接口介绍:int listen(int sockfd, int backlog);
- 进行
accept()
阻塞等待客户端链接,以下是它的接口介绍:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
- 详细代码
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, localaddr, localaddr_len);listen(listenfd, backlog);
int connfd = accept(listenfd, cilentaddr, clientaddr_len, 0);
详细解释 connect() 和 listen()
- 其实在
connect()
的时候就是 客户端向服务器发送三次握手的开始时间点; - 服务器会首先处于
listen()
状态
(监听状态),准备接受客户端的连接请求; - 在
listen()
的底层其实会维护两个队列,一个是已完成连接的队列 ,另一个是还在建立连接的队列。- 当客户端与服务器的三次握手完成后,连接将被移入已完成连接的队列,这个队列的大小实际上就是由 l i s t e n ( ) listen() listen() 的第二个参数 b a c k l o g backlog backlog 决定的,如果队列满了,服务器就会直接拒绝请求。
- 未完成连接队列存放的是那些尚未完成三次握手的连接请求。这些连接请求在被处理之前,会暂时存放在这个队列中。
- 所以
accept()
是在干什么呢?其实就是从已经完成连接建立的队列中取出一个连接,然后再分配一个文件描述符。
🎧1.2 三次握手的中间过程🎧
三次握手过程图解
在 TCP
报头中有一个标志位是 SYN
,这个标志位在三次握手中起着关键的作用。
- 客户端给服务器发送包含
SYN
标志位的报文; - 服务器接收客户端发送的报文,同意建立连接,并发送携带
ACK
和SYN
的报文(捎带应答); - 客户端接受到报文之后,会给服务器在发送一个
ACK
,客户端一旦发送了这个报文,就表示建立连接成功了。- 我们知道当接收方接收到发送方的信息的时候会给发送方发送
ACK
数据包,这样发送方就可以确定接收方收到了消息; - 那么在三次握手中,最后一次客户端发送的
ACK
,客户端本身是不能确定服务器一定收到了消息; - 所以其实客户端其实是在赌,服务器收到了消息。
- 我们知道当接收方接收到发送方的信息的时候会给发送方发送
详细解释最后一次 ACK 丢包
- 刚才说了,客户端最后一次的
ACK
服务器可能并没有收到; - 但是在客户端发送最后一次
ACK
之后,客户端立即把自己的状态变成了ESTABLISHED
; - 那么就说明客户端此时就可以立即给服务器发送携带正文的数据;
- 但是如果服务器接收到了消息,但是很明显,服务器的连接状态并没有变成
ESTABLISHED
; - 所以此时,服务器就会给客户端发送一个携带
RST
标志位的报文;
RST 标志位
- 当服务器给客户端发送这个报文的时候,服务器就会提醒客户端重新建立连接;
- 因此这样就可以完美解决最后一次
ACK
服务器可能没收到的情况。
🎧1.3 三次握手的中间状态🎧
客户端的状态变化:
[CLOSED -> SYN_SENT]
客户端调用connect
, 发送同步报文段;[SYN_SENT -> ESTABLISHED]
成功调用connect
, 则进入ESTABLISHED
状态, 开始读写数据;(成功接受服务器端的ACK + SYN
)
服务器的状态变化:
[CLOSED -> LISTEN]
服务器端调用listen
后进入 LISTEN 状态, 等待客户端连接;[LISTEN -> SYN_RCVD]
一旦监听到连接请求(同步报文段), 就将该连接放入内核等待队列中, 并向客户端发送 SYN 确认报文;[SYN_RCVD -> ESTABLISHED]
服务端一旦收到客户端的确认报文, 就进入ESTABLISHED
状态, 可以进行读写数据了。
🎧1.4 三次握手一定要三次吗🎧
三次握手可以是一次吗?
- 如果三次握手变成一次,就是说只要客户端给服务器发送一次
SYN
请求,服务器就会立马在内核中维护这个连接说明连接建立成功; - 这个时候如果是某些不法分子利用这个特点,在一台甚至多台主机上向某个服务器发送多个
SYN
请求,就会造成服务器崩溃; - 这个被称为
SYN 洪水
,SYN 洪水
具体的内容博主也不是很清楚,只知道这个在网络安全中被称之为DoS
攻击,如果各位有兴趣可以去了解一下。
三次握手可以是两次吗?
- 如果是两次,其实也不行,因为如果客户端对服务器发送的
ACK + SYN
不做处理,只是单纯的让服务器在他的操作系统内部维护连接队列,就依然会引发SYN 洪水
问题。 - 所以两次也是不行的,但是其实三次也会有类似的问题,但是这个时候服务器和客户端消耗的资源是类似的,所以少数的主机就很难将服务器挂掉。
为什么一定是三次呢?
- 首先因为三次握手可以验证网络的连通性,同时验证
TCP
是全双工的;- 因为如果是两次握手只能说明客户端可以发送数据,服务器可以发送、接受数据;
- 由于双方的地位是相同的,三次握手也可以说明他们彼此之间都想和对方通信,即达成通信共识意愿。
- 其实三次握手本质上就是四次握手,只是在第二次握手的时候服务器将
ACK
和SYN
合并成了一条数据包发送而已。
2. 四次挥手
🎧2.1 从代码看四次挥手🎧
- 在双方通信完毕之后,就会关闭掉对应的文件描述符,调用
close()
接口,下面是它的详细接口:int close(int fd);
- 其实在
close()
的时候就会发生两次次挥手,表示要和对方断开连接。 - 双方都调用
close()
就是四次挥手了。
🎧2.2 四次挥手的中间过程🎧
四次挥手过程图解
在 TCP
报头中有一个标志位是 FIN
,这个标志位在四次挥手中起着关键的作用。
- 当服务器或者客户端中的一方已经把要发送给对方的数据发送完了,那么这时就会给对方发送一个带有
FIN
标志位的数据报;- 这里断开连接的一方没有特定的规定必须是客户端或者服务器,只要给对方发送的数据发送完了就行。
- 当对方接受到报文之后就会给对方发送
ACK
; - 如果过了一段时间我要发送的数据也给对方发完了,那么我也要给对方发送带有
FIN
标志位的报文,并且另一端也要给我发送ACK
表示收到了我要断开连接的请求。
两次挥手可能不会同时发生
- 刚才说了如果一方已经把消息发送完了,就会给对方发送带有
FIN
标志位的数据报,但是这个时候另一方可能还要给我发送数据,所以说这个时候另一方还不想和我断开连接; - 那么这个时候另一方还是可以和我发送数据的;
- 但是我已经把我的文件描述符
fd
关掉了,也就是这个文件描述符对应的发送和接收缓冲区也就关掉了,但是我还是要接受另一方发送的数据的,所以这里就不能单纯的调用close()
系统调用; - 这里再介绍一个系统调用
shutdown()
,下面是这个接口的用法:int shutdown(int sockfd, int how);
这个接口表示我要以何种方式关闭我的文件描述符,何种方式就是how
对应的参数,有以下几个选项:SHUT_RD
表示只关闭读端;SHUT_WR
表示只关闭写端;SHUT_RDWR
表示同时关闭读写端,这个时候就和close()
类似了。
🎧2.3 四次挥手的中间状态🎧
客户端的状态变化:
[ESTABLISHED -> FIN_WAIT_1]
客户端主动调用close
时, 向服务器发送结束报文段,同时进入FIN_WAIT_1
;[FIN_WAIT_1 -> FIN_WAIT_2]
客户端收到服务器对结束报文段的确认, 则进入FIN_WAIT_2
,开始等待服务器的结束报文段;[FIN_WAIT_2 -> TIME_WAIT]
客户端收到服务器发来的结束报文段, 进入TIME_WAIT
, 并发出LAST_ACK
;[TIME_WAIT -> CLOSED]
客户端要等待一个 2MSL(Max Segment Life, 报文
最大生存时间)的时间,才会进入CLOSED
状态。(这里待会细说)
服务器的状态变化:
[ESTABLISHED -> CLOSE_WAIT]
当客户端主动关闭连接(调用close
), 服务器会收到结束报文段, 服务器返回确认报文段并进入CLOSE_WAIT
;[CLOSE_WAIT -> LAST_ACK]
进入CLOSE_WAIT
后说明服务器准备关闭连接(需要处理完之前的数据); 当服务器真正调用close
关闭连接时, 会向客户端发送FIN
, 此时服务器进入LAST_ACK
状态,等待最后一个ACK
到来(这个ACK
是客户端确认收到了FIN
);[LAST_ACK -> CLOSED]
服务器收到了对FIN
的ACK
, 彻底关闭连接。
详细解释 CLOSE_WAIT 状态
- 当服务器或者客户端处于
CLOSE_WAIT
状态,说明只是另一方要给我发送的数据发送完了,但是我还没有把数据发送完毕; - 但是如果主机上存在大量的
CLOSE_WAIT
状态,原因就是没有正确的关闭sockfd
,导致四次挥手没有正确完成,这是一个BUG
, 只需要加上对应的close()
即可解决问题。
详细解释 TIME_WAIT 状态(重要)
TIME_WAIT
状态一般是先发送退出请求的一方会处于的状态;- 这个状态一般有两个作用:
- 首先就是虽然对方已经发送了
FIN
请求了,但是在信道中可能还存在有部分数据报并没有到达对方的接受缓冲区,所以这就是为什么要等待 2 ∗ M S L 2 * MSL 2∗MSL 的原因,MSL
就是MAX SEGMENT LIFETIME
,最大段生存时间; - 如果说不等待这个时间,可能会对下一次连接的主机产生影响,会收到来自上一个进程的迟到的数据,会有预想不到的错误;
- 第二个作用就是对方处于
LAST_ACK
状态发送了FIN
数据报给我,我收到之后会给对方发送ACK
,我要保证对方收到了我的ACK
,以保证链接正确关闭。 - 假设最后一个
ACK
丢失,那么服务器会再重发一个FIN
, 这时虽然客户端的进程不在了, 但是TCP
连接还在, 仍然可以重发LAST_ACK
。
- 首先就是虽然对方已经发送了
- 这也就是说为什么我们写一个服务器第一次绑定一个端口,如果关闭服务器之后,第二次立即重新绑定这个端口是不可能的,一般要等待一段时间。
- 当然我们以可以用
setsockopt()
这个系统调用解决这个问题,下面是他的一般用法:-
接口API:
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
-
第一步:
int opt = 1;
-
第二步:
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
-
- 当然我们以可以用
查看TIME_WAIT状态
- 博主这里用了本地的浏览器去访问了在云服务器写的
http
的服务器; - 然后关闭掉服务器;
- 在采用
netstat -natp
命令查看。 - 这里为什么本地地址是
12.0.12.12
我们之后在讲网络层IP
协议的时候会讲,这里其实是公网路由器的IP,这个路由器是公网和内网交互的路由器。
🎧2.4 四次挥手的原因🎧
- 如果只是 主机A 给 主机B 发送完了数据,那么 主机A 会给 主机B 首先发送
FIN
报文; - 但是 主机B 还没有发送完数据,因此我还要继续发送数据;
- 等到发送完了数据,主机B 才会给 主机A 发送
FIN
数据报; - 所以总的来说双方地位平等,都要给对方发送断开连接的请求(FIN)才能完美的断开连接,所以这就是为什么是四次的原因。
- 但是如果 主机A 发送
FIN
数据报的时候,主机B 接收到了请求,主机B这个时候也发送完了数据,那么就会给 主机A 同时发送携带FIN
和ACK
的报文,所以三次和四次挥手本质上没什么不同。
相关文章:
【Linux网络】详解TCP协议(2)
🎉博主首页: 有趣的中国人 🎉专栏首页: Linux网络 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 TCP协议的三次握手和四次挥手 的相关内容。 如果看到最后您觉得…...
STM32DMA学习日记
STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器(DMA_ISR)4.2 DMA中断标志清除寄存器(DMA_IFCR)…...
【高性能内存池】page cache 5
page cache 1 page cache的框架2 central cache从page cache申请n页span的过程3 page cache 的结构3.1 page cache类框架3.2 central cache向page cache申请span3.3 获取k页的span page cache的结构和central cache是一样的,都是哈希桶的结构,并且挂载的…...
Vue 3 魔法揭秘:CSS 解析与 scoped 背后的奇幻之旅
文章目录 一、背景二、源码分析transformMain 返回值transformStyle 方法compileStyleAsync 方法scopedPlugin 方法template 添加 __scopeId 三、总结 一、背景 Vue 3 文件编译流程详解与 Babel 的使用 上文分析了 vue3 的编译过程,但是在对其中样式的解析遗留了一…...
如何获取钉钉webhook
第一步打开钉钉并登录 第二步创建团队 并且 添加自定义 机器人 即可获取webhook...
网页WebRTC电话和软电话哪个好用?
关于WebRTC电话与软件电话哪个更好用,这实际上取决于多个因素,并没有一个绝对的答案。不过,我可以根据WebRTC技术的一些特点,以及与传统软件电话相比的优劣势,为你提供一个清晰的对比。 首先,让我们了解一下…...
MySQL Mail服务器集成:如何配置发送邮件?
MySQL Mail插件使用指南?怎么优化 MySQL发邮件性能? MySQL Mail服务器的集成,使得数据库可以直接触发邮件发送,极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器,以实现邮件发送功能。 MySQL Mail&…...
【Rockchip系列】官方函数:imcopy
imcopy 函数原型 IM_STATUS imcopy(const rga_buffer_t src,rga_buffer_t dst,int sync 1,int *release_fence_fd NULL);功能说明 imcopy函数用于执行单次快速图像拷贝操作,将图像从源缓冲区拷贝到目标缓冲区。 参数说明 参数描述src[必填] 源图像缓冲区&…...
Matlab实现鲸鱼优化算法优化回声状态网络模型 (WOA-ESN)(附源码)
目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种基于座头鲸捕食行为的群智能优化算法。该算法通过模仿座头鲸使用螺旋形路径和包围猎物的策略来探索和开发解空间,以找到…...
迈威通信闪耀工博会,以创新科技赋能工业自动化
昨日,在圆满落幕的第24届中国国际工业博览会上,迈威通信作为工业自动化与智慧化领域的先行者,以“创新打造新质通信,赋能工业数字化”为主题精彩亮相,向全球业界展示了我们在工业自动化领域的最新成果与创新技术。此次…...
C# DotNetty客户端
1. 引入DotNetty包 我用的开发工具是VS2022,不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…...
4G模组SIM卡电路很简单,但也要注意这些坑
上次水SIM卡相关的文章,还是上一次; 上一篇文章里吹牛说,跟SIM卡相关的问题还有很多,目的是为下一篇文章埋下伏笔;伏笔埋是埋下了,但如果债老是不还,心里的石头就总悬着,搞不好老板…...
常见电脑品牌BIOS设置与进入启动项快捷键
常见电脑品牌BIOS与引导项快捷键速查表 | 电脑品牌 | BIOS快捷键 | 引导项快捷键 | 备注 ||------------|------------|--------------|------------------------------ || 联想 | F2/F1 | F12 | 笔记本通常为F2,台式机通常为F1 || IBM/ThinkPad | F1 | 未知 | ||…...
C语言中的日志机制:打造全面强大的日志系统
前言 在软件开发中,良好的日志记录机制对于调试、监控程序状态和维护系统的稳定性至关重要。本文将介绍如何在C语言中构建一个全面强大的日志系统,并提供一些示例代码。 1. 日志的基本概念 日志级别:用于分类日志信息的重要性,…...
局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用
前言 在古老的年代,如果我们要实现两台机器进行数据传输, A员工就得去B员工的办公电脑传数据(B休息,等A传完),这样就很浪费时间 所以能不能不去B的工位的同时,还能传数据。这时候网络通信就出来…...
LabVIEW项目编码器选择
在LabVIEW项目中,选择增量式(Incremental Encoder)和绝对式(Absolute Encoder)编码器取决于项目的具体需求。增量式编码器和绝对式编码器在工作原理、应用场景、精度和成本等方面存在显著差异。以下从多方面详细阐述两…...
Spring Boot实现房产租赁业务逻辑
1 绪论 1.1 研究背景 中国的科技的不断进步,计算机发展也慢慢的越来越成熟,人们对计算机也是越来越更加的依赖,科研、教育慢慢用于计算机进行管理。从第一台计算机的产生,到现在计算机已经发展到我们无法想象。给我们的生活改变很…...
汽车3d动画渲染选择哪个?选择最佳云渲染解决方案
面临汽车3D动画渲染挑战?选择正确的云渲染服务至关重要。探索最佳解决方案,优化渲染效率,快速呈现逼真动画。 汽车3d动画渲染选择哪个? 对于汽车3D动画渲染,选择哪个渲染器取决于你的项目需求、预算和期望的效果。Ble…...
火语言RPA流程组件介绍--网页/元素截图
🚩【组件功能】:对整个网页、可见区域或者某个元素进行截图 ,保存至指定文件夹,仅适用于内置浏览器 配置预览 配置说明 截图类型 整个网页/可见区域/元素截图 目标元素 支持T或# 通过自动捕获工具捕获(选择元素工具使用方法)…...
VSCode编程配置再次总结
VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…...
银行管理系统
摘 要 伴随着信息技术与互联网技术的不断发展,人们进到了一个新的信息化时代,传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须,提升管理高效率,各种各样管理管理体系应时而生,各个领域陆续进到…...
极狐GitLab 17.4 重点功能解读【四】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
[每日一练]利用自连接实现数量查询
该题目来源于力扣: 1731. 每位经理的下属员工数量 - 力扣(LeetCode) 题目要求: 表:Employees----------------------- | Column Name | Type | ----------------------- | employee_id | int | | name …...
Linux云计算 |【第四阶段】RDBMS1-DAY3
主要内容: 子查询(单行单列、多行单列、单行多列、多行多列)、分页查询limit、联合查询union、插入语句、修改语句、删除语句 一、子查询 子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一…...
初始MYSQL数据库(8)—— JDBC编程
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 JDBC的概念 JDBC的使用 加载驱动包 建立连接 创建 statement 对象 定义并执行SQL语句 处理结果集 关闭资源 SQL注入 …...
Vue $router.push打开新窗口
Vue $router.push打开新窗口 最近有粉丝小伙伴问我:$router.push方法用于在当前窗口中跳转路由,但有时候我们需要在新的窗口或标签页中打开一个路由改怎么实现呢? 那么这里就介绍下实现逻辑和代码案例! 文章目录 Vue $router.pus…...
SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法
目录 0 问题场景 1 数据准备 2 问题分析 2.1 需求一 2.2需求二 3 小结 0 问题场景 有两张表,一张用户下单表user_purchase(用户ID粒度)包含用户ID、订单ID和下单消耗金额和一张用户维表user_info包含用户ID、用户年龄和用户是否实名认证。 user_purchase user_info 需…...
SpringCloud-Alibaba第二代微服务快速入门
1.简介 Spring Cloud Alibaba其实是阿里的微服务解决方案,是阿里巴巴结合自身微服务实践,开源的微服务全家桶,在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如:Eureak,zuul等。所以Sprin…...
JSON字符串转换成对象
在Java中,将JSON字符串转换成对象是一个常见的操作,特别是在处理Web服务或API时。这通常通过使用第三方库来实现,因为Java标准库(Java SE)本身并不直接支持JSON的序列化和反序列化。最常用的库之一是Jackson和Gson。下…...
第三十五章 结合加密和签名
文章目录 第三十五章 结合加密和签名使用非对称密钥签名并加密使用非对称密钥加密并签名 第三十五章 结合加密和签名 可以在同一条消息中加密和签名。在大多数情况下,只需组合前面主题中给出的方法即可。本主题讨论了多种场景。 使用非对称密钥签名并加密 要签名…...
免费最好网站建设/域名注册需要多久
使用场景: 想要在某APP打新包之后,立即执行自动化测试的job来验证该新包。比如Job A 执行完执行Job B ,如下图所示,如何建立依赖呢? 主要有两种方法: 1、配置上游依赖; 2、配置下游依赖…...
wordpress付费站内搜索/软文发稿系统
先用fdisk -l 命令查看分区1 ?! I& e8 L2 ^ 挂载ntfs分区:& b* a1 c/ }8 o 假设/dev/hda1是Windows分区(NTFS)的位置,而要挂载的目录是:/media/windows :( S" z. g4 p/ t. k2 r4 z8 k b1 }" t. k, V3 K, E sud…...
sae wordpress 上传图片/百度网站登录
4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…...
网站如何建立快捷方式/海淀区seo搜索引擎优化企业
本文翻译自:Android 8: Cleartext HTTP traffic not permittedI had reports from users with Android 8 that my app (that uses back-end feed) does not show content. 我收到来自Android 8用户的报告,称我的应用程序(使用后端供稿&#x…...
页面模板如何设置/深圳百度搜索排名优化
一直以来做.Net 开发也好几年,却不知道依赖注入(也是醉了)。最近在学习.net Core,才开始接触学习依赖注入,自己总结一下。 微软这样定义asp.net core:一个可跨平台的高性能开源框架,用于生成基于…...
成品网站建设价格/绍兴seo排名收费
凭证纸尺寸自定义纸张尺寸对照表纸张类型自定义纸张大小()备 注凭 证账 簿6.02420127038202790US Std Fanfold(37782794)平PJ7.0Legal纸型或 标准法律用纸Legal纸型或 标准法律用纸系统自带,无须自定义其大小为21593556PJ7.02420115038302930PJ7.12420115038302930账…...