InternetProtocol

数据包结构图

IP_DATAPACKET

各字段说明

字段命 位数 说明
version 4bit 版本号
headerLength 4bit 表示首部长度占多少个32bit数量,所以,最大首部长度为15*4byte(32bit) = 60 byte;
typeOfService(TOS) 8bit 服务类型
totalLength 16bit 整个ip数据报的长度,子节为单位,所以ip数据报最大长度为0xFF(65536)byte
identification 16bit 16位标识
fragmentOffset 16bit 片偏移 3bit标识 + 13bit片偏移
TTL 8bit 生存时间,数据包最多可以经过最多的路由数,TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机
protocol 8bit 协议
checksum 16bit 首部校验和
source 32bit 源地址
destination 32bit 目的地址

头部长度合计: headerLength*4 byte


  • version: 4bit

  • headerLength: 4bit(15),表示首部长度占多少个32bit数量,所以,最大首部长度为15*4byte(32bit) = 60 byte;

  • typeOfService(TOS):8bit, 服务类型

  • totalLength:16bit,整个ip数据报的长度,子节为单位,所以ip数据报最大长度为0xFF(65536)byte

  • identification:16bit,16位标识,

  • fragmentOffset:16bit,片偏移 3bit标识 + 13bit片偏移

  • TTL :8bit,生存时间,数据包最多可以经过最多的路由数,TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机

  • protocol:8bit,协议

  • checksum: 16bit,首部校验和

  • source:32bit,源地址

  • destination:32bit,目的地址

    ----
    

InternetProtocol

数据包结构图

IP_DATAPACKET

各字段说明

字段命 位数 说明
version 4bit 版本号
headerLength 4bit 表示首部长度占多少个32bit数量,所以,最大首部长度为15*4byte(32bit) = 60 byte;
typeOfService(TOS) 8bit 服务类型
totalLength 16bit 整个ip数据报的长度,子节为单位,所以ip数据报最大长度为0xFF(65536)byte
identification 16bit 16位标识
fragmentOffset 16bit 片偏移 3bit标识 + 13bit片偏移
TTL 8bit 生存时间,数据包最多可以经过最多的路由数,TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机
protocol 8bit 协议
checksum 16bit 首部校验和
source 32bit 源地址
destination 32bit 目的地址

头部长度合计: headerLength*4 byte


  • version: 4bit

  • headerLength: 4bit(15),表示首部长度占多少个32bit数量,所以,最大首部长度为15*4byte(32bit) = 60 byte;

  • typeOfService(TOS):8bit, 服务类型

  • totalLength:16bit,整个ip数据报的长度,子节为单位,所以ip数据报最大长度为0xFF(65536)byte

  • identification:16bit,16位标识,

  • fragmentOffset:16bit,片偏移 3bit标识 + 13bit片偏移

  • TTL :8bit,生存时间,数据包最多可以经过最多的路由数,TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机

  • protocol:8bit,协议

  • checksum: 16bit,首部校验和

  • source:32bit,源地址

  • destination:32bit,目的地址

    ----
    

主动关闭的一方会进入TIME_WAIT,此时处于TIME_WAIT状态下的端口是不能用来LISTEN
SO_REUSEADDR 开启这个选项后,即使处于TIME_WAIT状态的peer(ip:port),也可以重新使用

TCP_NO_DELAY: 默认关闭
Nagle算法(拥塞控制算法)
发送方发送的数据大于等于MSS(Maximum segement size) = MTU - IP_HDR - TCP_HDR(tcp双端建立连接后协商的每次传输可接收最大字节数)

当已debug方式启动项目时,JVM进程直接就退出了 exit code 1

项目是spring-boot 2.3.6
spring-cloud Hxon-SR7
开始以为是spring 版本原因,因为启动之前的项目(spring-boot/cloud 1.x)完全正常。

最终通过控制变量,排除法,找到了问题

IDEA自2019.3后增加了Reactor Stream debug

开启这个后,项目就无法以Jrebel -debug方式启动。真坑啊。

最后找到了Reactor stream debugger.这个插件位置:jb-idea install dir /plugins/reactivestreams-core

有时间了反编译下这个插件,看看啥原因

https://www.jetbrains.com/help/idea/reactor.html#reactor-inspections

https://blog.jetbrains.com/idea/2019/10/whats-new-in-intellij-idea-2019-3-eap6-improved-reactor-support-and-a-huge-pack-of-fixes/

MediaCodec

inputBuffer (用于解码)

outputBuffer(用于获取编码后的数据)

录屏暂停

VideoEncoderCore

WSLiveDemo

编码相关

Libyuv

https://github.com/RyanRQ/ScreenRecoder

https://github.com/HelloHuDi/ScreenCapture

https://www.twblogs.net/a/5b8dd29b2b7177188340d7da?lang=zh-cn

https://github.com/chienpm304/Zecorder

https://zhuanlan.zhihu.com/p/268441151

https://github.com/TakuSemba/RtmpPublisher

https://www.coder.work/article/3500335

https://cloud.tencent.com/developer/article/1580199


var encoder = MediaCodec.createEncoderByType("video/aac")
while(true){
var index = encoder.dequeueOutputBuffer(info,10000);
if(index == "INFO_TRY_AGAIN_LATER"){
//TODO
}else if(index == "INFO_OUTPUT_FORMAT_CHANGED"){
//TODO
}else if(index =="INFO_OUTPUT_BUFFERS_CHANGED"){
//TODO
}
}

yuv -> h.264

微信公众号h5页面

关键知识

  • uin : 微信公众号/账户 唯一id

  • username : 微信公众号/账户的用户名 微信后端自动生成?

  • username 的获取可以通过找到公众号页面,然后点击“举报”,这时候可以通过抓包的方式,或者chrome-remote-debug查看“举报”页面的url中的username参数.

