代码编织梦想

传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道.linux系统的套接字机制支持低层协议发送和接受带外数据.但是TCP协议没有真正意义上的带外数据.为了发送重要协议,TCP提供了一种称为紧急模式(urgent mode)的机制.TCP协议在数据段中设置URG位,表示进入紧急模式.接收方可以对紧急模式采取特殊的处理.很容易看出来,这种方式数据不容易被阻塞,可以通过在我们的服务器端程序里面捕捉SIGURG信号来及时接受数据或者使用带OOB标志的recv函数来接受.
  Intel® 主动管理技术 (Intel AMT) 就是使用的OOB.
A,TCP支持带外数据OOB吗?与紧急模式URG有什么关系?
     TCP支持带外数据,但是只有一个OOB字节,TCP的带外数据是通过紧急模式URG实现的.
B,我们知道send(sendfd,"ABC",3,MSG_OOB),将发送3个字节的带外数据OOB数据.但是这里TCP又只支持一个字节的OOB,难道丢掉2个字节?
     TCP将把紧急模式URG 置位,紧急指针定位第三个字节("C")(这里不管它的具体位置,紧急指针的作用就是提供定位那个OOB字节的信息),前两个字节("AB")当作普通字节发送.其实TCP总是把最后一个字节当作OOB数据,其他的当作普通字节.不管你通过带MSG_OOB标志的sendxxx函数发送多少字节带外数据OOB数据,发送端只把最后一个字节当作OOB数据,接收端也只能收到一个字节的OOB数据.
C,如果一定要发送多字节的带外数据,让接收端能一次收到多个字节的带外数据.能不能做到?
     对于TCP协议,不能!
D,对于TCP,收到的带外数据怎么保存?
     两种模式:
     1,非OOBINLINE 模式,这是套接字的默认模式,把OOB字节与普通字节分开存放.存放在一个OOB缓冲区中,当然TCP只有一个字节,可以用一个字节保存OOB数据.
     2,OOBINLINE 模式,OOB字节和普通字节一起存放,它和普通字节本来就是一起发送,当然可以一起存放.
E,recv(recvfd,buff,256,MSG_OOB).会有哪些结果?
     recvxxxx函数,在MSG_OOB模式下,将在OOB缓冲区中寻找数据。
     如果发送端没发送OOB字节,它返回错误.
     如果发送端发送了OOB字节:
     1,对于非OOBINLINE 模式,它返回1字节的OOB数据.
     2,对于OOBINLINE 模式,它返回错误.因为OOB字节没有放到OOB缓冲区中.
F,如果发送端使用MSG_OOB模式,send(sendfd,sndbuff,64,MSG_OOB),发送了包含"OOB字节"的64字节数据,然后用非MSG_OOB模式,send(sendfd,sndbuff,64,0)发送64字节,当接收端收到64+64字节的数据后,用recv(recvfd,revbuff,256,0).会有哪些结果?
1,对于非OOBINLINE 模式,第一次recv(recvfd,revbuff,256,0)只返回前63字节的普通数据,接收缓冲区剩下64字节.要获得1字节的OOB数据,必须使用MSG_OOB模式的revxxx函数.再次recv(recvfd,revbuff,256,0),返回第二次发送的64字节.一次recvxxx不跨越urg-mark标记.
2,对于OOBINLINE 模式,第一次recv(recvfd,revbuff,256,0)只返回前63字节的普通数据,接收缓冲区剩下65字节(OOB+64字节),第二次recv(recvfd,revbuff,256,0),对于windows,只返回一字节的OOB字节,需要第三次rev才能返回最后的64字节,对于linux/unix,第二次rev 就返回65字节(OOB+64字节).总之与协议栈的实现有关.
G,如果OOB字节没被应用程序读取,协议栈又收到了新的OOB字节,会出现什么情况?
    TCP协议对每个socket保持一个URG指针,此时直接刷新URG指针,指向新的OOB字节.
对于非OOBINLINE,旧的OOB字节直接被丢弃,被新的OOB字节覆盖(经过本人测试,旧的OOB字节并不会被丢弃,而是被放入普通数据的接受缓冲区).
对于OOBINLINE,旧的OOB字节仍然在接收缓冲区中,但被当着普通数据看待,每个socket只有一个URG指针,只能定位一个OOB字节.
 
注:经测试发现,OOBINLINE是否设置带来的区别仅仅在于读取URG字节的时候是否需要MSG_OOB标志,其他包括sockatmark函数,新到OOB字节时对于尚未被读出的OOB字节的处理都是相同的。另外,即使在SIGURG处理函数中已经使用MSG_OOB读出了OOB数据,只要在普通接收缓冲区中的读指针还没有越过带外标记,OOB数据还是会被放入普通的接收缓冲区中(行为与没有读出OOB数据一样)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dingmin1860/article/details/48311307

说说配置gitlab的webhook时踩过的坑_coder麻雀的博客-爱代码爱编程

