HTTP 协议

HTTP 基本概念

HTTP,全称为 HyperText Transfer Protocol,即为超文本传输协议。是互联网应用最为广泛的一种网络协议,所有的 www 文件都必须遵守这个标准。HTTP 一般构建于 TCP/IP 协议之上,默认端口号是 80。

HTTP 定义了客户端与服务器交互的一些方式,如 GET,POST,PUT, DELETE。分别对应着查询,修改,增添,删除。

HTTP REQUEST

HTTP REQUEST由状态行,请求头(Request Header),请求正文组成:

  • 状态行由请求方式,路径、协议等构成,各元素之间以空格分隔。
  • 请求头提供一些参数比如:Cookie,用户代理信息,主机名等等。
  • 请求正文就放一些发送的数据,一般 GET 请求会将参数放在 URL 中,也就是在请求头中而请求正文一般为空,而 POST 请求将参数放在请求正文中。请求正文可以传一些 json 数据或者字符串等等。

GET 一般用于信息获取,比如刚才我们浏览百度首页,其使用的就是GET方法。

GET 请求一般不会产生副作用,它仅仅只是获取资源信息,就像数据库查询一样,不会修改、增加数据,不会影响资源的状态,并且对同一个 URL 的多次GET请求应该返回相同的结果。

而 POST 请求表示可能会修改服务器上的资源。

HTTP RESPONSE

HTTP RESPONSE是服务器在客户端发送 HTTP 请求后经过一些处理而做出的响应,HTTP 响应和 HTTP 请求相似,也是由三个部分构成。分别是:状态行,响应头(Response Header),响应正文。

HTTP 响应中包含一个状态码,用来表示服务器对客户端响应的结果。

状态码一般由3位构成:

  • 1xx : 表示请求已经接受了,继续处理。
  • 2xx : 表示请求已经处理掉了。
  • 3xx : 重定向。
  • 4xx : 一般表示客户端有错误,请求无法实现。
  • 5xx : 一般为服务器端的错误。

比如常见的状态码:

  • 200 OK 客户端请求成功。
  • 301 Moved Permanently 请求永久重定向。
  • 302 Moved Temporarily 请求临时重定向。
  • 304 Not Modified 文件未修改,可以直接使用缓存的文件。
  • 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized 请求未经授权,无法访问。
  • 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。
  • 404 Not Found 请求的资源不存在,比如输入了错误的URL。
  • 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
  • 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

HTTP 请求头

Accept:指定客户端能够接收的内容类型,如常见的 text/html 等,最后返回的百度首页也是个 HTML 文件。

  • Accept-Encoding:表示浏览器有能力解码的编码类型。
gzip是 GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式。

deflate是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
  • Accept-Language:表示浏览器所支持的语言类型。(这里指中文、简体中文和英文)
  • Cache-Control:指定请求和响应遵循的缓存机制。(这里表示不需要缓存)
  • Connection:表示是否需要持久连接。(HTTP 1.1 默认进行持久连接即为 keep-alive, HTTP 1.0 则默认为 close)
  • Cookie:用于会话追踪,在本文后面就继续介绍。
  • Host:表示请求的服务器网址
  • User-Agent:用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

还有另外还有一些常见的请求头:

  • Content-Length: 请求的内容长度
  • Referer: 先前访问的网页的地址,当前请求网页紧随其后,说明你是先前是从哪个网址点击访问到该页面的,如果没有则不填。
  • Content-Type:内容的类型,GET 请求无该字段,POST 请求中常见的有 application/x-www-form-urlencoded 为普通的表单提交,还有文件上传为 multipart/form-data

HTTP工作流程

