HTTP协议

(1)什么是HTTP协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种网络传输协议。它基于TCP/IP通信协议来传递数据,数据报括HTML、图片、查询结果等等。
HTTP协议工作在客户端-服务端结构上;
客户端
一般将用户浏览器作为HTTP客户端。浏览器通过URL向HTTP服务端发送请求。
服务端
HTTP服务端也就是WEB服务端,包括Apache服务器、IIS服务器等。
WEB服务端收到客户请求后,回复响应。浏览器展示服务端响应内容,例如HTML页面,文件、图片等等。
由于是WEB服务端,因此HTTP默认端口为80.

(2)HTTP协议的特点

HTTP协议是一种应用层的协议,不关注通信细节。底层的传递依靠TCP/IP协议来实现。
HTTP协议有三个特点:

  1. 无连接:无连接即每次连接限制只处理一个请求。服务器处理完客户请求后,并收到客户应答后,就断开连接。
  2. 媒体独立:只要客户端和服务端知道如何处理数据内容,可以通过HTTP发送任何类型的数据。通过MIME-type来指定内容的类型;
  3. 无状态:无状态是指,HTTP协议对于事务处理没有记忆能力。这意味着如果后续处理需要前面的信息,就必须重传。

(3)HTTP报文

URL

首先理解URL(UniformResourceLocator,统一资源定位符)。
URL是用来唯一标志网上每一个信息资源的地址。
URL由三部分组成:

  • 资源类型
  • 存放资源的主机域名
  • 资源文件名

也可以认为由4个部分组成:

  • 协议
  • 主机
  • 端口
  • 路径

URL的一般语法结构如下,[ ]中为可选项:

protocol://hostname[:port]/path/[:parameters][? query]#fragment

举例说明
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

  • protocol:指定使用的传输协议,包括HTTP、FTP、HTTPS等等,格式如下。
    HTTP:http://
    FTP:ftp://
    HTTPS:https://
  • hostname:主机名。指存放资源的服务器的域名系统(DNS)或IP地址。例子中为www.aspxfans.com
  • port:可选参数,省略时采用各种协议的默认参数。例子中为8080
  • path:主机上的一个目录或文件地址。包括虚拟路径+文件名。例子中虚拟路径为/news/,文件名为index.asp。
  • ?query:请求参数。用来指明搜索的内容,可以指定多个参数,中间用&分割。例子中为:?boardID=5&ID=24618&page=1
  • #fragment:锚部分,可选参数。

HTTP请求报文Request

报文格式及实例

客户端发送一个请求到服务器192.168.3.1时,传送一个HTTP Request。
报文如下:

Hypertext Transfer Protocol
    GET /html/index.html HTTP/1.1\r\n
    Host: 192.168.3.1\r\n
    Connection: keep-alive\r\n
    Cache-Control: max-age=0\r\n
    Upgrade-Insecure-Requests: 1\r\n
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36\r\n
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
    Accept-Encoding: gzip, deflate\r\n
    Accept-Language: zh-CN,zh;q=0.9\r\n
    Cookie: SessionID_R3=EKC1uzZT6PWojUfYpNu8LF7v2RNXizk3AtuYAQPRCPXn0LAh8K0PfbpBKGsSy4tyldLehmwhfs00GVNYwNTsQ7X76Nuye0LOP2qhvINiyF6RPFE9i9QHe7ZUOSTzsv6k\r\n
    \r\n

可以看到。一个请求报文分为四个部分:

  • 请求行(request line):用来说明请求类型,要访问的资源和所使用的HTTP版本。
  • 请求头部(header):用来说明服务器要使用的附加信息。例如HOST请求目的地;User-Agent用于浏览器类型检测等等。
  • 空行(CRLF):请求头部后面必须加换行。
  • 请求数据:GET方法不需要请求数据。如果是POST方法,一般需要附加其他提交给服务器的信息。

请求方法

HTTP1.0定义了三种方法:GET、POST和HEAD方法;
HTTP1.1新增了:OPTIONS、PUT、DELETE、TRACE和CONNECT方法

  • GET:请求某个资源
  • POST:向指定资源提交数据进行处理请求,例如表单或上传文件,数据包含在请求体中。
  • HEAD:只要求得到GET返回结果的首部部分。类似GET,但不是得到实际资源,会得到一些关于资源的信息。
  • TRACE:要求请求消息回送,客户可以看到服务器接收到了什么,用来测试排错。
  • PUT:从客户端向服务器传送的数据取代指定的文档的内容
  • DELETE:删掉url上的某个东西
  • OPTIONS:允许客户端查看服务器的性能
  • CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

其中GET、HEAD、PUT都是幂等的,POST不是幂等。
所谓幂等,是指一次请求与多次请求,资源的状态都是一定的。
POST不是幂等的,POST所提交的数据可能用于不可逆的事务。

GET和POST的区别

GET的HTTP报文

GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

POST的HTTP报文

POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

可以看到几个区别:

