面试—计算机网络
1.一次完整的HTTP请求经历什么样的流程?
答:利用DNS域名解析,将域名解析为计算机可以识别的IP地址,发起TCP连接后的三次握手,随后建立起TCP连接,之后发起HTTP请求,服务器响应HTTP请求,浏览器得到html代码,通过解析html代码,请求html代码中的资源,最后浏览器对页面进行渲染给用户。
2.TCP和UDP的区别,二者分布适用于什么样的场景。
答:
区别:TCP是可靠的,面向连接的协议,保证通信的双方主机之间具有可靠的字节流传输;UDP则是不可靠的,无连接的协议,特点就是“尽最大努力交付”,传输的速率非常快。
应用场景:TCP主要应用于对于传输质量有要求的传输场景中,例如QQ邮件传输,HTTP,HTTPS,SMTP,POP协议中;而对于UDP协议来讲,保证传输的速率是该协议最大的要求,主要应用于对于实时性比较高的传输通信中,例如QQ视频和QQ语音。
3.如何理解面向连接和面向无连接。
答:面向连接就是两个人通过电话直接进行交流;而对于面向无连接,就是指先将所要发送的信息放入到邮局中,期望通过邮局服务来完成,也叫做邮政服务。
4.TCP和UDP对应的应用层协议分别有哪些?
TCP:HTTP(超文本传输协议),SMTP(简单邮件传输协议),POP(邮局协议),FTP(文件传输协议),Telent(远程终端协议)
UDP:DNS(域名解析协议) ,SNMP(简单网络管理协议)
5.TCP三次握手,四次挥手。
三次握手:TCP建立连接的过程就叫做握手,握手需要在客户和服务器之间交换三个报文段,称之为三报文握手,采用三报文握手的目的就是防止之前丢失的报文突然又再次传送到服务器端。整个流程就是客户机先向服务器发送一个SYN=1,seq=x,随后服务器端返回SYN=1,ACK=1,ack=x+1,seq=y,最后客户机发送ACK=1,ack=y+1,seq=x+1,三次握手流程结束。TIP:在整个过程中:客户机是主动打开连接,而服务器是被动打开连接。
对于客户机为什么最后还要再发送一次确认,解释就是防止之前丢失的报文又突然再次传到服务器端,本来这是一个早就失效的报文段,但是B收到此报文段后,就直接和客户机A建立起了连接,但是现在A并没有发出建立连接的请求,所以不会向B发送数据,但B却以为新的运输连接已经建立了,并一直等待A发送信息,资源就这样白白浪费了。
四次挥手的过程,就是连接释放的过程,具体过程如下:A的应用进程先向服务器发送FIN,seq=u,随后服务器端向客户机端发送ACK=1,seq=v,ack=u+1,此时表明客户机已经不能在向服务器端发送数据了,但是此时服务器还是可以向客户机发送数据,等到服务器不想和客户机发送数据的时候,此时服务器就会向客户器发送FIN=1,ACK=1,seq=w,ack=u+1,最后客户机会发送确认报文,再确认报文段中置ACK为1,ack=w+1,seq=u+1,值得注意的是,此时TCP连接还并未释放,必须经过时间等待计数器设置的时间2MSL(最长报文段寿命)之后,A才会进入到CLOSE状态。
为什么A在时间等待计数器状态下等待2MSL的时间呢?
一是等待A发送的最后一个ACK报文可以顺利的到达B;二是防止失效的连接请求报文段出现在本连接中。
保活计数器:当客户机和服务器建立好连接以后,但是由于客户器出现了故障,此时服务器段不知到客户器出现了故障,此时就会用到保活计数器,作用就是,两个小时之内,客户机没有向服务器发送数据,,服务器就会发送一个探测报文段,以后每隔75秒 就发送一次,若一连发送的十个探测报文段都没有回应,那么服务器就会认为可慧极出现了故障,就会断开和客户器的联系。
6.为什么连接的时候是三次,而断开是四次。
答:建立连接的时候,ACK和SYN是一起发送,而断开连接的时候,FIN和ACK则是分开发送的,其实我们也可以在建立连接的时候使用四次建立连接的方法,只是为了简便起见 ,所以这就解释了原因。
7.在浏览器中输入www.baidu.com后执行的全过程?
答:客户端浏览器请求DNS服务器解析域名将其转换成成真确的IP地址,然后通过这个IP地址和默认端口80(即套接字SCOKET),和服务器建立起TCP连接,连接建立之后通过TCP将HTTP会话封装成数据包;
在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,然后使用IP层的IP地址去寻找目的端。
在客户端的网络层,通过查找路由表来确定如何到达服务器,期间可能经过多个服务器,这些都是由路由器来完成的工作,主要是通过查找路由表来确定通过哪个路径到达服务器;
在客户端的数据链路层,数据包通过链路层发送到路由器,通过邻居协议查找给定的IP地址和MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
好理解的版本:
1)浏览器分析链接指向页面的URL
2)浏览器向DNS请求解析www.baidu.com
3)域名解析DNS解析出相对应的IP地址
4)浏览器和服务器建立TCP连接
5)浏览器发出HTTP请求
6)服务器通过HTTP响应把文件发送给浏览器
7)TCP连接释放
8)浏览器解释文件,并将web页显示给用户。
8.HTTP(超文本传输协议)的协议包括哪些请求?
常见的请求有:get,post,put,delete,head,options
GET:请求读取有URL所标志的数据
POST:给服务器添加或更新数据
PUT:在给定的URL下存储数据
DELETE:删除给定的URL下的数据
HEAD:向服务器索要于GET相一致的请求,但是响应体将不会返回。这一方法就是实现预览的方法。
OPTIONS:服务器针对特定资源所支持的HTTP请求方法。
9.HTTP中POST和GET的区别?
GET:读取信息资源,安全的(不会修改所读取的信息资源呢),幂等的(对同一URL的访问请求是相同的,提交数据有点小限制;
POST:添加,更新信息,可能会改变服务器上的资源的请求,提交数据无限制.
10.说说你熟悉的计算机网络的分层结构?
OSI模型:物理层(二进制比特流),数据链路层(封装成帧),网络层(IP数据报),传输层(TCP,UDP 报文段),会话层,表示层,应用层. 通信子网,资源子网 点到点 端对端
11.Android网络编程需要注意什么?
答:端口号应该大于 等于1024,因为0到1023都被系统占用了;在清单文件中添加权限代码;在Android系统中,TCP和UDP都属于耗时操作,所以必须放在子线程中.
12.HTTP常见的转态码都代表什么意思?
1xx:继续,指示信息请求已经接受,继续处理;
2xx:成功,指示请求已经被成功的接收,理解,处理.
3xx:重定向,要求请求必须进行更进一步的操作.
4xx:资源请求错误,客户端-请求有语法错误或者请求无法实现.
5xx:服务器内部错误,服务器内部出错无法完成合法的请求.
404,服务器无法找到对应的资源.
13.HTTP和HTTPS的相同点?
答:HTTP指的是超文本传输协议,HTTPS指的是基于安全套接字的超文本传输协议.
这两者都是采用同一个基础的协议,浏览器作为HTTP或HTTPS客户端,设立一个连接到web服务器指定的一个端口.HTTPS和HTTP唯一不同的只是一个协议头(https)的说明,其他都是一样的.
14.为什么需要HTTPS?
HTTP是一个用来通过互联网传输和接受信息的协议,HTTP使用请求/响应的过程,因为此信息可在服务器间快速,轻松且精确的进行传输.当你访问web页面的时候你就是在使用HTTP协议,但HTTP协议是不安全的,可以很轻松的窃听拟合web服务器之间的数据传输.在很多时候,客户和服务器之间传输的是敏感信息,需要防止未经授权的访问.为了满足这个要求,网景公司推出了HTTPS,也就是基于安全套接字层的超文本传输协议.说到底就是为了安全起见,同时HTTP协议是不安全的协议,就和UDP和TCP有点类似.
15.HTTPS是什么?
在HTTP应用层的基础上使用安全套接字层作为子层来保证客户器和服务器之间数据传输的安全性.
16.HTTP1.0/1,1/1.2的区别是什么?
1.1相对于1.0的区别:支持长连接,增加了host域,增加了range(客户端)&content-range(服务端)头域,支持断点续传:
Range:bytes=500-999 表示需要500-999字节范围内的内容.
content-range:bytes 0-499/22400,表示当前发送的数据的范围为0-499,而22400则是文件的总大小.
返回头的区别:
HTTP/1.1 200 OK(不使用断点续传方式) HTTP/1.1 206 Partical content(使用断点续传方式)
2.0相对于1.x的区别?
支持多路复用;采用二进制分帧;首部压缩;服务器推送(将浏览器主动请求服务器资源改变成为服务器主动发送资源)
17.HTTP和SCOKET的区别?
SCOKET就是套接字的意思,具体表现形式是(IP地址,端口号),可以理解为对TCP,UDP协议在程序使用层面的封装,提供一些API来供程序员调用开发.
(1).HTTP是一个协议;而SOCKET是一个接口
(2).HTTP有可能是基于SOCKET的即HTTPS
(3)SOCKET可以维持一个长连接,HTTP是请求响应式,通常SOCKET效率高.
18.HTTP的缓存机制是什么样子的?
(1)请求处理:用户发起一个HTTP请求,缓存获取到URL,根据URL查找是否是否有匹配的副本,这个副本可能在内存中,也可能在本地磁盘里.
(2)新鲜度检测: 如果缓存中存在所请求资源的副本,则进行新鲜度检测.新鲜度检测就是我们去商店买一瓶汽水,看看汽水有没有过期,如果没过期,我们正常和就行了.如果过期了,我们肯定 会找商家.其实这就是新鲜度检测的过程,HTTP请求的新鲜度检测流程也是这样子的,HTTP发送一个请求的时候,发现缓存中有相应的副本,接着就会检测这个副本又没有过期,如果没有过期,直接使用,若过期了,则在进行验证.
(3)服务器再验证:缓存中的文档过期了并不代表它和服务器上的不一样,所以这个时候就需要问问服务器,过期的这段时间里这个文档有没有改变.如果改变了,缓存就会获取一份新的文档副本,然后发送给客户端.如果没有改变,缓存只需要获取新的首部,包含一个新的过期时间,并对缓存的首部更新.
(4)创建响应并返回:我们希望缓存看起来就像是来自原始服务器一样,缓存将已缓存的服务器响应首部作为响应首部,发送给客户端
缓存保质期的实现:HTTP中,通过cache-Control首部和expires首部为文档指定了过期时间,通过对过期时间的判断,缓存就可以知道文档是不是保质期内.expires首部和cache-control:max-age首部就是来告诉缓存文档有没有过期,为什么需要两个响应首部来做这件简单的是呢?其实这一切都是历史原因,expires首部是HTTP 1.0提出来的,因为他是使用的绝对时间,如果如果服务器和客户端时钟不同步的话(实际上这种问题非常常见),缓存就可能会认为文档已经过了保质期了,HTTP1.1为了修正这个问题,引入了cache-control:max-age首部,这个首部使用相对时间来控制保质期。
19.超文本传输协议(HTTP)
HTTP定义了浏览器如何向万维网服务器请求万维网文档,以及服务器怎么样把文档传送给浏览器。
从客户向服务器发送的请求报文称为请求报文;从服务器到客户的回答称为响应报文。
HTTP的请求体的格式:
请求行 请求头 CRLF(回车换行)请求实体
HTTP的响应体的格式:
状态行 响应头 CRLF(回车换行)响应实体