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); } };
可以快速判断一个元素一定不存在和可能存在一个集中的方法,用多个哈希函数将一个数据映射到位图中,核心思想一个值对应多个位。