前言:本文总结了HTTP和HTTPS协议的相关知识,包括对于URL、DNS等概念的解释,HTTP报文格式各组成部分的详细分析,有遗漏和错误的地方欢迎大家指出~
🏡个人主页:謬熙,欢迎各位大佬到访❤️❤️❤️~
👲个人简介:本人编程小白,正在学习互联网开发求职知识……
如果您觉得本文对您有帮助的话,记得点赞👍、收藏⭐️、评论💬,如果文章有什么需要改进的地方还请大佬不吝赐教🙏🙏🙏
目录
一、TCP/IP协议族
计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则——协议(protocol)。
像这样把与互联网相关联的协议族集合起来总称为 TCP/IP(protocol)。也有说法认为,TCP/IP 是指 TCP 和 IP 这两种协议。还有一种说法认为,TCP/IP 是在 IP 协议的通信过程中,使用到的协议族的统称。
这部分的 网络模型、TCP协议的三次握手四次挥手等内容在之前的博客中已有总结——【初识网络编程】,此处不再赘述。
需要指出的是,TCP/IP协议中的应用层决定了向用户提供应用服务时通信的活动。在该层TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(FileTransfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)服务就是其中两类。本文将总结的HTTP 协议(HyperText Transfer Protocol,超文本传输协议 )也处于该层。
二、URL
URL(Uniform Resource Locator,统一资源定位符),它是用于访问互联网上资源的地址,常用于访问网页。
常见格式:protocol : // hostname[:port] / path / [;parameters][?query][#fragment]
组成部分:协议,域名,端口,虚拟目录,文件名,查询字符串,片段标识符 |
- ✨协议:在Internet中可以使用多种协议,如HTTP,HTTPS,FTP等等,在协议后后面的“//”为分隔符,用于分隔协议和域名。访问 mysql 时的协议类型为
jdbc:mysql
。省略默认http。 - ✨域名部分:域名是访问网站的识别字符。一个URL中,也可以使用IP地址作为域名使用。
扩展1——域名等级:
顶级域名又称一级域名,由域名字符 + 域名后缀
组成,如csdn.net
;
二级域名是由字符. + 顶级域名
组成,如blog.csdn.net
由于使用习惯,大家一般将 www. 开头的域名称之为顶级域名,并将不带 www. 的顶级域名和带 www. 的域名(二级域名)不加区别的直接使用,如csdn.net
和www.csdn.net
一样。
扩展2——常见的域名后缀:
.com
代表商业、.net
代表网络、.org
代表组织和团体、.gov
代表政府部门、.top
代表顶级机构等。
中国常见的域名就是.com
和.cn
,而.com
是全球接受程度最高的域名类型,.cn
主要用于国内业务,但并不会影响全球网民访问网站。
扩展3——子域名:
子域名是主域名的下一级域名,通常是大型公司为了满足不同产品或业务需求在主域名基础上发展而来。子域名一般会根据不同用途在主域名前面加上不同的前缀构成。
- CSDN主页——
www.csdn.net
- CSDN博客浏览页——
blog.csdn.net
- CSDN博客编辑页——
editor.csdn.net
- 端口:用于标识在一台计算机上运行的不同程序。每个网络程序,都对应一个或多个特定的端口号。跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用协议的默认端口,例如HTTP程序的默认端口号为80,HTTPS程序的默认端口号为443。
- ✨虚拟目录:指定服务器上资源的具体位置。从域名后的第一个“/”开始到最后一个“/”为止是虚拟目录部分。
- 文件名:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。
- 查询字符串:用于向服务器发送额外的信息或参数,这些参数可以用于数据库查询、用户身份验证、状态信息传递等。服务器可以根据这些参数来处理请求,并返回相应的结果。。从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。参数允许有多个参数,参数与参数之间用“&”作为分隔符。
- 片段标识符:锚点用于指向资源内部的特定部分,主要用于页面内跳转。从“#”开始到最后,都是锚部分。锚也不是一个URL必须的部分。
三、与HTTP关系密切的几个协议
-
IP协议
关键词:IP地址
、MAC地址
、ARP协议
、Routing
-
TCP协议
关键词:SYN同步标志位
、ACK标志位
、三次握手
、四次挥手
-
DNS协议
关键词:域名解析
、IP地址
计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。比如www.hackr.jp
。用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。但要让计算机去理解名称,相对而言就变得困难了,因为计算机更擅长处理一长串数字。
为了解决上述的问题,DNS(Domain Name System) 服务应运而生,它是和 HTTP 协议一样位于应用层的协议。 DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
-
HTTP协议与上述协议之间的关系
HTTP是构建在TCP/IP协议族之上的应用层协议。HTTP作为应用层协议,依赖于下层的传输层协议TCP来确保数据的可靠传输,同时也依赖于网络层的IP协议来处理数据包的寻址和路由。- IP协议 为HTTP提供了必要的 网络层支持 ,使得数据能够在复杂的网络环境中从源点传输到目的地。
- TCP协议 在传输层提供了数据的顺序传输、数据完整性和错误检测功能,这对于HTTP传输的数据可靠性 尤为重要。
- DNS协议 在HTTP通信中扮演着 域名解析的角色,它将用户友好的域名转换为IP地址,使得用户无需记忆复杂的IP地址就能访问互联网资源。
四、HTTP报文格式
HTTP报文是面向文本的,因此报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。
HTTP有两类报文:请求报文和响应报文。
4.1、请求报文
组成部分:请求行、请求头部、空行、请求体 |
- 请求行
请求行由 请求方法字段、 URL字段和 HTTP协议版本字段3个字段组成,它们用空格分隔。
HTTP版本介绍:
每个版本的HTTP都在性能、安全性和功能上有所改进,以适应互联网的发展和用户需求的变化。随着技术的进步,HTTP协议也在不断地更新和优化。
- HTTP/0.9(1991年)
这是最早的HTTP版本,被称为“只有一个方法的协议”。
它只支持GET请求,没有状态码、没有HTTP头,只用于请求和接收HTML页面。- HTTP/1.0(1996年)
引入了状态码、HTTP头和多种HTTP方法(如POST和HEAD)。
支持持续连接(Connection: keep-alive),允许在一个TCP连接上发送多个请求和响应,减少了建立和关闭连接的开销。
没有官方规范,直到1999年才由RFC 1945正式标准化。- HTTP/1.1(1999年)
引入了持久连接(默认开启Connection: keep-alive,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭, 如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache、GlassFish)中设定这个时间),支持管道化请求(Pipelining),允许在等待一个响应的同时发送多个请求。
引入了更多的缓存控制机制。
支持分块传输编码(chunked transfer encoding),允许服务器在知道整个响应大小之前就开始发送数据。
引入了虚拟主机的概念,允许一个IP地址托管多个域名。
由RFC 2616标准化,后来被RFC 7230-7235系列文档更新。- HTTP/2(2015年)
引入了二进制协议,提高了解析效率。
支持头部压缩(HPACK),减少了请求和响应头部的大小。
引入了多路复用(Multiplexing),允许在同一个连接上并行交错发送多个请求和响应,解决了HTTP/1.x中的队头阻塞问题。
支持服务器推送(Server Push),允许服务器主动向客户端发送资源。
由RFC 7540标准化。- HTTP/3(2019年)
基于QUIC协议,运行在UDP之上,而不是TCP。
提供了更好的拥塞控制和连接迁移特性。
支持0-RTT(零往返时间)连接,减少了连接建立的时间。
支持前向保密(Forward Secrecy),增强了安全性。
由RFC 9114标准化。
常见的请求方法:
请求方法 用法 适用HTTP版本号 GET 请求读取由URL所标识的信息,参数是包含在URL中 全部 POST 给服务器发送数据(登录界面),参数是包含在请求体中 全部 HEAD 获得报文首部 1.0及以后版本 PUT 传输文件,在指明的URL下存储一个文档 1.1及以后版本 DELETE 删除文件,删除指明的URL所标识的资源 1.1及以后版本 OPTIONS 访问支持的方法 1.1及以后版本 TRACE 追踪路径 1.1及以后版本 CONNECT 要求用隧道协议连接代理 1.1及以后版本 LINK 建立和资源之间的联系 1.1及以后版本 UNLINE 断开连接关系 1.1及以后版本
- 请求头部
请求头部由 键/值对组成,每行一对,键和值用英文冒号“:”分隔。负责通知服务器有关于客户端请求的信息。
常见的请求头:
请求头 用法 User-Agent 产生请求的客户端类型、系统属性 Accept 指定客户端能够处理的媒体类型 Host 指定请求的服务器的域名和端口号 Accept-Encoding 客户端使用的编码环境和编码方式 Accept-Language 客户端的语言环境 Authorization 授权信息,一般用于存放授权之后的信息 Connection 表示是否需要持久连接 Content-Length 表示请求数据正文的长度 Cookie 这个与服务器端做交互的,存储保持会话的重要信息(保持客户端的登录状态) Referer 表示该次请求的来源,一般用于做防盗链
- 空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。 - 请求体
请求数据不在GET
方法中使用,而是在POST
方法中使用。POST
方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type
和Content-Length
。
4.2、响应报文
组成部分:状态行、响应头部、空行、响应体 |
这部分和请求报文类似,主要分析一下状态行。
状态行由 协议版本信息、 状态码以及 状态码的短语描述组成,之间用空格分隔。
状态码(StatusCode)是一个三位数字,用来表示请求的结果。状态码分为五类:
- 1xx:信息性状态码,表示接收的请求正在处理。
- 2xx:成功状态码,表示请求已成功被接收、理解、接受。
- 3xx:重定向状态码,表示浏览器需要进一步操作以完成请求。
- 4xx:客户端错误状态码,表示客户达请求包含语法错误或无法完成请求。
- 5xx:服务器错误状态码,表示服务器在处理请求的过程中发生了错误。
状态消息(Reason Phrase)是状态码的简短描述,提供了状态码的文本表示。
类别 状态码 状态消息 中文解释 信息性 100 Continue 继续 信息性 101 Switching Protocols 切换协议 成功 200 OK 请求成功 成功 201 Created 创建成功 成功 202 Accepted 已接受 成功 204 No Content 无内容 重定向 301 Moved Permanently 永久移动 重定向 302 Found 临时移动 重定向 304 Not Modified 未修改 客户端错误 400 Bad Request 错误请求 客户端错误 401 Unauthorized 未授权 客户端错误 403 Forbidden 禁止访问 客户端错误 404 Not Found 未找到 客户端错误 405 Method Not Allowed 方法不允许 服务器错误 500 Internal Server Error 内部服务器错误 服务器错误 502 Bad Gateway 网关错误 服务器错误 503 Service Unavailable 服务不可用 服务器错误 504 Gateway Timeout 网关超时
五、HTTPS(HTTP +加密 + 认证 + 完整性保护)
背景:
由于互联网上的所有数据都需经过路由器的多次转发,最终到达目标主机。当黑客入侵了这些场所的路由器,就可以通过抓包工具获取所有经过该路由器转发的数据,因此当我们通过网络传输了某些比较敏感的数据(如账户名、密码、身份证、各类支付密码、家庭住址等)且数据是明文传输的,黑客就可以通过这些信息做出某些违法行为,进而造成不可挽回的损失。
HTTPS(Hyper Text Transfer Protocol Secure,安全的超文本传输协议)是一种基于 SSL/TLS 协议的 HTTP 协议,它是 HTTP 协议的安全版本。HTTPS 协议通过加密通信内容和身份验证来保证数据传输的安全性和完整性,从而可以有效地防止数据在传输过程中被窃取或篡改。
5.1、SSL/TLS 协议
SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是两个主要的互联网安全协议,它们用于在计算机之间建立加密的通信连接,它们还提供了一种验证通信双方身份的方法,以防止中间人攻击。
- 历史:
SSL最初由网景公司(Netscape)在1994年开发,用于保护Web浏览器和服务器之间的通信。
TLS是SSL的后继者,由互联网工程任务组(IETF)标准化。TLS 1.0在1999年发布,随后有多个版本更新。- 工作流程:
握手阶段:在数据传输开始之前,客户端和服务器之间会进行一个握手过程,以协商加密算法、生成共享密钥,并验证彼此的身份。
加密通信:一旦握手完成,客户端和服务器将使用协商的密钥和加密算法来加密和解密它们之间传输的数据。
5.2、证书
在HTTPS中,证书是一种 数字文档,用于证明网站的身份,并用于在SSL/TLS握手过程中安全地交换密钥。
证书的组成:
- 公钥:服务器的公钥,用于加密通信。
- 身份信息:包括服务器的域名、公司名称等。
- 证书颁发机构(CA):证书由CA签发,CA是一个可信的第三方机构,负责验证服务器身份并签发证书。
- 有效期:证书的有效期限。
- 证书签名:CA用自己的私钥对证书内容进行签名,以确保证书的完整性和真实性。
证书的作用:
- 身份验证:确保用户连接到的是正确的服务器,而不是一个假冒的服务器。
- 密钥交换:证书中包含服务器的公钥,用于加密通信。
- 数据完整性:确保数据在传输过程中没有被篡改。
5.3、加密方法
HTTPS的加密过程涉及到几个关键步骤,主要使用了对称加密和非对称加密两种技术。
-
对称加密(共享密匙加密)
关键:使用相同的密钥进行数据的加密和解密。
在HTTPS中的应用:在SSL/TLS握手过程中,客户端和服务器使用对称加密来保护实际传输的数据。一旦握手完成,双方会生成一个会话密钥(session key),这个密钥用于整个会话期间的数据加密和解密。
缺点:以共享密钥方式加密时必须将密钥也发给对方。在互联网上转发密钥时,如果通信被监听那么密钥就可会落入攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的密钥。
-
非对称加密(公开密匙加密)
关键:一个公钥和一个私钥。
数据可以用公钥加密,然后只有对应的私钥才能解密。公钥可以公开分享,而私钥必须保密。
在HTTPS中的应用:
密钥交换:客户端使用服务器的公钥加密预主密钥(pre-master secret),然后发送给服务器,服务器使用自己的私钥解密得到预主密钥。
证书验证:服务器的证书中包含了服务器的公钥。客户端使用这个公钥来验证服务器的身份,并确保证书的签名是有效的。
缺点:加密和解密速度慢,不适合大量数据的加密。
5.4、HTTPS工作流程
HTTPS 充分利用了两者各自的优势,采用共享密钥加密和公开密钥加密两者并用的混合加密机制。
先保证安全,再保证高效:
- 在 交换密钥环节使用 公开密钥加密方式;
- 在 建立通信交换报文阶段则使用 共享密钥加密方式。
流程:
- 客户端发起HTTPS请求:
用户在浏览器中输入一个以https://开头的网址,客户端(通常是浏览器)向服务器的443端口(HTTPS的默认端口)发起连接请求。- 服务器响应并发送证书:
服务器响应客户端的请求,并发送其SSL/TLS数字证书给客户端。这个证书包含了服务器的公钥、证书颁发机构(CA)信息、服务器身份信息以及证书的签名等信息。- 客户端验证服务器证书:
客户端接收到服务器的证书后,会验证证书的合法性。这包括检查证书的颁发机构是否可信、证书是否在有效期内、以及证书的签名是否有效等。如果证书验证失败,客户端会发出警告或中断连接。- 密钥交换与生成:
如果服务器证书验证通过,客户端会生成一个随机的预主密钥(pre-master secret),并使用服务器的公钥进行加密后发送给服务器。服务器使用自己的私钥解密得到预主密钥。然后,客户端和服务器都基于这个预主密钥和一些其他参数,生成一个会话密钥(session key)。这个会话密钥将用于后续的数据加密和解密。- 建立安全连接:
客户端和服务器使用协商出的会话密钥对传输的数据进行加密,确保数据在传输过程中的安全。此后,客户端和服务器之间的所有通信都会使用这个会话密钥进行加密。
本次关于HTTP和HTTPS协议的大体内容就总结到这里了,还有很多细节没有整理,欢迎各位大佬们讨论指正,希望和大家共同进步💪💪💪