本文为自己总结的关于应用层协议:HTTP的相关知识,包括HTTP概括、HTTP报文格式以及cookie和session相关知识,欢迎大家参考学习。
HTTP
一、 HTTP概括
1.什么是HTTP?
Web的应用层协议是超文本传输协议 HTTP(HyperText Transfer Protocol)。HTTP由两个程序实现:一个客户程序和一个服务器程序,它们处在不同的端系统,通过交换HTTP报文进行会话。
HTTP使用 TCP 作为它的支撑运输协议。HTTP客户首先发起一个与服务端的TCP连接,一旦连接建立,该浏览器和服务器进程就可以使用套接字访问TCP。
2. 无状态协议
HTTP是无状态协议:HTTP服务器并不保存关于客户的任何信息,比如客户再短时间内多次请求同一个对象,服务器并不会因为刚刚为客户端提供了该对象就不做出反应,而会重新发送该对象,就像服务器忘记之前做过的事儿一样。
3.非持续连接和持续连接
非持续连接:每一个请求响应对是经一个单独的TCP连接发送
持续连接:所有的请求响应经过相同的TCP连接发送
非持续连接的一个缺点就是必须为每一个请求的对象建立和维护一个全新的连接,而TCP连接的建立是要消耗代价的,比如时间上的延迟以及缓冲区的建立,这就给Web服务器带来了严重的负担。
HTTP在默认情况下使用持续连接,也可以配置成非持续连接。
二、HTTP报文格式
首先我们知道,HTTP是以请求响应的形式实现两端的交流。而HTTP的报文格式就是以一种Key-Value形式。类似这样:
1.请求报文
请求报文中包含:请求行、请求报头、实体主体
- 请求行: 包含3个字段,分别是方法字段、URL字段、HTTP版本。
- 请求报头: 请求报头可以有多行,这里介绍几种常见字段:
Host : 指明了对象所在的主机
User-agent : 指明了向服务器发送请求的浏览器的类型
Connection : 常用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用
Accept-language : 指明了客户想要的语言版本
2. 响应报文
响应报文种包含:状态行、响应报文、实体体
- 状态行:包含3个字段,分别是协议版本、状态码、状态信息
- 响应报头: 响应报头可以多行,这里介绍相关字段:
Date : 服务器产生并发送该响应报文的日期和时间
Server : 指示服务器的类型,相当于请求报文种的 User-agent
Last-Modified : 对象创建或者最后修改的时间
Content-Length : 指明被发送对象中的字节数
Content-Type : 指明被发送对象中的类型 - 实体体: 报文的主要部分,包含了所请求的对象本身
3. 请求报文使用的方法
HTTP请求报文使用的方法:
- GET:当向浏览器请求一个对象时,使用GET方法,在URL字段中带有请求对象的标识。使用GET时,请求正文为空
- POST:当用户提交表单时,使用POST方法,此时浏览器向服务器请求页面依赖于用户的输入,实体主体为用户输入的值
- HEAD:获取报文首部。与GET类似,当服务器收到请求时,会发送HTTP响应,但并不返回请求对象
- PUT:允许用户上传对象到指定的Web服务器的指定路径
- DELETE:允许用户或者应用程序删除Web服务器上的对象
📌问:GET和POST方法是安全和幂等的吗?
安全:在 HTTP 协议里,是指请求方法不会破坏服务器上的资源。
幂等:是指多次执行相同的操作,结果都是相同的。
所以GET方法是安全且幂等的,POST是不安全且不幂等的
5. 响应报文的状态码
- 1 XX 服务器收到请求,需要请求者继续执行
100 继续 客户端应继续其请求
101 切换协议 服务器根据客户端的请求切换协议 - 2 XX 操作被成功接收并执行
200 请求成功 一般用于GET与POST请求
201 已创建 成功请求并创建了新的资源
202 已接受 已经接受请求,但未处理完成
203 非授权信息 请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 无内容 服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 重置内容 服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 部分内容 服务器成功处理了部分GET请求 - 3 XX 重定向 需要进行下一步操作
300 多种选择 请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 永久移动 请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 临时移动 与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 查看其它地址 与301类似。使用GET和POST请求查看
304 未修改 所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 使用代理 所请求的资源必须通过代理访问
307 临时重定向 与302类似。使用GET请求重定向 - 4 XX 客户端错误,请求包含语法错误或无法完成请求
400 客户端请求的语法错误,服务器无法理解
401 请求要求用户的身份认证
402 保留,将来使用
403 服务器理解请求客户端的请求,但是拒绝执行此请求
404 服务器无法根据客户端的请求找到资源(网页)
405 客户端请求中的方法被禁止
406 服务器无法根据客户端请求的内容特性完成请求
407 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408 服务器等待客户端发送的请求时间过长,超时
409 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410 客户端请求的资源已经不存在。
411 服务器无法处理客户端发送的不带Content-Length的请求信息
412 客户端请求信息的先决条件错误
413 由于请求的实体过大,服务器无法处理,因此拒绝请求。
414 请求的URI过长(URI通常为网址),服务器无法处理
415 服务器无法处理请求附带的媒体格式
416 客户端请求的范围无效
417 服务器无法满足Expect的请求头信息
422 表明由于所提供的的作为请求部分的数据非法,创建或修改操作不能被完成
429 表明超出了客户端访问频率的限制或者服务端接收到多于它能处理的请求。 - 5 XX 服务器错误,服务器在处理请求的过程中发生了错误
500 服务器内部错误,无法完成请求
501 服务器不支持请求的功能,无法完成请求
502 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 由于超载或系统维护,服务器暂时的无法处理客户端的请求。
504 充当网关或代理的服务器,未及时从远端服务器获取请求
505 服务器不支持请求的HTTP协议的版本
三、 cookie和session
我们已经知道了HTTP 是一个无状态协议, 就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。这种无状态的好处是快速。坏处是进行用户状态保持的场景时 比如,登陆状态下进行页面跳转,或者用户信息多页面共享等场景,如果不保存,就无法对应某一个特定的用户。所以必须使用一些方式或者手段比如: session 和 cookie
1.session
为了保存请求对象的会话状态,在服务器端使用session技术。当客户向服务器建立连接后,服务器接收到请求后,就开辟一段session空间,并为其生成一个唯一标识ID号,就是sessionID。此后每一次接受到请求时,通过sessionID,就可以定位到特定的session会话,并在其所拥有的数据上进行具体操作。session提供了在服务器端保存和区分某一个用户的数据信息。session的存储结构为ConcurrentHashMap
2.cookie
session在服务器端对用户进行了保存,但它也要通过浏览器发来的信息来定位到一个用户,发的什么呢?此时就用到了cookie。cookie是在浏览器上保存的,它的值就是上面说的每一个用户的唯一标识sessionID。在服务器第一次收到请求创建了一个session后,在返回响应报文时就会加上一句:Set-cookie = sessionID
,这样浏览器接受到报文后,就会将自己的cookie设置为sessionID,以后每一次以当前用户的身份访问时,都会在请求行中加入cookie的值。因此到达服务端后,也能根据cookie的值定位到某一个session会话并进行特定的操作。
3.cookie和session的区别
- 存储位置:cookie在浏览器上;session在服务器
- 安全性:cookie不安全,容易被伪造,修改;session是安全的
- 存储对象:cookie 只能存储ACSII字符串;session 能够存储任意的 java 对象,
- 服务器消耗资源:每个用户都会产生一个session,就会导致session过多消耗服务器资源,大型网站会有专门Session服务器,Cookie存在客户端没问题
- 浏览器支持不同:若浏览器不支持cookie,需要运用session和URL地址重写。
参考资料:
《计算机网络自顶向下》
中国慕课 哈尔滨工业大学《计算机网络》
博客:https://www.jianshu.com/p/c0a7bcba8987
基本总结了HTTP的基础知识,还有HTTPS协议和DNS等重要协议,以后慢慢都总结出来,是对自己学习进步的一个督促。有任何问题欢迎指正,也欢迎小伙伴们点赞关注一起进步!