手写http-server 面试题

350 阅读5分钟

1、创建bin --->www 脚本文件 #!/usr/bin/env node 引入文件main.js(需要利用commander配置后面参数 npm link 全局链接)

2.在server.js中创建一个服务,main.js中开启一个服务

3.在依赖文件package.json文件中配置后面相关参数,

"babel": "babel src -d dist ",

"babel:watch": "babel src -d dist --watch" 开启一个窗口npm run babel:watch监控main.js中文件变换

4.安装babel相关模块 npm i babel/cli 解析core babel/core执行preset babel/preset转换成低级语法

npx babel src -d dist

5、chalk粉笔改变字体颜色

配置一堆的头

请求头:

accept-encoding:浏览器支持压缩格式
if-modified-since:对比缓存,上次修改时间
if-none-match:摘要缓存,和Etag配对使用
user-agent;判断什么设备,重定向

响应头:

content-Type:告诉浏览器响应内容的格式

常见:application/x-www-form-urlencoded 表单

multipart/form-data 二进制文件

application/json json数据

text/xml 纯文本

content-Encoding:告诉浏览器压缩文件格式

常见:gzip、deflate、br

cache-Control:强制缓存,在规定时间内不要再访问

Expires;强缓,比cache-Control优先级低,需要转换时间格式 toGMTString()

Last-Modified:相对缓存,和if-modified-since配对使用 ,最后修改时间

Etag:根据摘要做缓存,和if-none-match配对使用

Location:重定向

网络模型:

OSI七层网络模型:

物理层-->数据链路层-->网络层-->传输层-->会话层-->表示层-->应用层

对于前端来说主要是传输层和应用层

在传输层有tcp和udp

在应用层有http和ftp

TCP的三次握手和四次四次挥手

三次握手:

客户端向服务端发送请求

服务端收到请求向客户端发送请求

客户端确认收到请求

四次挥手:

甲方向乙方发送断开连接请求

乙方确认收到请求

乙方向甲方发送断开连接请求

甲方确认收到请求

因为乙方在收到断开连接请求时,可能还有数据没有传输完,不能立即断开连接,所有断开连接是四次

TCP与UDP的异同点:

tcp与udp都是传输层协议

相对于UDP来说,TCP面向连接,需要双方先建立连接,之后才开始数据传输,在传输过程中有超时重发,丢弃重复数据,所以TCP更加安全可靠,更加耗时

UDP只是把应用层数据传输到ip层,并不能保证到达目的地,没有建立连接,没有超时重发等机制,速度相对较快

请求与响应

请求:

请求头:非常多 accept-encoding if-none-match if-modified-since url-agent

请求行:请求方式  url GET /http 1.1 版本号

请求正文:浏览器向服务器请求的内容

响应:

响应头:非常多  content-type content-encoding   cache-control Expires Etag last-modified location

响应行:HTTP 1.1 版本号 200 OK 状态码 描述

响应正文:响应的数据

### HTTP常用头:

content-type:响应的数据格式

content-encoding:响应的压缩格式

accept-encoding :请求支持的压缩格式

last-modified:最后修改时间

if-modified-since:上一次修改时间

Expires:强制缓存

cache-control:强制缓存

Etag:摘要

if-none-match:摘要

url-agent:判断什么设备,重定向

location:重定向

### http常用状态码

    101:双向通信

    200:成功态 204:没有响应体 206:断点续传

    301:永久重定向 302:临时重定向 304:缓存

    400:请求报文存在语法错误
    401:没有权限 unauthorized 表示发送的请求需要有http认证的认证信息 
    403:登录了没有权限,请求的访问被服务器拒绝 
    404:找不到资源
    405:请求方式不存在,不支持
    408:请求超时
    409:请求的的资源起冲突
    
    500:服务器在在执行请求时发生错误
    501:负载均衡,请求超出服务器能力范围,例如服务器不支持某个功能或某种方法
    503:服务器处于超负载或维护状态,无法处理请求
    505:服务器不支持请求的http版本

http请求方式

简单请求:

get:获取资源

post:新增资源

复杂请求:

put:上传文件

delete:删除资源

options:试探性请求,一般在跨域时出现,或复杂请求时

代理

正向代理:正向代理是位于客户端和服务器之间的代理服务器(中间服务器),为了得到原始服务器的信息,客户端指定目标服务器,代理服务器发送请求,并把得到的结果返回,真正的客户端对于服务器不可见,客户端需要设置ip和域名,适用于访问防火墙内,即翻墙

反向代理:客户端不需要任何设置,可以把代理服务器当做真正的服务器发送请求,代理服务器根据请求,判断走向何处,并转交给客户端,真正的服务端对于客户端不可见

https&http

http:超文本传输协议。位于应用层,基于TCP协议

特点:

无状态,不存储,没有记忆,客户端可以在短时间内重复请求一个网页多次,还是会响应

无连接:每次响应都要三次握手四次挥手

简单、灵活

通信使用明文,不确定双方身份,无法保证数据完整性

https:基于http,通过ssl和tls加密处理,验证对方身份,保证数据完整性

从输入一个网址到看到一个网页经历了什么

1、DNS域名解析,得到IP地址

2、建立连接,三次握手

3、浏览器向服务器发送http请求

4、浏览器收到请求后,做出http响应

5、浏览器收到响应后,进行解析与渲染,显示页面

6、断开连接,四次挥手