图解HTTP
了解Web以及网络基础
HTTP协议最初是为了科学家共享知识而发明一种网络通信协议。
网络基础TCP/IP
目前互联网采用的网络协议是tcp/ip协议族,也就是我们常说的4层协议栈。
TCP/IP协议栈与ISO七层协议栈不同,只有应用层、传输层、网络层、链路层。其中HTTP协议处于应用层,TCP/UDP处于传输层,IP网络处于网络层,通信电缆等处于物理链路层。
TCP/IP的通信传输流如图所示:
由于是分层结构,所以虽然数据按照通信传输流的方向进行传输,但是在某个层上看,相当于同层无缝传输。TCP/IP的通信针对上下层都是使用接口进行通信交流的。
TCP/IP的三次握手协议
TCP协议是确保可靠的,UDP协议并不能确保可靠传输。HTTP是基于TCP协议的,一般的流媒体视频等较多是基于UDP的。为了能够达到准确无误地将信息送达目的地,TCP协议采用了三次握手的策略。
上图为TCP协议的三次握手过程图。Client端向Server发送链接请求,server接收到之后回复一个ACK(我知道你了),并且发送一个SYN(我也想和你链接),Client收到Server的回复之后,再向Server发一个ACK,表明已经收到了Server的回信。这样,一个TCP链接就建立起来的。
HTTP是无状态的协议,所以TCP链接也会随着HTTP的断开而断开,这样会导致非常严重的多次重连。为了避免每次HTTP链接都需要重连TCP,目前广泛采用一种HTTP协议的改进版本1.1版,HTTP1.1版可以获取持久连接。
HTTP协议详解
HTTP请求
HTTP的报文分为两类,一类是Client端发送的请求报文,一类是Server端回复的响应报文。
看一个简单的请求报文:
HTTP请求报文包括:
- 请求方法:GET\POST\DELETE...
- 请求资源URI
- HTTP协议版本
- 请求报文首部字段
- 内容实体:
请求方法是告知服务器意图的HTTP方法。主要包括POST、GET、PUT、HEAD、DELETE等方法。目前主要在用的是POST和GET,主要区分是POST不会讲请求实体内容添加到URL链接上,而GET会将请求实体添加到URL链接上。
URI用于定位请求的资源。用户到底想要获取什么,由URI决定。
协议版本目前主流是1.1版,是1.0的改进版
首部字段和内容实体内容较多,稍后详细分析。这是HTTP最繁杂的内容,也是需要重点掌握的。
HTTP响应
有请求必然有响应。HTTP响应报文如下:
这里具体拿出HTTP状态码来进行分析。响应的首部字段包含了一些响应的基本信息,包括时间、长度、类型等。响应的主体就是浏览器解析的部分了。
HTTP的状态码分为5种,从1XX到5XX。相信大家最熟悉的莫过于404了,不论是访问Google还是youtube,返回的都是404,你懂的...
类别 | 短语原因 | |
---|---|---|
1XX | Informational | 接收的请求正在处理 |
2XX | Success | 请求正常处理完毕 |
3XX | Redirection | 请求重定向 |
4XX | Client Error | 客户端请求错误 |
5XX | Server Error | 服务器端错误 |
一般我们碰到比较多的都是2XX、4XX和5XX。如果返回2XX,说明一切OK,如果返回4XX,说明是你的问题(我有点不明白了,访问GOOGLE难道是我的问题?),如果返回5XX,一般都是服务器挂了...
你需要了解的Cookie
我们已经知道,HTTP是无状态协议。说的直白一点,就是翻脸不认人。刚刚可能还打得火热,一会儿工夫就不认识你了...为了提升HTTP协议的效率,Http协议采用了Cookie这个概念。cookie这个东西,更像一个通行证,服务器在回复Client的请求时给Client一个Cookie,下次Client再次请求时,带上这个Cookie,服务器就能认出这个Client了。
所以为啥有时候需要获取最新的Server信息的时候需要清除cookie,因为我们需要让服务器记不住Client与它曾经认识过...
HTTP首部
HTTP首部字段之多,简直令人发指...不过好在大部分的首部字段的名字都与其意义一样,容易理解。当然,也不可能全部都记住,需要的时候查一查就好了,只需要记住一些常用的首部字段即可。
本人从事的是CDN加速服务,这里主要讲解一些与CDN加速原理有关的字段。
通用首部字段
通用首部字段指的是请求和响应报文都会用到的首部字段。
重点讲解一下Cache-Control字段。这个字段用于控制缓存机制。你有没有发现过,有时候第一次打开某个网页非常慢,但是第二次打开就快多了,这就是因为有缓存机制的原因。
客户端可以请求缓存,服务器端可以选择不缓存,或者选择设置缓存时间等。
请求首部字段
顾名思义,指的是请求报文专用首部字段
If-XXX字段称为条件请求字段。If-Match用于比较报文实体。If-Modified-since用于判断请求的资源是否在某个时间段内被修改过(这个字段在CDN行业非常重要,主要用于判断一个资源的新鲜度)
User-Agent表示的是浏览器的信息。可以修改这个信息来改变服务器对客户端浏览器的判断。比如使用的是电脑,修改这个字段为手机UC浏览器的User-Agent信息,服务器端可能会给你返回手机端的网页...
响应首部字段
指的是响应报文专用首部字段
E-tag是某个资源的匹配信息,如果两个响应的E-tag一致,说明两次请求获取的资源是同一份,内容未变。所以在CDN中可以判定此资源无需重新获取缓存。
实体首部字段
请求报文和响应报文实体部分使用的首部字段
Expires表示实体的过期时间,一旦这个时间到了,不管源站资源是否与之相同,必须去源站重新获取。
更近一步——HTTPS
HTTP是不安全的协议。一旦被截获,可以随便篡改。
- HTTP使用明文,内容可能被窃听
- 不验证通信方的身份(可以盗用别人的cookie)
- 无法证明报文的完整性
为了保障HTTP的安全性,目前越来越流行使用HTTPS,HTTPS就是HTTP+SSL。
有了HTTPS,就相当于建立了一个加密通道,HTTP通信的内容再也不会被窃听、篡改了!
总结
HTTP协议在现代的互联网系统中扮演着举足轻重的角色,可以说没有HTTP协议,也就没有如今的互联网繁荣。认识HTTP协议对于每个IT从业人员,特别是互联网从业人员都是非常重要的一课。《图解HTTP》这本书使用大量的图片来讲解HTTP协议的内容精髓,值得一读!
原文链接:http://www.jianshu.com/p/05554734444f
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。