HTTP请求

HTTP请求和响应

请求报文

  • 组成:
    请求行(request line)
    请求头部 ( header )
    空行
    请求数据
  • 请求报文图
    HTTP请求_第1张图片
    request.png
  • 请求行
    请求行分为三个部分:请求方法、请求地址、协议版本
    1、请求方法
    根据HTTP标准,HTTP请求可以使用多种请求方法。
    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
    方法如图所示:
    HTTP请求_第2张图片
    request-line.jpg

    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)
    如下:
    HTTP请求_第3张图片
    request-url.png

    3、协议版本
    协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
  • 请求头部
    请求头部为请求报文添加了一些附加信息,由“名:值”对组成,每行一对,名和值之间使用冒号分隔。
    请求头主要存放客户端想给服务端的附加信息。

    请求头如下:
    HTTP请求_第4张图片
    request-header.jpg

    字段解释:
请求头 说明
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
注意:
请求头部的最后会有一个空行,表示请求头部的结束,接下来为请求数据

  • 请求数据
    Get请求就没有请求数据

    如图为POST方法的请求报文
    HTTP请求_第5张图片
    request-post.jpg

HTTP响应报文

  • 组成
    状态行
    响应头部
    空行
    响应正文

    如图所示:
    HTTP请求_第6张图片
    response.png

    1、状态行
    包括:协议版本,状态码,状态码描述
    其中协议版本和请求报文一致,状态码为3位数字,如下:
    1xx:指示信息--表示请求已接收,继续处理。
    2xx:成功--表示请求已被成功接收、理解、接受

    3xx:重定向--要完成请求必须进行更进一步的操作。
    4xx:客户端错误--请求有语法错误或请求无法实现。
    5xx:服务器端错误--服务器未能实现合法的请求。
    2、响应头部
    与请求头部类似,为响应报文添加附加信息
    常见响应头如下:

响应头 说明
Server 服务器应用程序软件的名称和版本
Content-Type 响应正文的类型,是图片还是二进制字符串
Content-Language 响应正文使用的语言
Content-Encoding 响应正文使用的数据压缩格式
Content-Charset 响应正文使用的编码格式
Content-Length 响应正文长度
Date 响应的日期

3、响应数据

用于存放需要返回给客户端的数据信息
HTTP请求_第7张图片
responst-data.jpg

HTTP、Socket、TCP的区别

首先看下这三者在TCP/IP协议中的位置关系:

图片来自网络:
HTTP请求_第8张图片
HTTP-Socket-TCP.jpg

解析图片:

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的三次握手

如图:
HTTP请求_第9张图片
TCP握手.jpg

解析如下:
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、图片等)--> 浏览器对页面进行渲染呈现给用户

来自网络详情见:
http://www.jianshu.com/p/a6a63e56a203

你可能感兴趣的:(HTTP请求)