TCP通信流程解析

2023-11-13

B/S通信简述

整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet的核心协议,HTTP协议是比TCP更高层次的应用层协议。

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。

浏览器(Web Browser)负责与服务器建立连接下载网页(包括资源文件及JS脚本文件)到本地,并最终渲染出页面。JS脚本文件运行在客户端,负责客户端一些行为响应或预处理,例如提交表单前的数据校验、鼠标事件处理等交互。由此可见,浏览器(Browser)一方面充当了C/S通信架构中C角色,另一方面它是HTML/JavaScript的解析渲染引擎(Analyze Render Engine)。

当在浏览器地址栏敲入“http://www.baidu.com/”并按下回车键时,浏览器中将呈现出百度搜索引擎首页。这样一种情景我们再熟悉不过,本文通过wireshark抓取这一过程的数据包,结合TCP协议分析HTTP通信的基本流程。

MTU和MSS

本文用到的抓包工具为wireshark,它的前身是赫赫有名的Ethereal。wireshark以太网帧的封包格式为:

----------------------------------------------------------------------------------------------------

Frame=Ethernet Header +IP Header +TCP Header +TCP Segment Data

----------------------------------------------------------------------------------------------------

(1)Ethernet Header =14 Byte =Dst Physical Address(6 Byte)+ Src Physical Address(6 Byte)+Type(2 Byte),以太网帧头以下称之为数据帧。

(2)IP Header =20 Byte(without options field),数据在IP层称为Datagram,分片称为Fragment

(3)TCP Header = 20 Byte(without options field),数据在TCP层称为Stream,分段称为Segment(UDP中称为Message)。

(4)54个字节后为TCP数据负载部分(Data Portion),即应用层用户数据。

Ethernet Header以下的IP数据报最大传输单位为MTU(Maximum Transmission Unit,Effect of short board),对于大多数使用以太网的局域网来说,MTU=1500。

TCP数据包每次能够传输的最大数据分段为MSS,为了达到最佳的传输效能,在建立TCP连接时双方将协商MSS值——双方提供的MSS值中的最小值为这次连接的最大MSS值。MSS往往基于MTU计算出来,通常MSS=MTU-sizeof(IP Header)-sizeof(TCP Header)=1500-20-20=1460。

这样,数据经过本地TCP层分段后,交给本地IP层,在本地IP层就不需要分片了。但是在下一跳路由(Next Hop)的邻居路由器上可能发生IP分片!因为路由器的网卡的MTU可能小于需要转发的IP数据报的大小。这时候,在路由器上可能发生两种情况:

(1)如果源发送端设置了这个IP数据包可以分片(May FragmentDF=0),路由器将IP数据报分片后转发。

(2)如果源发送端设置了这个IP数据报不可以分片(Don’t FragmentDF=1),路由器将IP数据报丢弃,并发送ICMP分片错误消息给源发送端。

关于MTU的探测,参考《Path MTU discovery》。我们可以通过基于ICMP协议的ping命令来探测从本机出发到目标机器上路由上的MTU,详见下文。

TCP和UDP

在基于传输层(TCP/UDP)的应用开发中,为了最后的程序优化,应避免端到端的任何一个节点上出现IP分片。TCP的MSS协商机制加上序列号确认机制,基本上能够保证数据的可靠传输。

UDP协议在IP协议的基础上,只增加了传输层的端口(Source Port+Destination Port)、UDP数据包长(Length = Header+Data)以及检验和(Checksum)。因此,基于UDP开发应用程序时,数据包需要结合IP分片情况考虑。对于以太局域网,往往取UDP数据包长Length<=MTU-sizeof(IP Header)=1480,故UDP数据负载量小于或等于1472(Length-UDP Header);对于公网,ipv4最小MTU为576,UDP数据负载量小于或等于548

“向外”NAT在内网和公网之间提供了一个“不对称”桥的映射。“向外”NAT在默认情况下只允许向外的session穿越NAT:从外向内的的数据包都会被丢弃掉,除非NAT设备事先已经定义了这些从外向内的数据包是已存在的内网session的一部分。对于一方在LAN,一方在WAN的UDP通信,鉴于UDP通信不事先建立虚拟链路,NAT后面的LAN通信方需先发送消息给WAN通信方以洞穿NAT,然后才可以进行双向通信,这即是常提到的“UDP打洞(Hole Punching)”问题。

