http协议详解(面试必问)

万维网

讲解http之前,先谈一下万维网,就是我们常说的www
万维网是因特网提供的服务之一(因特网提供的其他服务:电子邮件、远程登录、文件传输服务等)
万维网是一个资源空间,放着一系列的资源,是无数个网络站点和网页的集合
这些资源都有url来标识,我们通常说的url的中文名称:统一资源定位符
那么我们怎么来访问这些资源呢?
通过超文本传输协议来访问,也就是http协议
我们只需要点击这些url链接就可以访问到这些资源!

万维网的内核组成

万维网的内核部分由三个标准组成:url、http、html

url

统一资源定位符URL,负责标识万维网上的各种文档
url是对因特网上的资源的位置和访问方法的一种简洁表示
url一般形式:<协议>://<主机>:<端口号>/<路径>
协议:http、ftp
主机:存放资源的主机在因特网中的域名,也可以是ip地址
端口号和路径可以省略

http

超文本传输协议http是一个应用层协议,使用tcp连接进行可靠的传输
如果客户端要使用万维网这个资源,他和服务器之间就必须要严格遵守这个协议

html

超文本标记语言html,是一种文档结构的标记语言,使用一些约定的标记对页面上的文字格式、图片格式、声音格式、视频格式等进行描述

万维网的运行方式

万维网是以客户端/服务器端的方式运行的
浏览器:用户计算机上的万维网客户程序
万维网文档所驻留的计算机(万维网服务器):运行服务器程序
具体的工作流程:
1.web用户使用浏览器也就是指定url与web服务器建立连接,并发送浏览请求
2.web服务器把url转换成文件路径,并返回信息给web用户
3.通信完成,关闭连接

超文本传输协议HTTP

概述

HTTP协议定义了web用户如何向web服务器请求资源,以及web服务器如何把资源传给web客户
它规定了浏览器和服务器之间响应、请求的格式和规则

面试常见问题:点击一个网页地址后发生了哪些事情?

