一,定义:
超文本传输协议 ( Hypertext Transfer Protocal )
是一种实现客户端和服务器之间通信的响应协议,它是用作客户端和服务器之间的请求。
客户端(浏览器)会向服务器提交HTTP请求;然后服务器向客户端返回响应;其中响应包含有关请求的状态信息,还可能包含请求的内容。
二,请求方式:
8种:GET、POST、PUT、HEAD、DELETE、CONNECT、OPTIONS、TRACE

三,GET和POST:
GET方法提交的数据会直接填充在请求报文的URL上,如“ https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1 ” “?”问号划分域名和get提交的参数,A=B中的A是参数名,B是参数值,多个参数之间用&进行分割,如果参数值是中文,则会转换成诸如%ab%12加密16进制码。
POST方法提交的数据会附在正文上,一般请求正文的长度是没有限制的,但表单中所能处理的长度一般为100k(不同协议不同浏览器不一样),而且需要考虑下层报文的传输效率,不推荐过长。
所以GET方法可以用来传输一些可以公开的参数信息,解析也比较方便,如百度的搜索的关键词,而POST方法可以用来提交一个用户的敏感信息(如果不使用HTTPS加密,报文正文仍旧是明文,容易被人截获读取)
四,PUT和POST:
总:PUT是幂等的,POST非幂等;PUT用来改资源,Post用来增资源。
PUT和POST都有更改指定URI的语义.但PUT被定义为idempotent的方法,POST则不是.idempotent的方法:如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。也就是说:
PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源)
Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)
这两个方法看起来都是讲一个资源附加到服务器端的请求,但其实是不一样的。一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源。这个说法本身没有问题,但是并没有从根本上解释了二者的区别。事实上,它们最根本的区别就是:POST方法不是幂等的,而PUT方法则有幂等性。那这又衍生出一个问题,什么是幂等?
幂等(idempotent、idempotence)是一个抽象代数的概念。在计算机中,可以这么理解,一个幂等操作的特点就是其任意多次执行所产生的影响均与一次执行的影响相同。
POST在请求的时候,服务器会每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建。因此PUT是幂等的。
五,request包含的内容:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
POST请求例子:
POST / HTTP1.1
Host:www.wrox.com
User-Agent:iPhone OS/iOS:14.2
clientVersion:1.5.17
clientName:IOS
timeStamp:637647944666
token:cef641dc-4892-405c-9982-396110e12b89
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。
第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息。
服务端据此获取客户端的信息、与缓存相关的规则信息,均包含在header中。
第三部分:空行,请求头部后面的空行是必须的。
第四部分:请求数据也叫主体,可以添加任意的其他数据。
六,Response包含内容:
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
例子:
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息。
第三部分:空行,消息报头后面的空行是必须的。
第四部分:响应正文,服务器返回给客户端的文本信息。
七,请求返回状态码:
2XX系列:代表请求已成功被服务器接收、理解、并接受。这系列中最常见的有200、201状态码。
200 OK 当您的操作将在响应正文中返回数据时,出现此结果。
3XX系列:代表需要客户端采取进一步的操作才能完成请求,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。这系列中最常见的有301、302状态码。
301:Permanently moved 永久性转移
302:Temporarily moved 暂时性转移
304 Not Modified(重定向) 当测试实体自上次检索以来是否被修改时,出现此结果。
4XX系列:表示请求错误。代表了客户端看起来可能发生了错误,妨碍了服务器的处理。常见有:401、404状态码。
401状态码:请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
404状态码:请求失败
5xx系列:代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。常见有500、503状态码。
500:服务器错误
八,HTTP三次握手:
第一次握手:客户端发送syn包,里面包含位码为syn=1,同时里面还有随机产生seq number=2322326583 的数据包到服务器,服务器由SYN=1知道,客户端要求建立联机;客户端进入SYN_SEND,等待服务器确认;服务器向客户端发送(SYN+ACK包)
第二次握手:服务器收到请求后要确认联机信息(syn=1),向客户端发送一个SYN(syn=1,ack=1)+ACK(ack number=(客户端的seq+1))包,随机产生seq=3573692787的数据包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ACK确认包(ack number=(服务器的seq+1),ack=1)服务器收到后确认seq值与ack=1则连接建立成功。客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
九,HTTPS和HTTP的区别
1、HTTPS是加密传输协议,HTTP是明文传输协议;
2、HTTPS需要用到SSL证书,而HTTP不用;
3、HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO;
4、HTTPS标准端口443,HTTP标准端口80;
5、HTTPS基于传输层,HTTP基于应用层;
6、HTTPS在浏览器显示绿色安全锁,HTTP没有显示;
网友评论