HTTP

HTTP

HTTP方法

客户端发送的请求报文第一行包含了方法字段

  • GET

    获取资源,绝大多数请求是GET方法

  • HEAD

    获取报文首部,和get方法一样但是不返回报文实体部分。主要用户URL有效性及资源更新日期时间

  • POST

    POST主要用来传输数据

  • PUT

    上传文件(由于本身不带验证机制,存在安全机制一般不用)

  • PATCH

    部分修改资源

  • DELETE

    与PUT功能相反,同样不带验证机制

  • OPTIONS

    查询URL支持的方法

  • CONNECT

    要求在与代理服务器通信时建立隧道,使用SSlTSL

  • TRACE

    追踪路径,服务器会把通信路径返回客户端(通常不会用,易受攻击)

GET与POST的区别

作用

GET用于获取资源,POST用于传输实体主体

参数

GET和POST都能使用额外的参数,但是GET参数以查询字符串的形式出现在URL中,如http://127.0.0.1/Test/login.action?name=admin&password=admin 这个过程用户可见。而POST的参数存储在实体主体中。通过HTTP的POST机制。POST参数可以通过一些抓包工具(Fiddler)查看

因为URL只支持ASCLL码,因此GET参数中文会被编码,空格被编码为%20

安全

安全的HTTP方法不会改变服务器状态,可以说他是只读的

GET方法安全的,POST不是,POST方法传输主体内容,这个内容可能是某个表单数据,服务器可能把其存入数据库中,这样状态就发生了改变

幂等性

幂等性的HTTP方法,同样的请求被执行一次和连续执行多次的效果是一样的,服务器状态也是一样的。

所有安全的方法是幂等的,GET、HEAD、PUT、DELETE方法都是幂等的

而POST方法不是幂等的

XMLHTTPRequest

XMLHTTP Request是一个API,它为客户端和服务器之间传输数据的功能。他提供了一个URL来获取数据的简单方式,而且不会使整个页面刷新。这使得网页只更新一部分不会打扰到用户,在AJAX中被大量使用

xmlhttprequest中POST会先发送header再发送data(当然也和浏览器的做法相关)

而get方法会一起发送

其他

Get传输数据量小,因为受URL的限制,但是效率高;POST可以传输大量数据,文件只能通过POST传递

Get方式只支持ASCII字符,向服务器传输的中文字符可能会乱码。POST支持标准字符集,可以正确的传递中文字符

HTTP 首部 Request

Header 解释 某度首页示例
Accept 客户端能够接受的内容类型 text/html
Accept-Encoding 浏览器可以支持的web服务器返回内容压缩编码类型 gzip
Accept-Language 浏览器可以接受的语言 zh-CN
Cache-Control 指定请求和相应遵循的缓存机制 max-age=0
Connection 表示是否需要持久连接 keep-alive
Cookie HTTP请求发送时,会把保存在请求域名下的所有cookie值一起发送给web服务器 键值对
Host 请求服务器的域名和端口号 www.baidu.com
Upgrade-Insecure-Requests 浏览器可以处理HTTPS协议 1
User-Agent 发出请求的用户信息 Mozilla/5.0

HTTP 首部 Response

Header 解释 某度首页示例
Cache-Control 告诉所有的缓存机制是否可以缓存及缓存哪种类型 private
Connection 是否保持持久连接 keep-alive
Content-Encoding 返回内容压缩编码类型 gzip
Content-type 返回内容的MIME类型 text/html charset=utf-8
Date 原始服务器消息发出时间 Wed 03 Oct2018 12:04:45 GMT
Expires 响应过期的时间 Wed 03 Oct2018 12:04:45 GMT
Server Web服务器软件名称 BWS1.1
Set-Cookie 设置浏览器缓存 BDSVRTM=114; path=/
Transfer-Encoding 文件传输编码 chunked

HTTP状态码

HTTP中状态码大致分为五大类:

100-199 信息性状态码

  • 100 continue: 收到了请求的初始部分,请客户端继续

