HTTP常见面试问题
HTTP基本概念
HTTP是什么
HTTP全称为超文本传输协议(HyperText Transfer Protocol)。
超文本
如HTTP名字中所说的,其传输的是超文本,超文本从字面上理解是超过了普通的文本文字,也就是还包括文字以外的内容,如图片、视频、超链接等,超文本 就是这些内容的混合体。
HTML(Hyper Text Markup Language)就是最常见的超文本了,它本身只是纯文字的文件,但是内部用很多标签定义了图片、视频的链接,经过浏览器解释之后,呈现给我们的就是一个有文字、有图片和视频的网页了。
传输
所谓“传输”,就是将东西从一个地方搬到另一个地方。
HTTP协议是一个双向协议。
我们上网的时候,浏览器是请求方A,访问的网站就是应答方B,双方约定使用HTTP协议来通信,于是浏览器把请求数据发送给网站,网站再把一些数据返回给浏览器,最后由浏览器渲染出来显示在屏幕上。
TCP/IP四层模型
TCP/IP网络模型适用于不同设备上进程间的通信,共分为四层分,从上到下分别是应用层、传输层、网络层、网络接口层
应用层(Application Layer)
应用层是最上层的,我们能直接接触到的层,我们日常所使用的软件都是在应用层上实现的。
应用层不关心数据是如何传输的,就和我们寄快递的时候只需要把包裹交给快递员,我们不关心包裹是如何运输的。
协议
应用层的协议包括HTTP、FTP、Telnet、DNS、SMTP等。
传输层(Transport Layer)
传输层是为应用层提供网络支持的,在传输层有两个传输协议,分别是TCP和UDP。
TCP(Transmission Control Protocol)
TCP的全称是传输控制协议,大部分应用传输层协议使用的都是TCP,TCP为了保证数据能够可靠的传输到目的地,有流量控制、超时重传、拥塞控制等特性。
UDP(User Datagram Protocol)
UDP全称是用户报文协议,UDP相对TCP来说就很简单,只负责发送数据包,至于数据包能否正常抵达目的地,UDP不能保证;但是换一个角度来说,UDP少干了这么多,那他的实时性相对TCP来说更好,传输效率也更高。
通常来说一台设备上会运行多个应用进程,为了区分数据要发送的具体进程,传输层中需要指定端口号来区分不同的进程和应用。
魔改NexT主题
- hexo版本:6.2.0
- NexT版本:8.12.2
- NodeJS版本:16.16
背景修改canvas-nest
step1
在next主题文件夹根目录下的layout/_layout.njk
中加入如下代码到footer标签后面即可:
1 | {% if theme.canvas_nest.enable %} |
I217-V在openwrt下大流量断网问题
背景
最近跟着up司波图在玩一个AIO(All In One)服务器,也就是将软路由,NAS系统以及影音系统都集成到一个物理系统中,我用的是之前买的一个M73的小主机,里面的mini-PCIE插槽扩展了一个螃蟹RTL8111的千兆网卡,主机自带的是Intel的I217-V千兆网卡。
经过一天的使用下来发现每次大流量下载或上传时,openwrt都会断一下,开始还以为是openwrt系统的问题,后来经过一番资料搜索,发现是pve下面的这张Intel网卡有问题,查看了pve系统的日志,发现了如下:
1 | pve kernel: e1000e 0000:00:19.0 eno1: Detected Hardware Unit Hang: |
这和搜索到的情况一样,于是就确定是这张Intel网卡的问题。
原因
造成该问题的原因是Intel网卡固件的bug
解决方法
在pve虚拟机下关掉网卡的offload功能
1 | ethtool -K <网卡编号> tx off rx off >/tmp/e1000e.log |
为了方便,不需要每次重启虚拟机之后都手动来关掉,这里设置了一个自启动脚本,原理是pve虚拟机每次启动的呃时候都会扫描/etc/profile.d
下面的.sh
文件,所以办法很简单,在改文件夹下面新建一个e1000e.sh的文件
1 | vim /etc/profile.d/e1000e.sh |
然后填入上面的命令即可
参考链接:
Nginx配置反向代理
最近尝试了一下Nginx,感觉配置比Apache还要麻烦,折腾了一天,经过自己的不断尝试,总算试出了自己想要的结果。
MySQL8安装与配置
Ubuntu安装MySQL8
1 | apt install mysql-server |
Debian 安装MySQL8
因为Debian的源中没有MySQL,所以我们需要手动添加
先去MySQL官网
选择版本和系统之后,会出来下面这张图片,点击这张图片,进入到第二步
下载DEB package
进入第二个页面后,点击下载按钮,之后会跳转到另外一个页面
不需要登录,右键点击最下面的直接下载的链接,复制链接
然后到Debian中用wget下载:
1 | wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb |
- 安装
1 | dpkg --install mysql-apt-xxx.deb |
然后apt update
一下,apt install mysql-server
就可以找到MySQL的包了。
修改配置
登录MySQL
1 | sudo mysql |
可以直接登录,只要输入账户密码,登录之后再改密码
1 | show databases; |
更新域属性,’%’表示任何方式访问
1 | update user set host='%' where user ='root'; |
执行以上语句之后再执行
1 | FLUSH PRIVILEGES; |
再执行授权语句
1 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION; |
Debian系统到这里一般就可以远程连接了,Ubuntu可能还需要修改配置文件,注释掉绑定地址。
!!! 若还是有问题,则将/etc/mysql/mysql.conf.d/mysqld.cnf
文件中的bind-address
注释掉。
LeetCode第一天
LeetCode第350题
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
方法一:
用哈希表映射,先把较短的那个数组遍历,存入哈希表中,键是数组中元素的值,值是数组中元素出现的次数
再遍历另外一个数组,从哈希表中找这个数组中的值,看是否存在,存在就将其存入新造的数组中,再将哈希表中该键对应的值减一,如果值减到了0,就将这个键移除去,否则将这个键对应的值减一,在存入哈希表中。