用户点击了鼠标之后(按回车)所发生的的事件:(以清华大学为例)
1.浏览器分析链接指向页面的URL(http://www.tsinghua.edu.cn/chn/index.htm)
2.浏览器向DNS请求解析www.tsinghua.edu.cn的IP地址
具体解析过程:
这一过程为网址到IP地址的转换,DNS查找对应IP的过程如下:
客户机向其本地域名服务器发送DNS请求报文(注意是UDP报文)
本地域名服务器收到请求后,首先到浏览器缓存中去找
若没找到,则浏览器会做一个系统调用,到系统缓存中去找
接着是路由器缓存
以上三步都属于客户端DNS缓存,若都找不到,则进入ISP的DNS缓存服务器中查找
若以上均未完成,则向根域名服务器发出解析请求,根域名服务器存储着所有顶级域名服务器的IP地址(顶级域名:.com .net .cn .org等等这些),根域名服务器并不会直接返回要解析的域名IP地址,而是告诉本地域名服务器下一步应该找哪一个顶级域名服务器查询,也就是返回权限域名服务器的地址
顶级域名服务器存储着所有在其下注册的二级域名,当收到DNS请求时,如果是最后结果就给出最终的IP地址,如果不是,则返回下一个要查找的授权域名服务器的IP地址去查找
授权域名服务器收到请求后,将查询结果返回给本地域名服务器
本地域名服务器将查询结果保存到本地缓存,同时返回给客户机

3.域名系统DNS解析出清华大学服务器的IP地址
4.浏览器与该服务器建立TCP连接(默认端口号80)
5.浏览器发出HTTP请求:GET/chn/index.htm
6.服务器通过HTTP响应把文件index.htm发送给浏览器
7.TCP连接释放
8.浏览器将文件index.htm进行解释,并将web页面显示给用户

HTTP协议的特点

无状态的

HTTP协议是无状态的,也就是说,当一个用户再次向服务器发送请求时,服务器是不记得曾经访问过这个用户的,因此这里就用到cookie和session啦,详情看前面的博客~
HTTP协议的无状态设计简化了服务器的设计,是服务器更容易支持大量并发的HTTP请求

无连接的

HTTP采用TCP作为传输层协议,保证了数据的可靠传输。
但是HTTP本身是无连接的,也就是说,通信双方在交换HTTP报文之前不需要先建立HTTP连接。

HTTP协议的报文格式

HTTP是通过报文交换数据,对于发送请求:请求报文 对于响应请求:响应报文
HTTP是面向文本的,报文格式中每个字段都是一些ASCII码串

请求报文

HTTP请求报文,由请求行、请求头部、空行、请求数据组成。如下图所示:
HTTP请求报文格式
请求行由请求方法字段、URL字段、协议版本三个字段组成,他们之间用空格组成
例如:GET /doc/demo.html HTTP/1.1
请求头部由头部字段名称和它的值组成,每一行结束都要有回车和换行
请求头部是用来说明浏览器、服务器或者报文主体的一些信息。可以有好几行,但可以不使用
例如:Accept:text/*
Host:www.xxx.com
整个请求头部结束之后,还会有一个空行将请求头部和后面的请求数据分开
请求数据:一般在请求报文中都不用这个字段

下面看一些字段的具体选取:
请求方法:

请求方法用法
GET获取资源,网络请求中绝大部分使用的方法
HEAD获取报文首部,与GET方法相似,但不返回请求数据部分,用于确认URL的有效性以及资源更新日期等
POST传输请求数据,向指定资源提交表单或者上传文件(post请求可能会导致新的资源创建或者已有资源的修改)
PUT上传文件,不带验证机制,任何人都能上传文件,因此存在安全性问题,不推荐使用 PUT /new.html HTTP/1.1
DELETE与PUT相反,同样不带验证机制 DELETE /new.html HTTP/1.1
路径跟踪主要用于诊断,让服务器将收到的请求放到响应主体中返回给客户端,这样客户端可以判断发出的请求是否被篡改

响应报文

HTTP响应报文由状态行、响应头部、空行和响应数据(响应体)组成
HTTP响应报文结构
状态行由协议版本、状态码和状态码描述组成 例如:HTTP/1.1 200 OK
响应头部用于描述服务器的基本信息,以及数据的描述。服务器通过这些数据的描述可以通知客户端怎么处理它传回的数据
响应数据就是响应报文的消息体,里面可装纯数据、html页面代码等

常见状态码:
状态码用来告知客户端请求的结果

状态码范围含义
1xx100~199表示成功接受请求、要求客户端继续提交下一次请求才能完成整个处理过程
2xx200~299表示成功接受请求并已经完成整个处理过程。常用200
3xx300~399表明客户端请求的资源位置已经发生变化,要完成请求需要进一步操作 例如:301在请求的URL已经被移除时使用,响应的Location头部中应该包含该资源现在所处的URL
4xx400~499表示客户端的请求有错误,服务器无法处理 例如:404服务器无法找到所请求的URL
5xx500~599服务器端出现错误,处理不了客户端发来的请求 常用500

头部

http头部字段被分为4类:通用头部、请求头部、响应头部、实体头部

通用头部:请求报文和响应报文都可以使用

头部字段明含义说明
Cache-Control指定请求和响应遵循的缓存机制取值一般为no-cache、max-age=xx(xx资源缓存有效期)
Content-Type请求数据和响应数据类型text/plain:数据以纯文本形式编码(text/json/xml/html) application/json(x-www-form-urlencoded):数据以名/值被编码
Content-Length请求体和响应体的长度单位字节
Content-Encoding请求体和响应体的编码格式gzip、deflate
Accept说明接收的类型,以名:值的格式,可以多个值用,分开例如Accept:text/plain,text/html
Accept-Encoding告诉对方自己接收的响应体或者请求体的编码格式gzip、deflate

请求头部常用字段:

头部字段明含义
Host请求的服务器的域名和端口号
User-Agent包含发出请求的客户端信息,浏览器类型等
Connection表示是否需要持久连接

面试必问:post请求和get请求的区别在哪里?

首先get请求是为了获取资源、post请求是为了传输实体数据
get请求的参数位置是放在url后面的,post提交的数据是放在http请求报文的请求体里面
get请求提交的数据大小有限制,post请求提交的数据大小没有限制
get请求的参数形式是键值对,post请求的参数形式是放在表单里,请求头部的Content-Type设置为application/x-www-form- urlencoded
对于安全性来说了,get请求的安全性低,因为参数可在url上看见,报文可以缓存在浏览器内,post请求安全性高,请求参数在http请求数据中,浏览器无缓存

HTTPS协议

HTTP有哪些问题?

HTTP使用明文进行通信,内容可能会被窃听
HTTP不验证通信双方的身份,通信双方的身份可能被伪装
HTTP无法证明报文的完整性,报文有可能被篡改

HTTPS协议

HTTPS=HTTP+加密+认证+完整性保护=HTTPS
HTTPS协议是以安全目标的HTTP通道,是HTTP的加强版
实现原理简述:
HTTP先和SSL通信,再由SSL和TCP通信,HTTPS使用了SSL/TLS建立信道,加密数据包
通过使用SSL,HTTPS具有了加密、认证、和完整性保护
默认端口号:443

SSL

SSL(secure socket layer)是位于TCP/IP层之上,HTTP层之下的一个协议,名为安全套接层。
SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器端之间的安全通讯。
该协议由两层组成:SSL记录协议、SSL握手协议
SSL记录协议:它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持
SSL握手协议:它建立在SSL记录协议上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
SSL功能的实现主要依赖于三类基本算法:散列函数Hash、对称加密和非对称加密
非对称加密实现身份验证和密钥协商
对称加密算法采用协商的密钥对数据加密
散列函数验证信息完整性

HTTPS通信过程

先说一下对称加密:
使用一个密钥加密,使用相同的密钥才能解密。传输过程中需要传输密钥,密钥容易泄露,安全性低。
非对称加密:
有一个公钥、私钥。公钥加密之后,只能私钥解密。私钥加密只能公钥解密。在传输的数据时候传输公钥+公钥加密的数据,即使被截获,由于没有私钥也无法解密,安全性高~(HTTPS中的公钥和私钥使用来对对称加密中的密钥进行加密解密的,是不是有点绕哈哈哈)

总的来说,HTTPS使用对称加密和非对称加密相结合的方式来处理数据。
发送方将对称加密的密钥用非对称加密的公钥进行加密,接受方使用私钥进行解密得到对称加密的密钥,再通过对称加密交换数据。

1.客户端发起HTTPS请求,例如在浏览器输入https://www.baidu.com

2.服务器中有公钥、私钥,收到请求后,服务器会将公钥和服务器身份认证信息通过SSL认证数字证书返回给客户端
这里的证书包括公钥和身份认证信息,这里的证书可以向权威机构申请,也可以自制

3.客户端进入数字证书认证环节:由客户端的TLS完成,首先验证公钥是否有效,如果没有问题就生成一个随机值R,把随机值R用证书公钥加密(这里的R就是数据传输的对称密钥)
4.浏览器将加密的R传送给服务器
5.服务器用自己的私钥解密得到R
6.服务器以R为密钥使用了对称加密算法加密网页内容并传送给浏览器
7.浏览器以R为密钥使用对应的对称解密算法获取网页内容

参考

https://blog.csdn.net/qq_29966203/article/details/100710696
https://www.cnblogs.com/ldq2016/p/9055933.html
https://www.freebuf.com/column/202770.html
https://juejin.im/post/5af557a3f265da0b9265a498

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值