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之类的可用来发文章,然后我就在网页上插个看不到的<button>标签,范围全屏,src属性挂上<button><a href="zhihu.com/postarticle?title=xxxxxx"></a></button>,这样你一进去,点个鼠标,它就自动给你发了一篇文(guang)章(gao),神奇吧?当然只是举个栗子……而且好久不写html了,这个标签写法对不对我不知道,小朋友不要随便模仿。
防范方法:验证token,在自己的网页上挂个看不到的token,要post的时候带上这个token,服务端去验证它是不是对的,有没有他,就保证了受到信任的源才能用这个API。

2. XSS

XSS就是注入攻击,就是用户利用你的漏洞,你让他传文章的地方他给你插个<script>标签进去,然后你也不过滤,发布出来还带着这个脚本发布了,别人一访问,就触发这段脚本,后来的事情大家都知道了。
防范方法:过滤用户输入,永远不信任用户输入。

八. cookie 和 session

  • cookie:客户端缓存。浏览器侧保存信息,每次请求的时候带在header里发给服务器来同步状态。
  • session:服务端保存用户的状态。一般就是有一个session id,服务端这边拿着做映射,那用户端怎么同步呢?当然是在cookies里面放着这个session id辣。

九. HTTP 2.0

作者:腾讯云技术社区
链接:https://www.zhihu.com/question/34074946/answer/157909115
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、多路复用的单一长连接

1.单一长连接

在HTTP/2中,客户端向某个域名的服务器请求页面的过程中,只会创建一条TCP连接,即使这页面可能包含上百个资源。 单一的连接应该是HTTP2的主要优势,单一的连接能减少TCP握手带来的时延 。HTTP2中用一条单一的长连接,避免了创建多个TCP连接带来的网络开销,提高了吞吐量。

2.多路复用

HTTP2虽然只有一条TCP连接,但是在逻辑上分成了很多stream。

HTTP2把要传输的信息分割成一个个二进制帧,首部信息会被封装到HEADER Frame,相应的request body就放到DATA Frame,一个帧你可以看成路上的一辆车,只要给这些车编号,让1号车都走1号门出,2号车都走2号门出,就把不同的http请求或者响应区分开来了。但是,这里要求同一个请求或者响应的帧必须是有有序的,要保证FIFO的,但是不同的请求或者响应帧可以互相穿插。这就是HTTP2的多路复用,是不是充分利用了网络带宽,是不是提高了并发度?

二、头部压缩和二进制格式

http1.x一直都是plain text,对此我只能想到一个优点,便于阅读和debug。但是,现在很多都走https,SSL也把plain text变成了二进制,那这个优点也没了。

于是HTTP2搞了个HPACK压缩来压缩头部,减少报文大小(调试这样的协议将需要curl这样的工具,要进一步地分析网络数据流需要类似Wireshark的http2解析器)。

三、服务端推动Sever Push

这个功能通常被称作“缓存推送”。主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。

这个功能帮助客户端将Z放进缓存以备将来之需。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容