基本的HTTP协议知识点总结

1. 网络模型和对应位置

在这里插入图片描述
HTTP(hypertext transfer protocol,也就是超文本传输协议),是基于TCP的简单的请求-响应的传输协议。请求-响应简单来说就是发一次请求,得到一次回复,再发一次请求,再得到一次回复的模式。

无论是哪种网络模型,HTTP都是处在应用层的。与他同层的协议还有FTP(文件传输协议),SMTP(简单邮件传输协议),TELNET(无中文名,远程登录用的协议),记个名字即可。

2. HTTP请求类型

之前说了HTTP是请求-响应的传输模式,请求-响应中的请求大体上有8种类型:

名称 描述
GET 请求指定的页面信息,并返回实体主体
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
DELETE请求服务器删除指定的页面。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。

虽说有8种不同的类型,但是绝大多数情况下,我们只会用到GET和POST(甚至只用POST),所以大部分的记个名就行。

2.1 GET和POST的区别

  1. GET请求将参数包含在URL中;而POST请求将参数放在RequestBody中发送。

  2. GET参数有长度限制;POST没有长度限制。

    其实HTTP协议本身是没有这种限制的,一般都是浏览器或者服务器会主动限制你URL的最大长度,比如IE浏览器的限制长度就是2038byte,那自然在IE浏览器中GET请求也会因此而限制最大长度。

  3. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

    实际上GET由于参数在URL中,所以参数只能以ASCII码的形式表现(比如汉字会转化成ASCII码)。1

  4. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

    对于这一点,实际上HTTP的协议都是未加密的(即明文传输),只要能截获到数据包(通过WIRESHACK等软件),所有人都能得知到请求的所有内容,POST比GET安全也只是表面安全而已,没有直接把参数放在URL上。

  • 实际上,GET和POST都是HTTP协议的一种,HTTP协议是通过TCP协议来实现的,也就是说实际上GET和POST本质上没有区别,POST方法可以在URL中添加参数(实际上之前待过的公司就是如此,POST请求只有参数,没有RequestBody),而GET方法也可以有RequestBody,具体全看服务器端如何处理(GET方法也能处理RequestBody,POST方法也能处理参数)。
  • 有关POST方法生成两个TCP数据包,而GET方法只生成一个数据包这点。我在这里只引用原文的结论,具体的请看注脚中的文章2大多数框架都是尽量在一个tcp包里面把HTTP请求发出去的,但是也确实存在先发HTTP头,然后发body的框架。但是具体发多少个TCP包,这个是代码的问题,是tcp协议栈的问题,跟HTTP没关系。

3. HTTP状态码

HTTP协议中,状态码主要用于请求-响应模式中的响应上,服务器在响应客户端的请求后,用状态码对响应的结果做一个总结,这样客户端就可以不用仔细翻找响应的数据包就可以大体上知道响应的结果了。

1XX:表示服务器已经接收了客户端请求,客户端可继续发送请求;
2XX:表示服务器已成功接收到请求并进行处理;
3XX:表示服务器要求客户端重定向;
4XX:表示客户端的请求有非法内容;
5XX:表示服务器未能正常处理客户端的请求而出现意外错误。

HTTP状态码_百度百科
https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin
百科写的很详细,这里写几个常见的

200(OK):请求成功。
301(Moved Permanently):资源(网页等)被永久转移到其它URL。
400(Bad Request):报文语法错误。
404(Not Found):请求的资源(网页等)不存在。
500(Internal Server Error):内部服务器错误。

4. 浏览器访问网址的过程

  1. 浏览器解析你的URL,查看是否合法。
  2. 检测是否有缓存,有缓存直接显示网页,结束过程。
  3. 没有缓存时,先用DNS(域名系统)将URL转换成IP地址,通过IP找到对应服务器。
  4. 浏览器对服务器发起TCP连接请求,执行三次握手建立TCP连接。
  5. 浏览器发送请求包,等待服务器响应。
  6. 服务器收到请求包后,调用对应服务发送响应包,让浏览器接收。
  7. 浏览器收到响应包后解包,更新页面。
  8. TCP连接断开(四次挥手)。

