目录
- 1. 总结openssh服务安全加固和总结openssh免密认证原理,及免认证实现过程。
- 2. 总结sudo配置文件格式,总结相关示例。
- 3. 搭建时间同步服务器,详细总结配置和搭建过程
- 4. 总结常见的日志服务管理的常见日志服务
- 5. 总结日志分类, 优先级别。图文并茂解释应用如何将日志发到rsyslog,并写到目标。
- 6. 完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。
- 7. 完成功能,将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/all-ssh.log文件
- 8. 总结/var/log/目录下常用日志文件作用。
- 9. 总结journalctl命令的选项及示例
- 10. 完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中
- 11. 尝试使用logrotate服务切割nginx日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩。
- 13. 总结http协议相关面试题
1. 总结openssh服务安全加固和总结openssh免密认证原理,及免认证实现过程。
1.1 openssh服务安全加固
- SSH服务默认使用TCP的22端口
- openssh基于 C/S结构,ssh v2 ,有三个基础包:
- openssh
- openssh-server
- openssh-client
- ssh 命令
- 用户远程连接服务器时,会复制ssh服务器的公钥(/etc/ssh/ssh_host*key.pub文件)到客户机的~/.ssh/know_hosts中。下次连接时自动匹配对应的私钥。
- 常用选项:-p 指定远程端口; -b IP 指定本机使用的IP; -v 追踪此次连接的过程;-C 开启压缩;-F configfile 指定客户端配置文件; -i 指定私钥文件路径 ,实现基于key验证
- ssh -b 10.0.0.11 root@10.0.0.100 #指定本机IP地址11去连接100
- ssh -t 10.0.0.100 ssh -t 10.0.0.200 #先连接到100,再从100连接200
- ssh 10.0.0.10 "hostname" #在远程主机执行完命令后就断开
- ssh 10.0.0.10 /bin/bash < test.sh #在远程主机运行本地脚本
- ssh -o StrictHostKeyChecking=no 10.0.0.10 #首次连接不询问指纹,自动下载公钥
- 修改客户端配置实现首次连接自动下载公钥,不询问
- vim /etc/ssh/ssh_config
- StrictHostKeyChecking no
- scp命令
- scp 命令利用ssh协议在两台主机之间复制文件
- 常用选项: -C 压缩数据流; -r 递归复制; -p 保持原文件的属性信息; -q 静默模式;-P PORT 指定远程服务器端口
scp /root/test.sh mage@10.0.0.210: #复制当前主机的文件到远程主机家目录
scp root@10.0.0.157:/home/jose/test.sh /tmp #复制远程主机文件到本地
scp jose@10.0.0.157:test.sh root@10.0.0.154: #源和目标都不是本机
scp -r /var/log/ root@10.0.0.161:/tmp/ #复制本机目录到远程
scp -r dir dest/ #复制整个目录
scp -r dir/ dest/ #复制整个目录
scp -r dir/* dest/ #复制目录下所有文件
- rsync命令
- rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包
- 注意:通信两端主机都需要安装 rsync 软件
- 常用选项: -v 显示详细过程; -r 递归复制;-a 保留所有属性,不包括acl和selinux;--delelte 同步删除; -- bwlimit= 128 限制128KB
rsync -av /root/0525 root@10.0.0.161:/tmp/ #-a 保存所有属性 -v显示详细过程
rsync --delete /root/0525 root@10.0.0.161:/tmp #同步删除目标主机数据,与源数据保持一致
rsync -av /root/0525/ root@10.0.0.161:/tmp/ #只复制0525目录下的文件,不复制目录
1.2 openssh免密认证原理
- 基于公钥认证机制。客户端生成一对密钥(公钥和私钥),把公钥文件传输至远程服务器对应用户的家目录,认证时,客户端使用私钥加密信息,服务器使用对应的公钥解密,验证客户端身份。
1.3 免认证实现过程
- 在客户端生成密钥对:
ssh-keygen
- 把公钥文件传输至远程服务器对应用户的家目录
ssh-copy-id root@10.0.0.161
- 多机共用密钥对,先生成密钥对,复制到本机,再复制本机.ssh目录到其它主机
ssh-keygen
ssh-copy-id 127.1
rsync -a .ssh 10.0.0.xxx:/root/
2. 总结sudo配置文件格式,总结相关示例。
- 主配置文件: /etc/sudo.conf
- 授权规则配置文件: /etc/sudoers; /etc/sudoers.d/*
- 配置格式
#user用户可以在host主机上以 runas 的身份执行 command, TAG可以为空
user host=(runas) [TAG:]command
#可使用通配符
? #任意单个字符
* #任意长度字符
[abc] #匹配abc中的一个字符
[!abc] #匹配任意一个除abc之外的字符
\x #转义
[[alpha]] #字母
#user 和 runnas
userName #用户名
#uid #用户ID,#开头
%groupName #组名,%开头
%#gid #组ID, %#开头
User_Alias #user别名
Runas_Alias #runas别名
#host
ip #ip地址
hostname #主机名
network/netmask #网段/子网掩码
Host_Alias #别名
#command
cmmand #具体命令
directory/* #某个目录下所有命令
sudoedit #sudoedit命令,有此命令就可以编辑sudo规则
Cmnd_Alias #命令别名
- 配置范例:指定host, 别名写法
#指定IP或网段的写法,要求在对应主机上也有该配置
jose 10.0.0.158=(root) /bin/ls /root/
#指定执行用户
jose 10.0.0.158=(tom) /bin/ls /home/tom/
#id配置写法, (用户1011、1012,组ID1013,用户u2,以root身份执行
#1011,#1012,%#1013,u2 ALL=(#0) /bin/cat /etc/shadow
#别名写法
User_Alias ANLMAL=tom,jerry,%jose,#1013,%#1014
Runas_Alias ROOT=root
Host_Alias LOCAL=rocky86,10.0.0.158
Cmnd_Alias CMD=/sbin/init *,/usr/bin/yum update
Cmnd_Alias SHUTDOWN=/sbin/shutdown -h now
ANLMAL LOCAL=(ROOT) CMD,SHUTDOWN
配置不需要密码验证
#不要密码,排除useradd
jose ALL=(root) NOPASSWD: /usr/sbin/,!/usr/sbin/useradd
修改生命期时长
#查看时间相关的配置
sudo -V |grep time
#修改配置文件,添加下行
[root@ubuntu ~]# vim /etc/sudoers
Defaults timestamp_timeout=2 #密码有效期改成2分钟
#重置生命周期
#查看生命周期文件
ls -lh /run/sudo/ts/
#删除文件,可以重置生命周期
#使用 -k 选项,一样也可以重置认证生命周期
sudo -k
3. 搭建时间同步服务器,详细总结配置和搭建过程
- IP地址规则
主机 | 角色 | 系统版本 | 备注 |
---|---|---|---|
10.0.0.159 | NTP Server | Ubuntu22.04 | 配置成为服务端,为内网提供NTP时间同步服务 |
10.0.0.160 | NTP client | Ubuntu22.04 | 将本机的server 指向159,从159上同步时间 |
10.0.0.163 | NTP client | Rocky 8.9 | 将本机的server 指向159,从159上同步时间 |
- 搭建时间同步服务器
- 服务端配置
vim /etc/chrony/chrony.conf
allow 10.0.0.0/24 #允许10.0.0 网段的主机将本机作为时间同步服务器
local stratum 10 #允许本机在不能与外网同步的情况下,还能提供服务
#重启服务
systemctl restart chrony.service
#关闭防火墙
systemctl stop firewalld.service
#可以增加一台服务器,使用keepalived 配置成高可用。VIP设置为10.0.0.10
- 客户端配置(rocky和ubuntu相同)
vim /etc/chrony.conf #编辑客户端配置文件
server 10.0.0.159 iburst #iburst 选项允许在初始同步时发送多个数据包以加快同步过程
systemctl restart chronyd.service #重启服务
chronyc -n sources #查看同步源信息
4. 总结常见的日志服务管理的常见日志服务
4.1. sysklogd 系统日志服务
- 在 CentOS5 以及之前的发行版中,其采用的 sysklogd 服务来记录和管理系统日志的。
- sysklogd 服务有两个模块:
- klogd: 用于记录 linux kernel 相关的日志
- syslogd:用于记录用户空间应用日志
4.2. rsyslog 系统日志服务
- rsyslog 是 CentOS6 以后的版本中使用的日志管理程序,是一个默认安装的服务,并且默认开机启动。
- rsyslog 特性:
- 支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB ElasticSearch,实现使用第三方服务对日志进行存储和分析;
- 精细的输出格式控制以及对日志内容的强大过滤能力,可实现过滤记录日志信息中的指定部份;
- 通过 RELP + TCP 实现数据的可靠传输
- 支持数据的加密和压缩传输等
- 多线程
4.3. ELK 日志服务
- ELK 是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana
- ELK 主要用于部署在企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户
4.4. rsyslog 日志服务与 ELK 日志服务的区别
- rsyslog 主要用于单机日志管理,ELK 主要用于分布式集群环境中的日志管理
5. 总结日志分类, 优先级别。图文并茂解释应用如何将日志发到rsyslog,并写到目标。
5.1 日志分类
#syslog 内置分类
LOG_AUTH #auth 安全和认证相关的日志
LOG_AUTHPRIV #authpriv 安全和认证相关的日志,私有
LOG_CRON #cron 系统定时任务 crontab 与 at 产生的相关日志
LOG_DAEMON #daemon 各守护进程产生的日志
LOG_FTP #ftp ftp守护进程产生的日志
LOG_KERN #kern 内核产生的日志
LOG_LOCAL0 -- LOG_LOCAL7 #local0-local7 自定义分类
LOG_LPR #lpr 打印服务日志
LOG_MAIL #mail 邮件服务日志
LOG_NEWS #news 网络新闻服务产生的日志
LOG_SYSLOG #syslog syslogd 服务自己的日志
LOG_USER #user 用户等级
LOG_UUCP #uucp uucp子系统的日志信息
* #通配符,代表所有分类
5.2 日志优先级别
#syslog 内置优先级分类,从高到低,如果在记录日志时,设置了优先级,则只会记录设定的优先级和高于
设定优先级的日志
LOG_EMERG #emerg/panic 紧急,致命错误
LOG_ALERT #alert 告警,当前状态必须立即进行纠正
LOG_CRIT #crit 关键状态的警告,例如 硬件故障
LOG_ERR #err/error 其它错误
LOG_WARNING #warning/warn 警告级别的信息
LOG_NOTICE #notice 通知级别的信息
LOG_INFO #info 通告级别的信息
LOG_DEBUG #debug 调试程序时的信息
* #所有级别的日志
none #不需要任何日志
#panic,error,warn在新版中被弃,不建议使用
5.3 解释应用将日志发到rsyslog
-
范例:配置haproxy将日志发送到 /var/log/haproxy.log
-
配置HAProxy的日志
-
vim /etc/haproxy/haproxy.conf
-
global: log 127.0.0.1 local3 info
-
listen ststs: log global
-
-
vim /etc/rsyslog.conf
-
配置rsyslog
-
开启本地日志:启用UDP和TCP模块接收日志
-
-
指定自定义日志local3.info ,写入到 /var/log/haproxy.log
-
重启服务:systemctl restart haproxy.service rsyslog
-
查看自定义的HAProxy日志:tail -f /var/log/haproxy.log
-
windows 用浏览器访问状态页
-
6. 完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。
-
sshd 服务日志默认是归属于 AUTH 分类,默认级别是 INFO
-
修改 sshd 服务日志的配置项,分类改到 LOCAL6,级别不变
-
vim /etc/ssh/sshd_config
-
-
新增rsyslog的子配置文件 ,local6 分类的日志写到 sshd.log 中
-
vim /etc/rsyslog.d/sshd.conf
-
-
systemctl restart rsyslog sshd #重启服务生效
-
测试: ssh 127.0.0.1
-
7. 完成功能,将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/all-ssh.log文件
1、配置logServer(159):启用相关模块,UDP和TCP模块,参考5.3截图
配置日志写入的路径,vim /etc/rsyslog.d/sshd.conf 内容修改如下
local6.* /var/log/all-ssh.log
2、配置client 主机日志远程转发,参考6,
3、将vim /etc/rsyslog.d/sshd.conf,内容改为
local6.* @10.0.0.159:514
4、在client2和client3上重复client 上的操作(2、3步骤)
5、重启3台client和1台logServer的服务
systemctl restart rsyslog ssh
6、测试:分别在3台client上输入: ssh 10.0.0.159
8. 总结/var/log/目录下常用日志文件作用。
- rocky 中常见日志
#系统启动与运行日志
/var/log/messages: 记录系统启动过程、内核信息、设备驱动信息等,用于诊断系统问题和安全事件
#用户登录与认证日志
/var/log/secure:记录登录系统存取数据的文件,如pop3, ssh, telnet, ftp等登录信息
/var/log/auth.log:记录系统的认证和授权相关信息,包括用户登录、sudo命令使用等,对安全审计和入侵检测非常重要
#邮件与网络服务日志
/var/log/maillog: 记录邮件服务器的日志信息,如sendmail日志
/var/log/cron: 记录crontab服务的内容
/var/log/spooler: uucp,新闻相关日志
/var/log/boot.log: 操作系统启动流程日志
- ubuntu 中常见日志,除了和rocky相同的日志目录外
/var/log/syslog : 除了auth, authpriv 之外的日志
/var/log/kern.log :内核产生的日志
/var/log/ufw.log : ufw 服务日志
/var/log/btmp :当前系统上,用户的失败尝试登录相关的日志 ( bad logins ),二进制格式
/var/log/lastlog : 每一个用户最近一次的登录信息,二进制格式
/var/log/wtmp :当前系统上,用户正常登录系统的相关日志信息 ( who was
logged in ),二进制格式
9. 总结journalctl命令的选项及示例
- 选项及示例
#显示所有日志
journalctl
#查看日志文件元数据
journalctl --header
#查询日志占用了多少磁盘空间
journalctl --disk-usage
#查看日志分类
journalctl --list-catalog
#详细显示分类信息
journalctl --dump-catalog 8d45620c1a4348dbb17410da57c60c66
#日志跟随,显示最新日志
journalctl -f
#倒序显示
journalctl -r
#查看昨天到当前的日志
journalctl -S yesterday
#查看今天9点到1小时之前的日志
journalctl --since 09:00 --until "1 hour ago"
#查看启动信息
journalctl --list-boots
#查看本次启动日志
journalctl -b 0
#查看上次启动日志
journalctl -b -1
#查看内核日志
journalctl -k
#根据服务或程序查看
journalctl -u ssh.service
#根据PID查看
journalctl _PID=1
#根据UID查看
journalctl _UID=0
#根据等级查看
journalctl -p warning
#根据分类查看
journalctl --facility=auth
#指定显示格式
journalctl -o json-pretty -n 1
#显示特定字段
journalctl -o json-pretty -n 1 --output-fields=_UID
10. 完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中
- IP地址规划:
主机IP | 操作系统 | 角色 |
---|---|---|
10.0.0.163 | rocky | mysql-server |
10.0.0.159 | ubuntu | log-server |
10.0.0.160 | ubuntu | client1 |
10.0.0.164 | rocky | client2 |
- 前提:已经配置好 client1 client2通过网络将日志转发给log-server(参考7-sshd日志转发配置)
- 在client1和2上新建 /etc/rsyslog.d/net.conf,内容如下
-
*.info @10.0.0.159:514
- 安装 rsyslog 的mysql 插件包,初始化mysql-server(数据库、表、用户授权)
1、在 log-server上安装 rsyslog 的mysql 包
apt install rsyslog-mysql
#查看包文件
dpkg -L rsyslog-mysql
2、复制数据表文件到mysql-server服务器上
scp /usr/share/dbconfig-common/data/rsyslog-mysql/install/mysql 10.0.0.163:/root/rsyslog.sql
3、在 mysql-server 服务器上创建数据库
create database rsyslog;
use rsyslog;
4、导入SQL文件建表
source /root/rsyslog.sql
#查看表,两张表都是空的
show tables;
5、创建用户并授权
create user 'rsyslog'@'10.0.0.%' identified by '123456';
grant all on rsyslog.* to 'rsyslog'@'10.0.0.%';
flush privileges;
6、重启mysql 服务
systemctl restart mysql.servic
- 配置 mysql 转发
#在 log-server 服务器上配置 mysql 转发,复制模板到rsyslog配置文件目录下
cp /usr/share/rsyslog-mysql/rsyslog-mysql.conf.template
/etc/rsyslog.d/mysql.conf
#修改配置
module (load="ommysql")
*.* action(type="ommysql" server="10.0.0.163" db="rsyslog" uid="rsyslog" pwd="123456")
#重启日志服务
systemctl restart rsyslog.service
- 查看数据库验证
#测试:
[root@client1: ~]# logger "this msg from client-1"
[root@client2 ~]# logger "this msg from client-2"
#查看写入数据库的日志内容,如下图
mysql> select FromHost,Message from SystemEvents order by id desc limit 3;
11. 尝试使用logrotate服务切割nginx日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩。
- 新建 logrotate 配置文件,以实现nginx日志的转储
vim /etc/logrotate.d/nginx
/var/log/nginx/*log {
create 0664 nginx root
daily #每天切割一次
dateext #旧日志以时间为后缀进行命名
rotate 90 #保留最近90个文件,即90天的
missingok
notifempty
compress #压缩
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
- 将logrotate.conf 添加到 cron作业中
crontab -e
#添加以下行,表示每天0点0分执行logrotate命令,指定配置文件
0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf
crontab -l
13. 总结http协议相关面试题
1、http协议请求方式 :
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT
作用:
GET: 通常用于请求服务器发送某些资源
POST: 发送数据给服务器
PUT: 用于新增资源或者使用请求中的有效负载替换目标资源的表现形式
PATCH: 用于对资源进行部分修改
DELETE: 用于删除指定的资源
HEAD: 请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源
OPTIONS: 用于获取目的资源所支持的通信选项
CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
TRACE: 回显服务器收到的请求,主要用于测试或诊断
2、GET和POST有什么区别?
数据传输方式不同:GET请求通过URL传输数据,而POST的数据通过请求体传输。
安全性不同:POST的数据因为在请求主体内,所以有一定的安全性保证,而GET的数据在URL中,通过历史记录,缓存很容易查到数据信息。
数据类型不同:GET只允许 ASCII 字符,而POST无限制
GET无害: 刷新、后退等浏览器操作GET请求是无害的,POST可能重复提交表单
特性不同:GET是安全(这里的安全是指只读特性,就是使用这个方法不会引起服务器状态变化)且幂等(幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同),而POST是非安全非幂等
3、什么是无状态协议,HTTP 是无状态协议吗,怎么解决
无状态协议(Stateless Protocol) 就是指浏览器对于事务的处理没有记忆能力。
举个例子来说就是比如客户请求获得网页之后关闭浏览器,然后再次启动浏览器,
登录该网站,但是服务器并不知道客户关闭了一次浏览器。
HTTP 就是一种无状态的协议,他对用户的操作没有记忆能力。可能大多数用户不相信,
他可能觉得每次输入用户名和密码登陆一个网站后,下次登陆就不再重新输入用户名和密码了。
这其实不是 HTTP 做的事情,起作用的是一个叫做 小甜饼(Cookie) 的机制。
它能够让浏览器具有记忆能力。
解决办法是通过1、Cookie 2、通过Session会话保存。
4、UDP 和 TCP 的区别
UDP 是什么?
UDP 的全称是 User Datagram Protocol,用户数据报协议。它不需要所谓的握手操作,
从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。
数据报是与分组交换网络关联的传输单元。
UDP 的特点主要有:
UDP 能够支持容忍数据包丢失的带宽密集型应用程序
UDP 具有低延迟的特点
UDP 能够发送大量的数据包
UDP 能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议。
TCP 是什么?
TCP 的全称是Transmission Control Protocol ,传输控制协议。
它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。
通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。
一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。
TCP 的主要特点有:
TCP 能够确保连接的建立和数据包的发送
TCP 支持错误重传机制
TCP 支持拥塞控制,能够在网络拥堵的情况下延迟发送
TCP 能够提供错误校验和,甄别有害的数据包。
TCP 和 UDP 的区别(重点来了)
TCP 是面向连接的协议 。 UDP 是无连接的协议
TCP 在发送数据前先需要建立连接,然后再发送数据 。 UDP 无需建立连接就可以直接发送大量数据
TCP 会按照特定顺序重新排列数据包 。 UDP 数据包没有固定顺序,所有数据包都相互独立
TCP 传输的速度比较慢 。 UDP 的传输会更快
TCP 的头部字节有 20 字节 。 UDP 的头部字节只需要 8 个字节
TCP 是重量级的,在发送任何用户数据之前,TCP需要三次握手建立连接。 UDP 是轻量级的。没有跟踪连接,消息排序等。
TCP 会进行错误校验,并能够进行错误恢复 。 UDP 也会错误检查,但会丢弃错误的数据包。
TCP 有发送确认。 UDP 没有发送确认
TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK。 UDP无握手协议
TCP 是可靠的,因为它可以确保将数据传送到路由器。 UDP 中不能保证将数据传送到目标。
5、说一下Http协议中302状态?
HTTP协议中的302状态码表示临时重定向,也称为临时跳转。
这种情况下,服务器返回的头部信息中会包含一个Location字段,内容是重定向到的url。
302状态码的应用场景丰富,如网站重定向、负载均衡、表单提交后的页面转向、网站地域入口选择等
补充:301状态码表示永久重定向,用于网站迁移、改变域名等。意味着原网页已经不存在。
6、Http协议有什么组成?
请求报文包含三部分:
1 请求行:包含请求方法、URI、HTTP版本信息;
2 请求首部字段;
3 请求内容实体。
7、cookies机制和session机制的区别是什么?
(1)cookies数据保存在客户端,session数据保存在服务端;
(2)cookies可以减轻服务器压力,但是不安全,容易进行cookies欺骗;
(3)session安全一点,但是占用服务器资源。
8、HTTP协议有什么特点?
(1)http无连接:限制每次连接只处理一个请求,服务端完成客户端的请求后,即断开连接。
(传输速度快,减少不必要的连接,但也意味着每一次访问都要建立一次连接,效率降低);
(2)http无状态:对于事务处理没有记忆能力。每一次请求都是独立的,不记录客户端任何行为;
(3)客户端/服务端模型:客户端支持web浏览器或其他任何客户端;
(4)简单快速;
(5)灵活:可以传输任何类型的数据。
9、http和https有什么区别?
(1)https有ca证书,http一般没有;
(2)http是超文本传输协议,信息是明文传输。https则是具有安全性的ssl加密传输协议;
(3)http默认80端口,https默认443端口。
10、为什么有了HTTP为什么还要HTTPS?
https是安全版的http,因为http协议的数据都是明文进行传输的,所以对于一些敏感信息
的传输就很不安全,HTTPS就是为了解决HTTP的不安全而生的。
11、HTTP的keep-alive是干什么的?
在早期的HTTP/1.0中,每次http请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,
为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.0中以及HTTP/1.1中,
引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响
应完成后不要关闭,下一次咱们还用这个请求继续交流。协议规定HTTP/1.0如果想要保持长连
接,需要在请求头中加上Connection: keep-alive。
keep-alive的优点:
较少的CPU和内存的使用(由于同时打开的连接的减少了)
允许请求和应答的HTTP管线化
降低拥塞控制 (TCP连接减少了)
减少了后续请求的延迟(无需再进行握手)
报告错误无需关闭TCP连接
12、http的请求报文是什么样的?
1. 请求行
GET /index.html HTTP/1.1 #请求行包括: 请求方法、URL字段、HTTP协议/版本
2. 请求头部: K:V 键值对
User-Agent:Mozilla/...Chrome/...Safari/... #产生请求的浏览器类型
Accept:text/html,... #客户端可识别的内容类型列表
Host:www.baidu.com #请求的主机名,允许多域名同一个IP地址,即虚拟主机
3. 空行
4. 请求体:post put 等请求携带的数据
13、http的响应报文是什么样的?
1. 响应行:协议版本,状态码,状态码的原因短语,例如:HTTP/1.1 200 OK
2. 响应头:响应部首组成
3. 空行
4. 响应体:服务器响应的数据
14、聊一聊HTTP的部首有哪些?
#通用首部字段(General Header Fields):请求报文和响应报文两方都会使用的首部
Cache-Control 控制缓存
Connection 连接管理、逐条首部
#请求首部字段(Reauest Header Fields):客户端向服务器发送请求的报文时使用的首部
User-Agent 客户端程序信息
Host 请求资源所在服务器
If-Match 比较实体标记(ETage)
If-None-Match 比较实体标记(ETage)与 If-Match相反
If-Modified-Since 比较资源更新时间(Last-Modified)
If-Unmodified-Since比较资源更新时间(Last-Modified),与 If-Modified-Since相反
#响应首部字段(Response Header Fields):从服务器向客户端响应时使用的字段
Server 服务器的信息
Location 令客户端重定向的URI
#实体首部字段(Entiy Header Fields):针对请求报文和响应报文的实体部分使用首部
Last-Modified 资源最后的修改资源
Expires 实体主体的过期资源
Allow 资源可支持http请求的方法
15、聊一聊HTTP的状态码有哪些?
2XX 成功
200 OK,表示从客户端发来的请求在服务器端被正确处理
201 Created 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立
202 Accepted 请求已接受,但是还没执行,不保证完成请求
204 No content,表示请求成功,但响应报文不含实体的主体部分
206 Partial Content,进行范围请求
3XX 重定向
301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
302 found,临时性重定向,表示资源临时被分配了新的 URL
303 see other,表示资源存在着另一个 URL,应使用 GET 方法定向获取资源
304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
307 temporary redirect,临时重定向,和302含义相同
4XX 客户端错误
400 bad request,请求报文存在语法错误
401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
403 forbidden,表示对请求资源的访问被服务器拒绝
404 not found,表示在服务器上没有找到请求的资源
408 Request timeout, 客户端请求超时
409 Confict, 请求的资源可能引起冲突
5XX 服务器错误
500 internal sever error,表示服务器端在执行请求时发生了错误
501 Not Implemented 请求超出服务器能力范围,例如服务器不支持当前请求所需要的某个功能,或者请求是服务器不支持的某个方法
503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
505 http version not supported 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本
16、TCP 三次握手和四次挥手
三次握手:
第一次握手:客户端向服务端发送带有SYN标志的数据包,请求建立连接,并进入SYN_SENT状态。
第二次握手:服务端收到请求后,发送带有SYN和ACK标志的数据包作为响应,并进入SYN_RCVD状态。
第三次握手:客户端收到服务端的响应后,发送ACK数据包进行确认,双方进入ESTABLISHED状态,连接建立成功。
四次挥手:
第一次挥手:客户端发送终止报文,请求释放连接。
第二次挥手:服务端收到请求后,发送确认报文,并等待数据发送完毕后关闭连接。
第三次挥手:服务端发送终止报文,请求释放连接。
第四次挥手:客户端收到请求后,发送确认报文,并等待一段时间后关闭连接。