- 博客(11)
- 收藏
- 关注
原创 TCP Keepalive机制与应用层心跳Heartbeat
TCP长连接中可能出现的问题1. 很多防火墙路由器等对于空闲socket自动关闭2. 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制.于是,就有了心跳(HeartBeat)机制。心跳机制的两种实现方案目前而言,有两种方式实现TCP的保活(业内现状是IM方面几乎都采用第一种)1. 应用层协议自己实现的心跳机制很多应用层协议都有HeartBeat机...
2018-04-27 20:06:20 3848 2
原创 理解TCP长连接(Keepalive)
TCP Keepalive的起源TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,且...
2018-04-27 17:59:32 60923
原创 理解Socket
Socket的概念什么是Socket?很多博客总结的不到位。这里做一个全面的解释。基本原理的角度来看,Socket起源于Unix,Unix/Linux基本哲学之一就是“一切皆文件”,Socket是一种"打开—读/写—关闭"模式的实现,可以被认为是服务器和客户端各自维护的一种特殊文件,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。进程通信的角度来看,Sock...
2018-04-27 15:30:39 247
原创 Linux加载启动可执行程序的过程(二)解释器完成动态链接
接着上一篇博客。前面的工作都是在内核完成的,接下来会回到用户空间。第一步,解释器(也可以叫动态链接器)首先检查可执行程序所依赖的共享库,并在需要的时候对其进行加载。ELF 文件有一个特别的节区: .dynamic,它存放了和动态链接相关的很多信息,例如动态链接器通过它找到该文件使用的动态链接库。不过,该信息并未包含动态链接库的绝对路径,但解释器通过 LD_LIBRARY_PATH 参数可以找到(它...
2018-04-25 17:12:29 3307 1
原创 Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程
linux内核启动时将ELF格式注册到内核可支持的文件格式链表中,也就是通过register_binfmt 函数将定义的elf_format结构体添加到链表中。该结构体如下:当我们执行一个可执行程序的时候, 内核会list_for_each_entry遍历所有注册的linux_binfmt对象, 对其调用load_binrary方法来尝试加载, 直到加载成功为止。上面代码可以看倒,ELF中加载程序...
2018-04-25 17:07:12 6355
原创 剑指offer算法题汇总(java版)
1.二维数组中的查找题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题目思路读取矩阵最右上角的元素,也就是第一行最后一列的元素开始遍历判断 public boolean Find(int target, int [][] array) { if(arr...
2018-04-21 17:40:00 503 1
原创 必考算法总结(java版)
树的遍历先序遍历递归版本 public static void preorderTraversal(List<Integer> list,TreeNode root){ if(root==null) return; list.add(root.value); preorderTraversal1(list,r...
2018-04-21 13:44:42 266
原创 Wine中PE格式文件的加载(三):PE格式文件的加载
前面分析到ntdll中加载了kernel32,然后调用了kernel32的初始化函数__wine_kernel_init。该函数的实现在dlls/kernel32/process.c中。内容较多,就不完整截图了首先函数开始获取了需要加载的windows应用的路径名,这个就是在开始执行的命令的微信的绝对路径,在wine中一般为“/home/username/.wine/drive_c/Program...
2018-04-16 10:46:16 1269
原创 Wine中PE格式文件的加载(二):Wineserver初始化过程
Wineserver的初始化过程就在thread_init函数中进行的。具体分析thread_init函数(在ntdll/thread.c中)1. 创建了TEB,PEB等数据结构。2. 通过server_init_process()与服务进程建立socket连接。在此过程中,如果连接失败就说明服务进程尚不存在,此时要通过start_server()先fork()一个子进程,让其执行...
2018-04-16 10:41:04 1768
原创 Wine中PE格式文件的加载(一):Wine初始化过程
首先了解下Wine初始化过程。我们执行”wine WeChat.exe”命令,发生的过程是怎么样的?接下来从wine源码一步步分析函数调用过程。在loader/目录下的源码编译,由main.c生成了“wine”Linux可执行文件;preloader.c生成了“pre-loader”Linux可执行文件。假设在终端通过命令“wine WeChat.exe”启动微信;该过程涉及preloader,...
2018-04-16 10:38:59 3105
原创 linux系统调用过程理解
用户可以通过两种方式使用系统调用:第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。(如write,read,kill,mkdir等函数)第二种方式是使用_syscall宏。2.6.18版本之前的内核,在include/asm-i386/unistd.h文件中定义有7个_syscall宏,分别是:_syscall0(type,name) _syscall1(type,na...
2018-04-08 20:36:33 348
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人