TCP连接百度过程解析

1.wireshark抓包

下文对百度的完整抓包建立在不使用缓存的基础上。如若主机存有百度站点的cookie和脱机缓存(Offline Cache),则不会再请求地址栏图标favicon.ico;请求/js/bdsug.js?v=1.0.3.0可能回应“HTTP/1.1 304 Not Modified”。可在浏览器打开百度首页后,Ctrl+F5强制刷新,不使用缓存,也可参考《浏览器清除缓存方法》。

以下为访问百度过程,wireshark抓包数据。对于直接通过Ethernet联网的机器,Wireshark Capture Filter为"host www.baidu.com";对于通过PPP over Ethernet(PPPoE)联网的机器,Wireshark Capture Filter为"pppoes and host www.baidu.com"。以下抓包示例直接通过Ethernet联网访问百度的过程。可点击下面的图片超链接下载pcap文件,使用wireshark软件打开查看。

为方便起见,以下将客户端(浏览器)简称为C,将服务器(百度后台)简称为S。

 

2.TCP三次握手建立连接

“http://”标识WWW访问协议为HTTP,根据规则,只有底层协议建立连接之后才能进行更高层协议的连接。在浏览器地址栏输入地址后按下回车键的瞬间,C建立与S(机器名为www.baidu.com,DNS解析出来的IP为220.181.6.175)的TCP 80连接(HTTP默认使用TCP 80端口)。

以下为三次握手建立TCP连接的数据包(Packet1-Packet3)。

  /****************************************************************************************************

1  192.168.89.125:5672→220.181.6.175:80   TCP(协议) 62(以太网帧长)

amqp > http [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1

2  220.181.6.175:80→192.168.89.125:5672 TCP 62

http > amqp [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 SACK_PERM=1

3  192.168.89.125:5672→220.181.6.175:80   TCP 54

amqp > http [ACK] Seq=1 Ack=1 Win=65535 Len=0

****************************************************************************************************/

三次握手建立TCP连接的流程如下:

    C(Browser)                                    S(www.baidu.com)

 1. CLOSED                                             LISTEN

 2. SYN-SENT    →<SEQ=0><CTL=SYN>              → SYN-RECEIVED

 3. ESTABLISHED← <SEQ=0><ACK=1><CTL=SYN,ACK> ← SYN-RECEIVED

 4. ESTABLISHED→ <SEQ=1><ACK=1><CTL=ACK>      → ESTABLISHED

3-Way Handshake for Connection Synchronization

2.1 三次握手的socket层执行逻辑

S调用socket的listen函数进入监听状态;C调用connect函数连接S:[SYN],S调用accept函数接受C的连接并发起与C方向上的连接:[SYN,ACK]。C发送[ACK]完成三次握手,connect函数返回;S收到C发送的[ACK]后,accept函数返回。

2.2 关于Seq和Ack

Seq即Sequence Number,为源端(source)的发送序列号;Ack即Acknowledgment Number,为目的端(destination)的接收确认序列号。在Wireshark Display Filter中,可使用tcp.seq或tcp.ack过滤。

在Packet1中,C:5672向S:80发送SYN握手包,Seq=0(relative sequence number);在Packet2中,S:80向C:5672发送ACK握手回应包,Ack=1(relative sequence number),同时发送SYN握手包,Seq=0(relativesequence number);在Packet3中,C:5672向S:80发送ACK握手回应包,Seq=1,Ack=1。

至此,Seq=1为C的ISN(Initial Sequence Number),后期某一时刻的Seq=ISN+累计发送量(cumulative sent);Ack=1为C的IAN(Initial Acknowledge Number),后期某一时刻的Ack=IAN+累计接收量(cumulative received)。对于S而言,Seq和Ack情同此理。

参考:《TCP Analyze Sequence Numbers》、《Understanding TCP Sequence and Acknowledgement Numbers

3.TCP获取网站数据流程