200-299 成功状态码

  • 200 OK:请求被正常处理
  • 204 No Content: 请求被接受,但是响应报文只有首部和状态行,没有实体部分
  • 206 Partial Content: 客户端只请求了一部分的资源,服务器只针对请求的部分资源进行返回

300-399 重定向状态码

  • 301 Moved Permanently: 永久重定向
  • 302 Found: 临时重定向,资源被临时移动了
  • 303 See Other: 表示用户请求的资源代表着另一个URI,应该使用GET去获取资源
  • 304 Not Modified: 当客户端发送的请求附带条件时,服务器找到资源但未符合请求
  • 307 Temporary Redirect: 同302,临时重定向

400-499 客户端错误状态码

  • 400 Bad Request: 告知客户端它发送了一个错误的请求
  • 401 Unauthorized: 请求需进行认证
  • 403 Forbidden: 请求被服务器拒绝了
  • 404 Not Found:服务器无法找到对应资源
  • 405 Method Not Allowed:请求中带有不支持的方法

500-599 服务器错误状态码

  • 500 Internet Server Error: 服务器内部错误
  • 502 Bad GateWay: 代理或网关服务器从下一条链路收到了伪响应
  • 503 Server Unavailable: 服务器正忙
  • 504 GateWay Timeout: 一个代理网关等待另一服务器时超时了

持续性连接和非持续性连接

1. 定义

非持续连接:每个请求、相应都经一个而单独的TCP连接发送

持续连接:所有的请求相应通过相同的TCP连接发送

2. 区别

如果采用非持续连接,打开包含一个HTML文件和10个内联对象网页,HTTP需要建立11次TCP连接才能把文件从服务器传到客户机。而如果采用持续连接,HTTP建立一次TCP就把文件从服务器传到客户机

  • 每次TCP连接必需建立和断开(通过三次握手建立、四次挥手断开),这都需要占用CPU资源,这样占用客户机和服务器的CPU时间大大减少
  • 每次连接,客户端和服务器都必须分配发送和接收缓存,这意味着影响服务器和客户机的资源,着同样要占用CPU时间
  • 对于大量对象组成的文件,TCP低速启动算法会限制服务机向客户机传送对象的速度。使用HTTP/1.1后,大多数对象以最大速率传输

3. HTTP/1.0 + keep-alive

HTTP/1.1 中默认保持持久连接,但是1.0版本的HTTP需要设置 connection:keep-live

connection:keep-live 是HTTP1.0 浏览器和服务器的实验性扩展

由于HTTP是无状态协议,为了保持客户端与服务器的一些关系,便有了cookie和session

cookie是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头想客户端发送cookies, 在客户终端,浏览器解析这些cookies 并将它们保存为一个本地文件,它们在会在下一次对服务器的请求时附上这些cookies。

内容

logo

过期时间

会话cookie:若不设置过期时间,则表示这个cookie的生命周期为浏览器会话期间,若关闭浏览器,cookie就会消失。这种生命周期的cookie被称为会话cookie

持久cookie:若设置了过期时间,浏览器会把cookie存储到硬盘上(当然用户可以选择拒绝),关闭后再打开这些cookie仍然有效

2.session

session机制是一种服务端的机制,服务器利用一种类似于散列表的结构来保存信息

当程序需要为某个客户端的请求创建session时,服务器检查这个客户端是否包含了一个session标志,称为session_id, 如果检测到说明该客户曾创建过ID,服务器会把这个ID检索出来使用(或者未检测到新建一个),session_id 既不会重复也不容易被找到仿造。

session_id的储存
  1. 保存这个session_id可以采用cookie,这样交互过程中浏览器可以把这个标志返回给服务器。一般该变量名与session有关,如github的session ID即名为user_session
  2. 由于cookie可以被认为的禁止,必须有其他机制保证session_id传回服务器,经常使用的一种方法是URL重写,即直接把session_ID附在URL后面。作为路径的附加信息或查询字符
  3. 另一种技术是表单隐藏字段,服务器自动修改表单加入一个隐藏字段,便于传回session_id

3. cookie与session的区别

存取方式不同

