HTTP

HTTP代表超文本传输协议。

它是 www 组织设计的通信协议。

HTTP 是设计在应用层的协议。

HTTP通信基于超文本数据格式。超文本基本上是在包含引用(作为超链接)到其他资源的设备上显示的文本。

HTTP使用客户端 - 服务器模型。HTTP客户端打开连接并向HTTP服务器发送请求消息,然后服务器返回响应消息,通常包含所请求的资源。发送响应后,服务器将关闭连接。

一个响应对应一个请求使的HTTP成为无状态协议。也就是说,服务器不会在每个请求/响应事务之间保留连接信息。

请求/响应消息(通常称为HTTP消息)遵循标准格式。

事务

一个HTTP事务由一条请求和一个响应结果组成。这种通信是通过HTTP报文的格式化数据块进行的,请求生成请求报文,响应生成响应报文。请求包含请求方法,响应包含响应状态码。

报文

HTTP报文是都一行行的简单字符串组成的,HTTP报文都是纯文本的。如图:一个简单HTTP事务使用的HTTP报文:

HTTP报文由三部分组成:

  • 起始行:报文的第一行就是起始行,请求报文用来说明要做些什么,响应报文说明出现了什么情况。
  • 首部字段:起始行后有一个或多个首部字段,每个首部字段都包含一个键和一个值,两者之间使用:进行分割。
  • 主体:报文主体,请求主体包含了要发送给Web服务器的数据,响应主体装载了要返回给客户端的数据。主体可以是任意的二进制数据,也可以是文本。

平常说的请求头包含了起始行和请求首部字段,响应头包含了起始行和响应首部字段。

HTTP请求

HTTP请求报文由3部分组成:请求行+请求头+空行+请求体。如下:

请求行

由请求方法、请求URI、请求协议及版本组成了请求行。

请求头

Accept

用来告知服务器,客户端可以处理的内容类型,内容类型用MIME类型来表示。服务器可以从诸多备选项中选择一项进行应用,使用Contnet-Type响应头通知客户端它的选择。

语法
1
2
3
4
5
6
Accept: <MIME_type>/<MIME_subtype>
Accept: <MIME_type>/*
Accept: */*

// Multiple types, weighted with the quality value syntax:
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
指令
1
2
3
4
5
<MIME_type>/<MIME_subtype>:单一精确的 MIME 类型, 例如text/html
<MIME_type>/* :一类 MIME 类型, 但是没有指明子类
*/* :任意类型的 MIME 类型

