一、什么是http?
http协议(超文本传输协议)
是一种详细规定了浏览器和万维网(WWW = World Wide Web )服务器之间相互通信的原则,通过因特网传送万维网文档的数据传送协议。
二、http是基于TCP还是UDP?
HTTP是基于TCP的应用层协议
三、HTTP的特点
- 无连接、 无状态
- HTTP的持久连接、Cookie/Session
1.HTTP的无状态
每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求时无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况。
也就是说服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
标准的HTTP协议指的是不包括cookies,session,application的HTTP协议
1.HTTP的持久连接
- 非持久连接:每个连接处理一个请求-响应事务。
- 持久连接:每个连接可以处理多个请求-响应事务。
持久连接情况下,服务器发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。
HTTP/1.0使用非持久连接。HTTP/1.1 默认使用持久连接<keep-alive>。
非持久连接的每个连接,TCP得在客户端和服务端分配TCP缓冲区,并维持TCP变量,会严重增加服务器负担。而且每个对象都有2个RTT(Round Trip Time,也就是一个数据包从发出去到回来的时间)的延迟,由于TCP的拥塞控制方案,每个对象都遭受TCP缓启动,因为每个TCP连接都起始于缓启动阶段
3.HTTP持久连接怎么判断一个请求是否结束的?
有两种方法可以判断:
Content-length:根据所接收字节数是否达到Content-length值
chunked(分块传输):Transfer-Encoding。当选择分块传输时,响应头中可以不包含Content-Length,服务器会先回复一个不带数据的报文(只有响应行和响应头和\r\n),然后开始传输若干个数据块。当传输完若干个数据块后,需要再传输一个空的数据块,当客户端收到空的数据块时,则客户端知道数据接收完毕。
四、OSI网络的七层协议?
从下到上分别是:
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
五、请求报
- 请求行
- 请求头
- 空格
- 用户进行内容分割,表示请求头到此为止,下一行的内容不再是请求头。
- 请求体
- 请求体包含的就是请求数据,正如上文提高的,当使用的是GET方法的时候,没有请求体。
如下图是请求报文的结构图:
请求报文
POST /somedir/page.html HTTP/1.1
//以上是请求行:方法字段、URL字段和HTTP版本字段
Host: www.user.com
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
User-agent: Mozilla/5.0.
Accept-lauguage: fr
//以上是首部行
(此处必须有一空行) //空行分割header和请求内容
name=world 请求体
一、请求行
第一行为请求行,由请求方法、URI和HTTP协议版本3个字段组成,它们之间用空格分隔,最后以回车和换行符结尾进行内容分割,表示接下来的内容(下一行开始的)不是请求行的内容例如。举例,GET /index.php HTTP/1.1,GET是请求方法,/index.php是URI,HTTP/1.1表示使用的HTTP版本为1.1。
1、请求方法
只有请求方法的类型比较多,有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,其中GET、POST最为常用
GET和POST区别:
请求参数方式:GET的请求参数一般以?分割拼接到URL后面,POST请求参数在Body里面
请求参数长度:GET参数长度限制为2048个字符,POST一般是没限制的
请求参数存放位置:GET请求由于参数裸露在URL中, 是不安全的,POST请求则是相对安全
之所以说是相对安全,是因为,如果POST虽然参数非明文,但如果被抓包,GET和POST一样都是不安全的。(HTTPS该用还是得用)
- 请求资源方面:GET获取资源是 安全的,幂等的(只读的,纯粹的), 可缓存的,POST 获取资源是 非安全的,非幂等的,不可缓存的
这里的安全是指不应引起Server端的任何状态变化.
GET的语义就是获取数据,是不会引起服务器的状态变化的,即是安全的。(HEAD,OPTIONS也是安全的),而POST语义则是提交数据,是可能会引起服务器状态变化的,即是不安全的.
幂等:同一个请求方法执行多次和执行一次的效果完全相同.显然GET请求是幂等而POST请求是非幂等的。
- 请求是否可缓存:GET请求会主动进行Cache。
因为GET是幂等的只读的,即GET请求除了返回数据不会有其他副作用,所以GET才是安全的,从而可以直接由CDN缓存,大大减轻服务器的负担,也就是可缓存的。
而POST是非幂等的,即除了返回数据还会有其他副作用,所以POST是不安全的,必须交由web服务器处理,即是 不可缓存的
- 在响应时,GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把Header和实体主体一并发送出去,服务器响应200(返回数据)
对于POST,浏览器先发送Header,服务器响应100 Continue,浏览器再发送实体主体,服务器响应200 OK(返回数据)。
GET 相对 POST 的优势是什么?
最大的优势就是方便。GET 的URL可以直接手输,从而GET请求中的URL可以被存在书签里,或者历史记录里
可以被缓存,大大减轻服务器的负担
所以大多数情况下,还是用GET比较好。
二、请求头
请求头部由键/值对组成,每行一对,键和值用冒号“:”(英文)分隔。请求头部告知服务器所有关于客户端请求的信息,典型的请求头有:
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
Content-Type: application/x-www-form-urlencoded 表明 HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面
User-agent:产生请求的用户代理信息(浏览器信息)例如: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36等;
Accept-lauguage: 表示可接受语言
-
connection:连接方式,有close和keep-alive两种。
close:告诉WEB服务器或代理服务器,在完成本次请求的响应后,断开连接
keep-alive:告诉WEB服务器或代理服务器。在完成本次请求的响应后,保持连接,以等待后续请求
六、响应报文
响应报文也是四部分组成:
- 状态行、
- 响应头
- 空行
- 响应体
- 这个是服务器返回给浏览器的响应信息
状态行之外,其他三个部分与请求报文类似.
响应报文的结构图如下:
HTTP/1.1 200 OK
//以上是状态行:协议版本字段、状态码、相应状态信息
Connection:close
Server:Apache/2.2.3(CentOS)
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html
Content-Length: 122
//以上是首部行
(此处必须有一空行) //空行分割header和实体主体
(data data data data)//响应实体
1.状态行
HTTP/1.1 200 OK : http版本 状态码以及短语提示请求的结果。一下常见的状态码和对应的短语:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述的说明如下:
200 OK:客户端请求成功
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
2、响应头
-
Connection:
- close首部行告诉客户,发送完报文后将关闭TCP连接。
- keep-alive:连接已保持,在等待本次连接的后续请求;
Date:指的不是对象创建或最后修改的时间,而是服务器从文件系统中检索到该对象,插入到响应报文,并发送该响应报文的时间
Server: 首部行指示该报文是由一台Apache Web服务器产生的,类似于HTTP请求报文里的User-agent
Content-Length:首部行指示了被发送对象中的字节数
Content-Type:首部行指示了实体中的对象是HTML文本