PNP : TCP relay Socks4a
TCP relay
TCP中继。
带宽不匹配问题怎么应对?
TCP half-closed
muduo的做法是:
TcpConnection::shutdown() –> shutdown(sockfd, SHUT_WR)
Keep read(sockdf) uitil it return 0, then close(sockfd)
有可能数据没有读完,此时如果使用close关闭连接,那么TCP会发送一个RST到对端,导致对端数据接收不完整。
向一个收到RST报文的连接发送数据,进程会收到SIGPIPE信号。
那么何时会收到RST报文呢?
1. 请求的目标端口未开放,会收到rst段。
2. socket Recv-Q中的数据未完全被应用程序读取,而关闭该socket,会发送rst段。
3. 向已关闭的socket发送数据,对方会发回rst段。
4. SO_LINGER可以控制close的行为,发送rst。
muduo对与发送方向的half-close做了处理,但是对于接收方向,没做处理,因为这个需求并不常见。在read返回0时,无法判断对方时调用的close、还是shutdown
https://www.zhihu.com/question/48871684
如果看到Fin_WAIT_2 CLOSE_WAIT 状态,说明有程序在使用tcp half-close, 只关闭了写端,但是还可以继续接收数据。
non-block TCP relay
通过高水位回掉避免两端接收速度不匹配的情况(阻塞IO不会有这个问题,速度不匹配被自动完成).
tcprelay
$ ./tcprelay 127.0.0.1 3000 2000
客户端
$ pv /dev/zero | nc localhost 2000
服务端 可以限速来模拟一方接受较慢的情况
$ nc -l 3000 | pv -L 1M >/dev/null
61课的调试手段值得学习,gdb 手动调用一个函数,使用命令p
SOCKS4 and SOCKS4a
Non-blocking IO is not the only choice
异步DNS解析有些负责,其实nonblock IO不是唯一的选择。
TLS握手过程:
openssl中这个过程使用的是阻塞IO,使用非阻塞IO将会很复杂。对于天生支持并发的go语言来说,实现这个过程很简单。见go语言的src/crypto/tls/handshake_server.go 中的实现。
Threads vs Events debating for 20 years
关于线程模型和事件驱动模型的争论。
第7层以外的实现
splice可以避免read,write之间的拷贝。
这是从第4层做的relay,相比第7层要简单。
Maglev:Google’s network load balancer.
Bugs
https://github.com/chenshuo/muduo/commit/0502020488bc6d381f76fb6a1616cc58c8ffb903
注意理解这个bug.
TCP的可靠性到底指的是什么(最重要的知识点)
调用完send,马上close为什么不可以?
当你close时,如果内核接收缓冲区还有数据未被应用程序处理,那么tcp协议栈会给对方发送一个rst分节(而不是正常关闭连接的Fin分节),那么此时发送缓冲区的数据就不可能发送到对方了。
正确的做法是,对于发送方,如果你不需要发送数据给对方了,那么就是关闭tcp连接的写端: shutdown(WR), 然后等待recv返回0时,就可以使用close关闭整个连接了。接收方的处理比较简单,发送方使用shutdown(WR),那么接收方recv返回0,那么接收方调用close,发送FIN到接收方。接收方收到FIn,recv返回0,然后close。
总结一句话:read返回0时,可以close。但是遇到恶意的客户端,它一直不close,通常需要超时事件,在调用shutdown(WR),在若干秒之后就强制close。
起始可以通过协议设计解决,协议头设置消息长度,服务器接收到了完整数据后就可以close了。
分布式系统中的partial failure
C++11
注意第一条,list的成员函数size载gcc5之前时o(n), gcc5之后才变成o(1)
PNP : TCP relay Socks4a相关推荐
- 57. TCP relay功能描述及Python实现
处理client与server的带宽不匹配 代码:https://github.com/chenshuo/recipes/blob/master/python/tcprelay2.py 这个版本没有正 ...
- Muduo 网络编程示例之十:socks4a 代理服务器
Muduo 网络编程示例之十:socks4a 代理服务器 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice t.sina.com.cn/giantchen ...
- Metasploit***技巧:后***Meterpreter代理
前言 Metasploit是一个免费的.可下载的***测试框架,通过它可以很容易地获取.开发并对计算机软件漏洞实施***测试.它本身附带数百个已知软件漏洞的专业级漏洞***测试工具. 当H.D. Mo ...
- Meterpreter Guide
Croxy · 2015/11/04 16:10 由于网上很多文章乱而不全或者过期了 所以打算噜这篇来做个笔记- 方便自己以后查阅:) 0x01 入门篇(生成与接收) 功能介绍 msfpayload和 ...
- 渗透测试 ( 3 ) --- Metasploit Framework ( MSF )
白嫖 :https://zhuanlan.zhihu.com/p/449836479 :http://t.zoukankan.com/hxlinux-p-15787814.html :https:// ...
- Notes Twelfth Day-渗透攻击-红队-命令与控制
** Notes Twelfth Day-渗透攻击-红队-打入内网(dayu) ** 作者:大余 时间:2020-09-28 请注意:对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透 ...
- 记一次MSF综合应用内网渗透记录
0x01 前言 随机找的个台湾某越科技集团下的站点作为此次测试目标,只是为了学习下内网渗透和MSF的使用.13年9月份时拿到了一个子域的Webshell权限后就没再继续测试了,当时服务器没有安装Sym ...
- 陈硕《网络编程实战》目录
陈硕<网络编程实战>目录 00.前言 01.网络编程概要.mkv 02.一个TCP的简单实验.mkv 03.课程内容大纲.mkv 04.回顾基础的Sockets API.mkv 05.TT ...
- WCF服务编程设计规范(6):队列服务、安全和服务总线
WCF服务编程设计规范(6):队列服务.安全和服务总线.本节整理队列服务(Queue Servuce).服务安全(Service Security)和服务总线(Service Bus)的设计规范. Q ...
最新文章
- SET ROWCOUNT
- php 一行代码解决二维数组去重
- Java集合:set的遍历方式
- 一个好用的 SAP UI5 本地打包(build)工具,自动生成Component-preload.js
- 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
- 多项式除法,多项式取模
- 2020-python小工能
- 解读 2018之Go语言篇(下):明年有哪些值得期待?
- c语言 程序统计注释比例,C语言统计单词数量程序 超详解
- [c/c++] c 操作mysql数据库
- 使用nosetests对webpy程序做单元测试
- Python Flask Web 第六课 —— 静态文件
- 爬虫:查找自己浏览器headers
- scala中的协变和逆变
- 论计算机应用技术对企业信息化的影响
- 3DMAX 捕捉功能
- [Java教程]17.实战,趣味猜拳小游戏
- IE浏览器调用jquery需要注意的小问题
- Anti-aliasing and Continuity with Trapezoidal Shadow Maps
- 一些特殊ACII码的用法 在控制台中覆盖显示、刷新显示和删除字符
热门文章
- Start from today
- 三星超级本530u3c重装系统。。
- BDD之单元测试(三):BDD的官方教程
- HTML应用程序(HTML Application)
- ☀️在爬完一周的朋友圈后,我发现了.......惊人⚠️秘密
- ESXIi 5.0安装过程中粉屏及 提示”can’t detect last level cache”解决方法
- vue-quill-editor之图片上传、大小缩放及内容粘贴、长度限制
- k3导入账套_如何将金蝶k3老账套套打文件导入到新账套使用
- 从零到一的react.js+node.js+express.js+mysql产品开发全流程
- Sencha Architect 3破解