;q= :权重
示例
1
2
3
Accept: text/html
Accept: image/*
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8

Keep-Alive

是一个通用的消息头,允许消息的发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。

需要将Connection的值设置为“keep-alive”这个消息头才有意义。在HTTP/2.0协议中,ConnectionKeep-Alive被忽略,采用其他机制来管理连接。

指令
1
2
timeout:一个空闲连接保持打开状态的最小时长,以秒为单位
max :在连接关闭前,此连接可以发送的请求的最大值。
示例
1
Keep-Alive: timeout=5, max=1000

Connection

决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,表示一个长连接,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

Content-Type

告诉服务器实际发送的数据类型。

语法
1
2
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
指令
1
2
3
media-type :MIME类型
charset :字符编码标准
boundary :包括来自一组字符的1到70个字符,用于封装消息的多个部分的边界

Accept-Encoding

告诉服务器客户端可以理解的内容编码方式。服务器会选择一个客户端提议的方式,并在响应头通过Content-Encoding通知客户端它的选择。

Content-Encoding

对特定媒体类型的数据进行压缩。它的值表示消息主体进行了何种方式的内容编码转换。

Content-Length

用来指明发送给接收方的消息体的大小,用十进制数字表示的八位字节的数目。

Accept-Language

告诉服务器客户端可以理解的自然语言。服务器可以使用Content-Language响应头通知客户端它的选择。浏览器会基于用户界面语言来为这个请求头设置合适的值,用户尽量不要去修改它。


Host

指明了服务器的域名以及服务器监听的TCP端口号。如果没有给定端口号,会自动使用被请求服务器的默认端口。HTTP/1.1所有请求头中必须包含一个HOST头字段,若缺少或超出一个HOST头字段,会返回一个400的状态码。

Referer

表示当前请求页面的来源页面地址

User-Agent

标识发起请求的客户端软件应用类型、操作系统、软件开发商以及版本号。

语法
1
Referer: <url>

Cache-Control

用于在http 请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的, 这意味着在请求设置的指令,在响应中不一定包含相同的指令。

HTTP响应

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP响应头

Allow

服务器支持哪些请求方法(如GET、POST等)。

Server

服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。

Expires

应该在什么时候认为文档已经过期,从而不再缓存它。

Refresh

表示浏览器应该在多少时间之后刷新文档,以秒计。

设置和页面关联的Cookie。

Content-Type

告诉客户端实际返回的内容的内容类型。

Content-Encoding

用来告知客户端应该如何解码才能获取在Content-Type中标示的媒体类型。

版本

原始版本是HTTP/0.9,然后更高版本的HTTP/1.0和HTTP/1.1扩展了原始协议。

HTTP/0.9:它被设计为仅处理超文本文档。请求如下所示:

1
GET /

HTTP/1.0:此版本详细定义了它应如何用于客户端请求和服务器响应。它介绍了http请求方法GET,POST和HEAD方法。它还处理了许多类型的不同媒体。它支持通过标头进行缓存。HTTP/1.0请求如下所示:

1
GET / HTTP/1.0

HTTP/1.1: 此版本需要具有HOST标头。这个标头非常有用,它允许通过代理服务器路由一个消息,也可以让Web服务器区分同一服务器上的不同站点。它在同一HTTP连接上支持多个请求/响应。它还引入了新方法:OPTIONS,PUT,DELETE,TRACE和CONNECT。

1
2
GET / HTTP/1.1
Host: www.example.com

HTTP/2.0: 它在2015年发布。它减少了延迟以提高页面加载速度,支持服务器推送,改进了标头,可以在同一TCP连接上快速连续发送多个请求。

uri/url

每个Web服务器资源都有一个名字,服务器资源名称被称为统一资源标识符(URI,I,Identifier),在世界范围唯一标识并定位信息资源。如:http://solverpeng.com/images/MySQL索引/myisam.png 就是solverpengWeb服务器上的一个图片资源的URI。

URL(统一资源定位符),是URI最常见的形式。用来描述一台特定服务器上某资源的特定位置以及如何去访问它。大部分URL都遵循一种标准格式,这个格式包含三部分:

  • 第一部分是scheme(方案),说明了访问资源所使用的协议类型。这部分通常就是HTTP协议(http://)
  • 第二部分给出了服务器的internet地址,如:solverpeng.com
  • 其余部分指定了Web服务器上的某个资源,如:/images/MySQL索引/myisam.png

现在,几乎所有的URI都是URL。

TCP协议三次握手四次挥手

3次握手

建立连接的过程类比于打电话,拨通电话之后,A向B说,“喂”,然后B回复,“喂,能听到么”,然后A回复,“能”..接下来就是balabala打电话。
TCP的第一次握手:当客户端向服务器发送连接请求时,客户端会发送同步序列号syn到服务器端,等待服务器确认,这时客户端的状态为syn_send。
TCP的第二次握手:当服务器收到客户端发送的syn后,服务器要做的是确认客户端发送过来的syn,服务器向客户端发送确认包ack,意思是我收到你发送的syn了,同时,服务器也会向客户端发送一个syn包,此时服务器的状态为syn_recv。
TCP的第三次握手:客户端收到服务器端发送的syn和ack后,需要向服务器发送ack确认包,意思是我也收到你发送的syn了。发送完毕后,客户端和服务器端的状态为ESTABLISH,即TCP连接成功。

在三次握手中,客户端和服务器端都发送了两个包syn和ack,只不过服务器端的两个包是一次性发送过来的,客户端是分两次发送的。如图:

4次挥手

断开TCP连接需要4次挥手,断开连接请求可由客户端发起,也可以由服务端发起,这里我们由A端向B端发起断开请求。
第一次挥手:A端向B端发送一个带有fin标记的报文段。
第二次挥手:B端收到A端发送的fin后,B端可能数据传输没有完成,所以B端不会马上向A端发送fin,而是先发送一个确认号ack。
第三次挥手:当B端数据传输完成,就可以向A端发送fin序号,意思可以断开连接了。
第四次挥手:A端收到B端发送的fin后,会向B端发送ack确认号,经过两个MSL时长后断开连接。

MSL:maximum segment lifetime,最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。

两次握手可以么?

TCP连接时是三次握手,那么两次可以么?
client发出第一个连接请求报文段没有丢失,而是在某个网络节点长时间的滞留,以致延误到连接释放后的某个时间才到达server。本来这是一段早已失效的报文段,但是server收到此失效的连接报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同一建立连接。假设不采用“三次握手”,只要server发出确认,新的连接就建立了,会造成资源的浪费,而通过三次握手,可以确保TCP连接的正确性。

TCP连接是3次,断开却是4次?

TCP连接中,服务端的syn和ack向客户端发送是一次性发送的,而断开连接的过程中,B端向A端发送的ack和fin是分两次发送的。

2个MSL怎么解释?

MSL,最大报文段生成时间。假定网络情况不可靠,那么第四次发送的ack可能会丢失,即B端无法收到这个ack,若B端收不到这个ack,B端会定时向A端重复发送fin,直到B端收到A的ack。所以2个MSL用来处理这个可能丢失的ack的。

Http和Https

HTTPS是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。

HTTPS和HTTP的区别

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
  • HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
  • HTTP和HTTPS使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
0%