TCP提供一种面向连接的、可靠的基于流的服务。 面向连接:在彼此交换数据之前必须先建立一个TCP连接,双方互相确认,仅有两方彼此通信。 可靠:数据被分割成TCP认为最适合发送的数据块;TCP发出一个段后启动一个定时器,超时重传;TCP收到另一端的数据后,将回复一个确认;TCP将保持它首部和数据的校验和,以检测数据在传输过程中的任何变化;必要时TCP将对收到的数据进行重新排序;TCP还能提供流量控制。 基于流的服务:应用程序对数据的发送和接受是没有边界限制的,发送段指定的写操作和接受段执行的读操作的次数之间没有任何的数量关系。 提供全双工通信。数据在两个方向上独立的进行传输,连接的每一端必须保持每个方向上的输出数据序号。 TCP首部 通常是20个字节。 发送端和目的端的端口号:用于标识发端和收端的应用进程。一个IP地址和一个端口号称为一个socket,插口对(包含源端IP、源端口、目的IP、目的端口)可唯一确定一个TCP连接。 32位序号:用来标识从TCP发端向TCP收端发送的数 继续阅读 >>


杜肖孟 17/10/19 23:51:39
三种模型 计算机网络是物理计算机连接起来成的系统,以及工作于系统上的协议。 网络协议分层方式常见有三种,一种是OSI七层模型,一种是TCP/IP四层模型,一种是五层模型。 五层模型的数据封装 物理层:比特传输 把电脑通过电缆、光缆连接起来,主要规定了网络的一些电气特性,负责传送0和1的电信号。 数据链路层:相邻网络元素(主机、交换机、路由器等)的数据传输 电脑连接起来后,就可以传送高低电位了,但是单纯的0和1没有任何意义,必须规定解读方式:多少个电信号算一组?每个信号位有什么意义? 以太网协议 规定一组电信号构成一个数据包,叫做“帧”,每一帧分为两部分:标头(Head)和数据(Data)。 “标头”包含数据包的一些说明项,比如发送者(源物理地址)、接收者、数据类型、CRC校验码等。“数据”则是数据包的具体内容。具体的帧结构如下所示: “标头”的长度固定为18个字节(6+6+2+4=18),“数据”的长度,最短为46字节,最长为1500字节(MTU,最大传输单 继续阅读 >>


杜肖孟 17/10/19 23:11:52
什么是计算机网络? 主机之间通过交换网络互连,交换节点一般是路由器或者交换机。 什么是网络协议? 为进行网络中的数据交换而建立的规则、标准或约定。 协议的三要素是什么? 语法、语义、时序 计算机网络的结构? 网络边缘:主机(端系统)、网络应用 主机(端系统):运行网络应用程序 客户/服务器(C/S)应用模型:客户发送请求,接受服务器响应 对等(P2P)应用模型:不仅依赖专用服务器;对等实体之间直接进行通信 接入网络,物理介质:有线或无线通信链路,将网络边缘接入核心网络 带宽(bps):网络中指数据传输速率,Mb/s 共享/独占? 无线接入网络: 无线局域网(LANs):wifi 广域无线接入:通过电信运营商,3G、4G 网络核心:互联的路由器(或分组转发设备),将数据从源主机通过网络核心发送到目的主机 关键功能:路由+转发 路由:确定分组从源到目的传输路径 路由算法 转发:将分组从路由器的输入端口交换至正确的输出端口 本地转发表 继续阅读 >>


杜肖孟 17/10/19 20:56:07
Redis网络模型是一个使用IO多路复用、单线程、非阻塞的模型。这个模型的优点在于单线程不用考虑加锁,如果在单核环境上可以将效率发挥到最大。它没有那么庞大,代码一共2000多行,因此比较容易分析,学长推荐。 另外@浅墨学长拿出了redis网络部分的代码,设计了应用层协议,添加了应用层buffer,定义了服务器类型,完成了一个基于Redis网络模型的简易网络库,我fork了一份,然后跟着学长的博客 Redis网络库源码分析 以及网上搜集的资料,把这部分的源码根据自己的理解分析了一下,添加了很多注释,扔到我的git上,大概了解了服务端的工作过程,分享出来以供大家参考与我后期的回顾。 附上链接:Redis网络库源码浅解 参考资料: 什么是 Event Loop? 杨博东的博客 作者:Tanswer_ 发表于2017/8/12 16:43:52 原文链接 阅读:152 评论:0 查看评论 继续阅读 >>


杜肖孟 17/08/12 16:43:52
线程池介绍 服务器完成一项任务的时间可分为:T1:创建线程或进程时间;T2:执行任务时间;T3:销毁进程或线程时间。通常T1+T3的时间大于T2,线程池正是关注如何缩短T1和T3的时间。 线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分一个预先创建的线程去处理任务,线程在处理完任务后还可以重用,不会销毁,继续等待下次任务的到开。这样能避免大量的线程创建和销毁操作,从而节省系统资源;同时有很多任务时,也会减少创建线程的数量。 用C++11的线程相关特性,比如线程、条件变量、互斥量,让我们编写并发程序更简单。 半同步半异步线程池实现的关键技术分析 线程池又三层组成: 1. 同步服务层:不断的将新任务添加到同步队列中,可以用多路复用或者多线程来完成。一开始没看懂任务是什么,其实一个函数就是一个任务,C++11通过std::function将函数封装为类模板对象,可以将这些任务(函数)放到容器中保存起来,以进行添加读取任务操作。 2. 排队层:就是一个同步队列,处于核心地位。所有待处理的任务都存在这里,要保证队列中共享数据线程安全 继续阅读 >>


杜肖孟 17/08/11 16:03:45
左值和右值 左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象 右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。 比如 int a = b + c;,a 就是一个左值,可以对a取地址,而b+c 就是一个右值,对表达式b+c 取地址会报错。C++11中右值又由两个概念组成:将亡值和纯右值。 纯右值和将亡值 在C++98中,右值是纯右值,纯右值指的是临时变量值、不跟对象关联的字面量值。包括非引用的函数返回值、表达式等,比如 2、‘ch’、int func()等。将亡值是C++11新增的、与右值引用相关的表达式。 纯右值:非引用返回的临时变量( int func(void) )、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等。 将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&&的类型的转换函数的返回值。 将亡值可以理解为通过“盗取”其他变量内存空间的方式获取到的值。在确保其他变量不再被使用、或即将被销毁时,通过“盗取”的方 继续阅读 >>


杜肖孟 17/08/09 21:37:30
写在前面:最级要开始写我们的项目了,是一个网络编程的项目,语言用C++,基于Socket通信,采用JSON数据交换格式,存数据用Mysql数据库。我们开始的困难是不知道如何处理客户端,组内都没有学写APP,如果是在终端下跑那就有太多限制了,感觉反而是加大了难度。 纠结了一会,突然想到能不能用PHP来写客户端,我学过一段时间PHP,目前还不太了解高阶的用法,前不久写了一个简单的订餐系统,用到一些特性,记得看到过PHP也可以进行Socket编程。在网上搜了一下,然后我写了一个简单的测试样例,客户端是用PHP,服务端用C++,互发送一条消息之后成功接收。 PHP的语言特性决定了它不适合做socket服务器端,socket主要面向底层和网络服务开发,一般用C或Java实现,能更好的处理并发、阻塞等。和C++或C写TCP客户端是一样的,工作过程可用下面的图表示: PHP中和Socket相关函数 socket_accept() 接受一个Socket连接 socket_bind() 把socket绑定在一个IP地址和端口上 sock 继续阅读 >>


杜肖孟 17/07/19 15:14:50
一、JSON的简单介绍 JSON(JavaScript Object Notation):JS对象表示法 是轻量级的文本数据交换格式;独立于语言,JSON解析器和库支持多种编程语言 json文件的文件类型是”.json” 语法规则: 数据在 名称/值对 中 名称在双引号中,后面写一个冒号,然后是值 值可以是:数字(整数或者浮点数)、string(在双引号中)、逻辑值(true/false)、数组(在[]中)、对象(在花括号中)、null,这些结构可以嵌套。 eg.数组: { "people": [ {"firstname":"jr","lastname":"smith"}, {"firstname":"palu","lastname":"george"} ] } 对象people包含两个对象的数组,每个对象是某人的姓和名,people[0].lastname返回smith 数 继续阅读 >>


杜肖孟 17/06/12 19:49:44
I/O设备分类: 按使用特性 人机交互类外设:打印机、显示器、鼠标、键盘等 存储设备:磁盘、磁带、光盘等 网络通信设备:网络接口、调制解调器等 按传输速率分类 低速设备:每秒几个到数百个字节(< KB/s),如键盘、鼠标 中速设备:每秒数千个字节至数万个字节,如激光打印机 高速设备:数百个千字节至千兆字节(>100 KB/s),如磁带机、光盘机 信息交换的单位分类 块设备:信息的存取以数据块为单位,读写的基本单位是数据块,如磁盘 字符设备:用于数据输入输出的设备为字符设备,读写的基本单位是字符,如交互式终端机、打印机 设备控制器 什么是设备控制器? 设备控制器是计算机中的一个实体,物理上看控制器是一块接口卡或主板上的一个功能模块。主要职责是控制一个或多个I/O设备,以实现CPU与I/O设备之间的数据交换。设备控制器收到命令后,CPU可以转向执行其他工作,而让设备控制器自行完成具体的I/O操作。当命令执行结束后,控制器发出一个中断信号,OS重新获得CPU控制权并检查执行结果。这样把CPU解脱出来。 设备控制器 继续阅读 >>


杜肖孟 17/06/03 14:45:34
想用C++写项目,数据库是必须的,所以这两天学了一下C++操作Mysql数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。 连接MySQL数据库有两种方法:第一种是使用ADO连接,不过这种只适合Windows平台;第二种是使用MySQL自己的C API函数连接数据库。我是在Linux平台下开发,所以就采用第二种方法,有很多Api函数,但是常用的就几个,我也是就用到其中的几个。 API函数 1.mysql_real_connect() 连接一个mysql服务器 MYSQL *mysql_real_connect (MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag) 如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回 继续阅读 >>


杜肖孟 17/05/28 23:28:44