连接建立后,下一步发送(“GET / HTTP/1.1”)请求(Request)HTML页面,这里“/”表示S的默认首页,“GET”为HTTP Request Method;“/”为Request-URI,这里为相对地址;HTTP/1.1表示使用的HTTP协议版本号为1.1。

以下为HTTP GET请求数据包(Packet4)。

/****************************************************************************************************

4  192.168.89.125:5672220.181.6.175:80 HTTP 417

GET / HTTP/1.1

****************************************************************************************************/

HTTP GET报文长=417-54=363个字节,其中Next sequence number: 364(relative sequence number)表示,若在规定的时间内收到S响应Ack=364,表明该报文发送成功,可以发送下一个报文(Seq=364);否则重传(TCP Retransmitssion)。序列号确认机制是TCP可靠性传输的保障。

S(http)收到HTTP GET报文(共363个字节),向C(amqp)发送TCP确认报文(Packet5)。

/****************************************************************************************************

5  220.181.6.175:80→ 192.168.89.125:5672 TCP 60

http > amqp [ACK] Seq=1 Ack=364 Win=6432 Len=0

****************************************************************************************************/

这里Seq=1,为S的ISN,意为已发送过SYN。Packet2中,Ack=1为S的IAN。这里的Ack-IAN=364-1=363表示S已经从C接收到363个字节,即HTTP GET报文。同时,Ack=364也是S期待C发送的下一个TCP报文序列号(上面分析的Next sequence number)。

接下来,S向C发送Http Response,根据HTTP协议,先发响应头(Response Header),再发百度首页HTML文件。

Http Response Header报文(Packet6)如下。

/****************************************************************************************************

6  220.181.6.175:80→ 192.168.89.125:5672 TCP 465

[TCP segment of a reassembled PDU]

****************************************************************************************************/

其部分内容如下:

======================================

HTTP/1.1 200 OK

……

Content-Length: 2139

Content-Type: text/html;charset=gb2312

Content-Encoding: gzip

======================================

S响应C的“GET / HTTP/1.1”请求,先发送带[PSH]标识的411个字节的Http Response Header(Packet 6)。

TCP头部[PSH]标识置位,敦促C将缓存的数据推送给应用程序,即先处理Http Response Header,实际上是一种“截流”通知。相应C的socket调用send时在IPPROTO_TCP选项级别设置TCP_NODELAYTRUE禁用Nagle算法可以“保留发送边界”,以防粘连。

尽管握手协商的MSS为1460,但服务器或者代理平衡服务器,每次发送过来的TCP数据最多只有1420个字节。可以使用ping -f -l size target_name命令向指定目标target_name发送指定字节量的ICMP报文,其中-l size指定发送缓冲区的大小;-f则表示在IP数据报中设置不分片DF(Don’t Fragment),这样便可探测出到目标路径上的MTU。

执行“ping -f -l 1452 www.baidu.com”的结果如下:

220.181.6.18的 Ping统计信息:

   数据包:已发送 = 4,已接收 = 4,丢失 = 0 (0%丢失)

执行“ping -f -l 1453 www.baidu.com”的结果如下:

需要拆分数据包但是设置 DF。

220.181.6.18的 Ping统计信息:

   数据包:已发送 = 4,已接收 = 0,丢失 = 4 (100%丢失)

从以上ping结果可知,在不分片时,从本机出发到百度的路由上能通过的最大数据量为1452,由此推算出MTU{local,baidu}=sizeof(IP Header)+ sizeof(ICMP Header)+sizeof(ICMP Data Portion)=20+8+1452=1480。

S调用socket的send函数发送2139个字节的Http Response Content(Packet 7、Packet 9),在TCP层将分解为两段(segment)后再发出去。

/****************************************************************************************************

7  220.181.6.175:80→ 192.168.89.125:5672 TCP 1474

[TCP segment of a reassembled PDU]

----------------------------------------------------------------------------------------------------

由“Content-Length: 2139”可知,HTML文件还有2139-(1474-54)=719个字节。但此时,C已经发送了确认报文(Packet8)。

/****************************************************************************************************

8  192.168.89.125:5672→  220.181.6.175:80 TCP 54

amqp > http [ACK] Seq=364 Ack=1832 Win=65535 Len=0

****************************************************************************************************/

