1.简介
2. URL
3. HTTP的请求报文结构
4. HTTP请求报文的常用方法
5. HTTP的响应报文结构
1.简介
0. 万维网:我们用浏览器上的网站都是万维网
1. HTTP协议定义了浏览器(万维网客户端) 怎么向万维网服务器请求万维网文档,以及万维网服务器怎,文档传给浏览器
2.HTTP 工作工程:
每个万维网站点(即网站)都有一个服务器进程,它不断监听 TCP端口80,以便发现是否有浏览器向它发出TCP连接请求,一旦监听到连接请求,并建立TCP连接后,浏览器就向服务器发出 浏览某个页面的请求,服务器接着就返回请求的页面作为响应,最后释放TCP连接。 在浏览器和服务器之间的请求和响应必须按照规定的格式和遵循一定的规则,这些格式和规则就是 HTTP协议(超文本传送协议)。注意:HTTP的报文通常都用 TCP连接传送。
即:
1. 浏览器向服务器发送TCP连接请求,并通过三次握手建立TCP连接
2. 建立TCP连接后,浏览器发送 HTTP请求报文
3. 服务器收到 HTTP请求报文后,返回HTTP 响应报文
4. 通过四次挥手释放TCP连接
5.浏览器解析 HTML 内容
2. URL(统一资源定位符)
URL的作用是: 标识互联网上某一处资源的地址。
URL的格式:
必须部分:
<协议>://<主机(也叫域名)>:<端口>/<路径>
在HTTP中,协议就是 http 协议,端口就是 80 端口。80端口是可以省略的,若再省略 <路径>,则表示URL指向因特网上的某个主页。
如:http://www.tsinghua.edu.cn 则表示清华主页
而:http://www.tsinghua.edu.cn /chn/index.html 则表示请求 清华主页下的 index.html 文本。其中 /chn/index.html 是文本所在的路径
非必须部分:
锚点部分:
‘#’ 后的部分即使锚点部分。锚点代表网络中的一个位置,就是一个网页某个位置的标识符。
比如 http://www.example.com/index.html#print ,print 就表示 当浏览器读取该URL时,会自动将print位置滚到浏览器的可视区域。就像你在网站点击一个选项后,网页自动跳到该网页的对应位置。
定义一个锚点标识符: <a name = ”print“> </a>
HTTP发送请求时,是不发送#后的东西的
比如 http://www.example.com/index.html#print 浏览器实际发出的请求是:(请求的格式下面再说)
GET /index.html HTTP/1.1
Host: www.example.com
参数部分:
从 ‘?’ 开始到 ‘#’之间的就是参数部分,若没‘#’,则从‘?’到最后。参数部分表示传给服务器的参数。参数 与 参数 之间用 ‘&’ 连接
如: http://www.example.com/index.html?id=1234&password=5678
则表示 传入两个参数, id 和 password ,id = 1234,password = 5678
3.HTTP的请求报文结构
HTTP的报文分为两类: 请求报文 和 响应报文
请求报文:
请求报文 就是浏览器想获取 URL标记的信息而 向服务器发送的报文,格式如下:
分为 :
请求行:
请求方法:常用的有 GET,表示 请求读取由 URL标识的信息
URL :要请求的信息标识
协议版本:有两个: HTTP/1.0 和 HTTP/1.1 最新的是 1.1版本
请求头部:
用来说明浏览器,服务器或报文主题的一些信息。请求头部可以有好几行,但也可以没有。在每一个请求头部行中都有 字段名和他的值,以下给出几个字段:
请求数据:
一般为空
以下给出一个请求报文例子:
在浏览器输入 http://www.example.com/index.html
发送的请求报文是:
GET /index.html HTTP/1.1
Host:www.example.com
Connection:close 告诉服务器发送完请求的文档后就可以释放连接
User-Agent:Mozilla/5.0 表明用户是用Netscape浏览器
4. HTTP请求报文的常用方法
1. GET :
请求读取由URL所标志的信息,GET是向服务器索取信息的请求,当然 GET 方法也可以用来提交数据,只是用GET方法提交的数据会被人看到。因为GET提交的请求数据会附在 URL 后,以'?'分割 URL 和传输数据(也就是参数部分)。例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。因为GET输出的数据会在地址栏显示出来,而用POST方法,地址栏不会变
2. POST :
POST是向服务器提交信息的请求,例如发表新闻评论 。传输数据时安全性比GET高
3. HEAD:
类似GET,只是返回的的响应中没有具体内容,用于获取报头
5. HTTP的响应报文结构
响应报文也分为 3 个部分:
每一个请求报文发出后,都能收到一个响应报文。
响应报文第一行是 状态行 ,
1.状态行:
状态行(包括三项内容) :即 HTTP协议版本 , 状态码 , 解释状态码的短语
状态码:(都是三位数字的)
1xx : 表示收到了信息 或者 正在进行处理
2xx : 表示成功,如接收 或者 收到了
3xx :表示重定向, 如要完成请求还需要采取进一步的行动
4xx :表示客户的差错,如请求中有错误的语法或不能完成
5xx :表示服务器的差错,如服务器失效无法完成请求
比较常见的状态行:
HTTP/1.1 202 Accepted 接收
HTTP/1.1 400 Bad Request 错误的请求
HTTP/1.1 404 Not Found 找不到
2.响应头部:
头部包含各种 字段:值
3.响应正文:
实体主体,有些响应报文不用,这是可选部分。
返回的是 HTTP要传输的内容,如图片,视频,html文件,软件程序等。
以下是一个 用工具 Fiddler 抓取的 HTTP响应报文:
HTTP/1.1 200 Connection Established //状态行
FiddlerGateway: Direct //以下都是头部
StartTime: 09:42:20.540
Connection: close
EndTime: 09:42:20.713
ClientToServerBytes: 568
ServerToClientBytes: 147
This is a CONNECT tunnel, through which encrypted HTTPS traffic flows.
To view the encrypted sessions inside this tunnel, enable the Tools > Fiddler Options > HTTPS > Decrypt HTTPS traffic option.
A SSLv3-compatible ServerHello handshake was found. Fiddler extracted the parameters below.
Version: 3.3 (TLS/1.2)
SessionID: 69 30 23 97 86 E6 3B 16 A6 87 FF 24 A5 4F E2 8A AE 45 C7 A8 30 B6 15 FA 74 04 E5 5B D5 16 BA 92
Random: 59 15 12 DD 4D D4 46 AA 5A 05 5C 52 FA B4 62 56 17 B5 F4 ED 28 C8 D1 8C B5 DB F5 05 56 14 0E 8B
Cipher: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [0xC02F]
CompressionSuite: NO_COMPRESSION [0x00]
Extensions:
ALPN http/1.1
和