HTTP协议相关知识总结


前言

HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。


一、HTTP协议特点

HTTP 协议的主要特点可概括如下:
  1. .支持客户/服务器模式。

  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD 、 POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规 模小,因而通信速度很快。

  3. 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。

  4. .无连接无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的 应答后,即断开连接。采用这种方式可以节省传输时间。

  5. 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着 如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在 服务器不需要先前信息时它的应答就较快。

二、HTTP协议之URL

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP 的连接方式,HTTP1.1 版本中给出一种持续连接的机制,绝大多数的 Web 开发,都是构建在 HTTP 协议之上的 Web 应用

URL基本结构:<传输协议>://<主机名>:<端口号>/<文件名>(带层次的文件路径)/查询字符串#片段标识符(可查看之前博客讲解如何使用url定位资源)

http://host[":"port][abs_path]

这是基于HTTP协议的url,其中http 表示要通过 HTTP 协议来定位网络资源;host 表示合法的 Internet 主机域名或者 IP 地址 ;
port 指定一个端口号,为空则使用默认端口 80;abs_path 指定请求资源的 URI;如果 URL 中没有给出 abs_path,那么当它作为请求 URI 时,必须以“/”的形式给出,通常这个浏览器自动帮我们完成。
在这里插入图片描述

HTTP协议之请求

http请求由三部分组成:请求行、消息报头、请求正文
  1. 请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method 表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version 表示请求的 HTTP 协议版本;CRLF 表示回车和换行(除了作为结尾的 CRLF外,不允许出现单独的 CR 或 LF 字符)。
    (利用fiddler抓包查看)
    在这里插入图片描述
  2. 请求方法(所有方法全为大写)有多种,各个方法的解释如下:
    GET 请求获取 Request-URI 所标识的资源
    POST 在 Request-URI 所标识的资源后附加新的数据
    HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头
    PUT 请求服务器存储一个资源,并用 Request-URI 作为其标识
    DELETE 请求服务器删除 Request-URI 所标识的资源
    TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
    CONNECT 保留将来使用
    OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

常用的就是GET请求和POST请求

GET 请求:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用 GET 方法向服务器获取资源

一般GET请求没有请求体(请求正文)(抓包如图)
**第一行为是请求行,后面11行都是请求头(消息报头)

POST 请求要求被请求服务器接受附在请求后面的数据,常用于提交表单。POST请求有请求体(请求正文) 并且在请求头和请求头之间有一个空行 来分割

在这里插入图片描述

请求头中常见字段解释
  1. Accept:指浏览器或其他客户可以接爱的MIME文件格式。Servlet可以根据它判断并返回适当的文件格式。

  2. User-Agent:是客户浏览器名称 Host:对应网址URL中的Web名称和端口号。

  3. Accept-Langeuage:指出浏览器可以接受的语言种类,如en或en-us,指英语。

  4. connection:用来告诉服务器是否可以维持固定的HTTP连接。http是无连接的,HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接

  5. Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。 cookie工作原理 客户端向浏览器发送请求,浏览器根据提交的用户名密码来验证用户身份并分配一个session对象,生产sessionId,通过响应set-cookie传给客户端,客户端拿到session值保存到浏览器本地,下一次访问时自动带上之前的cookie中保存的值,服务器通过验证cookie中的值就知道身份了

  6. Referer:表明产生请求的网页URL。如比从网页/icconcept/index.jsp中点击一个链接到网页/icwork/search,在向服务器发送的GET/icwork/search中的请求中,Referer是http://hostname:8080/icconcept/index.jsp。这个属性可以用来跟踪Web请求是从什么网站来的。

  7. User-Agent:是客户浏览器名称。

  8. Content-Type:用来表名request的内容类型。可以用HttpServletRequest的getContentType()方法取得。

  9. Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器的默认值是ISO-8859-1.

  10. Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。

GET请求和POST请求的区别

大体上来说GET请求和POST请求没有差别,GET请求和POST请求本质上都是TCP连接,但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

1.Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求
2.Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改
3.Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。
4.Get传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的。
5.GET请求的数据会被浏览器缓存起来,用户名和密码将明文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。在服务器端,用Request.QueryString来获取Get方式提交来的数据
6.Post请求则作为http消息的实际内容发送给web服务器,数据放置在请求体中,Post没有限制提交的数据。Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post
7.POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据只能用Request.Form来获取
8.GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

具体更详细说明点击此处,我觉得讲的比较形象好理解


HTTP协议之响应

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

状态行格式 HTTP版本号 状态码 状态描述

在这里插入图片描述

状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

常见状态码 以及描述:
  1. 200 OK //客户端请求成功
  2. 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
  3. 401 Unauthorized // 请 求 未 经 授 权
  4. 403 Forbidden //服务器收到请求,但是拒绝提供服务
  5. 404 Not Found //请求资源不存在,一般是输入了错误的 URL
  6. 500 Internal Server Error //服务器发生不可预期的错误
  7. 503 Server Unavailable // 服 务 器 当 前 不 能 处 理 客 户 端 的 请 求 , 一 段 时 间 后,可能恢复正常

在这里插入图片描述

其中的一些常见字段与上述请求头中类似,不在重复,很多字段命名都是和他英文解释相关,所以可以猜测,当然那么多肯定记不住,可以查询手册来及时了解

总结

请求中的消息报头和响应中的消息报头都是以键值对的形式表示即key:value ,并且不区分大小写,其中在GET请求中说到Get请求的参数会跟在url后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,并且参数也是以键值对形式表示 但是是以key=value的形式,称为QueryString,可通过req.getParameter(“key”)方法获得对应的value。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值