HTTP请求与HTTP响应详解

HTTP请求完整步骤

先简单的使用curl命令来发出请求,在命令行观察一次HTT请求和响应的步骤~

  1. DNS域名解析

    在上一篇《浅析URL》中已经学习了解了DNS域名系统,这一步就是将域名解析成对应的服务器IP地址

  2. 建立TCP连接

    TCP 位于传输层,提供可靠的字节流服务。字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。简单来说,TCP协议为了更容易传输大数据将其切割,并且还能确认数据完整无误的传送给了对方。

    TCP采用三次握手策略来保证数据传输的可靠性。握手过程中使用了 TCP 的标志 —— SYN(synchronize) 和 ACK(acknowledgement),下图是TCP三次握手的图解:(来自于《HTTP图解》)

  3. 发送HTTP请求

    通过TCP协议与服务器建立连之后,就可以向服务器发起请求了~客户端发出请求报文,请求报文包含报文首部、空行和报文主体。其中,最重要的就是报文首部!报文首部中的请求行包括请求方法、用于定位资源的URI、HTTP版本。首部字段传递重要信息,包括请求首部字段、通用首部字段和实体首部字段。

  1. 服务器处理请求

    HTTP服务器接收到请求报文后,就会开始解析报文,分析客户端想要获取到的资源,然后开始调度服务器资源来响应客户端的请求。

  2. 返回响应结果

    服务器发出响应报文来响应请求,响应和请求报文的结构相似,包含报文首部、空行和报文主体。报文首部中的状态行包含表明响应结果的状态码,原因短语和 HTTP 版本。首部字段,包括响应首部字段、通用首部字段和实体首部字段。

  3. 关闭TCP连接

    为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方都可以发起关闭请求。与创建TCP连接的3次握手类似,关闭TCP连接,需要4次握手。

    NOW,借用HTTP图解中的图来回顾以下

HTTP请求报文

题外话:看了《HTTP图解》后,其中的报文首部、报文主体和我们常说的请求行、请求头、请求体、状态行、响应头、响应体有点混淆,用一个表格来对应他们的关系吧~

在《HTTP图解》中,对请求报文的各个部分都有详细的解读,本人详见印象笔记的记录,本博客只对重要常用的点做出记录。

请求行

包含用于请求的方法,请求 URI 和 HTTP 版本

GET  /  HTTP/1.1
  • 请求的方法

    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

    Attention: 方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。

请求头

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔,key:value。

请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

请求头 说明
Content-Type 是返回消息中非常重要的内容,表示后面的文档属于什么MIME类型。
Host 指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。
Accept 浏览器可接受的MIME类型
User-Agent 用户代理,浏览器类型
Connection 表示是否需要持久连接

补充 :

常见的MIME类型如下:

  • text/html : HTML格式 text/plain :纯文本格式 text/xml : XML格式
  • image/gif:gif图片格式 image/jpeg :jpg图片格式 image/png:png图片格式

以application开头的媒体格式类型:

  • application/xhtml+xml :XHTML格式 application/xml : XML数据格式
  • application/atom+xml:Atom XML聚合格式 application/json : JSON数据格式
  • application/pdf :pdf格式 application/msword : Word文档格式
  • application/octet-stream: 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded
    中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

请求体

请求数据不在GET方法中使用,而是在POST方法中使用,POST的数据就放在请求体中。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

HTTP响应报文

状态行

由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔

HTTP/1.1 200 OK 

HTTP状态码:图片来自与网络

面试时常考304,详见博客:304

响应头

和请求头相似,由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔,key:value。常见的响应头:

响应头 说明
Location Location响应报头域用于重定向接受者到一个新的位置
Server Server响应报头域包含了服务器用来处理请求的软件信息,它和User-Agent请求报头域是相对应的
WWW-Authenticate WWW-Authenticate响应报头域必须被包含在*401(未授权的)*响应消息中
Content-Type Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型
Last-Modified Last-Modified实体报头域用于指示资源最后的修改日期及时间

空行

发送回车符和换行符,通知客户端以下不再有响应头。

响应体

响应体就是服务器返回的数据,如HTML页面,json数据等等。

阿里云服务器部署

  1. 在github上新建repo上传Node.js代码。

  2. 在xshell远程连接阿里云服务器并新建用户

    adduser -m hy   //新建用户
    passwd hy
    
  3. 登录新用户

    ssh hy@1XX.92.1XX.XX
    
  4. 在centos中安装node和git(使用sudo来给hy用户安装权限)

    参考博客如何在CentOS上安装Node.js?超简单!3分钟搞定。

    centos上安装git服务

  5. 把github上的node.js代码下载到服务器

    git clone https://github.com/heeeyueee/nodedemo.git
    
  6. 部署应用

    cd nodedemo
    touch log
    启动命令:node server.js 8888 > log 2>&1 &
    把启动命令做成 start 文件
    添加执行权限 chmod +x ./start
    运行 sh ./start 得到一个进程号 pid
    tail log 看 log 内容
    kill -9 pid 可以关掉进程
    killall node 可以关掉所有 node 进程
    
  7. 重启应用

    ssh hy@实例ip
    cd nodedemo
    git pull
    killall node
    sh ./start