一个CPP程序猿的第一篇博客
1、网络模型的每一层及作用
在网络七层模型中
物理层:底层数据传输,如网线,网卡标准
数据链路层:负责数据的封装和差错检测,以及MAC寻址(ARP协议)
网络层:定义IP编制,负责数据的路由、转发、分片
传输层:端到端数据传输的基本功能,如TCP/UDP
会话层:控制应用程序之间的会话能力,不同软件数据分发给不同软件
表示层:数据转换成另一个兼容另一个系统能识别的格式
应用层:应用程序提供统一的接口
在四层模型中:
TCP/IP 网络模型共有 4 层,分别是应用层、传输层、网络层和网络接口层,每一层负责的职能如下:
应用层:HTTP(基于TCP协议的可靠传输)、DNS(是将域名和IP相互映射的分布式数据库一般基于UDP协议)、TFTP(基于UDP协议),负责向用户提供一组应用程序。
传输层:TCP(基于字节流的面向连接的可靠传输)、UDP(基于数据报的面向不连接的不可靠传输),负责端到端的传输。
网络层:IP、ICMP(ping的过程),负责网络包的封装、分片、路由、转发。
网络接口层:MAC寻址、通过网卡传输网络帧,负责网络在物理网络中的传输。
2、常见状态码
200 ok表示一切正常
301表示请求的资源已经不存在,永久重定向,需改用新的URL重新访问
302 资源还在,但是暂时需要一临时URL来访问
400 客户端请求的报文有错
403服务器禁止访问资源
404请求资源未找到或禁止反访问
500请求没有问题,服务器内部出现了错误
501请求的功能暂时不支持
502服务器工作正常,访问后端服务器发生了错误
503当前非常忙,稍后再试一下
3、web服务器http如何解析的?
HTTP请求报文由请求行、请求头部、空行和请求数据四个部分组成。报文的请求方法,本项目只用到GET和POST;
**GET** GET /562f25980001b1b106000338.jpg HTTP/1.1 Host:[http://img.mukewang.com](https://link.zhihu.com/?target=http%3A//img.mukewang.com) User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 Accept:image/webp,image/*,*/*;q=0.8 Referer:[http://www.imooc.com/](https://link.zhihu.com/?target=http%3A//www.imooc.com/) Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8 空行 请求数据为空 **POST** POST / HTTP1.1 Host:[http://www.wrox.com](https://link.zhihu.com/?target=http%3A//www.wrox.com) User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Content-Type:application/x-www-form-urlencoded Content-Length:40 Connection: Keep-Alive 空行 name=Professional%20Ajax&publisher=Wiley
由于在HTTP报文中,每一行的数据由\r\n作为结束字符,空行则是仅仅是字符\r\n。因此,可以通过查找\r\n将报文拆解成单独的行进行解析,项目中便是利用了这一点。
为什么要用状态机?它能处理任何顺序的事件,并能提供有意义的响应——即使这些事件发生的顺序和预计的不同,
strbrk( t1, t2)用来查找t2在t1中第一次出现的位置,没有返回NULL。
4、内存泄漏及其排查
内存泄漏问题在工程代码中是非常严重的问题,有些公司会通报批评这类代码, 内存泄漏并不是指物理上的消失,而是指由于程序员的失误导致对该片内存失去控制,造成内存的浪费。
常见的内存排查手段,cppcheck是静态检查方法,最好的是valgrind,是Linux下的一个开源工具,
实战检测泄漏,编译程序(四个阶段-预处理,编译,汇编,链接)
编译 gcc -g -o text.cpp
检查内存泄漏 valgrind --tool=memcheck --leak-check = full ./mem_discover
5、get和post的报文有什么不同
1.报文上的区别 GET 和 POST 只是 HTTP 协议中两种请求方式,所以在传输上,没有区别,因为HTTP 协议是基于 TCP/IP 的应用层协议 报文格式上,不带参数时,最大区别仅仅是第一行方法名不同,一个是GET,一个是POST 带参数时报文的区别呢?在约定中,GET 方法的参数应该放在 url 中,POST 方法参数应该放在 body 中 举个例子,如果参数是 name=qiming.c, age=22。 GET 方法简约版报文可能是这样的 GET /index.php?name=qiming.c&age=22 HTTP/1.1 Host: localhost
POST 方法简约版报文可能是这样的 POST /index.php HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded name=qiming. c&age=22
2.GET 方法参数写法是固定的吗? 在约定中,一般我们的参数是写在 ? 后面,用 & 分割。 我们知道,解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。 也就是说,我们可以自己约定参数的写法,只要服务端能够解释出来就行,一种比较流行的写法是这样 : http://www.example.com/user/name/yourname/age/22
3、POST 方法比 GET 方法安全? 按照网上大部分文章的解释,POST 比 GET 安全,因为数据在地址栏上不可见。 然而从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输,只要在网络节点上抓包,就能完整地获取数据报文。 要想安全传输,就只有加密,也就是 HTTPS
6、TCP的为什么可以可靠传输
TCP有序列号(防止乱序)、确认应答(防止丢包)、重传机制(超时重传、快速重传、SACK方法选择性确认)、滑动窗口、流量控制、拥塞控制。
滑动窗口:窗口大小用无需等待确认应答,可以继续发送数据的最大值。
流量控制:发送方根据接收方的实际接受能力控制发送数据量。
拥塞控制:慢启动呈指数增长,在小于慢启动门限时,使用慢启动算法。
当大于慢启动门限时,拥塞避免算法。
7、url网址键入浏览器时发生的一系列过程
首先浏览器做的第一步工作就是要对 URL
进行解析,从而生成发送给 Web
服务器的请求信息。
在发送之前,还有一项工作需要完成,那就是查询服务器域名对应的 IP 地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址。
所以,有一种服务器就专门保存了 Web
服务器域名与 IP
的对应关系,它就是 DNS
服务器。
在域名中,越靠右的位置表示其层级越高。(老外习惯地名从小到大)
浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。
客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
DNS获得IP之后,就可以把HTPP的传输工作交给协议栈;
可靠传输HTTP,HTTP是基于TCP协议传输的。
远程定位IP
两点之间传输MAC
一般在 TCP/IP 通信里,MAC 包头的协议类型只使用:
0800
: IP 协议0806
: ARP 协议出口: 网卡
送别:交换机
路由器
服务端层层剥开
先开数据包的MAC头部,如何和自己的MAC地址符合,就包收起来。
继续扒开IP头,发现IP地址符合,根据IP头部的协议栈,知道自己的上层是TCP协议。
扒开TCP的头,里面有序列号,看一看这个序列包是不是想要的,如果是放入缓存中并返回ACK,不是则丢弃,TCP的头部还有端口号,HTTP的服务器正在监听这个端口号,服务器知道是HTTP进程想要这个包,于是就将包发给HTTP进程,HTTP将网页封装在HTTP响应报文中,HTTP响应报文以此穿上TCP、IP、MAC头部从网卡出去,由交换机发给路由器,路由器将响应数据发到下一个路由器,最后到客户端,从下往上扒开到剩下HTTP响应报文, 浏览器开始渲染页面,显示在屏幕上。客户端离开后,四次挥手,断开连接。
8、常见哈希表的实现
实质上要问哈希的应用:位图和布隆过滤器,
9、布隆过滤器:
前提是位图,位图是内存中连续的二进制位,位图的下标是整数,位图存储的是0和1,0代表不存在,1代表存在。
位图的实现:位图的映射:一个char是8个bit位,如果整数10要映射到位图中,就需要找到第二个char数据,然后在找到第二个char的第二个bit位,并将其改变为1即可。任何数 | 1都为1,| 0为原来的数。
一个二进制位就能存一个数,一个int数要占四位,32个bit,所以一个数相差32倍。
void Set(size_t x)//将x映射到位图中{ //找相对应的位图下标int index = x / 8 + 1;//x在位图中的第几个char中int place = x % 8;//在这个数的第几个bit位v[index] |=(1 << place);}//删除x在位图中的映射void ReSet(size_t x){//找相对应的位图下标int index = x / 8 + 1;//x在位图中的第几个char中int place = x % 8;//在这个数的第几个bit位v[index] &=(~(1 << place));}//判断一个数据是否在位图中bool Test(size_t x){//找相对应的位图下标int index = x / 8 + 1;//x在位图中的第几个char中int place = x % 8;//在这个数的第几个bit位return v[index] &(1 << place);} };
可以快速判断一个元素一定不存在和可能存在一个集中的方法,用多个哈希函数将一个数据映射到位图中,核心思想一个值对应多个位。
一个CPP程序猿的第一篇博客相关推荐
- 程序猿小张的第一篇博客
第一篇博客我想从以下五个方面来记录: a. 写一个自我介绍: b. 列出编程的目标: c. 打算怎么学习编程? d. 打算在学习编程这件事上每周花费多少时间? e. 最想进入的一家IT公司. a.本人 ...
- Python 用pygame 做一个游戏的开始界面(小白第一篇博客)
Python 用pygame 做一个游戏的开始界面(小白第一篇博客) 主要功能实现 本篇文章主要是实现了一个游戏开始界面的两个功能: 1,将鼠标放到"开始游戏"或"结束游 ...
- 第一篇博客,用以规划我的编程人生
本人编程小白.第一次写技术博客,希望制定一个学习计划,让自己慢慢成长为一名优秀的程序猿. 学习方向是成为一名全栈工程师. 前端方面:会用bootstrap设计网页,会用jQuery完成动作. 后端方面 ...
- Carrey的第一篇博客
Carrey的第一篇博客 为什么要写这篇博客 回顾一下猿生 总结一下 为什么要写这篇博客 你好! 我是Carrey,这是我的第一篇博客.我是一个有将近三年工作经验的java后端程序员,今天写这篇博客绝 ...
- csapp实验摘选 I Data Lab ——小小菜下士的第一篇博客
csapp实验摘选 I Data Lab --小小菜下士的第一篇博客 注:这是我的第一篇博客,试图在通往程序猿的路上踏出坚实的一步. --小小菜下士 实验来自: [读厚 CSAPP]I Data La ...
- 人生第一篇博客,欢迎大佬莅临指导!
前话 大家好 ,这是我的第一篇博客 ,我今年是一名大二的学生 ,今年21岁, 最近听到许多程序员有写博客的想法 ,所以我就有了突发奇想,准备开始写博客.记得我大一开学的时候 我申请了一个公众号:计算机 ...
- C博客作业00--我的第一篇博客
这个作业属于哪个班级 C语言–网络2011/2012 这个作业的地址 C博客作业00–我的第一篇博客 这个作业的目标 学习Makdown语法,对本专业及C语言课程有个简单了解,记录自学慕课视频的笔记. ...
- 第一篇博客------自我介绍
目录 自我介绍 编程目标 如何编程 希望进入的公司 自我介绍: Hello!!!我是一名即将步入大二的计算机小白. 小白 姓名:###(三个字) 性别:男 年龄:大二(大概也就0--100 ...
- 2017年终总结——第一篇博客开端
2017的总结: 2017年过去了,真的好快,可以清晰的记得我去年除夕的晚上我干了啥.但是2017年也是我改变比较大的一年,何出此言呢,总结了几点: 1.变的更加稳重成熟了,这种感觉的由来,其实是有时 ...
最新文章
- 驭势科技引入国家队战略注资,完成超10亿元人民币融资
- 为什么处理有序数组比无序数组快?
- 大厂首发:java转算法工程师
- jquery学习手记(3)属性
- xmldocument如何创建一个不带结尾的节点_LDF文件是个啥?如何创建一个LDF文件
- C语言去括号编程题,数据结构课件.ppt
- EXP-00091 正在导出有问题的统计信息 问题的解决(转)
- eggjs的参数校验模块egg-validate的使用和进一步定制化升级
- 电脑音频服务未运行怎么解决_电脑提示音频服务未运行怎么办,快来看看吧,图片描述(最多50字)...
- mysql并发_MySQL并发更新数据时的处理方法
- border:0 none,border:none;,border:0;三者之间的区别
- FL Studio常见问题之通道窗口和步进音序器的设置
- 安卓开发仿微信图片拖拽_Android 仿微信朋友圈发表图片拖拽和删除功能
- 提高sql性能的方法_三种提高T-SQL性能的方法
- InVEST实践与进阶及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中的具体应用
- linux 小度 驱动_360WiFi 小度WiFi 无线网卡驱动下载
- pta C语言选择题
- 《陶哲轩教你学数学》读后感
- 基于C#+ASP.NET 毕业设计526套(保持更新)(建议CTRL+D)
- 解决安装虚拟机vmware无法打开注册表项的问题
热门文章
- Excel VBA 指定区域内的数据 导出为图片
- Android Studio最完整的插件整理
- python+selenium+webdriver 截取全页面长图
- 投:分众传媒相关文章
- 自监督学习和计算机视觉
- mysql timestamp 比较_解析mysql TIMESTAMP(时间戳)和datetime不同之处比较
- 计算机网络断网吗,教您解决电脑网络常常断网掉线的方法?
- Ubuntu的快乐学习1——Ubuntu18.04的ROS平台搭建
- 无法加载文件 C:\Users\Administrator\PycharmProjects\pythonProject\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。
- java pdf 用系统字体大小_java - Java PDFBox设置PDF表单中几个字段的自定义字体 - 堆栈内存溢出...