之前把公司的版本管理从svn换到了gitlab,用的各种舒适,但是,我的上线属于手动上线,先在本地git push到主分支,再到线上环境去运行git pull命令把代码拉取下来。 如何能做到自动部署呢? 答案是webhook。 有关如何配置webhook,推荐文章https://www.jianshu.com/p/00bc0323e83f。 那么w

配置git的webhook_一路向前ylc的博客-爱代码爱编程_git webhook

每次git push 后 ,服务器上都要去git pull 一下,很麻烦,因此我们可以编写一个钩子程序来执行git pull。 编写githook文件 <?php         $fs = fopen('./git_hook.log', 'a');         fwrite($fs, 'Request on ['.date("Y-m-d H:

使用宝塔面板配置webhook_xiaojin802399的博客-爱代码爱编程_宝塔的webhook

前言:最近开发用的测试服务器搭建了宝塔面板,在团队开发的时候为了方便,使用webhook不用上服务器自己手动拉代码,现在就说说宝塔webhook的配置 1.先来说说git仓库 git仓库有很多代码托管平台,Github、Gitee、Gitlab等等,本文使用Gitee配置webhook,其他git仓库大致相同效仿就行。 使用git clon

git webhooks 实现自动拉取代码_如风521的博客-爱代码爱编程_git webhooks

一. 关于 git 钩子 Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你

[Git] Github仓库添加webhook,Jenkins自动build-爱代码爱编程

给github仓库添加webhook,每次使用git push命令时,jenkins就会自动build。 步骤如下: 进入某一仓库的settings添加左侧导航栏的Webhook点击Add wekhook填写Payload URL,这里的URL就是jenkins的地址,example: http://myjenkins.com/github-webho

git的使用webhook实现自动化部署-爱代码爱编程

服务器使用ssh公钥拉取代码 ssh-keygen -t rsa -C "xxx@xx.com" cat .ssh/id_rsa.pub 出现的公钥复制到对应位置 使用webook出现报错:Host key verification failed. 使用www用户操作一次 git pull 流程即可 1:为www用户设置文件的操作执行权限 2:切

git生成ssh公钥_利用 WebHook 实现 Git 代码自动部署-爱代码爱编程

前提: 本文基于LNMP PHP代码自动部署;必须使用www用户;本文Git平台为 腾讯工蜂;操作步骤: 目标服务器切www用户:su www 切换用户(www)时:this account is currently not available 。此时,运行 cat /etc/passwd | grep www # 查看是否为 /sbin/nolg

git使用Webhook功能上传文件至服务器-爱代码爱编程

每次上传一些静态资源到我的阿里云服务器是都要使用sftp登录,然后上传文件,挺麻烦的,后来了解到github和gitee都有webhook功能,就利用该功能实现了服务器自动拉取静态资源文件的操作。 WebHook 简介 Gitee WebHook 功能是用户 push 代码后,github或者gitee自动回调一个用户设定的 http 地址。 用户可

Jenkins 进阶 05 Generic Webhook 实践优化 获取提交信息-爱代码爱编程

之前gitlab和Jenkins已经集成好了,现在需要来解析一些数据,因为提交构建需要有些值去拿的。  比如可以获取谁提交的,哪个分支提交的,用户Email和commitid。 "user_username": "root" "ref": "refs/heads/master" "user_email": "" "checkout_sha":

通过宝塔webhook实现git代码自动服务器部署_野玩家的博客-爱代码爱编程

第一步:配置webhook 从宝塔软件商店下载并安装webhook插件 点击设置 ==> 添加    名称自定义,脚本如下: /usr/bin/sh /opt/shell/auto-git-pull.sh $1 > /www/wwwlogs/auto-git-pull.log 第二步:配置脚本及日志文件 脚本:/opt/s

jenkins(2)— 配置webhook触发器-爱代码爱编程

1、webhook介绍 Gitee WebHook触发器 的功能是帮助用户 push 代码后,自动回调一个您设定的 http 地址。例如我们可以通过添加webhook触发器来实现这样一个功能: 每当开发push代码到提测分支后,自动触发jenkins构建,运行自动化测试用例,快速回归测试并输出测试报告,实现自动化测试集成到项目流程中来保障项目质量。

宝塔利用 git + webhook 实现与码云同步【自动部署】-爱代码爱编程

1. 将项目拉取到云服务器2. 配置 SSH 公共密钥3. 宝塔安装webhook4. 配置 gitee WebHook5. 测试同步 1. 将项目拉取到云服务器 拉取指定分支到云服务器 git clone -b 分支名 仓库地址 git clone -b liang https://gitee.com/holyking/test.git 配置永久记

详解git自动化部署webhook_git webhook-爱代码爱编程

前言:记录自己使用WebHook实现自动化部署项目 个人博客 已更新该文章— 详解git自动化部署WebHook WebHook 简介 WebHook 功能是帮助用户 push 代码后,自动回调一个设定的