HTTP请求与HTTP响应详解
HTTP请求完整步骤
先简单的使用curl
命令来发出请求,在命令行观察一次HTT请求和响应的步骤~
-
DNS域名解析
在上一篇《浅析URL》中已经学习了解了DNS域名系统,这一步就是将域名解析成对应的服务器IP地址
-
建立TCP连接
TCP 位于传输层,提供可靠的字节流服务。字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。简单来说,TCP协议为了更容易传输大数据将其切割,并且还能确认数据完整无误的传送给了对方。
TCP采用三次握手策略来保证数据传输的可靠性。握手过程中使用了 TCP 的标志 —— SYN(synchronize) 和 ACK(acknowledgement),下图是TCP三次握手的图解:(来自于《HTTP图解》)
-
发送HTTP请求
通过TCP协议与服务器建立连之后,就可以向服务器发起请求了~客户端发出请求报文,请求报文包含报文首部、空行和报文主体。其中,最重要的就是报文首部!报文首部中的请求行包括请求方法、用于定位资源的URI、HTTP版本。首部字段传递重要信息,包括请求首部字段、通用首部字段和实体首部字段。
-
服务器处理请求
HTTP服务器接收到请求报文后,就会开始解析报文,分析客户端想要获取到的资源,然后开始调度服务器资源来响应客户端的请求。
-
返回响应结果
服务器发出响应报文来响应请求,响应和请求报文的结构相似,包含报文首部、空行和报文主体。报文首部中的状态行包含表明响应结果的状态码,原因短语和 HTTP 版本。首部字段,包括响应首部字段、通用首部字段和实体首部字段。
-
关闭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
:
另外一种常见的媒体格式是上传文件之时使用的:
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数据等等。
阿里云服务器部署
-
在github上新建repo上传Node.js代码。
-
在xshell远程连接阿里云服务器并新建用户
adduser -m hy //新建用户 passwd hy
-
登录新用户
ssh hy@1XX.92.1XX.XX
-
在centos中安装node和git(使用sudo来给hy用户安装权限)
-
把github上的node.js代码下载到服务器
git clone https://github.com/heeeyueee/nodedemo.git
-
部署应用
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 进程
-
重启应用
ssh hy@实例ip cd nodedemo git pull killall node sh ./start