展开

关键词

LinuxTCP

TCPIP协议TCPIP 协议栈是一系列协议(protocol)的总和,是构成通信的核心骨架,它定义了电子设备如何连入因特,以及数据如何在它们之间进行传输。 OSI 7层模型和TCPIP四层模型对应关系计算机路基础的知识不过多讲解,主要是让大家明白接下来的Linux数据流属于那一层,具体如下图TCPIP协议数据流示意图我们接下来讲解的Linux Tcp协议是属于传输层的协议Linux Socket TCP协议TCP是面向连接的可靠的传输层协议。 TCPLinux中的是通过socket接口来进行的。socket是一种特殊的IO接口,它也是一种文件描述符。常用于不同机器上的进之间的通信,当然也可以实现本地机器上的进之间通信。 struct in_addr { uint32_t s_addr; * address in network byte order *}; ipv6用的比较少就不单独介绍定义了常用的有sockaddr_in(地址

7730

Linux书籍

先要学习知识才谈得上 讲述计算机的最经典的当属Andrew S.Tanenbaum的《计算机》第五版,这本书难易适中。 2本经典著作,《Unix环境高级》,《Unix》二卷本。 说明:搞Linux的,想学TCPIP的一定要看大师W.Richard Stevens这六本书,基本上六本书看完基础也就搭好了。?????? 他的著作有《UNIX》(两卷本),《UNIX环境高级》,《TCPIP详解》(三卷本)等,同时他还是广受欢迎的教师和顾问。    很明显属于技巧类的书,同样这本书很老,但是还是很有参考价值,这本书中大量出现Unix的提示,可以作为其补充。

90530
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux系列(二)

    基本概念1.1 什么是套接字套接字,也叫socket,是操作系统内核中的一个数据结构,它是中的节点进行相互通信的门户。 通信,说白了就是进间的通信(同一台机器上不同进或者不同计算机上的进间通信)。在中,每一台计算机或者路由都有一个地址,就是IP地址。 两个进通信时,首先要确定各自所在的节点的地址。 但是,地址只能确定进所在的计算机,而一台计算机上一般都是同时运行着多个进,所以仅凭地址还不能确定到底是和中的哪一个进进行通信,因此套接口中还需要包括其他的信息,比如端口号和协议。 2.4 IP地址格式转化通常在表达地址时采用的是点分十进制表示的数值(或者是为冒号分开的十进制Ipv6地址),而在socket中使用的则是32位的字节序的二进制值,这就需要对这两个数值进行转换

    14030

    Linux基础API

    此时序实现的难度并不小,因为传输文件的服务器端只需连续传输文件数据即可,而客户端无法知道需要接收数据到何时。客户端也没办法无休止的调用输入函数,因为这有可能导致序阻塞。 好在Linux内核检测到TCP紧急标志时,将通知应用序有带外数据需要接收。内核通知应用序带外数据到达的两种常见方式是: 1O复用产生的异常事件和SIGURG信号。 信息API利用域名获取IP地址IP地址比域名发生变更的概率要高,所以利用IP地址序并非上策。 另外,用户比较多的站有可能分配多个IP地址给同一个域名,利用多个服务器做负载均衡,此时可以通过此变量获取IP地址信息。__name:传入的域名。 addrinfo结构体中,ai_ protocol 成员是指具体的协议,其含义和socket系统调用的第三个参数相同,它通常被设置为0。ai_fags 成员可以取表中的标志的按位或。

    7520

    linux 之信号机制

    调试输出函数 这里利用宏来实现debug的相关输出 int dbg_level = -1; #define print_dbg(level, ...) ...

    30150

    Linux“惊群”问题总结

    1、前言我从事Linux系统下开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬。 如今计算机都是多核了,框架也逐步丰富多了,我所知道的有多进、多线、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker多进异步驱动模型。 2、何为惊群如今中经常用到多进或多线模型,大概的思路是父进创建socket,bind、listen后,通过fork创建多个子进,每个子进继承了父进的socket,调用accpet开始监听等待连接 这个时候有多个进同时等待的连接事件,当这个事件发生时,这些进被同时唤醒,就是“惊群”。这样会导致什么问题呢? 我们知道进被唤醒,需要进行内核重新调度,这样每个进同时去响应这一个事件,而最终只有一个进能处理事件成功,其他的进在处理该事件失败后重新休眠或其他。模型如下图所示:?

    43250

    Linux“惊群”问题总结

    1、前言   我从事Linux系统下开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬。 如今计算机都是多核了,框架也逐步丰富多了,我所知道的有多进、多线、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker多进异步驱动模型。 2、何为惊群   如今中经常用到多进或多线模型,大概的思路是父进创建socket,bind、listen后,通过fork创建多个子进,每个子进继承了父进的socket,调用accpet 开始监听等待连接。 这个时候有多个进同时等待的连接事件,当这个事件发生时,这些进被同时唤醒,就是“惊群”。这样会导致什么问题呢?

    57360

    linux IO复用 select,poll ,epoll

    核心思想:IO复用---- 使用情景:客户端序要同时处理多个socket客户端序要同时处理用户输入和连接TCP服务器要同时处理监听socket和连接socket,这是使用最多的场合服务器要同时可处理 如果在超时时间内没有任何文件描述符就绪,select将返回0. select失败时返回-1并设置errno 如果select 等待期间,序接收到信号,则select立即返回-1,并设置errno为EINTR

    83220

    linux socket选项的实现

    对这种情况,linux给开发人员提供的解决方案是:对监听socket设置这些socket选项,那么accept返回的连接socket将自动继承这些选项。 SO_REUSEADDR选项前面讨论过TCP连接的TIME_WAIT状态,并提到服务器序可以通过设置socket选项SO_REUSEADDR来强制使用被处于TIME_WAIT状态的连接占用的socket 此外,我们也可以通过修改内核参数procsysnetipv4tcp_tw_recycle 来快速回收被关闭的socket,从而使得TCP连接根本就不进入TIME_WAIT状态,进而允许应用序立即重用本地的 修改TCP发送缓冲区的客户端序:#include #include #include #include #include #include #include #define BUFFER_SIZE 512 当TCP接收缓冲区中可读数据的总数大于其低水位标记时,IO复用系统调用将通知应用序可以从对应的socket上读取数据;当TCP发送缓冲区中的空闲空间(可以写入数据的空间)大于其低水位标记时,IO复用系统调用将通知应用序可以往对应的

    11120

    Linux常见服务器模型

    http://blog.csdn.net/lingfengtengfei/article/details/12348903

    47910

    Linux之使用TCP传输文件

    原创作品,转载时请务必以超链接形式标明文章原始出处:http:blog.csdn.netgqb666articledetails8976263,作者:gqb666 最近在写Linux方面的demo ,用TCP实现了一个简单的传输文件序,适用于卡设备及TCPIP协议栈及环境测试时使用。 其功能是使用TCP协议从client端向server端传输文件,用法如下:      译:            client:gcc -o client client.c            server            server端:.server 其中,server端先运行,client端与server端的端口号必须一致并且不能与已知端口冲突(例如8888即可) 下面将代码贴上:(使用UDP传输文件请参阅博文Linux 之使用UDP传输文件) server端代码:server.c view plaincopy #include  #include  #include  #include  #include

    91210

    linux系列(九)--epoll的基本使用

    中的四种IO模型阻塞IO模型,默认socket都是阻塞的,就是IO操作都要等待操作完成以后才能返回;非阻塞IO模型,就是IO操作时不等待,立即返回,但需要不断的去询问内核,数据是否准备好了,如果准备好了 2.1.2 ET模式(又叫边缘触发模式,必须将socket设置为非阻塞):此种情况下,当文件描述符有变化时,epoll只会通知应用序一次,并将描述符从监视队列中清除,直到应用序处理完该次变化,如果应用序没有处理 这时应用序需要自己维护一张fds的表格,把从epoll_wait得到的状态信息登记到这张表格,然后应用序可以选择遍历这张表格,对处于忙碌状态的fds进行操作。 = -1) { close (m_nEpollFd); m_nEpollFd = -1; } return 1; } 将上面CEpollServer类和TCP类结合起来译成一个动态库,makefile { perror(socket not connect); return -1; } fprintf(stdout, recv data is:%sn, buf); } return 0; } 分别

    14220

    linux系列(五)--setsockopt的常用选项

    使用场景(1)如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用close(socket)(一般不会立即关闭而经历TIME_WAIT的过)后想继续重用该socket ,(const char*)& reuse,sizeof(int)); (3)在send(),recv()过中有时由于状况等原因,发收不能预期进行,而设置收发时限: int nNetTimeout 注意:TCP有发送缓冲区和接收缓冲区,但是UDP因为是不可靠的,它没有确认重传机制,不保存应用序数据的副本,所以是没有发送缓冲区的,但是UDP有接收缓冲区。 (5)如果在发送数据时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响序的性能: int nZero=0; setsockopt(socket,SOL_SOCKET,SO_SNDBUF,(char = 5; setsockopt(fd, SOL_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)); 打开这个功能后,内核在val时间之类还没有收到数据,不会继续唤醒进

    12320

    linux系列(十)--epoll的基本使用

    中的四种IO模型阻塞IO模型,默认socket都是阻塞的,就是IO操作都要等待操作完成以后才能返回;非阻塞IO模型,就是IO操作时不等待,立即返回,但需要不断的去询问内核,数据是否准备好了,如果准备好了 2.1.2 ET模式(又叫边缘触发模式,必须将socket设置为非阻塞):此种情况下,当文件描述符有变化时,epoll只会通知应用序一次,并将描述符从监视队列中清除,直到应用序处理完该次变化,如果应用序没有处理 这时应用序需要自己维护一张fds的表格,把从epoll_wait得到的状态信息登记到这张表格,然后应用序可以选择遍历这张表格,对处于忙碌状态的fds进行操作。 = -1) { close (m_nEpollFd); m_nEpollFd = -1; } return 1; } 将上面CEpollServer类和TCP类结合起来译成一个动态库,makefile { perror(socket not connect); return -1; } fprintf(stdout, recv data is:%sn, buf); } return 0; } 分别

    19930

    linux之共享内存简介和mmap 函数

    一、共享内存简介共享内存区是最快的IPC形式,这些进间数据传递不再涉及到内核,换句话说是进不再通过执行进入内核的系统调用来传递彼此的数据。 ? ,一个进对映射的内存做了修改,另一个进也会看到这种变化。 MAP_PRIVATE 多个进对同一个文件的映射不是共享的,一个进对映射的内存做了修改,另一个进并不会看到这种变化,也不会真的写到文件中去。内存映射文件示意图: ? mmap 注意点: 1、映射不能改变文件的大小; 2、可用于进间通信的有效地址空间不完全受限于被映射文件的大小; 3、文件一旦被映射后,所有对映射区域的访问实际上是对内存区域的访问。 参考: 《linux c 一站式学习》《UNP》

    74700

    linux之POSIX 消息队列 和 系列函数

    还有一点是,在Linux上,posix 消息队列是以虚拟文件系统实现的,必须将其挂载到某个目录才能看见,如            # mkdir devmqueue            # mount :当以信号方式通知的时候,表示信号的号.二、系列函数,译时候加上 -lrt 选项,即连接librt 库 (实时库)      #include           * For O_* constants attributes * }; sigev_notify 的取值有3个:SIGEV_NONE:消息到达不会发出通知SIGEV_SIGNAL:以信号方式发送通知,当设置此选项时,sigev_signo 设置信号的号 : 1、任何时刻只能有一个进可以被注册为接收某个给定队列的通知 2、当有一个消息到达某个先前为空的队列,而且已有一个进被注册为接收该队列的通知时,只有在没有任何线阻塞在该队列的mq_receive 3、当通知被发送给它的注册进时,其注册被撤消。进必须再次调用mq_notify以重新注册(如果需要的话),重新注册要放在从消息队列读出消息之前而不是之后。

    61100

    linux之POSIX 共享内存和 系列函数

    共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进的地址空间进行读写,而posix 共享内存与system v 共享内存不同的是它是用虚拟文件系统(tmpfs)实现的,已经挂载在 man 7 shm_overview下面来看系列函数,译时候加上 -lrt 选项,即连接librt 库 (实时库) 功能:用来创建或打开一个共享内存对象 原型 int shm_open(const char char *name);  参数 name: 共享内存对象的名字 返回值:成功返回0;失败返回-1 shm_unlink 类似 shmctl(, IPC_RMID, ); 功能:将共享内存对象映射到进地址空间 ,其实它还可以将共享内存对象映射到进地址空间,类似shmat的作用,只是传入的文件描述符fd 是shm_open 返回的。 下面写几个序来演示一下:shm_open.c#include#include#include#include#include#include#include#include#include #define

    52600

    linux之socket(十):shutdown 与 close 函数 的区别

    如果client再次调用write发数据给server,由于TCP协议层已经处于RST状态了,因此不会将数据发出,而是发一个SIGPIPE信号给应用层,SIGPIPE信号的缺省处理动作是终止序。 也就是说只有当所有进(可能fork多个子进都打开了这个套接字)都关闭了这个套接字,close 才会发送FIN 段。 下面使用shutdown 修改客户端序,在前面讲过的使用select函数修改后的客户端序基础上,修改很小一部分:if (FD_ISSET(fd_stdin, &rset)){     if (fgets 先运行服务器端序,再运行客户端序,在客户端标准输入,迅速敲入两行:AAAAAn  BBBBBn 然后按下ctrl+d 即fgets 会返回NULL,然后调用shutdown关闭写端,虽然服务器端延时才发送数据 参考: 《Linux C 一站式学习》 《TCPIP详解 卷一》《UNP》

    1.2K00

    linux系列(六)--tcp粘包及如何解决

    ,是指TCP的数据传输跟流动的水一样,大家可以想象一下,水是连成一片的,它是没有分界线的,而TCP数据传输也是一样的,是没有界限的; 缓存机制 熟悉TCP协议的人都应该知道,TCP发送数据,并不是应用序 最大传输单元 在传输中,有个MTU-最大传输单元,是1500个字节,就是说每一次发送最多只能发送1500个字节,如果要发送超过这个长度的数据包,就需要分包发送。 其实就是说,应用进并不知道一个完整的数据包到底是多大,没法进行解析,客户端和服务端需要有一个约定的规则,来确保不出现粘包。2.

    11610

    linux之socket(十四):基于UDP协议的

    下面依照通信流,我们来实现一个UDP回射客户服务器? sock; if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) ERR_EXIT(socket); echo_cli(sock); return 0;}译运行 二、UDP注意点1、UDP报文可能会丢失、重复 2、UDP报文可能会乱序 3、UDP缺乏流量控制 4、UDP协议数据报文截断 5、recvfrom返回0,不代表连接关闭,因为udp是无连接的。 其实connect 并没有真正建立一个连接,即没有3次握手过,只是维护了一种状态,绑定了远地址,因为如此在调用sendto 时也可以不指定远地址了,如 sendto(sock, sendbuf, 参考: 《Linux C 一站式学习》 《TCPIP详解 卷一》 《UNP》

    81320

    相关产品

    • 私有网络

      私有网络

      私有网络(VPC)是基于腾讯云构建的专属网络空间,为您的资源提供网络服务,不同私有网络间完全逻辑隔离。作为隔离网络空间,您可以通过软件定义网络的方式管理您的私有网络 ,实现 IP 地址、子网、路由表等功能的配置管理……

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券