HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型,它是一个无状态的协议。
在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于 TCP 协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。HTTP默认的端口号为 80,HTTPS的端口号为 443。
无状态协议
协议的状态是指下一次传输可以 “记住” 这次传输信息的能力。
http 不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存。
比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
由于 Web 服务器要面对很多浏览器的并发访问,为了提高 Web 服务器对并发访问的处理能力,在设计 HTTP 协议时规定 Web 服务器发送 HTTP 应答报文和文档时,不保存发出请求的 Web 浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二期服务请求。由于 Web 服务器不保存发送请求的 Web 浏览器进程的任何信息,因此 HTTP 协议属于无状态协议(Stateless Protocol)。
Connection: keep-alive?HTTP 协议是无状态的和 Connection: keep-alive 的区别:
HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议(无连接)。
从 HTTP/1.1 起,默认都开启了 Keep-Alive,保持连接特性,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。
TCP 传输层协议
HTTP 是基于传输层的 TCP 协议,而 TCP 是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以 HTTP 在开始传输之前,首先需要建立 TCP 连接,而 TCP 连接的过程需要所谓的 “三次握手”。
三次握手浏览器向服务器发出连接请求
服务器响应浏览器的连接请求,并要求确认
浏览器回应服务器的确认,连接成功
在 TCP 三次握手之后,建立了 TCP 连接,此时 HTTP 就可以进行传输了。一个重要的概念是面向连接,既 HTTP 在传输完成之间并不断开 TCP 连接。在 HTTP1.1 中 (通过 Connection 头设置) 这是默认行为。
请求数据浏览器发起请求
服务器确认
服务器发送数据
浏览器确认
请求信息
发出的请求信息格式如下:
● 请求行,例如 GET /images/logo.gif HTTP/1.1,表示请求/images/logo.gif 这个文件。
● 请求头,例如 Accept-Language: en
● 空行
● 可选的消息体 请求行和标题必须以作为结尾(也就是,回车然后换行)。空行内必须只有而无其他空格。在 HTTP/1.1 协议中,所有的请求头,除 post 外,都是可选的。
三个部分分别是:请求行、消息报头、请求正文。
响应消息
客户端向服务器发送一个请求,服务器以一个状态行作为响应,响应的内容包括:消息协议的版本、成功或者错误编码、服务器信息、实体元信息以及必要的实体内容。根据响应类别的类别,服务器响应里可以含实体内容,但不是所有的响应都有实体内容。
响应头第一行也称为状态行,格式如下(下图中红线标出的那行):
HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF
HTTP- Version 表示 HTTP 版本,例如为 HTTP/1.1。Status- Code 是结果代码,用三个数字表示。Reason-Phrase 是个简单的文本描述,解释 Status-Code 的具体原因。Status-Code 用于机器自动识别,Reason-Phrase 用于人工理解。Status-Code 的第一个数字代表响应类别,可能取 5 个不同的值。后两个数字没有分类作用。Status-Code 的第一个数字代表响应的类别,后续两位描述在该类响应下发生的具体状况。
响应消息的结构:
三个部分分别是:状态行、消息报头、响应正文。
Http 请求 7 个步骤
HTTP 通信机制是在一次完整的 HTTP 通信过程中,Web 浏览器与 Web 服务器之间将完成下列 7 个步骤:
建立 TCP 连接
在 HTTP 工作开始之前,Web 浏览器首先要通过网络与 Web 服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是 80
Web 浏览器向 Web 服务器发送请求命令 (发送请求行)
一旦建立了 TCP 连接,Web 浏览器就会向 Web 服务器发送请求命令
例如:GET/sample/hello.jsp HTTP/1.1
Web 浏览器发送请求头信息 (发送请求头)
浏览器发送其请求命令之后,还要以头信息的形式向 Web 服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
Web 服务器应答 (响应状态行)
客户机向服务器发出请求后,服务器会客户机回送应答,
HTTP/1.1 200 OK
应答的第一部分是协议的版本号和应答状态码
Web 服务器发送应答头信息 (响应消息报头)
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
Web 服务器向浏览器发送数据
Web 服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 应答头信息所描述的格式发送用户所请求的实际数据
Web 服务器关闭 TCP 连接
一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接。
如果浏览器或者服务器在其头信息加入了 keep-alive,则不会立即关闭连接!
HTTPS 传输协议原理
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容请看 SSL。
两种基本的加解密算法类型
对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有 DES、AES 等。
非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有 RSA、DSA 等。
HTTPS 通信过程
HTTPS 通信的优点
客户端产生的密钥只有客户端和服务器端能得到;
加密的数据只有客户端和服务器端才能得到明文;
客户端到服务端的通信是安全的。
Link