公众号资料页

//微信公众号的唯一数字码?
var uni = '123545';
var uniBase64 = b64(uni);
var mpPforileUrl = `https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=${uniBase64}#wechat_redirect`;

https://mp.weixin.qq.com/mp/profile_ext?action=report&uin=777&key=777&pass_ticket=fPx54kmr6jcYdnK8qI81wat4YVhJG3imtE6y2boI0KMfM+cLv5bZD7MdmM5YrSrI&username=&useraction=[object Object]&t=0.8240767701548524&scene=&__biz=MzU0MzExMzIwOA==&is_ok=1&fromplatform=3

静默自动关注

页面引入wx-js-sdk后

执行如下代码

var username= '';
//config
// 这里获取js签名参数.
var meta = {

};
window.wx && wx.config({
debug:true,
beta: true,
appId: meta.appid,
timestamp: meta.timestamp,
nonceStr: meta.noncestr,
signature: meta.signature,
jsApiList: ["quicklyAddBrandContact"]
});

(wx.ready(function () {
wx.invoke("quicklyAddBrandContact", {
username: username,
scene: ""
}, function (e) {
//{"err_msg":"quickly_add_contact:ok"}
//备注如果 e.err_msg 中包含ok则表示关注成功
console.log(e)//这时候可能会失败,然后需要执行
});
}),
wx.error(function (e) {
console.log(e);
}));

插件开发相关资源

IDEA平台版本号

IntelliJ Platform Based Products of Recent IDE Versions

API变更说明

Api changes

使用Gradle构建

Building Plugins with Gradle

插件的扩展点 && 组件说明

ApplicationComponent

initComponent只会回调一次,无论打开多个Project窗口

ToolWindowFactory

只实例化一次

AnAction

action被点击后,可以通过回调获取当前Project

public void actionPerformed(AnActionEvent e){
Project project = e.getDataContext().getData(PlatformDataKeys.PROJECT);
}


查询API使用方式

https://www.programcreek.com/java-api-examples/?api=com.intellij.execution.filters.TextConsoleBuilderFactory

其他

JRebel插件

  1. jrebel-config-client.jar 包含jrebel扩展参数。

RebelArgs

JrebelConfiguration

LunchingArgs

RouteDefination : 路由定义,配置文件中的
|
| convert
|
Route : 实际使用的路由信息

RouteDefinationLocator

RouteLocator

Request links

ReactorNetty
|
HttpServerHandle
|
ReactorHttpHandlerAdapter
|
WebServerManager
|
HttpWebHandlerAdapter
|
ExceptionhandlingWebHandler
|
FilteringWebHandler
|
DefaultWebFilterChain
|
DispatcherHandler
|
RoutePredicateHandlerMapping
|
SimpleHandlerAdapter
|
FilteringWebHandler
|
ReactiveLoadBalancerClientFilter
|
ReactorLoadBalancer

Architecture Components

SecurityContextHodler

ThreadLocal相关的安全上下文Holder

SecurityContext

包含 Authtication对象,用于获取当前已认证的用户信息

Authentication

  1. 未认证之前的包含用户提供凭证信息,交给 AuthenticationManager 处理

  2. 认证完成后的包含用户认证信息,通常托管在SecurityContext

GrantedAuthority

在用户认证中授予给用户的权限

AuthenticationManager

定义了SpringSecurity过滤器如何执行身份验证的API

ProviderManager

AuthenticationManager 的一个实现

AuthenticationProvider

ProviderManager用于执行特定类型的身份验证

Request Credentials with AuthenticationEntryPoint

用于从客户端请求凭证(即重定向到登录页面,发送一个WWW-Authenticate响应,等等)

AbstractAuthenticationProcessingFilter

用于身份验证的基本过滤器。这还可以很好地了解身份验证的高级流程以及各个部分如何协同工作。

Authentication Mechanisms

用户身份验证机制

Username and Password

如何通过用户名密码进行认证

OAuth 2.0 Login

使用OpenID Connect和非标准OAuth 2.0登录进行OAuth 2.0登录(如Github等…)

SAML 2.0 Login

Central Authentication Server (CAS)

Remember Me

JAAS Authentication

OpenID

Pre-Authentication Scenarios

X509 Authentication

SecurityContextHolder

SecurityContextHolder

获取token

Authentication-server

TokenEndpoint 

`/oauth/token`

incoming request
|
SecurityFilterChain
|
AbstractAuthenticationProcessingFilter
|
ClientCredentialsTokenEndpointFilter
|
AuthenticationManager
|
|
ProviderManager
- -
|
AuthenticationProvider
|
AbstractUserDetailsAuthenticationProvider
|
DaoAuthenticationProvider
|
TokenEndpoint
|
authenticate->tokenGrant->return

ClientDetails
-->
AuthorizedGrantTypes
-> password,xxx,xxx,xxx

检查token

Authentication-server

CheckTokenEndpoint

`/oauth/check_token`

imcomping request
|
OAuth2AuthenticationProcessingFilter
|
OAuth2AuthenticationManager#loadAuthentication
· |
RemoteTokenServices 验证token正确性
|
AccessTokenConverter
|
UserAuthenticationConverter 从map中获取认证信息(principal,authorities)

-> FixedAuthoritiesExtractor 获取权限列表

-> UserDetailsService 获取principal认证信息(可以表示为用户信息)

Mapper

MapperProxy
MapperMethod
->SqlCommand
statementId: mapperInterface.getName() + “.” + methodName;

DvaJs Vuex
Effect Action
Reducer Mutation
0%