Seq-ISN=364-1=363,表示C已经发出了363个字节,上边已经收到了S的确认。Ack-IAN=1832-1=(465-54)+(1474-54),表示C至此已经接收到S发来的1831个字节。

接下来,C收到HTML文件剩余的719个字节,报文(Packet9)如下。

/****************************************************************************************************

9  220.181.6.175:80→ 192.168.89.125:5672 HTTP  773

HTTP/1.1 200 OK

****************************************************************************************************/

至此,C收到S发送过来的全部HTTP响应报文,即百度首页HTML内容(text/html)。

Packet6、Packet7和Packet9的ACK都是364,这是因为这三个segment都是针对Packet4的TCP响应。S将百度首页HTML文件(一个完整的HTTP报文)按照MSS分段提交给TCP层。在Wireshark中可以看到Packet9的报文中有以下reassemble信息:

[Reassembled TCP segments (2555 bytes): #6(411),#7(1420),#9(719)]

[Frame: 6, payload: 0-410(411 bytes)]

[Frame: 7, payload: 411-1830(1420 bytes)]

[Frame: 9, payload: 1831-2549(719 bytes)]

C(amqp)接收到百度首页的HTML文件后,开始解析渲染。在解析过程中,发现页面中含有百度的logo资源baidu_logo.gif,并且需要bdsug.js脚本

<img src="http://www.baidu.com/img/baidu_logo.gif" width="270" height="129" usemap="#mp">

{d.write('<script src=http://www.baidu.com/js/bdsug.js?v=1.0.3.0><//script>')}

于是上面那个连接(C:5672)继续向S请求logo图标资源,报文(Packet10)如下。

/****************************************************************************************************

10 192.168.89.125:5672→  220.181.6.175:80 HTTP 492

GET /img/baidu_logo.gif HTTP/1.1

****************************************************************************************************/

与此同时,C(jms)新建一个连接(TCP 5673)向S请求js脚本文件。报文(Packet11)如下。

/****************************************************************************************************

11 192.168.89.125:5673→  220.181.6.175:80 TCP 62

jms > http [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1

****************************************************************************************************/

(Packet12)Packet13、Packet14、Packet16和Packet17为对Packet10的TCP响应(它们的Ack=802),在逻辑上它们是一个完整的TCP报文。其Http Response Content为图片文件baidu_logo.gif。我们在Wireshark中可以看到Packet17的报文中有以下reassemble信息:

[Reassembled TCP segments (1801 bytes): #13(312),#14(1420),#16(28) ,#17(41)]

[Frame: 13, payload: 0-311(312 bytes)]

[Frame: 14, payload: 312-1731(1420 bytes)]

[Frame: 16, payload: 1732-1759(28 bytes)]

[Frame: 17, payload: 1760-1800(41 bytes)]

Packet11-Packet19-Packet20完成新连接的三次握手。然后,C(jms)发送“GET /js/bdsug.js?v=1.0.3.0 HTTP/1.1”报文(Packet21),以获取bdsug.js脚本文件。

/****************************************************************************************************

21 192.168.89.125:5673→  220.181.6.175:80 HTTP 465

GET /js/bdsug.js?v=1.0.3.0 HTTP/1.1

****************************************************************************************************/

(Packet22)Packet23、Packet24、Packet26和Packet27为对Packet21的TCP响应(它们的Ack=412),在逻辑上它们是一个完整的TCP报文。其Http Response Content为脚本文件bdsug.js。我们在Wireshark中可以看到Packet27的报文中有以下reassemble信息:

[Reassembled TCP segments (3897 bytes): #23(310),#24(1420),#26(1420) ,#27(747)]

[Frame: 23, payload: 0-309(310 bytes)]

[Frame: 24, payload: 310-1729(1420 bytes)]

[Frame: 26, payload: 1730-3149(1420 bytes)]

[Frame: 27, payload: 3150-3896(747 bytes)]

通常,浏览器会自动的搜索网站的根目录,只要它发现了favicon.ico这个文件,就把它下载下来作为网站地址栏图标。于是,C(amqp)还将发起“GET /favicon.ico HTTP/1.1”请求网站地址栏图标,见报文Packet29。

4.TCP四次挥手关闭连接

经Packet28确认收到了完整的japplication/javascript文件后,链路1(本地端口5673)使命结束,S关闭该链路,进入四次挥手关闭双向连接。

(Packet30)Packet31和Packet32为对Packet29的TCP响应(它们的Ack=1201)。经Packet33确认收到了完整的image/x-icon文件后,链路2(本地端口5672)使命结束,S关闭该链路,进入四次挥手关闭双向连接。

   为什么握手是三次,而挥手是四次呢?这是因为握手时,服务器往往在答应建立连接时,也建立与客户端的连接,即所谓的双向连接。所以,在Packet2中,服务器将ACK和SYN打包发出。挥手,即关闭连接,往往只是表明挥手方不再发送数据(无数据可发),而接收通道依然有效(依然可以接受数据)。当对方也挥手时,则表明对方也无数据可发了,此时双向连接真正关闭。

 

参考:

浏览器/网页工作原理》《What really happens when you navigate to a URL

HTTP通信过程分析

究竟什么是HTTP连接

一次完整的HTTP通信步骤

SOCKET与TCP/IP与HTTP的关系

TCP连接、Http连接与Socket连接

TCP传输协议抓包经验




FROM: http://blog.csdn.net/phunxm/article/details/5836034

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP通信流程解析 的相关文章

  • linux AIO (异步IO) 那点事儿

    在高性能的服务器编程中 IO 模型理所当然的是重中之重 需要谨慎选型的 对于网络套接字 我们可以采用epoll 的方式来轮询 尽管epoll也有一些缺陷 但总体来说还是很高效的 尤其来大量套接字的场景下 但对于Regular File 来说
  • 【Linux学习】epoll详解

    什么是epoll epoll是什么 按照man手册的说法 是为处理大批量句柄而作了改进的poll 当然 这不是2 6内核才有的 它是在2 5 44内核中被引进的 epoll 4 is a new API introduced in Linu
  • ipv6 socket bind 失败 - accept_dad

    file proc sys net ipv6 conf interface accept dad variable net ipv6 conf interface accept dad Official reference Whether
  • 网络层:IP协议

    本博文分享的是网络层的IP协议 从IP协议的基本概念 协议格式开始分析并分享出来 IP协议的基本概念 不同于讨论TCP UDP时只讨论通信主机之间的关系 在讨论IP协议中 会加上主机之间的网络来一起进行讨论分析 主机 一般配有IP地址 路由
  • C++在线五子棋对战(网页版)项目:websocket协议

    目标 认识理解websocket协议 websocket切换过程和websocket协议格式 认识和学会使用websocketpp库常用接口 了解websocketpp库搭建服务器流程 认识和学会使用websocketpp库bin接口 最后
  • webbench剖析

    webbench 其为linux上一款web性能压力测试工具 它最多可以模拟3万个并发连接数来测试服务器压力 其原理为fork多个子进程 每个子进程都循环做web访问测试 子进程将访问的结果通过管道告诉父进程 父进程做最终结果统计 其主要原
  • Linux下socket异步通讯聊天程序

    Linux下socket异步通讯聊天程序 转 original from http yangqi org linux socket asynchronous im system Posted by yangqi 2010年02月17日 We
  • 【Linux网络(C++)】——网络套接字(TCP/UDP编程模型)多进程,多线程,线程池服务器开发(画图解析)

    目录 一 套接字基本概念 IP地址 TCP和UDP协议 端口号 端口号vs 进程pid 网络字节序 本地字节序转换成网络字节序 网络字节序转换为本地字节序 二 套接字的基本操作 socket的创建 域 domain 类型 type 协议 P
  • 高并发的epoll+线程池,业务在线程池内

    epoll是linux下高并发服务器的完美方案 因为是基于事件触发的 所以比select快的不只是一个数量级 单线程epoll 触发量可达到15000 但是加上业务后 因为大多数业务都与数据库打交道 所以就会存在阻塞的情况 这个时候就必须用
  • socket阻塞与非阻塞,同步与异步、I/O模型

    socket阻塞与非阻塞 同步与异步 作者 huangguisu 1 概念理解 在进行网络编程时 我们常常见到同步 Sync 异步 Async 阻塞 Block 非阻塞 Unblock 四种调用方式 同步 所谓同步 就是在发出一个功能调用时
  • 基于tcpdump实例讲解TCP/IP协议

    前言 虽然网络编程的socket大家很多都会操作 但是很多还是不熟悉socket编程中 底层TCP IP协议的交互过程 本文会一个简单的客户端程序和服务端程序的交互过程 使用tcpdump抓包 实例讲解客户端和服务端的TCP IP交互细节
  • linux系统PXE自动装机无人值守

    PXE高效批量网络装机 PXE服务允许客户机通过网络从远程服务器下载引导镜像 并安装文件或整个操作系统 必须满足的前提条件 客户机的网卡支持PXE协议 且主板支持网络引导 网络中有一台DHCP服务器为客户机分配地址 指定引导文件位置 服务器
  • Linux网络和安全:配置、远程访问与防御指南

    文章目录 Linux 网络和安全 引言 网络配置 IP地址配置 配置网络接口 防火墙设置 安全性加强 Linux网络配置及端口管理 网络配置命令 端口管理 防火墙和安全性设置 防火墙管理工具 安全性设置 Linux远程访问技术 SSH和VP
  • 【网络自定向下的学习】——TCP3次握手和4次挥手详解

    目录 前言 一 可靠数据传输 1 确认应答机制 2 超时重传机制 二 建立连接 三次握手 1 建立连接的过程 2 为什么会有三次握手 3 三次握手可以携带数据吗 4 什么是半连接队列 三 断开连接 4次挥手 1 4次挥手的过程 2 为什么连
  • linux下异步RPC的阶段性总结-非阻塞SOCKET客户端

    尽可能使用非阻塞socket int flags s flags fcntl fd F GETFL 0 if flags 1 close fd return 1 flags O NONBLOCK s fcntl fd F SETFL fla
  • 组播技术

    1 概述 1 1 产生背景 传统的IP通信有两种方式 一种是在源主机与目的主机之间点对点的通信 即单播 另一种是在源主机与同一网段中所有其它主机之间点对多点的通信 即广播 如果要将信息发送给多个主机而非所有主机 若采用广播方式实现 不仅会将
  • TCP通信流程解析

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用
  • linux非阻塞socket教程

    本文并非解释什么是非阻塞socket 也不是介绍socket API的用法 取而代替的是让你感受实际工作中的代码编写 虽然很简陋 但你可以通过man手册与其它资源非富你的代码 请注意本教程所说的主题 如果细说 内容可以达到一本书内容 你会发
  • 【网络自定向下学习】——TCP报文段的详细解析

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 目录 一 Tcp报文段的结构 二 首部长度 三 窗口大小 四 序列号和确认序
  • Http协议详解

    引入 超文本传输协议 HTTP HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 1960年美

随机推荐

  • EM算法估计beta混合模型参数

    1 用 network memerisation 造成的 clean noisy 数据 loss 差异来区分 clean noisy data 当得到一批数据的 normalised loss l i 0
  • android 填充,Android Drawable部分填充

    是的 如果您使用Layer List并定义重叠的项目 则是可能的 这是一个例子 android height 30dp gt android height 30dp gt 您可能需要尝试这些值 并根据需要进行调整 编辑 我认为您无法指定相对
  • MATLAB 添加自有的工具包

    我们经常会用到一些专业的MATLAB工具包 这些工具包下载好后应该如何添加呢 下面简单介绍 1 在命令行中敲入 pathtool 启动 设置路径 窗口 如下图所示 2 根据自己的需求 选择 添加文件夹 或者 添加并包含子文件夹 然后选择自己
  • linux 串口调试助手,COMTool: Cross platform Serial Assistant ( 跨平台 串口 调试 助手 串口助手 串口调试助手 linux windows mac R...

    COMTool A cross platform serial debug tools written by python Windows Linux Elementry OS Raspberry Pi3 screenshot shows
  • Mediapipe+OpenCV图像识别技术与Unity引擎的结合-Part2

    前言 之前写了一篇文章 Mediapipe OpenCV图像识别技术与Unity引擎的结合 其中的技术是Python利用OpenCV图像捕捉 配合强大的Mediapipe库来实现人体动作检测与识别 将识别结果实时同步至Unity中 实现人物
  • 开机出现文件windows root\system32\ntoskrnl.exe的另类解决办法

    一般的复制文件方法就不说了 我的这个是因为拷贝ntoskrnl exe还提示错误的解决办法 发生这种问 题主要可能有以下原因 Boot ini 文件的 Boot Loader 部分中的 Default 值丢失或无效 Ntoskrnl exe
  • JavaScript之变量和类型

    变量和类型 用处 1 让代码可以重复使用 重用性 2 修改代码方便 灵活 灵活性 1 上面 i love you 要写4次 2 把 love 改成 hate 要写4次 改成使用变量
  • 解决Windows因D3DCompiler_47.dll文件找不到等问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个D3DCompiler 47 dll文件进行安装
  • 基于RBAC模型的权限设计思路

    一 RBAC模型 进行设计前 最好能够理解技术模型 在业界接受度较高的功能权限模型是RBAC Role Based Access Control 模型 其基本理念是将 角色 这个概念赋予用户 在系统中用户与权限之间通过角色进行关联 以这样的
  • 解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上,运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本,激活win10步骤流程。

    一 解决 0x803F7001在运行Microsoft Windows非核心版本的计算机错误 首先 按下win R打开 运行 输入 regedit 后回车 打开注册表 然后再注册表下输入地址HKEY LOCAL MACHINE SOFTWA
  • 有计算机考试励志的文案,抖音冲刺高考励志文案

    不知不觉就是2021年的高考了 其实高考也没有什么可怕的 保证心态好 就可能考出比平时更好的成绩 冲刺高考励志句子怎么写有哪些你知道吗 今天小编在这给大家整理了一些关于冲刺高考励志句子 我们一起来看看吧 冲刺高考励志句子 1 再苦再难 也要
  • js 中map()方法和reduce()方法

    js中的map是映射的意思 即原数组被映射成新的数组 而这个数组是由原数组中的每个元素调用一个特定的方法返回值组成的新数组 比如 首先定义一个方法F 然后map F 那么执行结果就是所有输入的值执行完F这个方法后产生的新数组 注意 map
  • Java加密技术(三)——PBE算法

    除了DES 我们还知道有DESede TripleDES 就是3DES AES Blowfish RC2 RC4 ARCFOUR 等多种对称加密方式 其实现方式大同小异 这里介绍对称加密的另一个算法 PBE PBE PBE Password
  • win10专业版激活(cmd方式)

    转载于 https www cnblogs com bug baba p 11225322 html
  • VBS基础篇 - 条件语句(1) - If...Then...Else

    转自http www cnblogs com sirrah articles 2349078 html 使用条件语句和循环语句可以控制脚本的流程 使用条件语句可以编写进行判断和重复操作的 VBScript 代码 在 VBScript 中可使
  • 法如X330扫描仪在行业内的使用性

    3D扫描仪是一种用于捕捉实物三维模型的设备 通常通过激光 光线 摄像头等技术获取物体表面的点云数据 并将其转换成可编辑的三维模型 扫描仪的操作流程 1 准备工作 首先需要确定需要扫描的物体的大小 形状和材质 根据物体大小选择适当的扫描仪型号
  • 每天学命令

    report timing clock from edge from lead trail clock to clk signame list edge to lead trail rise fall early late hpin che
  • 【webrtc】音频采集-链接错误总结

    在集成webrtc的过程中 大量使用了directshow 大量的链接失败 而lib库又不好找 花费了大量时间 分享出来 共同学习 1 wmcodecdspuuid lib 1 gt audio device lib audio devic
  • 分析如何计算TVS管的功率?

    常见的汽车电源部分的原理图 分别是防反接模块和LDO模块 我们的客户要求ISO7637 2脉冲5为40V 400ms 内阻2欧姆 我开始时用的SMBJ20CA 结果TVS管被烧毁 后改成SMBJ36CA 现在可以过ISO7637 2脉冲5
  • TCP通信流程解析

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用