前端面试题 | 计算机网络基础篇(4月15日更新)

2,244 阅读7分钟

1. 从输入URL到页面加载发生了什么?

  1. 地址栏输入URL并按下回车
  2. 浏览器会在缓存中查找URL是否存在,并比较缓存是否过期
  3. DNS解析url,找到对应的ip地址
  4. 获取IP地址之后开始建立第一次🔗,这里是由tcp协议完成的,主要通过3次握手完成:
  • 第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
  • 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  • 第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
  1. 完成握手后,浏览器向服务器发送http请求,
  2. 浏览器接收服务器返回的Response对象,主要包括状态码、响应头和响应报文3个部分
  3. 浏览器收到后就会对dom结构进行渲染
  4. 四次挥手:

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

http和https有什么区别?

  1. https协议更加安全,因为它是基于ssl加密传输的,而http是超文本传输协议,数据通过明文传输
  2. http速度更快,因为https传输需要验证证书
  3. 端口不同,http端口是80,https端口是443
  4. http连接是无状态的

2. get和post有什么区别?

其实,GET和POST本质上两者没有任何区别。他们都是HTTP协议中的请求方法。底层实现都是基于TCP/IP协议。所谓区别,只是浏览器厂家根据约定,做得限制而已。

  • get是通过明文发送数据请求,而post是通过密文;
  • get传输的数据量有限,因为url的长度有限,post则不受限;
  • GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制
  • GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
  • 参考:www.cnblogs.com/logsharing/…

3. OSI七层协议

blog.csdn.net/tracy_frog/…

4. 栈和堆的区别

  1. 堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

  1. 堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

  1. 效率比较

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

  1. 存储内容

栈: 在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。

当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向函数的返回地址,也就是主函数中的下一条指令的地址,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

其他知识点参考:juejin.cn/post/684490…

5. session和cookie有什么区别?

  1. 存储位置不同:cookie存储在客户端,是客户端保存用户信息的一种机制,用来记录用户的一些信息。每次HTTP请求时,客户端都会发送相应的Cookie信息到服务端。session存储在服务端,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应,这个id会被传递给客户端放置于cookie中,从而识别用户。

  2. 删除权限不同:cookie可以由用户在浏览器设置中清除,session则只能由服务端通过validate或者是过期后自动删除。

  3. cookie相对而言不够安全

  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie;session保存的数据大小不受限制,但太多了也会损耗服务器性能,所以还是根据需要适当分配cookie和session。

参考:www.cnblogs.com/Lzf127/p/89…

6. 请求头包括哪些内容?

Accept浏览器可以接受的媒体类型 Accept-Encoding浏览器可以接受的编码方法 Accept-Language申明自己可以接受的语言 Host也就是域名 Connectionkeep-alive或者close cache-control比如no-cache Referer告诉服务器我是从哪个页面链接过来的 User-Agent告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本

7. tcp为什么是三次握手而不是两次握手?

采用两次握手,那么若Client向Server发起的包A1如果在传输链路上遇到的故障,导致传输到Server的时间相当滞后,在这个时间段由于Client没有收到Server的对于包A1的确认,那么就会重传一个包A2,假设服务器正常收到了A2的包,然后返回确认B2包。由于没有第三次握手,这个时候Client和Server已经建立连接了。再假设A1包随后在链路中传到了Server,这个时候Server又会返回B1包确认,但是由于Client已经清除了A1包,所以Client会丢弃掉这个确认包,但是Server会保持这个相当于“僵尸”的连接。

8.http有哪些请求?

GET:对服务器资源的简单请求

POST:用于发送包含用户提交数据的请求

HEAD:类似于GET请求,不过返回的响应中没有具体内容,用于获取报头

PUT:传说中请求文档的一个版本

DELETE:发出一个删除指定文档的请求

TRACE:发送一个请求副本,以跟踪其处理进程

OPTIONS:返回所有可用的方法,检查服务器支持哪些方法

CONNECT:用于ssl隧道的基于代理的请求

9.tcp为什么需要4次挥手?

因为TCP有个半关闭状态,假设A.B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A连接释放报文,然后A发确认,所以是4次。

在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。原因是因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。

10.IP地址和Mac地址有什么区别?

IP地址是逻辑上的,用户可以修改自己设备的IP地址,Mac地址是物理上的,直接烧入物理设备,比如路由器,用户不能轻易修改。

IP地址负责标记发送方和接收方,而MAC地址负责传输过程中的分段传送,二者缺一不可。