
linux网络编程
文章平均质量分 82
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
UNIX网络编程--传输层:TCP、UDP、SCTP(二)
UNIX网络编程----传输层:TCP、UDP、SCTP一、概述本章的焦点是传输层:包括TCP、UDP、和SCTP(流控制传输协议)。SCTP是一个较新的协议,最初设计用于跨因特网传输电话信令。UDP是一个简单的、不可靠的数据报协议。TCP是一个复杂、可靠的字节流协议。SCTP与TCP类似之处在于它也是一个可靠的数据报协议,但它还提供消息边界、传输级别多宿支持以及将头端阻塞减少到最小的原创 2013-09-17 20:35:03 · 2567 阅读 · 1 评论 -
UNIX网络编程--非阻塞connect的实现
一、《UNIX网络编程》-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未完成;同时TCP的三路握手操作继续进行;在这之后,我们可以调用select来检查这个链接是否建立成功;非阻塞connect有三种用途:1.我们可以在三路握手的同时做一些其它的处理.co原创 2014-04-11 11:40:03 · 3622 阅读 · 0 评论 -
linux守护进程的详解与创建
一,守护进程概述Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器m原创 2014-04-11 08:29:14 · 2118 阅读 · 0 评论 -
UNIX网络编程--TCP网络编程中的listen
int listen(int fd, int backlog); 有几个概念需要在开头澄清一下TCP socket分两种,监听socket和传输socket两种监听socket:负责处理网络上来的连接请求(客户端的syn包到达便是连接请求来了,如果不知道syn包,请参看一下TCP三次握手);传输socket:负责在网络上的两个端点之间传输TCP数据。 未决socke原创 2014-03-18 10:41:16 · 1516 阅读 · 0 评论 -
高性能服务器框架--I/O模型
socket在创建的时候默认是阻塞的。我们可以通过socket系统调用的第二个参数传递SOCK_NONBLOCK标志,或者通过fcntl系统调用的F_SETFL命令,将其设置为非阻塞的。阻塞和非阻塞的概念能应用与所有文件描述符,不仅仅是socket,我们称阻塞的文件描述符为阻塞I/O,非阻塞的文件描述符为非阻塞I/O. 针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系原创 2014-10-26 09:13:13 · 2029 阅读 · 0 评论 -
高性能I/O设计模式 reactor & proactor
两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(EventDemultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(EventHandler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有转载 2014-10-14 16:05:53 · 1145 阅读 · 0 评论 -
两种高性能I/O模式 reactor & proactor
Reactor 和 Proactor 是基于事件驱动,在网络编程中经常用到两种设计模式。曾经在一个项目中用到了网络库 libevent,也学习了一段时间,其内部实现所用到的就是 Reactor,所知道的还有 ACE;Proactor 模式的库有 Boost.Asio,ACE,暂时没有用过。但我也翻阅了一些文档,理解了它的实现方法。下面是我在学习这两种设计模式过程的笔记。ReactorR转载 2014-10-14 16:11:53 · 1176 阅读 · 0 评论 -
linux下的epoll如何高效处理百万连接
开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽,确实快,那么,它到底为什么可以高速处理这么多并发连接呢?先简单回顾下如何使用C库封装的3个epoll系统调用吧。原创 2014-11-19 20:27:38 · 2607 阅读 · 2 评论 -
UNIX网络编程--EINTR error
EINTR error总结:本文介绍了EINTR错误产生的原因,以及如何解决,并在最后给出一个实例,通过该实例可以解决调用ioctl产生的EINTR错误。一. EINTR1.EINTR错误产生的原因;当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能会返回一个EINTR错误。例如:在socket服务器端,设置了信号捕获机制,有子进程当在父进程阻转载 2013-09-22 19:45:44 · 3584 阅读 · 0 评论 -
高性能网络服务器--I/O复用 select poll epoll_wait之间的区别
一、select 使用的集合的方式,最多只能监听1024个文件描述符,内部使用位操作,将相应的位置为1或者置为0,需要将可读、可写、异常的三类事件分开来用,内部使用轮询的方法,每次返回都需要将所有的套接字从内核到用户空间之间进行拷贝。二、poll 比select稍微好一点,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪。三、epoll_wai原创 2014-10-26 21:47:25 · 2279 阅读 · 0 评论 -
UNIX网络编程--广播(二十)
广播的用途之一是在本地子网定位一个服务器主机,前提是已知或认定这个服务器主机文娱本地子网,但是不知道他的单播IP地址。这种操作也称为资源发现。另一个用途是在有多个客户主机与单个服务器主机通信的局域网环境中尽量减少分组流通。处于这个目的使用广播的因特网应用有多个例子。 1)ARP。ARP并不是一个用户应用,而是IPB4的基本组成部分之一。ARP在本地子网上广播一个请求说"IP地址为a.b.c.d的系统亮明身份,告诉我你的硬件地址"。ARP使用链路层广播而不是IP层广播。 2原创 2013-09-21 17:43:17 · 1742 阅读 · 0 评论 -
epoll机制:epoll_create、epoll_ctl、epoll_wait、close
在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,linux/posix_types.h头文件有这样的声明:#define__FD_S原创 2013-11-10 13:59:26 · 135006 阅读 · 13 评论 -
再次深入了解epoll
一、 介绍Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性。传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃至三次方的下降,而epoll的性能不会随socket数量增加而下降。标准的linux-2.4.20内核不支持epoll,需要打patch。本文主要从linux-2.4.32和linux-2.6.10原创 2013-11-10 17:15:08 · 4149 阅读 · 0 评论 -
常见多线程并发服务器编程模型
一、3点基础知识1、一个主机的端口号为所有进程所共享,但普通用户进程绑定不了一些特殊端口号如20、80等。 2、每个进程都有自己的文件描述符(包括file fd, socket fd, timer fd, event fd, signal fd),一般是1024,可以通过ulimit -n 设置,但所有进程打开的文件描述符总数有上限,跟主机的内存有关。3、一个进原创 2013-12-26 20:52:18 · 4448 阅读 · 1 评论 -
socket 可读 可写 条件
一、下列四个条件中的任何一个满足时,socket准备好读: 1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).我们可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1; 2.连接的读这一半原创 2014-04-06 13:55:01 · 3678 阅读 · 0 评论 -
HTTP请求格式和响应格式
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:l 请求方法URI协议/版本l 请求头(Request Header)l 请求正文下面是一个HTTP请求的例子:GET/sample.jspHTTP/1.1Accept:image/gif.image/jpeg,*/*Accept-La原创 2014-06-09 22:59:32 · 1758 阅读 · 4 评论 -
UNIX网络编程------高级I/O函数(十四)
UNIX网络编程------高级IO函数1、 套接字的I/O操作上设置超时操作;1) 使用信号处理函数alarm,不过这样会涉及到信号处理函数的问题,同时还有可能会引起程序中其他alarm函数的处理,2) 使用select函数,在这个函数的最后一个参数中可以设置时间超时,这个函数在上一篇文章中已经讲解。3) 使用比较新颖的超时套接字选项SO_RCVTIMEO和SO_SEND原创 2013-09-13 08:14:34 · 1686 阅读 · 0 评论 -
结合内核实现源码分析 select poll epoll区别
在博客中以前的文章有介绍epoll的使用方法,但是并没有详细介绍之间的区别select,poll,epoll都是IO多路复用的机制。所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个原创 2014-04-06 23:01:42 · 2109 阅读 · 1 评论 -
UNIX网络编程--服务器的几种异常终止
1、在accept函数返回前连接夭折这种情况发生在TCP 3次握手刚好完成,服务器TCP将连接放入到已经建立好连接队列中,此时客户端给一个RST,接下来accept返回,不过这时accept返回的是ECONNECTABORT错误.这不是一个致命错误。2、服务器进程终止过程如下:a、kill掉服务进程,作为进程善后处理的部分,所有打开的文件描述符被关闭,这导致服务端TCP原创 2014-04-04 10:11:21 · 2343 阅读 · 0 评论 -
高性能网络服务器6--reactor反应堆与定时器管理
反应堆开发模型被绝大多数高性能服务器所选择,上一篇所介绍的IO多路复用是它的实现基础。定时触发功能通常是服务器必备组件,反应堆模型往往还不得不将定时器的管理囊括在内。本篇将介绍反应堆模型的特点和用法。首先我们要谈谈,网络编程界为什么需要反应堆?有了IO复用,有了epoll,我们已经可以使服务器并发几十万连接的同时,维持高TPS了,难道这还不够吗?我的答案是,技术层面足够了,但在软件转载 2014-04-28 22:08:22 · 1571 阅读 · 0 评论 -
高性能网络服务器3--TCP消息的接收
这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读:1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?2、若socket为默认的阻塞套接字,此时recv方法传入的len参数,是表示必须超时(SO_RC转载 2014-04-28 22:10:47 · 2635 阅读 · 2 评论 -
linux网络编程--TCP分包 粘包 MTU 和MSS之间的关系分析
其实在以前的文章中介绍了和这个话题相关的文章,TCP封包。这里还想继续回顾想以前的内容,把不明白的东西弄明白:IP分片在以太网上,由于电气限制,一帧不能超过1518字节,除去以太网帧头14字节(mac地址等)和帧尾4字节校验,还剩1500字节,这个大小称为MTU(最大传输单元)。如果你的IP包大于1500字节,IP层就会分片了。而1492的MTU值的来源,是因为PPPoE协议。PPP协议是原创 2014-03-04 19:17:03 · 5964 阅读 · 0 评论 -
高性能网络编程--accept建立连接
最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件参数来达到目转载 2014-04-19 14:13:15 · 2088 阅读 · 0 评论 -
高性能网络服务器7--TCP连接的内存使用
当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。socket编程方法提供了SO_SNDBUF、SO_RCVBUF这样的接口来设置连接的读写缓存,linux上还提供了以下系统级的配置来整体设置服务器上的TCP内存使用,但这些配置看名字却有些互相冲突、概念模糊的感觉,如下(sysctl -a命令可以查看这些配置):[cpp]转载 2014-04-28 22:09:34 · 2175 阅读 · 0 评论 -
Linux网络编程--wireshark分析TCP包头的格式
摘要: 本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析。一、概述 TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息。连接建立整个过程如下(即三次握手协议):首原创 2014-10-07 13:15:18 · 2876 阅读 · 1 评论 -
一个环形缓冲(ringbuf)的简单实现
代码中有相关注释:// mybuf.h#ifndef _RINGBUF_HEADER_#define _RINGBUF_HEADER_#ifdef _cplusplusextern "C"{#endif/************* 1 === succeed 0 === failed*************/typedef struct _ringbuf_原创 2014-01-16 20:49:28 · 6993 阅读 · 0 评论 -
TCP传输粘包问题解决方法
当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API)。TCP/IP传输层有两个并列的协议:TCP和UDP。其中TCP(transport controlprotocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagramprotocol,用户数据报协议)是无连接的,提供高效率服务。在实际工程应用中,对可靠性和效率的选择原创 2013-12-11 20:52:55 · 2600 阅读 · 1 评论 -
Linux网络编程中EAGAIN错误和EINTR错误
在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。 从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起原创 2015-05-12 15:01:38 · 14880 阅读 · 6 评论 -
TCP/IP详解--发送ACK和RST的场景
在有以下几种情景,TCP会把ack包发出去:1.收到1个包,启动200ms定时器,等到200ms的定时器到点了(第二个包没来),于是对这个包的确认ack被发送。这叫做“延迟发送”;2.收到1个包,启动200ms定时器,200ms定时器还没到,第二个数据包又来了(两个数据包一个ack);3.收到1个包,启动200ms定时器,还没超时,正好要给对方发点内容。于是对这个包的确认ack就跟着捎原创 2014-03-18 10:38:29 · 21995 阅读 · 0 评论 -
linux网络编程--Circular Buffer(Ring Buffer) 环形缓冲区的设计与实现
1. 应用场景 网络编程中有这样一种场景:需要应用程序代码一边从TCP/IP协议栈接收数据(reading data from socket),一边解析接收的数据。具体场景例如:用户点击Youtube或优酷网站上的视频内容,这时用户PC上的播放软件就是一边接收数据一边对数据进行解码并播放的。这样的场景的存在如下约束:1. 必须边接收数据,边对数据进行解析,不能等待到数据全部接收完原创 2014-01-16 20:47:09 · 7651 阅读 · 0 评论 -
UNIX网络编程----线程(二十六)
UNIX网络编程----线程一、概述一个服务器的父进程accept一个连接,fork()一个子进程,该子进程处理与该连接对端的客户之间的通信。但是fork调用却存在一些问题。1) fork是昂贵的。当今的实现使用称为写实复制的技术,用以避免在子进程切实需要自己的副本之前把父进程的数据空间按复制到子进程。然而即便有这样的优化措施,fork还是昂贵的。2) fork返回之后斧子进程原创 2013-09-13 17:49:37 · 1390 阅读 · 0 评论 -
高性能网络服务器5--IO复用与并发模型
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发。服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽。并转载 2014-04-28 22:07:03 · 1580 阅读 · 0 评论 -
高性能网络服务器4---TCP连接的关闭
TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。为方便阅读,我们可以带着以下5个问题来阅读本文:1、当socket被多进程或者多线程共享时,关闭连接时有何区别?2、关连接时,若连接上有来自对端的还未处理的消息,会怎么处理?3、关连接时,若连接上有本进程待发送却未来得及发送出的消息,又会怎么处理?4、so_linger这个功能的转载 2014-04-28 22:05:17 · 1687 阅读 · 0 评论 -
linux网络编程--深入浅出send和recv
先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应 socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到so原创 2014-10-12 16:40:34 · 3679 阅读 · 0 评论 -
TCP分包方法 && 粘包处理策略
针对三种不同的粘包现象,分包算法分别采取了相应的解决办法。其基本思路是首先将待处理的接收数据流(长度设为m)强行转换成预定的结构数据形式,并从中取出结构数据长度字段,而后根据n计算得到第一包数据长度。1)若n2)若n=m,则表明数据流内容恰好是一完整结构数据,直接将其存入临时缓冲区即可。 3)若n>m,则表明数据流内容尚不够构成一完整结构数据,需留待与下一包数据合并后再行处理。原创 2013-12-11 22:14:44 · 6279 阅读 · 0 评论 -
TCP发送数据流程详解
B/S通信简述整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet的核心协议,HTTP协议是比TCP更高层次的应用层协议。HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。浏览器(Web Browse原创 2013-12-31 10:18:48 · 15286 阅读 · 0 评论 -
linux网络编程--网络编程的基本函数介绍与使用
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下:1、网络中进程之间如何通信?2、Socket是什么?原创 2013-12-24 22:13:42 · 2315 阅读 · 0 评论 -
linux网络编程--shut_down和close()函数的区别
在Linux C网络编程中,一共有两种方法来关闭一个已经连接好的网络通信,它们就是close函数和shutdown函数,它们的函数原型分别为:1#include2int close(intsockfd)3//返回:0——成功, 1——失败4原创 2014-09-01 20:36:14 · 5462 阅读 · 0 评论 -
UDP连接调用connect()函数
UDP是一个无连接的协议,它没有像TCP中EOF之类的东西。8.11 UDP的connect函数除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。对于已连接UDP套接字,与默认原创 2015-07-15 10:59:38 · 6604 阅读 · 1 评论 -
网络编程:Reactor和Proactor模式
1、标准定义两种I/O多路复用模式:Reactor和Proactor一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个转载 2013-12-15 23:36:03 · 1152 阅读 · 0 评论