HTTP是一个无状态的协议。所谓的无状态指的是客户端(Web浏览器)和服务器之间不需要建立持久的连接。这也就意味着当一个客户端向服务器发出请求,然后服务器返回响应之后,连接也就关闭了。服务器并不会保留连接的相关信息,HTTP遵循的是请求(Request)/应答(Response)模型。客户端(Web浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有的HTTP连接都被构造成一套请求和应答。在这个过程中要经历4个阶段,包括建立连接、发送请求信息、发送响应信息和关闭连接,如下图所示:

由上图可知,HTTP的工作流程为:
1、客户端通过TCP的三次握手建立与服务器的连接。
2、当TCP连接成功建立后,客户端向服务器发送HTTP请求。
3、服务器收到客户端的HTTP请求后,将回复响应数据包,并向客户端发送数据。
4、客户端通过TCP四次握手,与服务器断开TCP连接。

HTTP数据包的捕获

刚才说了,HTTP需要使用TCP的三次握手来建立连接,那么我们在使用Wireshark进行数据包的捕获时,需要在筛选条件中加上TCP这个筛选条件。我们的目标是捕获到使用HTTP浏览网页的数据包。那么当我们开启捕获后,就可以打开浏览器,尝试浏览www.baidu.com网站,就可以获取与HTTP连接相关的一系列数据包。

由于浏览网页会使用GET方法,所以我们可以在筛选器中输入http.request.method==GET,这样就可以筛选出所有的GET方法了。筛选后可以发现第44号数据包排在了第一位,那么这个其实就是我们要寻找的,与百度建立连接的HTTP的数据包。我们可以对其进行着色处理,这样所有与其相关的数据包都会拥有相同的颜色。之后点击筛选器旁边的Clear,清除筛选条件,这样我们就可以看到完整的HTTP连接了。

HTTP连接数据包的分析

分析上一步筛选出来的文件。可以发现,整个通信是从客户端192.168.147.129到百度的Web服务器119.75.218.70的三次握手开始的:

当连接建立之后,第一个标记为HTTP的数据包是从客户端发往服务器的:

可以发现,HTTP数据包通过TCP被传输到服务器的80端口,也就是HTTP通信的标准端口(8080端口也常被使用)。
接下来可以看到,这个数据包所请求的方法是GET,所请求的URI是“/”,请求的版本为HTTP/1.1。这些信息告诉我们这个客户端请求使用HTTP的1.1版本,下载Web服务器的根目录(/)。这里面还包含有客户端向服务器发送的关于自己的信息。这些信息包含了类似于使用用户代理(User-Agent)、浏览器接受的语言(Accept-Language)以及Cookie等信息。为了保证兼容性,服务器可以利用这些信息决定返回给客户端的数据。
当服务器接收到了数据包4中的HTTP请求,它就会响应一个TCP ACK,用于数据包的确认,并在6到26号数据包中传输所请求的数据。HTTP只被用来发布客户端和服务器的应用层命令。当进行数据传输时,除了在数据流的开始和结束部分,是看不到应用层的控制信息的。
服务器将数据在6、7、8号数据包中发送,9号数据包是来自客户端的确认,10到24号数据包也是服务器发给客户端的数据,25号数据包是客户端发出的另一个确认。尽管HTTP仍然负责这些传输,但所有这些数据包在Wireshark中都被显示为TCP分片而不是HTTP数据包。当数据传输结束后,数据的重组装流就已经发送完了,就到了最后一个数据包:

HTTP使用了一些预定义的响应码来表示请求方法的结果。这里我们看到了一个带有200状态码的数据包,表示一次成功的请求方法。这个数据包里面包含有一个时间戳,以及一些关于Web服务器内容编码和配置参数的额外信息。当客户端接收到这个数据包后,这次的处理也就完成了。

HTTP传送数据包分析

我们刚才所研究的是从Web服务器下载数据的过程,现在来研究一下上传数据。当我们在网站上进行提交表单或者上传文件的操作时,往往就能够捕获含有POST方法的数据包。最开始依旧是TCP的三次握手,之后客户端(172.16.16.128)向Web服务器(69.163.176.56)发送了一个HTTP的数据包:

这个数据包使用了POST方法来向Web服务器上传数据以供处理。这里使用的POST方法指明了URI为/wp-comments-post.php,以及HTTP 1.1请求版本。如果想查看上传数据的内容,可以展开下方的HTML Form URL Encoded查看。 当这个数据包传输完之后,服务器会发送一个ACK数据包,并在第6个数据包中传输了一个响应码302(表示“找到”)作为回应:

302响应码是HTTP的一个常用的重定向手段。这个数据包的Location域指明了客户端被重定向的位置。此时,这个地方就是评论所发表的原先的网页。最后,服务器传送一个状态码200,并且这个页面的内容会在接下来的一些数据包中进行发送,从而完成传输。

拓展【http长连接、短连接的概念及其使用的场景】

HTTP长连接和短连接 https://www.cnblogs.com/0201zcr/p/4694945.html

  • HTTP协议与TCP/IP协议的关系

  HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。

  • 如何理解HTTP协议是无状态的

  HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

  • 什么是长连接、短连接?

  在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

        但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:

        Connection:keep-alive


  在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

  • GET 请求和 POST 请求的区别:
  1. GET 和 POST 请求参数位置不同,从上面两个请求报文可以看出,GET 请求对应的参数放在 URL 中,而 POST 请求对应的参数放在 HTTP 请求主体中。(但是这只是一种约定,GET 请求中出现 Body 也是被允许的)
  2. 虽然 HTTP 协议的 RFC规范 并没有详细规定 URL 的最大字符长度限制,但实际上,在浏览器或者服务器中总会存在限制的,这就导致了 GET 请求中参数数量是有限的。
  3. 处于安全考虑,在一些涉及安全的请求比如:登录请求需要用 POST 提交表单,而GET 请求一般用来获取静态资源。
  4. GET 请求可以被缓存,可以被收藏为书签,但 POST 可以被缓存,但不能被收藏为书签。
  5. GET 请求的参数在 URL 中,因此绝不能用 GET 请求传输敏感数据。POST 请求数据则写在 HTTP 的请求头中,安全性略高于 GET 请求。

参考资料

【1】https://zhuanlan.zhihu.com/p/24913080

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值