5. HTTPS

之前也说到,HTTP是明文传输,只要截获了数据包,就毫无安全性可言,这个时候就用上了HTTPS,它的本质是HTTP+SSL。SSL(Secure Sockets Layer 安全套接层),,是为网络通信提供安全及数据完整性的一种安全协议,作用于应用层和传输层之间。
使用非对称加密的方式进行数据加密,以防止别人破解。

  • HTTP的常用端口号是80,而HTTPS是443

5.1 非对称加密原理

  1. 无加密:假设现在有A和B在通过HTTP进行对话。这里暂定A是客户端,B是服务器。
    在这里插入图片描述
    由于数据包是没有加密的,当第三者截获了HTTP的数据包后,他就可以冒充A和B进行对话,而B并不知道和他对话的A已经是另一个人了。
    在这里插入图片描述

  2. 对称加密:那么,为了应对这种情况,A和B应该怎么办呢?A和B打算把他们的数据内容进行加密,也就是进行加密通话。A和B手上各持有一个秘钥,在发送内容前先用秘钥对内容以某种方式加密。而在收到内容后再用秘钥以某种方式解密得到原本的数据。

    这里我举一个简单的例子,秘钥的内容是一个字符串’5’,这意味着将数据包的字符的ASCII码+5进行加密,而解码就是-5。
    在这里插入图片描述
    这样随之而来的就是另一个问题,当双方第一次开始通信的时候,并不是两者都持有秘钥(一般来说,秘钥的设定和加密解密都是由服务器规定的),所以在第一次通信的时候(或者其他时候),数据包上会附带着秘钥一起发送。
    在这里插入图片描述
    那么随之而来的老问题就是窃听,第三者C同样可以获取到秘钥的内容,有了秘钥的内容他也迟早能破解加密和解密的方法。破解之后,那就又和没有加密一样了,C又可以冒充A了。
    在这里插入图片描述

  3. 非对称加密:为了防止这种情况发生,于是就有了非对称加密,这个也被称作公开密钥加密。秘钥现在一式两份,一份是公钥,可以公开给所有人知道。另一份是私钥,私钥不用发给任何人,只用自己保存就行。

    非对称加密的特点:

    • 用公钥加密的密文,必须要用私钥才能解开。
    • 不能通过公钥的内容推导出私钥,反之也不可。
      在这里插入图片描述
      这样C即使截获了数据包,得到的也只有公钥和密文,而没有私钥是无法解密的。

6. COOKIE和SESSION的区别

在网站中,HTTP请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。COOKIE和SESSION的技术就是为了解决这个问题而产生的。两者都可以把数据缓存下来保存在本地,以便下次连接的时候继续使用。

  • cookies数据保存在客户端。session数据保存在服务端
  • cookies可以减轻服务器压力,但是不安全,容易进行cookies欺骗
  • session安全一点,但是占用服务器资源。

参考材料

http协议相关面试题 - baby_duoduo - 博客园
https://www.cnblogs.com/gaozhiqiang/p/11750772.html
HTTP协议知识点总结_网络_小晓晓晓林的博客-优快云博客
https://blog.youkuaiyun.com/weixin_38051694/article/details/77777010
HTTP知识点总结 - 知乎
https://zhuanlan.zhihu.com/p/91460671
【计算机网络】HTTP协议知识点总结_网络_susanhc的博客-优快云博客
https://blog.youkuaiyun.com/susanhc/article/details/99674558


  1. 前端 - 为什么说:“对参数的数据类型,GET只接受ASCII字符,而POST没有限制?” - SegmentFault 思否
    https://segmentfault.com/q/1010000010875486 ↩︎

  2. http post请求发两个tcp包后续_网络_zerooffdate的专栏-优快云博客
    https://blog.youkuaiyun.com/zerooffdate/article/details/81513717
    顺便可以看看这篇:听说『99% 的人都理解错了 HTTP 中 GET 与 POST 的区别』?? - 知乎
    https://zhuanlan.zhihu.com/p/25028045 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值