golang网络编程简介和概念
再本章节中,了解了golang网络编程的基本概念和流程,了解了golang的web架构的基本概念。
再接下来的学习之中,应该用较短的时间,以基本定义中的注中的内容进行学习,之后再重点学习集中网络架构。
网络架构学习重点:
- 实现几种网络架构,了解细节
- 归纳集中架构中的重要特点【从架构之间对比和架构自身两个角度进行归纳】
网络编程概念
基本定义
定义:计算机网络进行数据交换和通信的编程过程。当我们说使用 Go 实现 TCP/UDP 网络编程时,我们是指使用 Go 语言编写程序来利用 TCP/UDP 协议进行网络通信。【再进一步说,以http为例,http代码是有其固定格式的,但是http代码是不能直接使用的。所谓的golang的http编程,就是利用golang语言将http请求等代码进行封装,使其可用的过程】
- 经过形式化分析的http协议
- http逻辑代码
- 封装成golang包
- 利用封装包实现http协议
注:其实前三部已经实现了,了解1中的协议原理,再学习2中的具体逻辑代码实现,再学习golang包的api,将api和2中的逻辑代码相对应,之后灵活进行4中的http实现即可。
编程主要内容:
-
设计应用程序
1.建立连接
2.实现数据交换
-
设计协议
主要类型:
- TCP/UDP 编程:用以实现客户端和服务器之间的数据传输
- HTTP 编程:用以实现http客户端和服务器
- WebSocket 编程:用以实现客户端和服务器之间的双向通信
- RPC 编程:实现远程程序调用。RPC(Remote Procedure Call)是一种网络编程模型,也就是远程过程调用。它允许一个程序调用另一个程序中的函数或方法,即使这两个程序在不同的机器上运行。RPC 抽象了网络通信的细节,使得调用远程函数就像调用本地函数一样简单。
- socket编程:
网络编程协议
- TCP/IP (IP TCP UDP ICMP ARP; 三次握手)
- HTTP (实现Web服务器和Web浏览器之间的通信)
- HTTPS (加密通信版HTTP)
- SMTP
- FTP
- SSH
- UDP
- DNS (将域名转化为IP地址)
- SNMP
- RTP
- NTP
网络分层模型
OSI七层模型
TCP/IP四层模型
套接字
两种类型:TCP UDP
IP地址映射到一台主机,端口号映射到一个进程
套接字:被定义为**“IP地址 + 端口号”**的组合
举例:如果我们继续使用邮递的类比,你可以把套接字理解为你的邮箱地址,包括你的街道名称(IP地址)和你的门牌号(端口号)。你可以从你的邮箱(套接字)发送和接收邮件(数据)。
网络异常状态码
- 400(Bad Request):服务器无法理解请求的语法或参数。
- 401(Unauthorized):请求需要用户身份验证。
- 403(Forbidden):服务器拒绝请求访问资源。
- 404(Not Found):请求的资源未找到。
- 405(Method Not Allowed):请求中指定的方法不允许访问资源。
- 408(Request Timeout):请求超时。
- 500(Internal Server Error):服务器遇到了意外情况,无法完成请求。
- 502(Bad Gateway):服务器作为网关或代理,从上游服务器接收到无效的响应。
- 503(Service Unavailable):服务器暂时无法处理请求,通常由于过载或维护。
- 504(Gateway Timeout):服务器作为网关或代理,未及时从上游服务器接收到响应。
会话session
服务端进行创建,记录客户端状态
用唯一Session ID标识,ID存储在用户端cookie中、或者URL之中
流程:
- 客户端(指浏览器)用户登录
- 服务端创建session,存储在服务器之中
- S将session id返回给客户端
- 客户端将session id封装在URL或cookie之中,访问服务端
- S通过id找到特定session,完成特定状态切换
cookie
流程:
- 服务端将特定用户的session进行提取,封装成用户cookie
- 将用户cookie返回给客户端
- 客户端将cookie存储在浏览器之中
- 二次访问时,向服务器提交cookie,服务器会快速恢复用户状态
身份管理和会话管理
注意:session中的数据是一种临时数据,还有一种存储在服务器数据库中的长期数据,如账户数据。
- 用户通过身份验证之后才能创建session
- 创建session时会读取数据库中的用户数据
- session可以更改数据库中的用户数据
- session经超时等状态时,会被服务器清除
- session一旦被清除,用户再次登录时,就要再次进行身份验证
url
scheme://username:password@host:port/path?query_string#fragment_id
- scheme(协议):
- username:password:身份验证–可选
- host(主机):IP地址\域名。
- port(端口):这部分指定了服务器上的端口号。如果没有指定,那么会使用该协议的默认端口
- path(路径):这部分指定了服务器上资源的具体位置。【这个路径主要看端口程序如何进行处理,如果这个端口程序很高,甚至可以通过它访问任意数据】
- query_string(查询字符串):这部分以问号“?”开头,包含了一系列的参数,通常用于给服务器提供额外的信息。每个参数都是一个键值对,参数之间用"&"分隔。
- fragment_id(片段标识符):这部分以井号“#”开头,通常用于指定网页的一个特定部分。
http
http请求:请求行+请求头部+请求体
http响应:响应行+响应头部+响应体
内容类型:Content-Type --【头部字段】
text/plain表示纯文本格式,text/html表示HTML格式,application/json表示JSON格式等等。
内容编码:Content-Encoding 【头部字段】
可以用来压缩消息体,增加通信效率。
注意:可以没有该字段,甚至可以没有消息体
http请求方法
GET:请求数据
POST:提交数据
restful编程
restful是一种编程架构。在该架构中,每一个资源都用唯一的一个url进行表示。资源的状态更新统一使用http请求进行完成。
golang-http框架
- Gin框架
- Echo框架
- Beego框架
- Revel框架
Go语言Web框架
以上四种就是go语言的web架构,之所以设计多种架构,是因为不同架构对应的需求不同。
针对特定的需求,选择适当的架构完成快速开发,是web开发的基本逻辑。
网站的基本结构
- 前端(Front-end):也称为客户端,包括 HTML、CSS 和 JavaScript 等资源。用户在浏览器中查看和交互的网页内容就是前端部分。
- 后端(Back-end):通常运行在服务器上,负责处理 HTTP 请求,执行业务逻辑,访问数据库等。后端可以用各种编程语言(如 Python、JavaScript(Node.js)、Ruby、Java、Go 等)编写。
- 数据库(Database):用于持久性地存储和检索数据。有许多类型的数据库可供选择,如关系型数据库(如 MySQL、PostgreSQL)、非关系型数据库(如 MongoDB、Redis)等。
- 服务器(Server):运行后端代码的物理或虚拟机器。
- 网络(Network):负责在用户的浏览器和服务器之间传输数据。在互联网上,这通常通过 HTTP 或 HTTPS 协议完成。
购物网站运行实例:
- 用户访问网站:用户打开浏览器,输入购物网站的 URL,比如
http://www.shopping.com
,然后按回车键。浏览器通过网络连接到 www.shopping.com
服务器,然后发送一个 HTTP GET 请求,请求首页的内容。
- 服务器响应请求:购物网站的服务器接收到请求后,运行后端代码来生成首页的 HTML 内容。这可能包括查询数据库来获取最新的商品信息等。然后服务器将生成的 HTML 内容作为 HTTP 响应的主体发送回浏览器。
- 浏览器渲染页面:用户的浏览器接收到服务器的响应,然后解析 HTML、CSS 和 JavaScript,将页面渲染出来供用户查看。
- 用户浏览商品:用户在首页上点击一个商品链接,浏览器就会发送另一个 HTTP GET 请求,请求这个商品的详细信息。服务器响应请求,生成商品详情页面的 HTML,浏览器再将其渲染出来。
- 用户添加商品到购物车:用户决定购买这个商品,点击“添加到购物车”按钮。这可能会触发一个 JavaScript 函数,该函数向服务器发送一个 HTTP POST 请求,告知服务器用户要将此商品添加到购物车。服务器接收请求,更新数据库中的购物车信息,然后响应请求,确认商品已添加到购物车。
- 用户结账:用户完成购物,点击“结账”按钮。浏览器可能会显示一个结账表单,用户在此输入收货地址和付款信息,然后提交表单。这又会向服务器发送一个 HTTP POST 请求,服务器收到请求后,执行相应的业务逻辑,如计算总价、检查库存、生成订单等。
- 用户确认订单:服务器处理完结账请求后,可能会返回一个订单确认页面,用户确认信息无误后,点击“确认”按钮。这又会发送一个 HTTP POST 请求到服务器,服务器接收到请求后,将订单状态更新为“已确认”,然后可能会发送一个电子邮件给用户,确认订单已经生成。
- 后续处理:服务器收到用户的确认后,可以将订单信息发送给仓库进行处理,然后仓库会根据订单信息将商品打包并寄出。
疑难理解
1.test.com:8080的具体含义
在网络编程之中,我们通常以域名或ip地址代表一个主机,网站的端口号,实际上对应的就是主机中的一个进程。
2.端口监听的具体含义
“主机 “example.com” 的80端口正在监听连接请求”就是指一个正在运行的程序在等待接受某一指令,就像cmd在等待指令一样。
比如,在Web服务器(如Apache或Nginx)上,服务器程序会监听80 端口(对于HTTP)或443端口(对于HTTPS)。当有人尝试连接这些端口时,服务器程序会接受这个连接请求,并与请求者进行通信,例如接收HTTP请求并返回HTTP响应。
你的类比是对的,这就像一个命令行界面(如cmd)在等待用户输入命令。只不过在网络编程的情境下,"命令"变成了网络连接请求,"用户"变成了其他的计算机或应用程序。
3.api详解
应用程序变成接口,可以理解为一种封装。即已有代码实现了一定的功能,将这些代码进行封装之后,定义对应的格式化输入,即可调用该功能。
在api的基础之上,我们可以对原有程序进行功能拓展。
api有web api ,库和架构api 、操作系统api 、硬件api的那个多种类型,主要是提升代码的复用性
4.如何理解架构
架构可以理解为一个生态系统,而协议和库只是架构的组成部分。
架构包含;
- 组件:系统由哪些主要部分组成?例如,一个Web应用可能包括前端用户界面、后端服务器和数据库这三个主要部分。
- 关系:这些组件是如何相互连接的?它们如何交互?例如,前端用户界面可能通过HTTP请求与后端服务器交互,后端服务器则可能通过SQL查询与数据库交互。
- 行为:这些组件在系统中的行为是什么?例如,后端服务器可能负责处理用户输入,执行业务逻辑,并将数据存储在数据库中。
对于更复杂的系统,架构还可能涉及更多的方面,如安全、性能、可靠性、可扩展性等。
"架构"可以看作是一个系统的“生态系统”,它包括了系统中的所有组件以及他们如何相互交互。这些组件可能包括各种协议、库、服务、数据库、硬件等等。架构描述了这些组件如何协同工作以达成特定的目标或满足特定的需求。【组件如何协同工作以达到特定目标】
收获汇总:
- restful编程的基本概念
- cookie原理
- session原理
- 网站的基本构成
- 架构、协议、包\库的理解
- api的理解
- 域名、端口号、ip的理解
- golang编程的基本流程
- url
以及核心重点:
- golang网络编程的基本流程
- 常见的web架构、及其优劣之处