![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux网络编程
文章平均质量分 57
昭君出塞
每天进步一点点
展开
-
唯快不破:read/write 阻塞/非阻塞
read函数从打开的设备或文件中读取数据。#include ssize_t read(int fd, void *buf, size_t count);返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注意这个读写位置转载 2017-12-29 08:58:38 · 1686 阅读 · 0 评论 -
唯快不破:高性能网络编程中的几个基本概念
阻塞(blocking)和非阻塞(non-blocking):阻塞和非阻塞是指用户进程在做read(), write()等系统调用的时候,根据系统调用当前所处的状态而采取的不同的处理策略。拿read()函数来说,阻塞情况下,如果没有数据到达,则用户进 程一直等待(睡眠),直到数据到达,这个过程中用户进程处于睡眠状态,干不了其他事情;非阻塞情况下,如果数据没有到达,则立即返回给用户进程一个状态信息(转载 2017-12-25 13:11:35 · 228 阅读 · 0 评论 -
唯快不破:浅谈TCP/IP网络编程中socket的行为 数据的美妙旅程
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉:1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等)2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplex转载 2017-12-25 10:37:28 · 224 阅读 · 0 评论 -
唯快不破:深入浅出TCP/IP中的send和recv
先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应 socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到转载 2017-12-25 09:37:36 · 465 阅读 · 0 评论 -
唯快不破:TCP/IP中的SO_REUSEADDR和SO_KEEPALIVE
SO_REUSEADDR 据《UNIX网络编程》卷一所说,此选项用于4种用途我本人在TCP服务器上只处理过两种,其他情况如有需要,请参考《UNIX网络编程》卷一1.引自《UNIX网络编程》卷一多进程绑定同一对IP和PORT,按时序举个多进程模式tcp服务器的例子a.父进程进行监听; b.来syn包,请求连接; c.派生子进程处理用户长连接请求; d.父进程挂掉;转载 2017-12-16 10:20:09 · 353 阅读 · 0 评论 -
唯快不破:Linux网络编程中socket常见错误分析
socket错误码:EINTR: 4阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。如果recv的返回值为0,那表明连接已经断开,接收操作也应该结束。转载 2017-12-16 10:18:26 · 943 阅读 · 0 评论 -
唯快不破:TCP之性能优化避免慢启动
TCP协议中有个慢启动,在《TCP/IP详解卷一》中占据的篇幅很小,但是这个东西,在某些业务场景下,对性能的影响非常大。什么是慢启动 最初的TCP的实现方式是,在连接建立成功后便会向网络中发送大尺寸的数据包,假如网络出现问题,很多这样的大包会积攒在路由器上,很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此现在的TCP协议规定了,新建立的连接不能够一开始就发送大尺寸的数据包,而只能转载 2017-12-16 10:17:11 · 308 阅读 · 0 评论 -
唯快不破:I/O之内核buffer-“buffer cache”
"buffercache" 要理解"buffercache"这个东西,需要澄清一下概念:一般情况下,进程在io的时候,要依赖于内核中的一个buffer模块来和外存发生数据交换行为。另一个角度来说,数据从应用进程自己的buffer流动到外存,中间要先拷贝到内核的buffer中,然后再由内核决定什么时候把这些载有数据的内核buffer写出到外存。"buffer cache"仅仅被内核用于常转载 2017-12-16 10:16:05 · 264 阅读 · 0 评论 -
唯快不破:高性能网络服务器3--TCP消息的接收
这篇文章将试图说明应用程序如何接收网络上发送过来的TCP消息流,由于篇幅所限,暂时忽略ACK报文的回复和接收窗口的滑动。为了快速掌握本文所要表达的思想,我们可以带着以下问题阅读:1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?2、若socket为默认的阻塞套接字,此时recv方法传入的len参数,是表示必须超时(SO_RC转载 2017-12-06 17:43:17 · 273 阅读 · 0 评论 -
唯快不破:高性能网络服务器4---TCP连接的关闭
TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。为方便阅读,我们可以带着以下5个问题来阅读本文:1、当socket被多进程或者多线程共享时,关闭连接时有何区别?2、关连接时,若连接上有来自对端的还未处理的消息,会怎么处理?3、关连接时,若连接上有本进程待发送却未来得及发送出的消息,又会怎么处理?4、so_linger这个功能的转载 2017-12-07 14:53:38 · 248 阅读 · 0 评论 -
唯快不破:linux网络编程--TCP分包 粘包 MTU 和MSS之间的关系分析
其实在以前的文章中介绍了和这个话题相关的文章,TCP封包。这里还想继续回顾想以前的内容,把不明白的东西弄明白: IP分片在以太网上,由于电气限制,一帧不能超过1518字节,除去以太网帧头14字节(mac地址等)和帧尾4字节校验,还剩1500字节,这个大小称为MTU(最大传输单元)。如果你的IP包大于1500字节,IP层就会分片了。而1492的MTU值的来源转载 2017-12-26 09:24:44 · 438 阅读 · 0 评论 -
唯快不破:TCP/IP网络编程的四书五经
[本文发表于《程序员》杂志2003年第12期,作者孟岩] TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。但是,如果想要在转载 2018-01-04 10:45:42 · 454 阅读 · 0 评论 -
唯快不破:I/O多路复用之select总结
1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用转载 2017-12-28 09:32:08 · 267 阅读 · 0 评论 -
唯快不破:TCP发送数据流程详解
B/S通信简述整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet的核心协议,HTTP协议是比TCP更高层次的应用层协议。HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。浏览器(Web转载 2017-12-27 17:37:08 · 8502 阅读 · 0 评论 -
唯快不破:再次深入理解TCP网络编程中的send和recv
本篇我们用一个测试机上的阻塞socket实例来说明主题。文章中所有图都是在测试系统上现截取的。需要理解的3个概念1. TCP socket的buffer每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用r转载 2017-12-19 14:37:55 · 299 阅读 · 0 评论 -
唯快不破:TCP/IP详解--发送ACK和RST的场景
在有以下几种情景,TCP会把ack包发出去:1.收到1个包,启动200ms定时器,等到200ms的定时器到点了(第二个包没来),于是对这个包的确认ack被发送。这叫做“延迟发送”;2.收到1个包,启动200ms定时器,200ms定时器还没到,第二个数据包又来了(两个数据包一个ack);3.收到1个包,启动200ms定时器,还没超时,正好要给对方发点内容。于是对这个包的确认ack就跟着捎转载 2017-12-18 20:12:27 · 768 阅读 · 0 评论 -
唯快不破:UNIX网络编程--TCP网络编程中的listen
int listen(int fd, int backlog); 有几个概念需要在开头澄清一下TCP socket分两种,监听socket和传输socket两种监听socket:负责处理网络上来的连接请求(客户端的syn包到达便是连接请求来了,如果不知道syn包,请参看一下TCP三次握手);传输socket:负责在网络上的两个端点之间传输TCP数据。未决socket:p转载 2017-12-18 19:08:45 · 193 阅读 · 0 评论 -
唯快不破:linux网络编程--TCP/IP网络编程中socket的行为
熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉:1. TCP/IP协议(如连接的建立和终止、重传和确认、滑动窗口和拥塞控制等等)2. Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。3. 编写Performant, Scalable的服务器程序。包括多线程、IO Multiplexing、转载 2017-12-26 11:04:23 · 218 阅读 · 0 评论 -
唯快不破:高性能网络服务器5--IO复用与并发模型
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接。同时处理多个并行发生事件的连接,简称为并发;同时处理万计、十万计的连接,则是高并发。服务器的并发编程所追求的就是处理的并发连接数目无限大,同时维持着高效率使用CPU等资源,直至物理资源首先耗尽。并转载 2017-12-08 09:03:37 · 219 阅读 · 0 评论 -
唯快不破:linux 中IO多路复用epoll函数的ET和LT工作模式详解
epoll的优点:1.支持一个进程打开大数目的socket描述符(FD)select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的 Apache方案),不转载 2017-12-15 09:03:24 · 573 阅读 · 0 评论 -
唯快不破:TCP/IP详解--TCP中异常关闭连接的意义 异常关闭的情况
一、异常关闭连接的意义终止一个连接的正常方式是发送FIN。在发送缓冲区中所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。但我们有时也有可能发送一个RST报文段而不是FIN来中途关闭一个连接。这称为异常关闭。进程关闭socket的默认方式是正常关闭,如果需要异常关闭,利用SO_LINGER选项来控制。异常关闭一个连接对应用程序来说有两个优点:(1)丢弃任转载 2017-12-15 09:02:02 · 974 阅读 · 5 评论 -
唯快不破:UNIX网络编程--服务器的几种异常终止
1、在accept函数返回前连接夭折这种情况发生在TCP 3次握手刚好完成,服务器TCP将连接放入到已经建立好连接队列中,此时客户端给一个RST,接下来accept返回,不过这时accept返回的是ECONNECTABORT错误.这不是一个致命错误。2、服务器进程终止过程如下:a、kill掉服务进程,作为进程善后处理的部分,所有打开的文件描述符被关闭,这导致服务端TCP转载 2017-12-14 12:59:07 · 222 阅读 · 0 评论 -
唯快不破:Linux网络编程--wireshark分析TCP包头的格式
摘要: 本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析。一、概述 TCP是面向连接的可靠传输协议,两个进程互发数据之前需要建立连接,这里的连接只不过是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护任何连接状态信息。连接建立整个过程如下(即三次握手协议):首转载 2017-12-01 08:56:01 · 154 阅读 · 0 评论 -
唯快不破:linux网络编程--深入浅出send和recv
先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应 socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到so转载 2017-11-30 13:04:38 · 342 阅读 · 0 评论 -
唯快不破:高性能服务器框架--I/O模型
socket在创建的时候默认是阻塞的。我们可以通过socket系统调用的第二个参数传递SOCK_NONBLOCK标志,或者通过fcntl系统调用的F_SETFL命令,将其设置为非阻塞的。阻塞和非阻塞的概念能应用与所有文件描述符,不仅仅是socket,我们称阻塞的文件描述符为阻塞I/O,非阻塞的文件描述符为非阻塞I/O. 针对阻塞I/O执行的系统调用可能因为无法立即完成而被操转载 2017-11-30 09:24:27 · 186 阅读 · 0 评论 -
唯快不破:高性能网络服务器--I/O复用 select poll epoll_wait之间的区别
一、select 使用的集合的方式,最多只能监听1024个文件描述符,内部使用位操作,将相应的位置为1或者置为0,需要将可读、可写、异常的三类事件分开来用,内部使用轮询的方法,每次返回都需要将所有的套接字从内核到用户空间之间进行拷贝。二、poll 比select稍微好一点,也是在指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪。三、epoll_wai转载 2017-11-30 09:23:29 · 178 阅读 · 0 评论 -
唯快不破:linux下的epoll如何高效处理百万连接
开发高性能网络程序时,windows开发者们言必称iocp,linux开发者们则言必称epoll。大家都明白epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高大发了。我们用起epoll来都感觉挺爽,确实快,那么,它到底为什么可以高速处理这么多并发连接呢?先简单回顾下如何使用C库封装的3个epoll系统调用吧。转载 2017-11-29 14:20:01 · 1300 阅读 · 0 评论 -
唯快不破:Linux网络编程中EAGAIN错误和EINTR错误
在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。 从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起转载 2017-11-29 14:18:16 · 589 阅读 · 0 评论 -
唯快不破:UDP套接字调用connect()函数
UDP是一个无连接的协议,它没有像TCP中EOF之类的东西。8.11 UDP的connect函数除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。对于已连接转载 2017-11-29 10:51:44 · 1268 阅读 · 0 评论 -
linux平台下防火墙iptables原理
iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。iptables基础 规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如转载 2017-04-21 08:20:27 · 455 阅读 · 0 评论 -
唯快不破:linux网络编程--shut_down和close()函数的区别
在Linux C网络编程中,一共有两种方法来关闭一个已经连接好的网络通信,它们就是close函数和shutdown函数,它们的函数原型分别为:1#include2int close(intsockfd)3//返回:0——成功, 1——失败4转载 2017-12-02 08:46:46 · 186 阅读 · 0 评论 -
唯快不破:HTTP请求格式和响应格式
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:l 请求方法URI协议/版本l 请求头(Request Header)l 请求正文下面是一个HTTP请求的例子:GET/sample.jspHTTP/1.1Accept:image/gif.image/jpeg,*/*Accept-La转载 2017-12-04 09:08:16 · 190 阅读 · 0 评论 -
唯快不破:socket 可读 可写 条件
一、下列四个条件中的任何一个满足时,socket准备好读: 1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).我们可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1; 2.连接的读这一半关闭(即:转载 2017-12-14 09:11:52 · 421 阅读 · 0 评论 -
唯快不破:结合内核实现源码分析 select poll epoll区别
在博客中以前的文章有介绍epoll的使用方法,但是并没有详细介绍之间的区别http://blog.csdn.net/yusiguyuan/article/details/15027821http://blog.csdn.net/yusiguyuan/article/details/15029465http://blog.csdn.net/yusiguyuan/article/detai转载 2017-12-14 09:10:42 · 124 阅读 · 0 评论 -
唯快不破:高性能网络服务器2--TCP消息的发送
在高性能网络编程--accept建立连接中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字。操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,在操作系统内核中发生了什么事情呢?我们带着以下3个问题来细细分析:发送方法成功返回时,能保证TCP另一端的主机接收到吗?能保证数据已经发送到网络上了吗?套接字为阻塞或者转载 2017-12-05 11:49:09 · 194 阅读 · 0 评论 -
唯快不破:linux守护进程的详解与创建
写在前面,守护进程与后台进程的区别:后台进程:默认情况下,进程是在前台运行的,但是在运行的时候使用特殊操作使前台运行的程序放置后台运行,但是如果这个进程所依附的shell终结,就是在后台运行的程序也会被终止。守护进程:类似于一种服务,在开机启动的时候会自动启动,或者通过程序写一个守护进程,下面有讲解关于后台进程的书写规范;还可以通过命令来启动一个后太进程。即使所有的shell都关闭,后台进转载 2017-12-13 13:05:44 · 197 阅读 · 0 评论 -
唯快不破:UNIX网络编程--非阻塞connect的实现
一、《UNIX网络编程》-非阻塞connect在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未完成;同时TCP的三路握手操作继续进行;在这之后,我们可以调用select来检查这个链接是否建立成功;非阻塞connect有三种用途:1.我们可以在三路握手的同时做一些其它的处理.connect操作转载 2017-12-12 21:26:27 · 390 阅读 · 0 评论 -
唯快不破:TCP网络编程--非阻塞accept和非阻塞connect
非阻塞accept当一个已完成的连接准备好被accept的时候,select会把监听socket标记为可读。因此,如果用select等待外来的连接时,应该不需要把监听socket设置为非阻塞模式,因为如果select告诉我们连接已经就绪,accept就不应该被阻塞。不过这样做的时候有一个BUG:当客户端在跟服务器建立连接之后发送了一个RST包,这个时候accept就会阻塞,直到有下一个已完成的转载 2017-12-12 20:06:00 · 581 阅读 · 0 评论 -
唯快不破:高性能网络服务器1--accept建立连接
最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它。编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件参数来达到目转载 2017-12-04 15:00:23 · 246 阅读 · 0 评论 -
唯快不破:epoll的原理和用法
设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一个时刻只有几十个或几百个TCP连接时活跃的(接收到TCP包),也就是说,在每一时刻,进程值需要处理这100万连接中的一小部分连接。那么,如何才能高效地处理这种场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作系统,然后由操作系统找出其中有事件发生的几百个连接呢?实际上,在Linux内核2.4版转载 2017-12-04 09:29:14 · 170 阅读 · 0 评论