cookie只能保存ASCII字符,Unicode及二进制数据需要编码,cookie不能直接存取java对象,存储略微复杂的信息较为艰难。而session中能够存取任何类型的数据,包括不限于string、integer、list、map,而且可以直接存取java的类对象,十分方便

隐私策略不同

cookie存储在客户端阅读器中,对客户端可见,客户端可以窥探甚至是修改cookie内容。而session存储在服务器上对用户透明,不存在泄露风险。cookie可以像googlebaidu一样将敏感信息加密后保存,在服务器上进行解密。

有效时间不同

由于session依赖于session_id的cookie,而session_id过期时间默许为-1,关闭浏览器即消失。而cookie可以设置长期的保存

服务器压力不同

由于不同的储存方式,储存在客户点的cookie不会给服务器造成压力,而session由于存在服务器上,对服务器压力较大

浏览器支持不同

cookie是需要客户端浏览器支持的,假如客户端禁用了cookie或者不支持cookie,则会话跟踪会失效。

假如客户端不支持cookie,就需要运用session及url地址重写。需要注意的是一切用到session的程序url都需要进行重写,否则session会话还是会失效

跨域支持不同

cookie支持跨域名访问,一切以相同后缀的域名均可以访问该cookie,跨域名cookie被广泛应用

session仅在当前域名有效

其他

一个web页面的请求过程

1.DHCP配置主机信息(找本机IP)

  • 主机生成一个DHCP请求报文,并将这个报文放入目的端口67和源端口68的UDP报文段中
  • 该报文段放在一个广播IP地址(255.255.255.255)和源IP地址(0.0.0.0)的IP数据报中
  • 该数据报被放在MAC帧中,目的地址FF:FF:FF:FF:FF:FF,广播到交换机连接的所有设备
  • 交换机的DHCP服务器收到广播帧后,不断向上解析得到IP、UDP、DHCP报文,之后生成DHCP的ACK报文,该报文包括 IP地址、DNS服务器IP地址、默认网关路由器的IP地址和子网掩码,再经过层层封装到MAC帧中
  • 该帧的目的地址是主机的mac地址,主机收到该帧后分解得DHCP报文,之后配置IP地址,子网掩码、DNS服务器IP地址,安装默认网关

2.ARP解析网关MAC地址(找网关MAC地址)

  • 主机通过浏览器生成一个TCP套接字,为了发送HTTP请求,需要知道网站对应的IP地址
  • 生成一个DNS查询报文,端口53(DNS服务器)
  • DNS查询报文放入目的地址为DNS服务器IP地址的IP数据报中
  • IP数据报放入一个以太网帧中,发送至网关路由器
  • DHCP过程只知道网关的IP地址,为了获取网关的MAC地址,需要用ARP协议
  • 主机生成一个目的地址为网关路由器IP的ARP查询报文,放入一个广播帧中,并发送这个以太网帧,交换机将其发送给所有的连接设备
  • 网关接收到该帧后,分解得到ARP报文,发现IP地址与自己想匹配,发送一个ACK报文回应自己的MAC地址

3.DNS解析域名(找服务器IP)

  • 知道了DNS的MAC地址后就可以继续DNS解析过程
  • 网关接收到DNS查询报文后,抽出IP数据报,并根据该表选择该转发的路由器
  • 路由器根据内部网关协议(RIP、OSPF)和外部网关协议(BGP)配置路由器到DNS的路由表项
  • 之前的DNS报文到DNS服务器后,照常依次抽出报文,在DNS库中查找解析域名
  • 找到DNS记录后发送DNS回答报文,然后将其放入UDP报文段、IP数据报,通过路由器反转发回网关路由器,经过交换机到主机

4. HTTP请求页面

  • 有了HTTP服务器的IP地址后,主机便可以生成TCP套接字,向web服务器发送HTTP get报文
  • 建立HTTP连接前需要进行TCP连接,进行三次握手,过程略
  • 建立连接后发送HTTP的GET报文,交付给HTTP服务器
  • HTTP服务器从TCP中读出报文,生成HTTP相应报文,将web页面放入HTTP报文主体中发挥主机
  • 浏览器收到HTTP相应报文后抽取WEB页面内容进行渲染,显示web页面