
网络编程
文章平均质量分 79
hjxhjh
这个作者很懒,什么都没留下…
展开
-
关于time_wait的一些经典问答
Q: 我正在写一个unix server程序,不是daemon,经常需要在命令行上重启它,绝大 多数时候工作正常,但是某些时候会报告"bind: address in use",于是重启失 败。 A: Andrew Gierth server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。至于 TIME_WAIT状态,你无法避免,那是TCP协议的一部分。 Q: 如何避免等待60秒之后才能重启服务 A: Erik Max Francis 使用setsockopt,比如转载 2011-05-08 20:47:00 · 527 阅读 · 0 评论 -
浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉:1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等)2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplexing、转载 2013-08-13 08:55:42 · 877 阅读 · 0 评论 -
高性能网络编程(三)----TCP消息的接收
这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读:1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?2、若socket为默认的阻塞套接字,此时recv方法传入的len参数,是表示必须超时(SO_RC转载 2013-09-02 09:21:59 · 1147 阅读 · 0 评论 -
kmemcache源码浅析
简介 kmemcache是memcache的linux内核移植版, 这两天断断续续的看了其网络方面的实现. 简单来说, kmemcache不落窠臼, 摈弃了epoll通知机制. 它借助skb的回调函数, 实现packet级别的调度. 在网路模型上, kmemcache分为一个dispatcher和多个workers(均为workqueue线程). dispatcher服务于TCP和转载 2013-09-25 09:27:37 · 972 阅读 · 0 评论 -
高性能网络编程(四)---- tcp 连接的关闭
TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。为方便阅读,我们可以带着以下5个问题来阅读本文:1、当socket被多进程或者多线程共享时,关闭连接时有何区别?2、关连接时,若连接上有来自对端的还未处理的消息,会怎么处理?3、关连接时,若连接上有本进程待发送却未来得及发送出的消息,又会怎么处理?4、so_linger这个功能的转载 2013-11-06 14:56:06 · 884 阅读 · 0 评论 -
高性能网络编程(二)----TCP消息的发送
在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字。操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,在操作系统内核中发生了什么事情呢?我们带着以下3个问题来细细分析:发送方法成功返回时,能保证TCP另一端的主机接收到吗?能保证数据已经发送到网络上了吗?套接字为阻塞或者非阻塞时,发送方法做的事情有何不转载 2013-09-01 11:11:04 · 1383 阅读 · 0 评论 -
高性能网络编程(一)----accept建立连接
最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件参数来达到目转载 2013-09-01 10:42:50 · 929 阅读 · 0 评论 -
Raw Socket和Socket编程
1.原始套接字(raw socket) 1.1 原始套接字工作原理与规则 原始套接字是一个特殊的套接字类型,它的创建方式跟TCP/UDP创建方法几乎是一摸一样,例如,通过CODE:[Copy to clipboard] int sockfd; sockfd = socktet(AF_INET, SOCK_转载 2013-12-11 09:33:42 · 14676 阅读 · 0 评论 -
高性能网络编程五--IO复用与并发编程
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发。服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽。并转载 2013-12-12 09:00:50 · 985 阅读 · 0 评论 -
高性能网络编程六--reactor反应堆与定时器管理
反应堆开发模型被绝大多数高性能服务器所选择,上一篇所介绍的IO多路复用是它的实现基础。定时触发功能通常是服务器必备组件,反应堆模型往往还不得不将定时器的管理囊括在内。本篇将介绍反应堆模型的特点和用法。首先我们要谈谈,网络编程界为什么需要反应堆?有了IO复用,有了epoll,我们已经可以使服务器并发几十万连接的同时,维持高TPS了,难道这还不够吗?我的答案是,技术层面足够了,但在软件转载 2013-12-26 18:24:56 · 833 阅读 · 0 评论 -
网络编程中重要函数总结:如何判断socket关闭
1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 0接收到数据大小,特别:返回值 2、阻塞模式与非阻塞模式下write的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞write返回值没有区分,都是 0发送数据大小,特别:返回值 3、阻塞模式下read返回值 非阻塞模式下read返回值 0表示接收转载 2014-02-11 11:15:41 · 4221 阅读 · 0 评论 -
高性能网络编程七--tcp连接的内存使用
当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。socket编程方法提供了SO_SNDBUF、SO_RCVBUF这样的接口来设置连接的读写缓存,linux上还提供了以下系统级的配置来整体设置服务器上的TCP内存使用,但这些配置看名字却有些互相冲突、概念模糊的感觉,如下(sysctl -a命令可以查看这些配置):[cpp]转载 2014-02-19 11:44:52 · 915 阅读 · 0 评论 -
从TCP协议的原理来谈谈rst复位攻击
在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP的flag标志位里RST在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事。1、TCP是什么?TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输。我来用土语解释下上转载 2014-03-04 08:44:29 · 766 阅读 · 0 评论 -
tcp 连接关闭详解
注:tcp关闭连接不区分客户端和服务端,哪一端口可以主动发起关闭连接请求。所以为了描述方便,描述中的“主动方”表示主动发起关闭连接一方,“被动方”表示被动关闭连接一方。1. tcp关闭连接状态转换 上图是tcp连接主动关闭端的状态转换图:(1)应用层调用close函数发起关闭连接请求(2)发送FIN到对端,关闭写通道,自己进入FIN_WAIT1状转载 2014-07-13 16:48:51 · 1583 阅读 · 0 评论 -
Linux协议栈accept和syn队列问题
环境: Client 通过tcp 连接server,server端只是listen,但是不调用accept。通过netstat –ant查看两端的连接情况。server端listen,不调用accept。client一直去connect server。问题:运行一段时间后,为什么server端的ESTABLISHED连接的个数基本是固定的12转载 2014-08-23 20:38:32 · 1136 阅读 · 0 评论 -
TCP协议疑难问题讲解
说明:1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不会解释慢启动和快速重传的定义4).除了《TCP/IP详解》(卷一,卷二)以及《Unix网络编程》以及Linux源代码之外,转载 2013-08-24 11:05:19 · 1264 阅读 · 0 评论 -
linux网络编程之socket(十):shutdown 与 close 函数 的区别
假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出转载 2013-08-22 19:03:07 · 4694 阅读 · 0 评论 -
Linux socket关闭连接shutdown与close
在Linux socket关闭连接的方法有两种分别是shutdown和close,首先看一下shutdown的定义#includeint shutdown(int sockfd,int how);how的方式有三种分别是:SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sock转载 2013-08-22 18:38:04 · 3851 阅读 · 0 评论 -
close_wait状态和time_wait状态
不久前,我的Socket Client程序遇到了一个非常尴尬的错误。它本来应该在一个socket长连接上持续不断地向服务器发送数据,如果socket连接断开,那么程序会自动不断地重试建立连接。有一天发现程序在不断尝试建立连接,但是总是失败。用netstat查看,这个程序竟然有上千个socket连接处于CLOSE_WAIT状态,以至于达到了上限,所以无法建立新的socket连接了。为什么会这样呢?它们为什么会都处在CLOSE_WAIT状态呢?CLOSE_WAIT状态的生成原因首先我们知道,如果我们的Clie转载 2011-05-08 18:34:00 · 1524 阅读 · 0 评论 -
SSH原理与运用(二):远程操作与端口转发
七、远程操作SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行操作。上一节的操作,就是一个例子: $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' 单引号中间的部分,表示在远程主机上执行的操作;后面的输入重定向,表示数据通过SSH传向远程主机。这就是说,SSH可以在用户和远程主机之间,转载 2012-09-05 20:16:42 · 629 阅读 · 0 评论 -
SSH原理与运用(1)
SSH是每一台Linux电脑的尺度配置。之前只是简单的配置但是不了解原理,了解一下。随着Linux设备从电脑逐渐扩展得手机、外设和家用电器,SSH的使用规模也越来越广。不仅轨范员离不开它,很多普通用户也每天使用。SSH具备多种功能,可以用于很多场所。有些事情,没有它就是办不成。本文是我的学习笔记,总结和解释了SSH的常见用法,希望对巨匠有用。虽然本文内容只涉及低级应转载 2012-09-05 20:13:22 · 507 阅读 · 0 评论 -
NFS 安装配置管理
网络文件系统(NFS)的概念 网络文件系统(NFS)是一种在网络上的机器间共享文件的方法,文件就如同位于客户的本地硬盘驱动器上一样。Red Hat Linux 既可以是 NFS 服务器也可以是 NFS 客户,这意味着它可以把文件系统导出给其它系统,也可以挂载从其它机器上导入的文件系统。NFS的安装 RedHad默认已经安装了NFS,如果没装需手动安装如下5个rpm包:转载 2012-10-08 15:06:18 · 717 阅读 · 0 评论 -
epoll 的实现原理
转载自:http://blog.youkuaiyun.com/perfectpdl/article/details/6069585epoll 与select、poll的区别epoll与select/poll不同的一点是,它是由一组系统调用组成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd,转载 2013-03-31 11:21:16 · 774 阅读 · 0 评论 -
libevent源码深度剖析 一 1
转载自:http://blog.youkuaiyun.com/sparkliang/article/details/4957667 1 前言Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少。写这一系列文章的用意在于,一则分享心得;二则对libevent代码和设计思想做系统的、更深层次的分析,写出来,也可供后来者参考。附带一句:Libevent是用c语言编写转载 2013-03-31 11:07:39 · 672 阅读 · 0 评论 -
Reactor与Proactor的简单对比
1、标准定义两种I/O多路复用模式:Reactor和Proactor一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个转载 2013-04-01 11:49:15 · 605 阅读 · 0 评论 -
Linux内存管理Slab分配器
一:概述采用伙伴算法分配内存时,每次至少分配一个页面。但当请求分配的内存大小为几十个字节或几百个字节时应该如何处理?如何在一个页面中分配小的内存区,小内存区的分配所产生的内碎片又如何解决?Linux采用Slab。Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对转载 2013-04-09 09:58:28 · 1986 阅读 · 0 评论 -
C语言存储类型
看c专家编程,有说存储类型一直不太清楚。看到一篇文章讲解c的存储类型,讲解了c语言中的各种变量的存储类型,而且是从进程、内存的角度讲解的,以前从没有这样理解过,觉得挺有用的,在这里转载过来。 首先要来理解一下可执行文件加载进内存后形成的进程在内存中的结构,如下图:代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。数据区:存放已初始化的全局变量、转载 2013-05-19 18:29:03 · 12008 阅读 · 7 评论 -
SO_REUSEADDR例解
网友vmstat多次提出了这个问题:SO_REUSEADDR有什么用处和怎么使用。而且很多网友在编写网络程序时也会遇到这个问题。所以特意写了这么一篇文章,希望能够解答一些人的疑难。 其实这个问题在Richard Stevens的《Unix网络编程指南》卷一里有很详细的解答(中文版P166-168页)。这里我只是写几个基本的例子来验证这个问题。 首先声明一个问转载 2013-06-19 11:05:43 · 501 阅读 · 0 评论 -
epoll 边缘触发学习
在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __转载 2013-06-19 12:18:00 · 714 阅读 · 0 评论 -
浅析http协议、cookies和session机制、浏览器缓存
最近几天在复习http协议中headers,cookies、session、缓存等相关知识,发现些新知识点。这篇文章注重结合PHP去理解这些内容,也就是比较注重实践部分。一、 http headers NO1:对于web应用,用户群在客户端 (各种浏览器)点击任何一个连接向服务器发送http请求,这过程肯定需要3次握手,建立连接,服务器响应转载 2013-07-13 14:40:38 · 810 阅读 · 0 评论 -
ZooKeeper FAQ
这段时间来,也在和公司里的一些同学交流使用zk的心得,整理了一些常见的zookeeper问题。这个页面的目标是解答一些zk常见的使用问题,同时也让大家明确zk不能干什么。页面会一直更新。客户端1. 客户端对ServerList的轮询机制是什么随机,客户端在初始化( new ZooKeeper(String connectString, int sessionTimeout, Watch转载 2013-07-20 01:35:00 · 613 阅读 · 0 评论 -
HBase的long GC与 Zookeeper lease expired的权衡
问题和现象:这是一个连锁反应:1)RegionServer在遇到"Stop-The-World" GC时,会停止一切工作,这样与Zookeeper保持的心跳,就会停止。2)Zookeeper在没有收到注册节点的心跳时,就会删除对应rs对应节点。3)HMaster的ServerManager会发现这个RegionServer出现了问题,然后交由ServerShutdownHand转载 2013-07-20 01:43:14 · 922 阅读 · 0 评论 -
epoll的两种触发模式
linux异步IO浅析 http://hi.baidu.com/_kouu/blog/item/e225f67b337841f42f73b341.html epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/转载 2013-07-18 23:55:11 · 22309 阅读 · 1 评论 -
TCP连接关闭过程笔记
前言:TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。 简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:1.服务器读通道关闭2.客户机写通道关闭3.客户机读通道关闭4.服务器写通道关闭关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方转载 2013-08-20 20:02:50 · 649 阅读 · 0 评论 -
Sendfile Linux 系统中的零拷贝
如今几乎每个人都听说过Linux中所谓的"零拷贝"特性,然而我经常碰到没有充分理解这个问题的人们。因此,我决定写一些文章略微深入的讲述这个问题,希望能将这个有用的特性解释清楚。在本文中,将从用户空间应用程序的角度来阐述这个问题,因此有意忽略了复杂的内核实现。什么是”零拷贝”为了更好的理解问题的解决法,我们首先需要理解问题本身。首先我们以一个网络服务守护进程为例,考虑它在将存储在文件转载 2014-09-30 15:30:06 · 1004 阅读 · 0 评论