面试宝典——计算机网络
文章目录
- 面试宝典——计算机网络
- 一、http状态码
- 二、TCP三次握手
- 三、TCP四次挥手(断开连接):
- 四、http与htpps的区别
- 五、TCP和UDP的区别
- 六、常见的Http请求方式:
- 七、OSI 7层模型:
- 八、GET和POST的区别
- 九、在地址栏打入http://www.baidu.com会发生什么?
- 十、tcp/ip协议在各个层的作用
- 十一、HTTP和Socket的区别
- 十二、长连接与短连接
- 十三、Cookie和Session的区别
- 十四、[IO模型](https://blog.csdn.net/qq_43299522/article/details/115002769)
- 十五、TCP为什么可靠?
- 十六、IP地址的分类
- 十七、HTTP的结构
一、http状态码
100-199 表示请求已收到接受处理
200-299 表示成功
200-响应成功
300-399 表示资源重定向
301-域名跳转,永久重定向
302-临时跳转,临时重定向
400-499 表示客户端请求出错
400-客户端语法错误
403-服务器拒绝提供服务
404-请求资源不存在
500-599 表示服务器端出错
500-服务器内部出错
二、TCP三次握手
(目的:使数据包的发送和接收同步)
第一次:主机A向主机B发送一个带有序列号的数据段,向主机B请求链接,主要告诉B 两件事:我要和你建立链接,你需要回应我那个序列号作为起始的数据段
第二次:主机B收到主机A的请求,用一个确认应答ACK还有同步序列号的数据段回应主机 A,告诉A两件事:我已经收到了你的请求,你需要用那个序列号作为起始数据段来回应我
第三次:主机A收到数据段后,再发送一个应答,确认已经收到主机B的数据段“我已经收 到了回复,我要开始传输数据了”
三、TCP四次挥手(断开连接):
第一次:当主机A完成数据传输后,将控制位FIN置为1,提出停止TCP连接的请求
第二次:主机B收到FIN后,做出响应将ACK置为1,并关闭这一方向的TCP连接
第三次:主机B提出反方向的关闭请求,FIN置为1
第四次:主机A收到主机B的关闭请求,做出响应ACK置为1,双方连接结束
四、http与htpps的区别
①传输信息安全性不同:http明文输入----HTTPS是具有安全性的ssl加密传输协议;
②连接方式不同:
http连接简单,无状态;------HTTPS由SSL+http协议构建的可以进行加密传输、身份认证的网络协议。
③端口不同: 80 -----443
④证书认证方式不同:http—免费申请;------HTTPS:需要ca申请证书。
五、TCP和UDP的区别
TCP是数据控制协议,面向连接,数据传输的单元是报文段,提供可靠交付。应用:视频网站
UDP是用户数据包协议,无连接,数据传输的单元是用户数据段,无法提供可靠交付。应用:视频通话
六、常见的Http请求方式:
GET——获取资源
POST——传输资源
PUT——更新资源
DELETE——删除资源
HEAD——获取报文头部
七、OSI 7层模型:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
八、GET和POST的区别
- 表层:
GET在浏览器回退是无害的,POST会再次请求
GET可以被缓存,POST不能
编码方式:GET只能url,post可以支持多种编码方式
GET通过url传参,POST放在request body中
GET请求在URL中传送的参数是有长度限制的,而POST么有。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。 - GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
GET浏览器会把header和data一起发送出去,服务器响应200
POST浏览器先发送header,服务器响应100,再发送data,服务器响应200
九、在地址栏打入http://www.baidu.com会发生什么?
当输入www.baidu.com时,计算机会请求DNS服务器,进行域名转换,得到服务器IP地址,同时对服务器发出请求,服务器响应请求,客户端浏览器发起一个HTTP会话到IP地址,然后通过tcp进行封装数据包,输入到网络层
十、tcp/ip协议在各个层的作用
第五层-应用层
是体系结构的最高层,直接为用户的应用进程提供服务。如简单电子邮件传输(SMTP)(25端口)、文件传输协议(FTP)(20/21端口)、网络远程访问协议(Telnet)(23端口)等
第四层-运输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
在传输层有两个性质不同的协议:TCP(传输控制协议)和UDP(用户数据包协议)
第三层-网络层
① 负责为分组交换网上的不同主机提供通信服务
② 选中合适的路由,使源主机运输层所传下来的分组能够通过 网络中的路由器找到目的主机。
第二层-数据链路层
用来处理连接网络的硬件部分。
第一层-物理层
在物理层上所传数据的单位是比特,物理层的任务就是透明的传送比特流。
十一、HTTP和Socket的区别
http:超文本传输协议
特点:
- 短链接,响应后断开
- 应用级接口,使用方便,对开发要求不高,容错性高
- 传输速度慢,数据包大
- 若进行实时交互,服务器压力大
- 安全性差
Socket:对TCP/IP协议的封装,是一个调用接口
特点:
- 长连接,通常情况Socket连接就是TCP连接
- 需要解析传输数据,对开发要求高
- 传输字节,数据可自定义,数据量小
- 传输速度快,性能高,适合实时交互
- 安全性强,可加密
十二、长连接与短连接
概念:
-
长连接:是指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双发检测数据包以维持此连接,一般需要自己在线维持。
-
短连接:是指通信双方有数据交互时,建立一个TCP连接,数据发送完成后,则断开TCP连接,一般银行都使用短链接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
长连接和短连接的优点和缺点
- 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适合长连接。(数据库的连接用长连接,如果用短连接频繁通信会造成socket错误,而且也是资源的浪费)
长连接并不是永久连接,当超时且这个连接没有HTTP请求发出,长连接就会断开。 - 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但是如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和宽带。(web网站的http服务一般都用短连接,长连接对于服务端来说会耗费一定的资源)
十三、Cookie和Session的区别
- 存储位置不同:
Cookie是将用户数据通过加密的方式保存在客户端,大多数情况Cookie存储在浏览器
Session是用于控制客户端和服务端的连接,Session存储在服务器 - 存储容量不同:
Cookie单个不超过4KB,最多20个
Session无上限,尽量少,多了会影响性能 - 存取方式不同:
Cookie只能使用ASCII字符串
Session能存储任何类型的数据 - 隐私策略/安全性不同:
Cookie放在客户端,不安全
Session放在服务端,更安全 - 有效期不同:
Cookie设置属性可以达到长期有效
关闭窗口Session就会失效 - 服务器压力不同:
Cookie保存在本地,不存在服务器压力
Session产生过多,会比较占用服务器的性能 - 浏览器支持不同:
如果浏览器禁用Cookie,那么Cookie直接失效
Session比较好,可以用URL重写 - Cookie和Session应用的场景:
Cookie一般用于记住用户的登录状态,如记录用户的习惯,购物车等
Session用于登录验证
十四、IO模型
1、阻塞IO
当B发起读取数据申请时,在内核数据没有准备好之前,应用B会一直处于等待数据状态,直到内核把数据准备好了才会交给应用B结束。
术语描述:在应用调用recvfrom读取数据时,其系统调用知道数据包到达且被复制到应用缓存区中或者发送错误时才返回,在此期间一直会等待,进程从调用到返回在这段时间内都是被阻塞的称为阻塞IO
流程:
- 应用进程向内核发起recvfrom读取数据。
- 准备数据报(应用进程阻塞)
- 将数据从内核负责到应用空间
- 复制完成后,返回成功提示
2、非阻塞IO
当应用B发起读取数据申请时,如果内核数据没有准备好会即刻告诉应用B,不会让B在这里等待。
术语描述:非阻塞IO是应用调用recvfrom读取数据时,如果该缓存区没有数据的话,就会直接返回一个EWOULDBLOCK错误,不会让应用一直等待中。在没有数据的时候会即刻返回错误表示,那就意味着如果应用要读取数据就需要不断的调用recvfrom请求,直到读取到它想要的数据为止
流程:
- 应用进程向内核发起recvfrom读取数据
- 没有数据包准备好,即刻返回EWOULDBLOCK错误码
- 应用进程向内核发起recvfrom读取数据
- 已有数据包准备好就进行下一步,否则还是会返回错误码
- 将数据从内核拷贝到用户空间
- 完成后,返回成功提示
3、IO复用模型
由一个线程监控多个网络请求(我们将其称为fd文件描述符,linux系统把所有网络请求以一个fd来标识),这样就可以只需要一个或几个线程就可以完成数据状态的询问操作,当有数据准备就绪之后再分配对应的线程去读取数据,这样就可以节省出大量的线程资源出来。
IO复用模型的思路就是系统提供了一种函数可以监控多个fd的操作,这个操作就是我们常说的select,poll,epoll函数,有了这个函数后,应用线程通过的调用select函数就可以同时监控多个fd,select函数监控的fd中只要有任何一个数据状态准备就绪了,select函数就会返回可读状态,这时询问线程再去通知处理数据的线程,对应线程此时再发起recvfrom请求去读取数据。
术语描述:进程通过一个或多个fd传递给select,阻塞在select操作上,select帮我们侦测多个fd是否准备就绪,当有fd准备就绪时,select返回数据可读状态,应用程序再调用recvfrom读取数据
总结:
复用IO的基本思路就是通过select或者poll、epoll来监控fd,来达到不必为每个fd创建一个对应的监控线程,从而减少线程资源浪费的目的。
4、信号驱动IO模型
text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMjk5NTIy,size_16,color_FFFFFF,t_70)
信号驱动IO不是用循环请求询问的方式去监控数据就绪状态,而是在调用sigaction时候建立一个SIGIO的信号联系,当内核数据准备好之后再通过SIGIO信号通知线程数据准备好后的可读状态,当线程收到可读状态的信号后,此时再向内核发起recvfrom读取数据的请求,因为信号驱动IO的模型下应用线程在发出信号监控后即刻返回,不会阻塞,所以在这样的方式下,一个线程也可以同时监控多个fd。
术语描述:首先开启套接口信号驱动IO功能,并通过系统调用sigaction执行一个信号处理函数,此时请求即刻返回,当数据准备就绪时,就生成对应进程的SIGIO信号,通过信号回调通知应用线程调用recvfrom来读取数据。
总结:
IO复用模型里的select虽然可以监控多个fd了,但select其实现的本质上还是通过不断的轮询fd来监控数据状态,因为大部分轮询请求是无效的,所以信号驱动IO意在通过这种建立信号关联的方式,实现了发出请求后只需要等待数据就绪通知即可,这样就可以避免大量无效的数据状态轮询操作。
5、异步IO
应用只需要向内核发送一个read请求,告诉内核它要读取数据后即刻返回;内核收到请求后建立一个信号联系,当数据准备就绪,内核会主动把数据从内核复制到用户空间,等所有操作都完成后,内核会发起一个通知告诉应用,我们称这种一劳永逸的模式为异步IO模型。
术语描述:应用告知内核启动某个操作,并让内核在整个操作完成之后,通知应用,这种模型与信号驱动模型的主要区别在于,信号驱动IO只是由内核通知我们合适开始下一个IO操作,而异步IO模型是由内核通知我们操作什么时候完成。
总结:
异步IO的优化思路是解决了应用程序需要先后发送询问请求,发送接收数据请求两个阶段的模式,在异步IO的模式下,只需要向内核发送一次请求就可以完成状态询问和数据拷贝的所有操作。
十五、TCP为什么可靠?
- 因为TCP丢包之后,会做数据校验,然后重传数据。
- 接收方每收到一个数据包就发送一次确认,发送方设置定时器,如果定时没有收到接收确认就重传。有两种,一种是丢多少重传多少,一种是从丢弃的地方重新传送数据,一般是后面一种。
- 并且针对传输的流量,TCP会做限制,尽量保证网络的最大传输效率,保证接受方稳定接受。这就是利用滑动窗口来实现流量控制
- 提供拥塞控制
当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞
十六、IP地址的分类
IP地址 = 网络号+主机号。
- A类:1-127 地址范围:1.0.0.0-126.255.255.255 最大网络数:2^{7}-2 126个
- B类:128-191 地址范围:128.1.0.1-191.255.255.254
- C类:192-223 地址范围:192.0.1.1-223.255.255.254
- D类:224-239 地址范围:224.0.0.1-239.255.255.254
- E类:240-255
十七、HTTP的结构
http请求报文由三部分组成,分别是:请求行(请求头)、消息报头、请求正文。
请求头(请求行)以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
请求方法参加第六条