一个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 服务器」。

  1. 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。

  2. 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 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);
    	}
    };

    可以快速判断一个元素一定不存在和可能存在一个集中的方法,用多个哈希函数将一个数据映射到位图中,核心思想一个值对应多个位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值