HTTP协议

HTTP协议应该是最常见的一个应用层协议,我们通过URL访问网页时就会用到HTTP协议。

1. HTTP请求的准备工作

HTTP协议是基于TCP协议的,所以在发送HTTP请求前,我们首先需要通过TCP三次握手建立通信连接。目前使用最广泛的HTTP1.1版本中,默认开启了Keep-Alive,这样建立的TCP连接就能在多次请求中反复使用。

2.HTTP请求的构建

建立了连接之后,就可以开始发送HTTP请求了,请求的格式如下:

image.png

HTTP的请求报文分为三部分:

第一部分:请求行

请求行中有三个部分:请求方法,URL和版本协议,他们之间用空格符分隔。

这一部分的重点是请求方法,HTTP中的请求方法主要有如下几种:

GET:获取服务器资源

POST: 向服务器传输数据

PUT: 向指定资源位置上传最新内容,但是HTTP往往是不允许上传文件的,所以PUT和POST都变成了要给服务器传输东西的方法

DELETE: 删除服务器上的资源

第二部分:首部

首部键值对的形式,中间用冒号分隔。首部中往往包含一些比较重要的信息,如:

Accept-Charset:表示客户端可以接受的字符集,防止传过来的是另外的字符,导致出现乱码

Content-Type:正文格式,如text/html, json等

Cache-Control:控制缓存

image.png


3.HTTP请求的发送

浏览器将请求通过HTTP协议封装后,将数据通过socket发往TCP层,TCP将数据切割成一个个的报文段,并将其转化为二进制流格式。TCP每发送一个报文,都会加上自己的地址(源地址)与它要去的地方(目标地址),将两个信息加入到IP头中,交给IP层进行传输。

IP层需要查看目标地址与自己是否在同一个局域网。如果是,就通过ARP协议来请求这个目标地址对应的MAC地址,然后将源MAC和目标MAC放入MAC头,然后将数据发送出去即可。如果不是,就需要先通过ARP协议获取网关的MAC地址,将源MAC和网关MAC放入MAC头,然后将数据发往网关。

网关接受到包后,发现符合MAC和自己的MAC相符,就取出目标IP,根据路由协议找到下一跳的路由器,获取下一跳路由器的MAC地址,将包发给下一跳的路由器。就这样,数据包经过层层路由器的转发,终于到达目标IP所在局域网的网关。这个网关取出目标IP后发现和自己在同一个局域网,就通过ARP协议获取目标IP的MAC,然后封装,将数据发往目标IP。

目标IP所在的服务器接收到数据包后,取下MAC头,发现MAC地址符合,就将包发送到IP层,IP层取下IP头,发现IP地址符合,然后将数据发往TCP层,TCP层解析TCP头,TCP头里有序列号,需要先看一下这个序列号是不是自己需要的,是就放入缓存并返回一个ACK,不是就丢弃。TCP头中还有端口号,HTTP服务器正在监听这个端口,于是系统就将这个包发送给HTTP服务器。HTTP服务器接受到请求后,解析请求内容,然后返回请求数据给浏览器。


4.HTTP响应的构建

HTTP响应报文格式如下:

image.png

HTTP响应中部首和实体与请求中的类似,需要注意的是状态行中的状态码:200系列表示成功处理了请求,300系列表示要完成请求,需要进一步操作,通常,这些状态码用来重定向,400系列表示请求可能出现错误,500系列表示服务器处理请求时发生内部错误。

image.png

下面附上一些比较常见的HTTP状态码:

2开头(请求成功)表示成功处理了请求的状态码。

200     成功                            服务器成功处理了请求,通常这表示服务器提供了请求的网页

201     已创建                         请求成功并且服务器创建了新的资源

202     已接受                         服务器已接受请求,但尚未处理

203     非授权信息                   服务器已成功处理了请求,但返回的信息可能来自另一来源

204     无内容                         服务器成功处理了请求,但是没有返回任何内容

205     重置内容                      服务器成功处理了请求,但没有返回任何内容

206     部分内容                      服务器成功处理了部分GET请求

3开头(请求被重定向)表示要完成请求,需要进一步操作,通常,这些状态码用来重定向

300     多种选择                      针对请求,服务器可以执行多种操作。服务器可以根据请求者(User agent)选择一项操作,或提供操作列表供请求者选择

301     永久移动                     请求的网页已永久移动到新的位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新的位置

302     临时移动                     服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

303     查看其他位置               请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。

304     未修改                        自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 

305     使用代理                     请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 

307     临时重定向                  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。


4开头(请求错误)这些状态码表示请求可能出现错误,妨碍了服务器的处理

400     错误请求                     服务器不理解请求的语法。 

401     未授权                        请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 

403     禁止                           服务器拒绝请求。

404     未找到                        服务器找不到请求的网页。

405     方法禁用                     禁用请求中指定的方法。 

406     不接受                        无法使用请求的内容特性响应请求的网页。 

407     需要代理授权              此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。

408     请求超时                     服务器等候请求时发生超时。 

409     冲突                           服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 

410     已删除                        如果请求的资源已永久删除,服务器就会返回此响应。 

411     需要有效长度              服务器不接受不含有效内容长度标头字段的请求。 

412     未满足前提条件           服务器未满足请求者在请求中设置的其中一个前提条件。 

413     请求实体过大              服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 

414     请求的 URI 过长          请求的 URI(通常为网址)过长,服务器无法处理。 

415     不支持的媒体类型        请求的格式不受请求页面的支持。 

416     请求范围不符合要求     如果页面无法提供请求的范围,则服务器会返回此状态代码。 

417     未满足期望值              服务器未满足"期望"请求标头字段的要求。

5开头(服务器错误)这些状态码表示服务器处理请求时发生内部错误,这些错误可能是服务器本身的错误,而不是请求出错

500     服务器内部错误           服务器遇到错误,无法完成请求。 

501     尚未实施                     服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 

502     错误网关                     服务器作为网关或代理,从上游服务器收到无效响应。 

503     服务不可用                  服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 

504     网关超时                     服务器作为网关或代理,但是没有及时从上游服务器收到请求。 

505     HTTP 版本不受支持     服务器不支持请求中所用的 HTTP 协议版本。

书山有路勤为径 学海无涯苦作舟