【网络协议】 -- HTTP协议

什么是HTTP协议?

协议是指两台计算机之间通信所必须遵守的规定和规则,而超文本传输协议(HTTP协议)允许将超文本标记语言(HTML)文档从web服务器返回到客户端的浏览器。

web服务器,浏览器,代理服务器

其实当我们输入一个url时,其实是浏览器传输给web服务器一个Request,Web服务器将接收到的Request进行处理,生成相应的Response,然后返回给浏览器,浏览器解析html生成相应的网页。

代理服务器

具有的作用:1.缓存,提高访问效率                                 2.隐藏真实身份                                          3.防止攻击

URI和URL

  URI(统一资源标识符)纯粹是一种符号结构,用于指定构成Web资源的字符串的各个不同部分。而URL(统一资源定位符)是一种特殊的URI,包含了用于查找某个资源的足够信息。

  URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。

eg::          URL: http://localhost:8080/test/hello.html         URI:/test/hello

URL的组成:eg:https://mp.csdn.net/postedit

一般包括,1.使用的协议版本         2.域名或者IP地址          3.端口号         4.访问路径          5.请求参数         6.锚点

HTTP请求时无状态的,同一个客户端的这次请求和下次请求之间是没有对应关系的,他并不知道两个请求是否来自同一个客户端,为了解决这个问题,web程序引入了cookie机制来维护。

打开一个网页需要浏览器发送很多次Request

1.当你在浏览器输入URL时,浏览器发送一个Request去获取该URL对应的html,服务器吧Response发送回给浏览器

2.浏览器分析Response中的HTML,发现其中引入了css 图片 js

3.浏览器再去发送请求加载对应的CSS和JS文件

4.等所有的文件都下载成功后,网页将被显示出来

HTTP的消息结构

HTTP的Request消息分为3个部分:请求行,请求头和body,请求头和body之间有一空格

请求行:包括请求方法,URI,HTTP版本,CRLF(换行)

GET请求:

GET /index.html?uname=admin&pwd=123 HTTP/1.1  -----------请求行

Host: localhost:8888    -----------用于表示请求的主机域名或合法IP地址

Connection: keep-alive  -----------HTTP/1.1后默认的,默认长链接

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 -----------请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器,非必须

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 ---------可接受的格式

Referer: http://localhost:8080/HttpServer2/login.html-----------表示是从哪个页面过来的

Accept-Encoding: gzip, deflate,  ----------可接受的编码格式

Accept-Language: zh-CN,zh;q=0.9 -----------可接受的语言

Cookie: JSESSIONID=BE3DED7D7494DEDEEE01BFDF7B5E36C8---------Cookie缓存数据

空行

请求正文

 

POST请求:

POST /index.html HTTP/1.1      --------------请求行(请求方式,url,HTTP协议版本)
Host: localhost:8888              -------------请求的主机地址
Connection: keep-alive          -------------长连接

keep-alive:timeout=20        ------------长连接失效时间
Content-Length: 19               ------------内容长度   
Cache-Control: max-age=0      ------------

Cache-Control:Public   可以被任何缓存所缓存()

Cache-Control:Private     内容只缓存到私有缓存中

Cache-Control:no-cache  所有内容都不会被缓存

max-age=<seconds>

设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。
Content-Type: application/x-www-form-urlencoded -------------内容类型
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=BE3DED7D7494DEDEEE01BFDF7B5E36C8

                                                                                         ---------空行

uname=admin&pwd=123                                              -----------请求正文

 

Get协议和Post协议的区别:

Get一般用于查询获取资源数据,而Post一般用于更新资源数据

1.Get提交的数据会放在URL之后,以?分割,参数之间以&相连,而post是放在HTTP包的Body中

2.Get提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制

3.Get方式提交数据,会带来安全问题

 

HTTP协议的Response:

Response也包含三部分:响应行,响应头,空格,响应体

响应行:HTTP版本  返回码 状态消息

响应头:服务器,Content-Type:内容类型,日期

响应体:返回内容

 

è¿éåå¾çæè¿°

返回码:

1XX  提示信息 - 表示请求已被成功接收,继续处理

2XX  成功 - 表示请求已被成功接收,理解,接受

3XX  重定向 - 要完成请求必须进行更进一步的处理

4XX  客户端错误 -  请求有语法错误或请求无法实现

5XX  服务器端错误 -   服务器未能实现合法的请求

200:成功

302:重定向,新的连接将会在Response中的location中返回,浏览器将会自动使用新的URL发出新的Request(www.google.com    ----  www.google.com.hk)

304 :代表上次的文档已被缓存,还可以继续使用

400:客户端请求语法错误,不能被服务器所理解

403:服务器收到请求,但被拒绝

404:Not Fount(请求资源不存在),一般是url输错了

500:服务器发生了不可预期的错误

503:服务器当前不能处理客户端的请求,一段时间后才可以恢复

Pragma:防止页面被缓存,在HTTP/1.1版本中,它和Cache-Controller:no-cache作用一模一样

HTTP/1.0和HTTP/1.1的区别:

1、HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理

HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent  connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).

在1.0时的会话方式:
 1. 建立连接
 2. 发出请求信息
 3. 回送响应信息
 4. 关掉连接

 HTTP 1.1的持续连接,也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。

请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。例如:一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。  HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。

2.HTTP 1.1增加host字段

在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。

 HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。

3、100(Continue) Status(节约带宽)

HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看server要不要接收request body,再决定要不要发request body。

4、HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。

长连接的数据传输完成标识:

两部分:

1.是判断传输数据是否达到了Content-Length指示的大小;

2.动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块

TCP的keep alive和HTTP的Keep-alive:

答:1.TCP的keep alive是检查当前TCP连接是否活着;

       2.HTTP的Keep-alive是要让一个TCP连接活久点。它们是不同层次的概念。

HTTP长链接和短连接的适用场景:

短连接:例如普通的web请求,在三次握手之后建立连接,发送数据包并得到服务器返回的结果之后,通过客户端和服务端的四次握手进行关闭断开。

长连接:区别于短连接,由于三次握手链接及四次握手断开,在请求频繁的情况下,链接请求和断开请求的开销较大,影响效率。采用长连接方式,执行三次握手链接后,不断开链接,保持客户端和服务端通信,直到服务器超时自动断开链接,或者客户端主动断开链接。

短连接:适用于网页浏览等数据刷新频度较低的场景。

长连接:适用于客户端和服务端通信频繁的场景,例如聊天室,实时游戏等。