深入理解HTTP协议

  作为web的一部分,hhtp协议是一个非常常用也非常重要的协议了。HHTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,基于TCP/IP面向应用层的协议,如果是基于TLS或者SSL协议层的话,那就变成了我们常说HTTPS协议,关系如下。http默认端口为80端口,https默认端口为443端口。

 

  .HTTP特点

  1.简单快速。只需要请求方法和路径。

  2.灵活。允许传输任意类型的数据对象,类型由Content-Type表示。

  3.自定义持续连接。http1.0限制每次连接只处理一个请求,服务端处理完客户端的请求并受到客户端的应答后,即断开连接,但在请求方式中如果使用Connection:Keep-Alive模式,那么可以保持连接。http1.1中默认开启Keep-Alive模式,只有崽Connection:close时才会关闭。(个人觉得这个Keep-Alive模式与http最开始的无状态无连接的模式有一定冲突的)

  4.无状态:http协议时无状态协议。如果后续处理需要前面的信息,则必须重传。

 

  二.URL

  URL是uniform resource locator的缩写,统一资源定位器。看字面意思就是对对某个资源的定位,那定位只要找到具体的“门牌号”就好了。那么这么门牌号的构成:协议部分+域名部分+端口部分+虚拟目录部分+文件名+参数+...

  如:http://www.aspxfans.com:8080/news/index.asp?boardID=5

  协议部分:该URL的协议部分为“http:”,Internet中协议很多如http、https、ftp等。“http:”后面要跟“//”分隔符。

  域名部分:该URL的域名部分为“www.aspxfans.com”,也可以使用ip,因为域名最终还是要通过DNS转为ip地址的。

  端口部分:跟在域名后面的为端口,可省略,如http默认端口为80,https为443,ftp为20/21,这里的8080为tomcat的默认端口。

  虚拟目录部分:从域名后第一个/开始到最后一个/是虚拟目录部分,该URL中为/news/。

  文件名部分:从域名最后一个/到?为止是文件名部分,该URL为index.asp。

  参数部分:在?之后,形如XXX=XXX的为参数部分,采用&作为分隔符。

 

  三.HTTP请求Request

  客户端向服务端发送一个http请求,该请求包括:请求行、请求头部、空行和请求数据四个部分。

  

  例如:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8

  即使请求数据为空,第三部分空行也要存在。

 

  四.HTTP响应Response

  服务端接收到客户端发来的request,处理完成后会返回一个http响应。http响应也有四部分组成:状态行、消息报头、空行和响应正文

  五.HTTP响应状态码

  状态码由三位数字组成,第一个数字定义了响应的类型。常见的状态码与对应的状态消息:

  

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

 

  六.HTTP请求方法

   http可以采用多种请求方法,这个方法放在request的请求行里,告诉服务器我以哪种方式请求。常用的请求方式有GET、POST、HEAD、PUT,具体如下。

GET     请求指定的页面信息,并返回实体主体。
HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST     向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT     从客户端向服务器传送的数据取代指定的文档的内容。
DELETE      请求服务器删除指定的页面。
CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS     允许客户端查看服务器的性能。
TRACE     回显服务器收到的请求,主要用于测试或诊断。

  其中connect用于实现Keep-Alive模式,上面有提到过,就是会保持连接而不是像传统的http那样每次连接只处理一个请求

  这里简单介绍一下这个Keep-Alive模式。HTTP是基于TCP协议的连接,通常的方式是”短连接“,而相对的就是”长连接“(Keep-Alive或者持久连接等等)。如果是短连接,客户端拿到服务端的HTML代码之后,TCP连接就关闭了,接着客户端会分析这个HTML源码,看看会用到那些图片啊CSS啊JS啊,再从服务端拿取,每次拿取都要建立一个TCP连接再中断。在1.0版本的时候,web网页相对简单,没有太多的CSS和JS需要从服务端获取,这样的话短连接也还可以应付,但是web网页越来越复杂,各种样式越来越多的情况下短连接就不适用了,因为每次拿取都需要TCP连接再断开会浪费很多时间,于是有了长连接的概念,也就是Keep-Alive。其实再http1.0中也有这个功能,只不过默认是关闭的,可以通过connection请求方法开启。而再http1.1中这个长连接模式是默认开启的,从服务端拿到html代码后,连接不关闭,暂时先保持着(也就是Keep-Alive),然后客户端分析需要哪些CSS和JS,直接从服务端拿取就可以了。

 

  七.HTTP的工作过程

  首先http客户端,通常是浏览器,通过URL与服务端的http端口(默认80)建立一个TCP套接字连接。

  通过TCP套接字,客户端向服务端发送一个请求报文,也就是request。

  服务端接收到请求之后,进行处理,处理之后的结果为response放到TCP套接字中,由客户端读取。

  如果开启了Keep-Alive模式,那么此连接不会直接断开,如果未开启该模式,服务器主动关闭TCP连接,客户端被动关闭TCP连接。

  客户端解析返回的response,查看状态行,如果成功即(200 ok),解析响应头,拿到完整的html页面代码,内核和js引擎解析这个页面,最终显示。

 

  八.GET与POST请求方法的区别

  GET提交请求时,请求的数据会附在URL后面,这样导致GET请求不是那么安全。POST是把数据放在HTTP包的包体中。

  虽然http协议没有对传输数据的大小进行限制,也没有对URL长度进行限制,但是特定的浏览器对GET的URL长度有限制。而POST不是通过URL船只,理论上数据是不受限的。

 

  

posted @ 2018-03-30 11:32  真的是从入门开始  阅读(1382)  评论(0编辑  收藏  举报