linux网络编程
cpp加油站
公众号:cpp加油站,专注分享linux下cpp知识
展开
-
OSI七层模型和TCP-IP四层模型
1. ISO七层网络模型为使不同计算机厂家之间的计算机能够互相通信,以便在更大的范围内建立计算机网络,国际标准化组织ISO在1981年正式推出了一个网络系统结构–OSI七层网络模型,此后各大计算机厂商迅速向它靠拢,大大推动了计算机网络的发展。OSI七层网络模型分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。1.1 应用层应用层是最靠近用户的OSI层,这一层为用户的应用程...原创 2019-06-06 10:37:39 · 270 阅读 · 0 评论 -
linux网络编程系列(十一)--select基本使用以及它和epoll区别
1. select函数复用IO还有一种就是select模型,我们下面就来简单介绍一下select用法。1.1 select函数原型int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);//fd_set是一个集合,里面存放的是文件描述符,如下是一...原创 2019-06-28 13:19:21 · 201 阅读 · 0 评论 -
epoll的基本使用
1. 网络编程中的四种IO模型阻塞IO模型,默认socket都是阻塞的,就是IO操作都要等待操作完成以后才能返回;非阻塞IO模型,就是IO操作时不等待,立即返回,但需要不断的去询问内核,数据是否准备好了,如果准备好了,就主动调用函数去处理数据,使用fcntl设置socket为非阻塞;多路复用模型,就是事件驱动IO,也就是说检测到描述符上发生了事件,才去处理,典型的就是select和epol...原创 2019-06-27 12:34:18 · 362 阅读 · 2 评论 -
linux网络编程系列(十三)--缓冲区设计及收发大量数据
1. 自定义缓冲区我们在使用TCP/IP编程的时候除了socket有收发数据缓冲区之外,通常我们还要自己定一个数据的收发缓冲区。1.1 为什么要自定义缓冲区假设应用程序需要发送40kB数据,但是操作系统的TCP发送缓冲区只有25kB剩余空间,那么剩下的15kB数据怎么办?如果等待OS缓冲区可用,会阻塞当前线程,因为不知道对方什么时候收到并读取数据。因此网络库应该把这15kB数据缓存起来,放...原创 2019-07-02 14:08:51 · 1093 阅读 · 0 评论 -
优雅关闭以及如何检测对端已经关闭
1. 什么是优雅关闭一种情况是在多进程并发时,假设客户端有两个进程,父进程和子进程,子进程是在父进程和服务器建立连接之后fork出来的,我们期望实现这样的功能:子进程将数据写入套接字后close,并退出,服务端接收完数据,直到检测到EOF,也关闭连接,并退出,接着父进程读取完服务端响应的数据,也退出,但如果子进程使用close的话,并不会发生4次挥手的过程,只是引用计数减1,服务端是接收不到...原创 2019-06-26 12:34:35 · 1207 阅读 · 0 评论 -
errno以及网络编程使用场景
1. linux下定义的errno为防止和正常的返回值混淆,系统调用并不直接返回错误码,而是将错误码放入一个名为errno的全局变量中。如果一个系统调用失败,你可以读出errno的值来确定问题所在。errno不同数值所代表的错误消息定义在errno.h中,你也可以通过命令"man 3 errno"来察看它们。需要注意的是,errno的值只在函数发生错误时设置,如果函数不发生错误,errno的...原创 2019-06-18 13:58:14 · 536 阅读 · 0 评论 -
tcp和udp的基本函数调用过程及如何选择
1. socket编程1.1 概述TCP是TCP/IP体系中面向连接的传输层协议,它提供全双工和可靠交付的服务。它采用许多机制来确保端到端结点之间的可靠数据传输,如采用序列号、确认重传、滑动窗口等。首先,TCP要为所发送的每一个报文段加上序列号,保证每一个报文段能被接收方接收,并只被正确的接收一次。其次,TCP采用具有重传功能的积极确认技术作为可靠数据流传输服务的基础。这里“确认”是指接收...原创 2019-06-12 12:28:45 · 2072 阅读 · 0 评论 -
如何将socket设置成非阻塞的,非阻塞socket与阻塞的socket在收发数据上的区别
1. 生成socket时设置socket函数创建socket默认是阻塞的,也可以增加选项将socket设置为非阻塞的:int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);2. 使用fcntl设置将socket设置为非阻塞的if ((nFlags = fcntl (nSock, F_GETFL, 0)) ...原创 2019-06-25 12:36:15 · 2874 阅读 · 0 评论 -
tcp粘包及如何解决
1. 什么是粘包流式套接字首先说说TCP为什么叫流式套接字,顾名思义,是指TCP的数据传输跟流动的水一样,大家可以想象一下,水是连成一片的,它是没有分界线的,而TCP数据传输也是一样的,是没有界限的;缓存机制熟悉TCP协议的人都应该知道,TCP发送数据,并不是应用程序send以后就发出去了,它是先存储在发送缓冲区的,为了性能考虑,可能会等到多个数据包汇总到一起后,操作系统底层再把缓...原创 2019-06-21 12:36:20 · 2750 阅读 · 1 评论 -
套接口、ip、端口号相关
1. 网络相关概念1.1 套接口的概念套接口,也叫“套接字”。是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户。网络通信,归根到底还是进程间的通信(不同计算机上的进程间通信)。在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进...原创 2019-06-10 12:36:47 · 1091 阅读 · 0 评论 -
setsockopt的常用选项
1. 函数原型#include <sys/types.h >#include <sys/socket.h>int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);sockfd:标识一个套接口的描述字level:选项定义的层次;支持SOL_S...原创 2019-06-19 12:23:57 · 398 阅读 · 0 评论 -
tcp包头、三次握手、四次挥手、状态
1. TCP协议1.1 TCP数据包头要了解三次握手和四次挥手,首先需要了解下TCP数据包头的结构,如下:源端口、目的端口:16位长,标识出远端和本地的端口号;序号:SEQ,32位长,标识发送的数据包的顺序,防止数据包乱序;确认号:32位长,接收方对发送方发送来的TCP报文段的响应,其值是对收到的报文序号加1,用于解决不丢包的问题;TCP头长:4位头长,标识tcp头部可以有多少个3...原创 2019-06-14 12:06:14 · 482 阅读 · 0 评论 -
linux网络编程系列(十二)--滑动窗口、拥塞控制、断线重连机制
1. 滑动窗口我们都知道TCP是可靠的协议,而可靠性很多时候就是来自于TCP的确认重传机制,在确认重传的基础上,就实现了滑动窗口协议,滑动窗口主要有两个作用:保证TCP的可靠性;提供TCP的流控特性;1.1 滑动窗口保证可靠性所谓窗口其实就是表示一段存放在发送缓冲区中的、可以被发送者发送的字节序列,它连续的一个范围,我们就称为窗口。而滑动则是随着数据不断的被发送,那么窗口就会在缓冲区...原创 2019-07-01 14:03:37 · 548 阅读 · 0 评论