Loading

Asp.net core 少走弯路系列教程(五)HTTP 协议学习

前言

新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力。

新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马。

作者认为新人应该先打好基础,不要直接学习框架,例如先掌握 SQL 再使用 EFCore 框架。

作者只传授数年内不会变化的知识,让新手学习快速进入跑道受益终身。

分享使我快乐,请务必转发给同学,朋友,让大家都少走一些弯路!!


可能会疑惑为什么要了解 HTTP 协议,我只能说这是基础,了解 HTTP 网络协议对以后网络编程有很大的帮助。并且在与 WebApi 交互时更容易排查出问题的原因。


浏览器与服务器的工作原理

目前我们在学习了 HTML,CSS,JavaScript 后,可以根据需求将数据和前端代码拼接在一起后给浏览器运行。其实,我们的数据和前端代码是应该由我们的Asp.net core应用程序来打印到浏览器中运行的,不是我们目前直接将.html页面展开运行的。这样就涉及到浏览器和Java应用程序之间需要进行数据的交互。比如:

浏览器运行网页--->网页收集用户数据--->发送Asp.net core应用程序处理。

Asp.net core应用程序处理浏览器的请求---->将处理结果发送给浏览器--->浏览器将结果展现。

我们先不考虑浏览器和Asp.net core应用程序之间进行数据交互的具体代码的实现,浏览器是代码写的,Asp.net core应用程序也是代码写的,而且使用的是不同的开发语言。

现在是两个不同的软件之间要进行数据的交互,那么是浏览器随便发送什么格式的数据,我们的Asp.net core应用程序就能直接识别使用的吗?

不能,浏览器和Asp.net core应用程序之间必须按照指定的规范来进行数据的交互。那么使用什么样的格式呢?

浏览器和Asp.net core应用程序之间约定一个数据交互的规范(HTTP协议)


HTTP通信机制是在一次完整的 HTTP 通信过程中,客户端与服务器之间将完成下列7个步骤:

1、建立 TCP 连接

在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;

2、客户端向服务器发送请求命令

一旦建立了TCP连接,客户端就会向服务器发送请求命令;

例如:GET/sample/hello.jsp HTTP/1.1

3、客户端发送请求头信息

客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;

4、服务器应答

客户端向服务器发出请求后,服务器会客户端返回响应;

例如: HTTP/1.1 200 OK

响应的第一部分是协议的版本号和响应状态码

5、服务器返回响应头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档;

6、服务器向客户端发送数据

服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;

7、服务器关闭 TCP 连接

一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。


HTTP协议介绍

html页面上全是文字,但是浏览器解析之后,展现出来的页面是非常丰富的

超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。超文本更是一种用户界面范式,用以显示文本及与文本之间相关的内容。

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写, HTTP是万维网(WWW:World Wide Web)的数据通信的基础。

HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。


HTTP1.0

最早在1996年在网页中使用,内容简单,所以浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态),请求只能由客户端发起(单向性)。


HTTP1.1

到1999年广泛在各大浏览器网络请求中使用,HTTP/1.0中默认使用Connection: close。在HTTP/1.1中已经默认使用Connection: keep-alive(长连接),避免了连接建立和释放的开销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。

1.1中最重要的一个特点是支持“长连接”,即“一次连接可以多次请求”。

HTTP 1.1支持持久连接(HTTP/1.1的默认模式使用带流水线的持久连接),在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。

请求报文结构:

  • 方法名 GET、POST
  • Content-Length: 32 是主体内容的长度(GET 没有主体和 Content-Length)

响应报文结构:

  • Content-Length: 256 是主体内容的长度
  • Content-Type: text/html 是体客户端应该把主体当作 HTML(text/plan 则当作文本)

请求数据结构

1、QueryString 是一种跟随 url key-value 数据结构:

https://www.baidu.com/s?ie=UTF-8&wd=dotnet

  • QueryString["id"] = "UTF-8"
  • QueryString["wd"] = "dotnet"

2、Form 与 QueryString 数据格式一致,它在 POST 请求报文的主体中:

POST / HTTP/1.1
Host: www.baidu.com
Content-Length: 18
Content-Type: application/x-www-from-urlencoded

ie=UTF-8&wd=dotnet
  • Form["id"] = "UTF-8"
  • Form["wd"] = "dotnet"

3、JSON

POST / HTTP/1.1
Host: www.baidu.com
Content-Length: 33
Content-Type: application/json

{ "ie": "UTF-8", "wd": "dotnet" }

服务器遇到这种请求报文,将主体内容以 JSON 的解析得到对应的参数值。(注意它比 QueryString/Form 占用更多的字节)


使用 Chrome 浏览器观察 HTTP协议

在 Chrome 使用 F12 打开开发者工具,然后访问 cnblogs 首页如下:

我们很直观的看到,浏览器访问 github 页面包含了 html、css、以及很多图片,大概顺序:

  • 请求 github.com/xxx 页面,得到 HTML
  • 渲染 HTML 的时候:
    • 遇到 <img ..> 图片,发送 HTTP 请求图片
    • 遇到 <style ..> 样式,发送 HTTP 请求 .css 样式文件
    • 遇到 <script ..> 脚本,发送 HTTP 请求 .js 脚本文件

点击图中任何一项,可进入详细的内容,请求报文,响应报文。


使用命令行请求网页

这里特别介绍在 command.exe 中请求一个网页:

输入以下内容(注意两个换行):

GET / HTTP/1.1
Host: www.cnblogs.com
Accept-Language: zh-CN

HTTP/1.1 302 Found
Date: Thu, 29 Sep 2022 11:35:06 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: https://www.cnblogs.com/
Via: HTTP/1.1 SLB.52

<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

响应 302 是因为我们访问的是 http://www.cnblogs.com/,服务器跳转到 https://www.cnblogs.com/

Location: https://www.cnblogs.com/

HTTP 协议还有很多知识,但是对新手而已学到这里算入门了,千万不要指望一下能吃下所有内容(贪吃蛇的后果),只有反复的实战才能彻底领会贯通。

到这里,你已经对 HTTP 协议有了初步的认识,为我们以后深入打下了基础,下一篇我们学习 C# 语言知识吧!


系列文章导航

原创保护,转载请注明出处:https://www.cnblogs.com/FreeSql/p/16782488.html

posted @ 2022-10-11 20:29  FreeSql  阅读(837)  评论(0编辑  收藏  举报