前言
计算机网络课程的学习已经是在大二下学期的时候了,过去了半年多,有很多东西似乎都忘记了QAQ。况且当时上课的时候就感觉专业术语多,很多知识也难以理解,但是还是硬着头皮学了下来,如今阅读《HTTP图解》这本书发现很好理解,但是需要加强印象还得自己总结与实践,所以写了这篇文章。
网络基础
最初的念想
借助多文档之间的关联形成的超文本连成可互相参阅的万维网。
三项WWW构建技术:
- SGML作为页面的文本标记语言的HTML(HTML5已不在SGML基础上)
- 作为文档传递协议的HTTP
- 指定文档所在地址的URL
HTTP(超文本传输协议,书上说称为超文本转移协议更严谨)
破壳日:1989年3月
客户端到服务器通信的流程是建立在HTTP协议之上的。
TCP/IP的协议模型
在每次进行信息传输的时候,信息都要从高层传到底层,会经过不断的“包装”。再从对方的底层传到高层,这时会不断的“拆包装”。
在这之中也会用到各个层的一些很重要的协议,在一次HTTP请求发送中:
应用层(应用层、表示层、会话层):HTTP、DNS
传输层:TCP
网络层:IP、ARP
其中DNS协议用于解析域名,TCP协议用于确定目标计算机资源端口,IP协议用于确定目标计算机的IP地址,ARP协议用于把IP地址转换为真正的物理地址MAC。
TCP协议
TCP提供可靠的字节流服务,会把数据分割成报文段进行发送。
TCP用SYN和ACK标志来确认对方是否成功送达:
1.发送端发送:SYN。
2.接收端接收后,发送SYN和ACK。
3.发送端接收后,再次发送ACK,握手结束。
综上,当我们从浏览器输入一个URL后,发生了这些事:
客户端想浏览URL为 http://www.mochiko.cn 的页面,HTTP协议生成请求页面资源报文,TCP协议把HTTP请求报文分割为多个文段,把文段可靠的传给对方。随后IP协议搜索对方的地址,一遍中转,一遍传送。(省略了网络层以下的了)随后TCP协议把收到的报文段重新组合成原来的顺序,然后HTTP协议把WEB服务器请求的内容进行处理,并返回请求的结果和内容。
wireshark抓包结果可看到,首先发生了三次握手,建立起了TCP链接。随后发出HTTP请求,TCP再把报文分成了四段发送,其中收到了三个数据接收回复,最后HTTP返回200 OK表示成功发送完了主页的HTML文件。
在此次抓包中,这里的x=0,y=0,第二次x=1,第三次,x=y=1,符合图中的规则。
URL
URI 统一资源标识符(在《HTTP权威指南》里面对URI的解释更充分一点)
协议方案名://登录信息@服务器地址:端口号/带层次的文件路径?查询字符串#片段标识符
初识HTTP
- HTTP协议用于客户端和服务器端之间的通信,请求必定由客户端发出,服务器端被动回复。
- HTTP协议不保存状态,是无状态协议。
- HTTP协议使用URI定位互联网资源。
请求报文
开头GET是请求服务器的类型,即方法,随后的“/”表示请求访问的资源对象。最后的HTTP1.1是版本号。
响应报文
开头是HTTP的版本,200是状态码,OK是短语。下面(没截)还带有HTML的主体代码。
HTTP方法
GET:获取资源
指定的资源经过服务器解析后返回相应内容,即文本直接返回,CGI返回经过执行后的结果。
POST: 传输实体主题
PUT和GET功能相似,但是POST的主要目的不是获取响应的主题内容
PUT:传输文件
像FTP文件上传一样,要把请求报文主题包含在文件内容,保存在请求URI的指定位置上。
HTTP/1.1的PUT自身不带验证,任何人都可以上传,存在安全性问题,一般不使用。若配合WEB应用程序的验证机制或架构设计采用REST标准则可能开放使用。
HEAD:获得报文首部
和GET方法一样,但不返回报文主体部分。用于确认URI有效性和资源更新的日期等。
DELETE:删除文件
与PUT相反的方法,同样存在安全性问题。
OPTIONS:询问支持的方法
查询针对请求URI指定的资源支持方法。
1.1版本才支持。
TRACE:追踪路径
让WEB服务器端将之前的请求通信环回给客户端,发送请求把Max-Forwards首部字段填入数值,每经过一个服务器端就把该数字减1,是0时停止传输。容易引发XST攻击,通常不会用到。
1.1版本才支持。
CONNECT:用隧道协议连接代理
主要用SSL和TSL协议把通信内容加密经网络隧道传输。
1.1版本才支持。
其他特性
持久链接节省通信量
HTTP 1.1和部分HTTP 1.0提供持久链接,只要任意一段没有提出断开链接,就保持TCP链接状态。
可以查看抓包数据,发送成功一个请求后没有断开TCP连接,此图也适用于管线化的说明,同时发送几个HTTP请求。
管线化
从前必须要收到响应才发送新的请求,而管线化技术不需要等待,可以同时发送多个请求。
Cookie管理状态
因为HTTP是无状态的协议,所以需要Cookie来管理状态:
1.客户端发送请求。
2.服务器对这个客户端生成一个Cookie,保存下来,并发送回去。
3.客户端保存这个Cookie。
4.客户端第二次发送请求,带着Cookie一起发送。
5.服务器坚持Cookie,分析出是刚才那个客户端。
了解HTTP
HTTP报文本身是由多行(CR+LF换行符)数据构成的文本。[这点上头的示例报文很明显了]。
压缩内容编码
原貌传输速度没有压缩后的编码速度快,但是相应会消耗资源。
常见编码有:
- gzip(GUN zip)
- compress
- deflate
- identity
报文主体和实体主体
报文主体用于传输请求或者响应实体主体。
分块传输编码
把实体主体分成多个部分,每一块用十六进制标记块大小,最后一块用“0(CR+LF)”标记。
发送多种数据多对象集合
MINE机制允许多个不同类型的二进制数据以ASCII码指明。
多部分对象集合包含:
1.multipart/form-data
2.multipart/byteranges
3.multipart/form-data
用boundary字符串(指定各个实体开始和结束加入--)划分多部分对象集合类型。
图为一个大图的GET请求,Range表示请求933343~2151819之间的字节
针对范围请求,会有206状态码返回。若服务器无法响应,就是返回200状态码。
Accept内容协商
包括服务器驱动协商,客户端驱动协商和透明协商
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language
协作HTTP的WEB服务器
虚拟主机
物理层面只有一台服务器,利用虚拟主机可以实现为多个域名提供各自的服务。
DNS服务把域名解析为IP地址,服务器假如托管了多个域名,必须要弄清楚到底是访问了哪个。即应在HTTP报文Host首部标记清楚。
HTTP通信除了客户端和服务器之间,还有一些用于通信数据转发的应用程序:代理、网关、隧道配合工作。
代理
具有转发功能的应用程序,服务器与客户端之间的中间角色。
网关
转发其他服务器通信数据的服务器,即与非HTTP协议进行通信。
隧道
相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接。
代理
接收客户端发送请求转发给其他服务器,代理不改变请求URI,直接发送给前方拥有资源的目标服务器。
每次经过一个代理,会追加写入Via首部信息。
缓存代理:转发响应会把预先资源的副本保存在代理服务器上,有一个期限,下次请求可以直接返回。(缓存还可以留在浏览器中,叫做临时网络文件)
透明代理:转发不对报文做任何加工(反之则是非透明代理)。
状态码和短语
1XX Information
接受的请求正在处理
2XX Success
请求正常处理完毕
200 OK
客户端发来的请求被正常处理了,返回的信息因为方法不同而不同。
204 No Content
客户端发来的请求被正常处理了,但不包含实体的主体部分。
206 Partial Content
客户端进行了范围请求,且服务器正确执行了请求,响应报文中包含由Content-Range指定范围的主体。
3XX Redirection
重定向,需要进行附加操作
301 Move Permanently
永久性重定位,状态码表示请求的资源已经被分配了新的URI,以后应用现在指定的URI。如果URI保存书签了,也应该按照Location首部字段提示保存。
输入URL最后不加/会产生301状态码
302 Not Found
临时性重定向,请求的资源被分配了新的URI,希望用户用新的URI访问。
303 See Other
与302有相同的功能,但是303明确表示客户端用GET方法获取资源。
304 Not Modified
客户端发送附带条件的GET请求:If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since,服务器允许请求资源,但因发生请求不满足条件而返回。
307 Temporary Redirect
临时重定向,与302 Found相同含义。307不会从POST变成GET,不过要看具体浏览器。
4XX Client Error
客户端错误
400 Bad Request
请求报文中存在语法错误。
401 Unauthorized
发送请求需要通过HTTP认证的认证信息。头部必须包含一个WWW-Authentiate首部质询用户信息
403 Forbidden
访问请求资源被拒绝。
404 Not Found
无法找到资源或者服务器拒绝请求且不想说明理由。
5XX Server Error
500 Internal Service Error
服务器在执行请求时发生了错误。
503 Service Unvaliable
服务器暂时超载或正在进行停机维护,无法进行处理。若事先知道时间,返回Retry-after字段。
HTTP/1.1通用首部字段
即响应报文和请求报文都可以用的字段
Cache-Control
操作缓存,参数可选,逗号分隔
public:其他用户也可以利用缓存。
private:特定用户可以利用缓存。
no-cache:不是不缓存,是客户端不接受缓存过的响应,所以缓存服务器必须要把请求转发出去。若对它赋值(如no-cache=Location),表示客户端接收到这个参数的响应报文后不能使用缓存。
no-store:按时请求或响应中包含机密信息。规定缓存不能在本地存储请求或响应的部分。
s-maxage: 功能和max-age相同,但这个适用于多位用户使用的公共缓存服务器。
max-age: 单位秒,缓存时间比指定时间数值小则接收数据。HTTP/1.1还存在Expires首部字段,会优先处理max-age,而HTTP/1.0中max-age会被忽略。
min-fresh:缓存服务器返回至少还未过指定时间的缓存资源。
max-stale:过期缓存资源也接收。
only-if-cached:客户端仅在缓存服务器本地缓存目标资源的情况下返回,若请求缓存服务器本地缓存无反应,返回504。
must-revalidate:代理向源服务器再次验证即将返回响应缓存是否有效。无法连接服务器返回504。用这条会忽略max-stale。
proxy-revalidate:所有缓存服务器在收到客户端指令请求返回时,再次验证缓存有效性。
no-transform:请求或相应中都不能改变主体媒体类型。
Connection
- 控制不再转发给代理的首部字段
- 管理持久连接:HTTP/1.1默认是持久链接,想断开连接指定Connection:Close。旧版本默认是非持久,所以需要指明Connection:Keep-Alive。
Connection:不再转发的首部字段名
Connection:close
Date
创建HTTP报文的日期时间
Pragma
历史遗留字段,为了兼容而存在
Pragma:no-cacheyao要求中间缓存服务器不返回缓存。
Trailer
事先说明在报文主体后记录了哪些首部字段。
Transfer-Encoading
规定报文主体采用的编码方式。进队分块传输编码有效。
Upgrade
检测HTTP协议及其他协议是否可使用高版本进行通信,参数可以指定一个完全不同的通信协议。
Via
追踪客户端与服务器之间的请求和响应报文的传输路径。
Warning
从1.0版本的Retry-After演变过来的,通常会告知用户一些缓存相关的问题警告。
1.1版本定义了7种警告:
110 Response is stale 代理返回已过过期资源
111 Revalidation failed 代理再验证资源有效失败
112 Disconnection operation 断开连接操作
113 Heuristic expiration 试探性过期,响应试用期超过24小时
199 Miscellaneous warning 任意的警告内容
214 Transformation applied 代理对内容编码或媒体类型执行了某些处理
299 Miscellaneous persistent warning 任意的警告内容