网络通信之生成HTTP消息
简明扼要
- URL:Uniform Resource Locator,统一资源定位符
- 浏览器是一个具备「多种客户端功能」的综合性客户端软件
- 浏览器的「第一步工作」就是对 URL 进行解析
- 请求消息中包含的内容是「对什么」和「进行怎样的操作」两个部分
- 消息头按照用途可分为「四大类」 1. 通用头:适用于请求和响应的头字段 2. 请求头:用于表示请求消息的附加信息的头字段 3. 响应头:用于表示响应消息的附加信息的头字段 4. 实体头:用于消息体的附加信息的头字段
- 状态码的第一位数字表示「状态类型」,第二、三位数字表示具体的情况
- 1 条请求消息中只能写 1 个 URI。如果需要获取多个文件,必须对每个文件单独发送 1 条请求。
文章概要
- URL是个啥?
- 浏览器解析URL
- 省略文件名的情况
- HTTP 的基本思路
- 生成 HTTP 请求消息
- 发送请求后会收到响应
1. URL是个啥?
❝URL:Uniform Resource Locator,统一资源定位符,是互联网上标准资源的地址。 ❞
而互联网上的每个文件都有「唯一」的一个的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
基本URL包含:模式(或称协议)、服务器名称(或IP地址/网址)、路径和文件名。
协议部分则以“//”为分隔符,如“协议://授权/路径?查询”。
其一般语法格式为:protocol :// hostname[:port] / path / [;parameters][?query]#fragmen
之所以有各种各样的 URL,是因为尽管我们通常是使用浏览器来访问 Web 服务器的,但实际上浏览器并不只有这一个功能。
❝浏览器是一个具备「多种客户端功能」的综合性客户端软件 ❞
URL 开头的文字,即“http:”“ftp:”“file:”“mailto:”这部分文字都表示浏览器应当使用的「访问方法」。
2. 浏览器解析URL
浏览器要做的第一步工作就是对 URL 进行解析,从而生成发送给 Web 服务器的请求消息。
解析过程
看拆分结果,其中包含 Web 服务器名称 www.lab.glasscom.com
,以及文件的路径名 /dir1/file1.html
。
服务器目录结构
因此,我们得知,URL 表示要访问 www.lab.glasscom.com
这个 Web 服务器上路径名为 /dir/file1.html
的文件,也就是位于 /dir/
目录 D 下的 file1.html
这个文件。
3. 省略文件名的情况
有时候我们也会见到一些不太一样的 URL,例如这个 URL 是以“/”来结尾的。
http://www.wl.com/dir/
以“/”结尾代表 /dir/
后面本来应该有的文件名被省略了。根据 URL 的规则,文件名可以像前面这样省略。
在服务器上事先设置好文件名省略时要访问的默认文件名。大多数情况下是 index.html
或者 default.html
之类的文件名。
还有一些 URL 是像下面这样只有 Web 服务器的域名
http://www.wl.com/
它表示访问一个名叫“/”的目录。而且,由于省略了文件名,所以结果就是访问 /index.html
或者/default.html
这样的文件了。
❝浏览器的「第一步工作」就是对 URL 进行解析 ❞
4. HTTP 的基本思路
HTTP 的基本思路
❝HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤 ❞
客户端向服务器发送请求消息
❝请求消息中包含的内容是「对什么」和「进行怎样的操作」两个部分 ❞
1. 对什么 (URI)
其中相当于“对什么”的部分称为 「URI」。一般来说,URI 的内容是一个存放网页 数据的文件名或者是一个 CGI 程序的文件名,例如/dir1/file1.html/dir1/program1.cgi
等。
换句话说就是,这里可以写各种访问目标,而这些访问目标统称为 「URI」
❝URI:Uniform Resource Identifier,统一资源标识符 ❞
2. 进行怎样的操作 (方法)
把“进行怎样的操作”的部分称为方法。方法表示需要让 Web 服务器完成怎样的工作,其中典型的例子包括读取 URI 表示的数据、将客户端输入的数据发送给 URI 表示的程序等。
HTTP 的主要方法
5. 生成HTTP请求消息
对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。
请求消息格式
1. 请求行
请求消息的第一行称为请求行。
这里的重点是最开头的「方法」,方法可以告诉 Web 服务器它应该进行怎样的操作。
方法有很多种,我们必须先判断应该选用其中的哪一种。解决这个问题的关键在于「浏览器的工作状态」。
浏览器向 Web 服务器发送请求消息的场景。
- 在浏览器顶部的地址栏中输入网址(「Get状态」)
- 点击网页中的超级链接(「Get状态」)
- 表单中填写信息后点击“提交”按钮(「Post/Get状态」)
- .....
写好方法之后,加一个空格,然后写 「URI」
URI 部分的格式如下,一般是文件和程序的「路径名」。
/< 目录名 >/…/< 文件名 >
路径名一般来说已经包含在 URL 中了,因此只要从 URL 中提取出来原封不动地写上去就好了。
第一行的末尾需要写上 「HTTP 的版本号」,这是为了表示该消息是基于哪个版本的 HTTP 规格编写的。「到此为止,第一行就结束了」。
2. 消息头
有些情况下还需要一些「额外的详细信息」,而消息头的功能就是用来存放这些信息的。
❝消息头按照用途可分为「四大类」 1. 通用头:适用于请求和响应的头字段 2. 请求头:用于表示请求消息的附加信息的头字段 3. 响应头:用于表示响应消息的附加信息的头字段 4. 实体头:用于消息体的附加信息的头字段 ❞
通用头:适用于请求和响应的头字段
请求头:用于表示请求消息的附加信息的头字段
响应头:用于表示响应消息的附加信息的头字段
实体头:用于消息体的附加信息的头字段
3. 消息体
写完消息头之后,还需要添加一个「完全没有内容的空行」,然后写上需要发送的数据。这一部分称为消息体,也就是消息的主体。
6. 发送请求后会收到响应
响应消息格式
在响应消息中,第一行的内容为「状态码」和「响应短语」,用来表示请求的 执行结果是成功还是出错。
状态码是一个「数字」,它主要用来向程序告知执行的结果。
响应短语则是一段「文字」,用来向人们告知执行的结果。
❝状态码的第一位数字表示「状态类型」,第二、三位数字表示具体的情况 ❞
❝1 条请求消息中只能写 1 个 URI。如果需要获取多个文件,必须对每个文件单独发送 1 条请求。 ❞
返回响应消息之后,浏览器会将「数据类型」 (Content-Type
)提取出来并显示在屏幕上。
之后的流程,可以参考页面是如何生成的(宏观角度)
后记
分享是一种态度,这篇文章,主要的篇幅来自于《网络是如何连接的》,算是一个自我学习过程中的一种记录和总结。主要是把自己认为重要的点,都罗列出来。同时,也是为大家节省一下排雷和踩坑的时间。当然,可能由于自己认知能力所限,有些点,没能表达的很好。如果大家想看原文,“墙裂推荐”看原文。
参考资料:
- URL是什么意思
- 网络是如何连接的
相关文章
- Go HTTP 编程 | 01 - 使用 http 包创建 Web 服务器
- HTTP默认端口_http协议使用的端口号
- 12-RabbitMQ高级特性-在海量订单产生的业务高峰期, 如何避免消息的重复消费问题
- 消息队列:第六章:ObjectMessage与MapMessage
- 05期:面向业务的消息服务落地实践
- Spring Cloud Bus使用自定义的消息转换器(一)
- 循环队列 作为消息队列详解程序员
- 服务Linux快速启动HTTP服务实现网络分享(linux启动http)
- 服务器一步步教你搭建Linux HTTP服务器(linux搭建http)
- HttpServletResponse详解:封装HTTP响应消息
- 极速搭建Linux下HTTP代理服务器(linux搭建http代理)
- 消息称Win11将默认以黑暗模式出现在用户面前
- 服务器管理Linux中的HTTP服务器(linux中http)
- 消息称华为确定卖掉x86服务器业务:保留ARM产品线
- 消息称台积电日本首家芯片工厂将于2023年运营
- 超高功率无线快充遭禁止 消息称50W上限政策已开始执行
- HTTP 状态消息
- HTTP 消息结构
- 深入浅出Mongodb Http: 开箱即用的可扩展性数据库(mongodb http)
- Linux快速搭建超强HTTP服务器(linux搭建http服务器)
- 新一代消息队列像Redis一样简单高效(类似redis消息队列)
- Redis消息队列实战精粹(消息队列redis实战)
- Redis订阅消息之间的联系(redis订阅和消息联系)
- 利用Redis订阅实现消息推送(redis订阅做消息推送)
- 之战Redis消息队列容量突围之路(redis消息队列容量)