1、提交数据的差别:

  • GET提交的数据跟随在URL中,在HTTP请求行中,以?分割URL和数据,多个不同参数之间用&隔开。
    例如:sex=man&name=Professional
  • POST提交的数据在实体主体中,以请求数据的形式给出。
    例如:name=Professional%20Ajax&publisher=Wiley

2、地址栏的区别:

  • GET的请求数据在地址栏中可以看到(URL)
  • POST的请求数据看不到,被隐藏。

3、传输数据的大小:

  • 实际开发中,特定浏览器对URL的长度有限制,因此一般不能传输大量数据
  • POST的数据长度没有要求,但是实际开发中,不同WEB服务器对数据长度也有限制。

4、安全性:POST>GET

HTTP响应Response

报文格式及实例

服务器收到客户端你的GETHTTP后,回复一个Response,报文如下:

Hypertext Transfer Protocol
    HTTP/1.1 200 OK\r\n
    Set-Cookie: SessionID_R3=IEcSKTYCC2n58N657PB3CMu00svNwoCNK8xFNcwq3Ie10FXAAw1jyxAmzIacb8V001s4qv2P36w16vuxGSBQgIesuiynCvM0NtHmRE9mxj1PKhg4nzGHYIujBUV4b0CM; path=/; HttpOnly;\r\n
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate\r\n
    Pragma: no-cache\r\n
    Content-Type: text/html; charset=utf-8\r\n
    X-Download-Options: noopen\r\n
    X-Frame-Options: SAMEORIGIN\r\n
    X-XSS-Protection: 1; mode=block\r\n
    Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval'\r\n
    X-Content-Type-Options: nosniff\r\n
    Date: Mon, 20 Jul 2020 07:25:53 GMT\r\n
    Connection: Keep-Alive\r\n
    Content-Language: en\r\n
    Content-Length: 5802\r\n
    \r\n
    [HTTP response 1/6]
    [Time since request: 0.638637000 seconds]
    [Request in frame: 66]
    [Next request in frame: 79]
    [Next response in frame: 87]
    [Request URI: http://192.168.3.1/html/index.html]
    File Data: 5802 bytes
Line-based text data: text/html (94 lines)
    <!DOCTYPE html>\r\n
    <html lang="en">\r\n
    <head>\r\n
    ……(中间的省略)
    </html>\r\n

可以看到,一个HTTP响应报文四个部分:

  • 状态行::由HTTP版本号(HTTP/1.1),状态码(200),状态消息(ok)加回车换行构成构成;
  • **消息报头:**用来说明客户端要使用的一些附加信息。以键值对的形式给出。例如Date;Content-Type
  • **空行:**必须要加
  • **响应正文:**服务端返回给客户端的文本信息,例如HTML。

HTTP状态码

状态码分类

状态码由三位数字构成,用于表示服务器对于请求的处理结果。

  • 1xx:指示信息——表示请求已经接收,继续处理
  • 2xx:成功——表示请求已经被成功接收,理解和接受
  • 3xx;重定向——要完成请求必须进行重定向操作
  • 4xx:客户端错误——请求语法错误或请求无法实现
  • 5xx:服务器错误——服务器未能实现合法的请求
常见状态码
  • 200 OK :客户端请求成功
  • 400 Bad Request :客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized :请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403 Forbidden :服务器收到请求,但是拒绝提供服务
  • 404 Not Found :请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error :服务器发生不可预期的错误
  • 503 Server Unavailable :服务器当前不能处理客户端的请求,一段时间后可能恢复正常

MIME type

MIME即因特网多媒体邮件扩展。MIME type用来标示内容是什么格式。通过该标签,告诉浏览器或者server如何解析该数据
HTTP的请求和响应都含有一个MIME Type字段。显示在消息报头的Content-Type键后。
例如例子中的:Content-Type: text/html; charset=utf-8\r\n
常用的MIME type有:
在这里插入图片描述

(4)HTTP请求响应流程

流程

  1. 域名解析(DNS解析)
  2. 发起TCP连接
    三次握手后与服务器的HTTP端口建立套接字连接
  3. 发起HTTP请求Request
    通过TCP套接字,向WEB服务器发送一个文本的请求报文
  4. 服务器返回HTTP响应Response
    WEB服务器解析客户请求,定位请求资源。服务器将资源副本写到TCP套接字。
  5. 释放连接
    根据connection模式选择断开方式。如果connect:close,则服务器主动关闭TCP连接;如果模式为connect:keepalive,则保持一段时间连接,连接器件可以继续接收请求。
  6. 浏览器得到html代码
    浏览器首先解析状态行,查看请求是否成功。然后解析每一个响应头。
  7. 浏览器解析html文件,渲染呈现给客户。
  8. 获取资源:在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。这些文件就包括CSS/JS/图片等资源,这些资源的地址都要经历一个和HTML读取类似的过程。所以浏览器会在DNS中查找这些域名,发送请求,重定向等等…

在这里插入图片描述

抓包流程

在这里插入图片描述

封装过程

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值