HTTP协议的论述

前言

  在日常生活中,我们经常使用浏览器来浏览各种各样的网站,而通常我们使用浏览器都是进行百度。但有时我们直接输入网址。然后就能看见我们要访问网址的内容,我们输入网址,看到结果,殊不知这里面发生了更加动人的故事,我们先从浏览器访问服务器的流程开始进行介绍。

B/C访问流程

  B/S结构(浏览器/服务器)是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件,这种模式统一了客户端,将系统功能能实现的核心部分集中到服务器上,简化了系统的开发,维护和使用。

这里写图片描述

  当系统是Windows系统时,hosts的绝对路径是C:\Windows\System32\drivers\etc,浏览器会到这个文件中去浏览,看是否有映射关系。

  DNS:因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问物联网,而不用去记住能够被机器直接读取的ip数串。通过主机名,最终得到该主机名对应的IP地址。

  其中标红的部分就是使用http协议的部分。

HTTP连接的七个步骤:

  1. 建立TCP/IP连接
  2. 客户端向服务端发送HTTP请求
  3. 客户端发送请求头信息,请求内容,最后发送一行空白行
  4. 服务器会做出响应,表示对客户端请求的响应。
  5. 服务器向客户端发送响应头信息。
  6. 服务器向客户端发送响应头信息后,也会发送一空白行,表示响应信息发送完毕,接着就以Content-Type要求的数据格式发送数据给客户端。
  7. 服务器关闭连接。但是服务器和客户端增加了ConnectionKeep-alive就表示长连接。

  上面的七个步骤简洁的说是浏览器发送了一个请求,服务器根据接受的请求给浏览器返回一个响应,而HTTP协议定义了请求和响应的规范或标准。接下来我们详细介绍HTTP协议的请求和响应部分。

HTTP协议

  我们可以用浏览器的开发者工具进行抓包,看一下请求头和响应头。(以Chome为例)

当访问一个页面的时候可以看到请求头和响应头。

这里写图片描述

我们可以看到在请求和响应中有很多信息,这些内容就是http协议,可以说是一种规则或者格式。

  HTTP协议:HTTP是一个属于应用层的面向对象的协议。所有的www文件都必须遵守这个标准。(百度解释一大堆)

HTTP请求

  一个http请求报文由请求行、请求头部、空行和请求数据4个部分组成,

请求行

  请求行:由请求方法、URL和HTTP协议版本3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。而在我们的开发中经常使用到的两种请求方式是GET和post方式。

GET:

  1. GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。

  2. 使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,请求数据以地址的形式表现在请求行。

  3. 地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然这种方式不适合传送私密数据
  4. 如果是中文/其他字符,则直接把字符串加密

POST:

  1. 允许客户端给服务器提供信息较多。

  2. POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,不会显示在URL中。

  3. POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用”&“符号隔开。

  4. POST方式大多用于页面的表单中。

GET和POST发送数据说明:

传输数据的大小:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

POST:由于不是通过URL传值,理论上数据不受限。

请求头部

  请求头部:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔。请求头部通知服务器有关于客户端请求的信息。典型的请求头有:

  1. User-Agent:产生请求的浏览器类型,版本等。

  2. Accept:客户端可识别的内容类型列表。星号 “ * ” 用于按范围将类型分组,用 “ / ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型。

  3. Host:要请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

  4. Accept-Language:客户端可接受的语言。

  5. Accept-Encoding:客户端可接受的压缩格式。

  6. Accept-Charset:可接受的响应的字符集。

  7. connection:连接方式(close 或 keepalive)。

  8. Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie。

  9. Referer:告诉浏览器,我上一个页面的url可以防止用户盗链;

  10. IF-Modified-Since:浏览器告诉服务器,我请求资源,目前最新的修改时间是什么。

空行

  空行:最后一个请求头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头部。

请求数据

  请求数据:请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头部是Content-Type和Content-Length。

HTTP响应

  一个http响应报文由状态行、响应头部、空行和响应数据4个部分组成。

状态行

  状态行:用于表示服务器对请求的处理结果,它是一个三位数的十进制。响应状态码分为5类:

这里写图片描述

  • 200 OK 表示客户端请求成功

  • 204 No Content 成功,但不返回任何实体的主体部分

  • 206 Partial Content 成功执行了一个范围(Range)请求

  • 301 Moved Permanently 永久性重定向,响应报文的Location首部应该有该资源的新URL

  • 302 Found 临时性重定向,响应报文的Location首部给出的URL用来临时定位资源

  • 303 See Other 请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源

  • 304 Not Modified 客户端发送附带条件的请求(请求首部中包含如If-Modified-Since等指定首部)时,服务端有可能返回304,此时,响应报文中不包含任何报文主体。

  • 307 Temporary Redirect 临时重定向。与302 Found含义一样。302禁止POST变换为GET,但实际使用时并不一定,307则更多浏览器可能会遵循这一标准,但也依赖于浏览器具体实现

  • 400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解

  • 401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用

  • 403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因

  • 404 Not Found 请求的资源不存在,例如,输入了错误的URL

  • 500 Internel Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求

  • 503 Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常

响应头部

  响应头部:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔,典型的响应头有:

  1. Location:用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源

  2. Server:包含了服务器用来处理请求的软件信息及其版本。

  3. Vary:指示不可缓存的请求头列表

  4. Connection:连接方式(close 或 keepalive)。

  5. Content-Length:返回长度;
  6. Refresh:用来返回告诉浏览器几秒后,将跳转到那个页面。
空行

  空行:最后一个响应头部之后是一个空行,发送回车符和换行符,通知浏览器以下不再有响应头部。

响应数据

  响应数据:服务器返回给客户端的文本信息。

总结

  上面的HTTP协议的论述,都是一些基本的HTTP协议知识,这时候再看浏览器访问服务器的流程,感觉更加清晰。掌握HTTP协议后,对于开发有很好的作用,明白B/C的数据传输机制。对于错误的处理也有一定的帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值