HTTP请求和响应
请求报文
- 组成:
请求行(request line)
请求头部 ( header )
空行
请求数据 -
请求报文图
- 请求行
请求行分为三个部分:请求方法、请求地址、协议版本
1、请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
方法如图所示:
2、请求地址
URI Uniform Resource Identifier 统一资源标识符
URL Uniform Resource Locator 统一资源定位符
格式如下: scheme://[username:password@]HOST:port/path/to/source
http://www.baidu.com
URN Uniform Resource Name 统一资源名称
URL和URN 都属于 URI
为了方便就把URL和URI暂时都通指一个东西
URL组成:<协议>://<主机>:<端口>/<路径>
端口和路径有时可以省略(HTTP默认端口号是80)
如下:
3、协议版本
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1 -
请求头部
请求头如下:
请求头部为请求报文添加了一些附加信息,由“名:值”对组成,每行一对,名和值之间使用冒号分隔。
请求头主要存放客户端想给服务端的附加信息。
字段解释:
请求头 | 说明 |
---|---|
Host | 接受请求的服务器地址,可以是IP端口号,也可以是域名 |
User-Agent | 发送请求的应用程序名称,一般情况是浏览器,也有其他类型 |
Accept | 就是告诉服务器端,客户端接受那些MIME类型,服务端知道客户端所能接收的数据类型,如text/htm |
Accept-Language | 通知服务端可以发送的语言 |
Accept-Encoding | 通知服务端可以发送的数据压缩格式 |
Accept-Charset | 通知服务端可以发送的编码格式 |
Keep-Alive | |
Connection | 指定与连接相关的属性,如Connection:Keep-Alive |
cookie | 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端 |
If-Modified-Since | 是浏览器向服务器端询问某个资源文件如果自从什么时间修改过,那么重新发给我,这样就保证服务器端资源文件更新时,浏览器再次去请求,而不是使用缓存中的文件 |
Content-Length | body的长度,如果body为空则该字段值为0。该字段一般在POST请求中才会有。 |
Content-Type | body中的数据类型,如application/json; charset=UTF-8 |
什么是MIME(多用途互联网邮件扩展)?
是一个互联网标准,遵循以下格式:major/minor 主类型/次类型,例如:image/jpg、image/gif、text/html
注意:
请求头部的最后会有一个空行,表示请求头部的结束,接下来为请求数据
-
请求数据
如图为POST方法的请求报文
Get请求就没有请求数据
HTTP响应报文
-
组成
如图所示:
状态行
响应头部
空行
响应正文
1、状态行
包括:协议版本,状态码,状态码描述
其中协议版本和请求报文一致,状态码为3位数字,如下:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
2、响应头部
与请求头部类似,为响应报文添加附加信息
常见响应头如下:
响应头 | 说明 |
---|---|
Server | 服务器应用程序软件的名称和版本 |
Content-Type | 响应正文的类型,是图片还是二进制字符串 |
Content-Language | 响应正文使用的语言 |
Content-Encoding | 响应正文使用的数据压缩格式 |
Content-Charset | 响应正文使用的编码格式 |
Content-Length | 响应正文长度 |
Date | 响应的日期 |
3、响应数据
HTTP、Socket、TCP的区别
首先看下这三者在TCP/IP协议中的位置关系:
解析图片:
HTTP是应用层的协议,更靠近用户端;
TCP是传输层的协议;
而socket是从传输层上抽象出来的一个抽象层,本质是接口。
解疑答惑:
1、TCP连接与HTTP连接的区别
HTTP是基于TCP的,客户端往服务端发送一个HTTP请求时第一步就是要建立与服务端的TCP连接,也就是先三次握手,“你好,你好,你好”。从HTTP 1.1开始支持持久连接,也就是一次TCP连接可以发送多次的HTTP请求。
小总结:HTTP基于TCP
2、TCP连接与Socket连接的区别
socket层只是在TCP/UDP传输层上做的一个抽象接口层,因此一个socket连接可以基于TCP连接,也有可能基于UDP。
基于TCP协议的socket连接同样需要通过三次握手建立连接,是可靠的;
基于UDP协议的socket连接不需要建立连接的过程,不过对方能不能收到都会发送过去,是不可靠的,大多数的即时通讯IM都是后者。
小总结:Socket也基于TCP
3、HTTP连接与Socket连接的区别
HTTP是短连接,Socket(基于TCP协议的)是长连接。尽管HTTP1.1开始支持持久连接,但仍无法保证始终连接。而Socket连接一旦建立TCP三次握手,除非一方主动断开,否则连接状态一直保持。
HTTP连接服务端无法主动发消息,Socket连接双方请求的发送先后限制。这点就比较重要了,因为它将决定二者分别适合应用在什么场景下。
HTTP采用“请求-响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。Socket连接双方类似peer2peer的关系,一方随时可以向另一方喊话。
4、什么时候该用HTTP,什么时候该用socket
用HTTP的情况:双方不需要时刻保持连接在线,比如客户端资源的获取、文件上传等。
用Socket的情况:大部分即时通讯应用(QQ、微信)、聊天室、苹果APNs等
TCP的三次握手
如图:解析如下:
1、Client首先发送一个连接试探,这时候Client进入syn_sent状态,表示客户端等待服务器的回复。
ACK=0 表示确认号无效,
SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,
seq = x 表示Client自己的初始序号(seq = 0就代表这是第0号包),
2、Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。
TCP报文首部中的SYN 和 ACK都置1 ,
ack = x +1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到
(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq= y 表示Server自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。
3、Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
ACK 置1 表示确认号ack= y + 1有效(代表期望收到服务器的第1个包),
Client自己的序号seq= x +1(表示这就是我的第1个包,相对于第0个包来说的)
浏览器地址栏输入url,看到页面的过程
域名解析--> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 -->服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)--> 浏览器对页面进行渲染呈现给用户