HTTP相关问题

一. 什么是HTTP

HTTP协议工作在应用层,端口号是80。HTTP协议被用于网络中两台计算机间的通信,相比于TCP/IP这些底层协议,HTTP协议更像是高层标记型语言,浏览器根据从服务器得到的HTTP响应体中分别得到报文头,响应头和信息体(HTML正文等),之后将HTML文件解析并呈现在浏览器上。同样,我们在浏览器地址栏输入网址之后,浏览器相当于用户代理帮助我们组织好报文头,请求头和信息体(可选),之后通过网络发送到服务器,,服务器根据请求的内容准备数据。
HTTP1.0 和 HTTP1.1都是文本标记型的header,而在HTTP2.0中,会修改为二进制的header。

二. HTTP的通信过程

在HTTP1.0中,一个http请求的通信过程分为以下四步:

  • 客户端通过三次握手和服务端建立连接
  • 客户端向服务端发送一个请求
  • 服务端向客户端发送一个回应
  • 客户端接收消息,解析呈现,断开链接。

我们可以看出,在这个通信过程中,每有一个请求都要创建一个http连接,请求完成就断开,有效的通信包这个过程中占比是很小的。现代前端页面动辄一个页面几十个对象要下载,这样要建立、断开几十次连接,显然效率比较低。
于是HTTP1.1支持了持久连接,即在一个TCP连接中复用多个请求。这样可以保持连接建立而发送多个多请求,提高了TCP连接利用的效率。但是即便如此在效率上仍有值得提高的地方,就是这种连接可能是停等式ARQ模型的,也即上一个request的response回来之后,才能发送下一个request,这样对于N个请求而言,可能需要N*RTT的时间才能完成所有请求,这样效率相对也是比较低的。
HTTP1.1的长连接模型,最常提及的也就是Pipeline,即可以一口气发送N个request,然后等几个response陆续发回来。也就是所谓的滑窗ARQ模型(话说我通网好像也就记得这点东西了),理想情况下只有一个RTT的开销……当然这是理想情况。

三. HTTP的报文结构

结构很简单,就是报文头+请求头(header)+payload,每行结尾都是CRLF,即"\r\n",header和payload之间用一个空行隔开。

1. 报文头

reuest的:

METHOD URI VERSION
example:
GET /index.html HTTP1.1

response的:

VERSION STATUS_CODE INFORMATION
example:
HTTP1.1 200 OK

2. header

header都是key:value形式的键值对,表示某些选项,选项极多……丧心病狂。下面介绍一几个(我觉得)常用的。

  • Host:指定请求资源的主机和端口号。端口号默认80。

  • Connection:值为keep-alive和close。keep-alive使客户端到服务器的连接持续有效,不需要每次重连,此功能为HTTP/1.1预设功能。

  • Accept:浏览器可接收的MIME类型。假设为text/html表示接收服务器回发的数据类型为text/html,如果服务器无法返回这种类型,返回406错误。

  • Cache-control:缓存控制,Public内容可以被任何缓存所缓存,Private内容只能被缓存到私有缓存,non-cache指所有内容都不会被缓存。

  • Cookie:将存储在本地的Cookie值发送给服务器,实现无状态的HTTP协议的会话跟踪。

  • Content-Length:请求消息正文长度。

  • Content-Type:请求消息正文类型。

  • User-Agent: 客户端信息。

  • X-Forward-For: 记录从客户端到服务端的代理路径

3. payload

想要啥随便写不谢。

四. HTTP的那些方法

方法名 描述 是否幂等
GET 用于请求服务器信息
POST 用于向制定资源提交处理请求,增删改查都有可能
PUT 替换服务器的指定内容
DELETE 删除服务器的指定内容
TRACE 回显服务器收到的请求 -
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 -
CONNECT 用于建立连接 -
OPTION 查看服务器性能 -

PS:什么是幂等:多次重复同一请求,无论多少次效果都是相同的,即为幂等。

五. HTTP的状态码

这个是按首个数字分类的,1XX是信息,2XX一般是成功,3XX是重定向,4XX是客户端错误,5XX是服务端错误。
常用的状态码列一下:

  • 100: 继续。

  • 200:成功。

  • 301:内容已经移动。

  • 400:请求不能被服务器理解。

  • 403:无权访问该文件。

  • 404:不能找到请求文件。

  • 500:服务器内部错误。

  • 501:服务器不支持请求的方法。

  • 505:服务器不支持请求的版本。

六. HTTPS

就是在HTTP协议上套了一层TLS协议用于加密,现在被认为是有效的安全通信机制。
忽然发现憋不出啥来了……就先这样吧。
主要就是有CA认证,非对称加密的公钥放在公网上用于握手,然后用非对称加密传输对称加密的秘钥,通信过程用对称加密保证安全性。
对了,他用443端口。

七. HTTP的一些安全问题

其实搞前端的应该才会被经常问这些,常问的就两个,CSRF和XSS。

1. CSRF

CSRF实际上是利用了服务端对已经登录用户的信任,比如说你登录了知乎,然后知乎有个API叫/postarticle?title=xxxxxx之类的可用来发文章,然后我就在网页上插个看不到的,这样你一进去,点个鼠标,它就自动给你发了一篇文(guang)章(gao),神奇吧?当然只是举个栗子……而且好久不写html了,这个标签写法对不对我不知道,小朋友不要随便模仿。
防范方法:验证token,在自己的网页上挂个看不到的token,要post的时候带上这个token,服务端去验证它是不是对的,有没有他,就保证了受到信任的源才能用这个API。

2. XSS

XSS就是注入攻击,就是用户利用你的漏洞,你让他传文章的地方他给你插个

你可能感兴趣的:(HTTP相关问题)