golang网络编程学习day1
- 网络编程
- 网络编程常用协议
- 网络分层:
- DNS
- socket
- 客户端和服务器模型
- UDP和TCP区别
- 会话session
- Cookie
- https
- Go网络编程分类
- Go网络编程库
- day1总结
网络编程
三个主要方面:1.程序设计,2.网络协议,3.实现用到的语言和包
程序设计:
就是设计应用程序之间如何进行通讯的,今天学的例子的设计主要是客户端和服务器端这样的方式
网络协议:
就是进行通讯时要用到什么协议(tcp/ip,udp,http,smtp)等等,都是计算机网络的理论知识,这个学过了心中有数就行。
编程语言和工具:
用go语言如何实现,这一般要用到语言提供的包,用了哪些包,然后来实现socket编程,编写客户端和服务器,RESful API框架。
目的就是实现不同应用程序实现数据的交换,实现互联网或局域网进行数据传输,web程序等等。
网络编程常用协议
用的比较多的:tcp/ip,udp,http,smtp,ftp,ssh。细节不做解释,回顾的时候之间去看计算机网络。
这里我就只看一个我学的比较浅的协议
http(超文本传输协议)用来从万维网(www)服务器传输超文本到本地浏览器的协议。基于TCP\IP通信协议来传输数据,一般传html,图片文件,查询结果)。
总结用途:用于Web浏览器和万维网服务器之间通信。
http工作原理:
工作模型:请求和响应模型:客户端(web浏览器)向服务器发送HTTP请求,然后服务器处理请求后返回HTTP响应:
流程:
1.客户端与服务器建立tcp链接
2.客户端向服务器发http请求
3.服务器就收请求后并返回http响应
4.释放tcp链接
5.客户端解析返回的内容
HTTP请求方法:
1.GET 用于客户端请求服务器发送某个资源
比如我访问一个网页http://www.example.com,浏览器实际上是向服务器发送一个GET请求来获取该网站的html内容
2.POST 用于提交数据给服务器。
这通常会导致服务器上的状态发生改变,比如数据的添加或修改
比如用户注册,会填写相关的信息,填写完了后要点击注册,这实际上就是提交表单的过程,会通过POST请求,将表单数据发送到服务器来创建新用户。
3.PUT 用于上传指定资源的全部内容
比如我正在使用一个在线文件编辑服务,我写完后进行保存,这个通常就是用PUT请求来更新存储在服务器上的原始文件
4.DELETE 请求服务器删除指定的资源
比如我在一个内容管理系统,我要删除一篇文章,那这个过程就是客户端向服务器发送了DELETE请求,实现了删除服务器上的这篇文章
5.HEAD 类似于GET,但是服务器在响应中只返回头部信息,不返回实体的主主体部分
这个通常用在我想指定服务器上是否存在某个资源,或者获取数据的元数据,比如最后的修改时间。在这个场景就会非常便捷。
6 OPTIONS 用于获取目的服务器支持的通信选项
比如在发送实际请求之前,客户端可以使用OPTIONS请求来检查服务器支持哪些HTTP方法
7 TRACE 回显服务器收到的请求,主要用于测试或诊断
比如开发人员可能使用TRACE方法来进行故障诊断或网络测试
8 CONNCET 用于代理服务器,以切换到管道方式
这个用于SSL加密服务器连接。
HTTP请求结构
四个部分:
1.请求行:包括请求类型、资源地址、和HTTP协议版本
2.请求头部:包含服务器使用的附加信息
3.空行:分隔头部和正文
4.请求数据:可选,用于添加其他任意数据
举个例子
我访问www.example.com这个网站,上面介绍也说了,就是发了个GET请求获取这个页面的html文档。
那发的这个请求为这样:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
分析:
请求行:GET /index.html HTTP/1.1,请求类型GET,资源路径/index.html,HTTP版本HTTP/1.1
请求头部:包含了Host(目标主机)www.example.com,浏览器信息User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ,可接收响应类型Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
空行 :请求头部和请求体之间的空行
请求体:也就是下面返回的信息,这里啥也没有就是空。因为GET请求中通常为空。
请求头列举:
响应头列举:
HTTP响应结构
http响应包括以下四部分
1.状态行:包括http版本,状态码,和状态信息
2.响应头:这些头包含了关于响应的附加信息,如DATA,内容类型(Context-Type),服务器类型(Server),内容长度(Context-length)等
3.空行:也是响应头和响应体之间的空行
4.响应体:包含和服务器返回的实际数据,可能是HTML文档,图像数据或者其他。
举个例子
作为回应服务器可能会发送这样的响应:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
解读:
状态行:HTTP/1.1(协议) 状态码200 状态信息OK
响应头:返回了时间,服务器的类型和最后修改时间,返回的文档的长度和类型还有连接状态。
响应体
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
状态码
1xx:信息性状态码,表示请求已经被接收,继续处理
2xx:成功:表示已成功被服务器接收、理解、接受
3xx:重定向,要完成请求必须进行更多操作
4xx:客户端错误,请求有语法错误或无法实现
5xx:服务器错误,服务器未能实现合法请求
最后说说HTTP的特点:
1.无状态:HTTP协议自身不保存之前的请求或响应,每次请求都是独立的。
2.无连接:限制每次连接只处理一个请求,然后断开,但HTTP/1.1中有持久连接的概念
网络分层:
计算机网络学过了
osi七层,tcp/ip四层,自己去了解每一次的作用还有涉及到的应用场景和用的协议。
总之就是实现通信要用到一些协议。比较重要的就是TCP/IP协议族,因为这是通信所必须要的协议。
这里通信最常用到的一些协议就是tcp,udp,ICMP,ARP,IP,自己搞清楚这些协议都是干嘛的,特点是什么,还有TCP协议的三报文握手,四报文挥手协议等等。这些原理在计算机网络都学习过了,这里简单过一下。
DNS
具体去看计算机网络,我这里一句话总结了:首先DNS是域名解析协议,在互联网上我们访问是通过IP地址,但是平时我们都习惯用域名比如www.baidu.com,我们在访问域名的背后其实实质还是在访问IP地址,DNS服务器中有IP地址和域名的映射,所以我们访问一个域名其实是先到这个域名服务器中找到这个域名对应的IP地址之后才实现访问的。然后这个域名解析的过程又是分级的,这里要对域名有相关的理解,知道什么叫顶级域名,一级域名二级域名等等。所以这才引出了什么根服务器,顶级域名服务器,本地域名服务器,权威域名服务器等。这个查询的过程本来是先看本地域名服务器,本地域名服务器没有才往上面进行查询。
这里查询通常由两种,迭代查询和递归查询,这个具体过程就去看计算机网络。
补充一点,本地域名服务器一般都是有高速缓存的。
socket
如上图所示,socket就是个插座接口:
IP地址和端口封装就是socket的抽象概念,所以这就可以看出socket的作用就是用于不同主机的进程之间通信。还有一种理解就是Socket就是一个抽象的数据结构,里面含有ip地址和端口。
套接字通信原理
分五个部分:
1.服务器监听:就是在服务器的特定IP和端口上创建一个套接字(相当于服务器这边搞了个插头接口),然后服务器就监听这个端口上的客户端请求,这个过程总结就是绑定和监听。
2.客户端请求:客户端知道了服务器的IP地址和端口号,自己也创建一个套接字,并且从这个套接字向服务器发起请求。(客户端自己搞了个插头,发起请求就是去接服务器的插头)
3.连接确认:服务器接收到客户端的请求后会建立连接,这个时候双方就可以进行数据通信了
4.数据交换:就是连接建立之后,客户端和服务器都可以通过读写操作来收发数据。一般发的都是数据包,每个数据包都含有目的IP和目的端口号。
5.断开连接:数据发完了就将这个连接关闭,各自释放各自的套接字资源
套接字类型
一种是udp一种是tcp
tcp套接字(面向连接):这种类型的套接字在交换数据,客户端和服务器必须建立一个稳定的连接(而且这个传输和tcp的传输一样,基于流的传输)。tcp套接字通过三次握手来建立连接
upd套接字:不需要在通信前提前建立连接,而是直接发送数据包。
socket总结:
这只是理论基础,具体的实现,不同语言的实现方式不一样,但是原理都是一样的。
客户端和服务器模型(C/S)
我就举个例子:
客户端client,服务器server,多个客户端可以同时连接到服务器上,这个服务器通常是一台高性能计算机也有可能是集群,然后客户端通过请求的方式向服务器请求资源。然后这个请求的过程中还会用到一些协议。
在工作上:客户端发起请求,请求资源,服务器处理请求,并提供资源。
是一种广泛的通信交互方式。
UDP和TCP的区别
这里我还是一句话总结:都是传输层的协议,在网络通信上有重要的作用,区别主要在以下五点。
1.连接方式:tcp有连接,udp没有
2.可靠性:tcp可靠,udp不可靠
3.速度,tcp慢一点,udp快一点
4.数据量:tcp没有限制,udp有限制
5.应用场景不同
这里就是我对上面总结的理解:1.连接方式我就不说了,这就是协议天生的特性,2.tcp可靠是因为他实现了差错控制,流量控制等很多东西,udp啥也不保证,所以udp不可靠,3.tcp还有一些确认和重传的操作,udp根本就没这些操作,收得到就收收不到就算了,4.tcp是字节流,udp是用户数据报,一般传用户数据包都有个最大数据长度的,这个纯粹是计算机网络的知识,学过就知道,5就是因为前四点,这才决定了应用场景,tcp通常用在要求可靠的场景,udp就是不可靠。
举个例子:tcp一般用在文件传输,网页请求,邮件,这些你就必须保证可靠,要是乱码了那文件不就坏了。udp一般用在需要快速传输的场景,比如网络电话和在线游戏,你想想有时候你打视频电话网卡了那就是卡了,刚刚的画面你也看不到对吧。
会话session
是什么?
会话指的是一种服务器端记录客户端状态的机制。在Web应用程序中,由于HTTP是协议是无状态的,服务器无法区分不同客户端的请求。所以说为了克服这种缺点,Session这个概念就得到了一引入,这种会话机制可以来维护客户端状态。
怎么创建?
会话一般是服务器创建的,服务器会为每个客户端创建一个唯一的会话标识,并将该标识存储在客户端的Cookie或URL中。包括登录状态、购物车内容、表单数据等等。
具体例子:
举几个例子看看Session的应用
1.用户登录:用户登录后,服务器就是会创建一个会话,保存用户的登录状态,这样后续的操作就不需要验证。
2.购物车:我们在点外卖的时候,有时候你不仅仅只是点同一个商家的外卖,你在不同商家加了购物车之后,你退出这个商家的店面时你发现你购物车里面的添加的商品还在,这就是会话保证的。
注意事项:
会话机制需要注意的问题:
1.安全性:小心会话被劫持,举个例子,你刚把东西加了购物车,有人劫持了你的会话,你搞半天发现啥也没加。
2.生命周期:会话一般是有一定的生命周期的,比如超时了会话就会关闭。
3.负载均衡:会话需要在多个服务器之间共享,这需要一些机制来实现会话的负载均衡。
这个你过一遍你就指的会话是啥意思了。
Cookie
是什么?
web服务器与服务器之间状态传递信息的机制。
相关用法:
web浏览器向服务器发送请求时,服务器可以设置响应头部中的Set-Cookie字段来创建一个Cookie,将一些状态信息保存在客户端的浏览器中。
在客户端浏览器中,Cookie以文本的形式保存的,保存在客户端的磁盘中,当下次客户端再次访问该网站时,客户端会自动将保存的Cookie发送给服务器,服务器读取了Cookie中保存的信息,根据这些信息来判断客户端的状态。
Cookie结构
1.名称:就是个名称用于标识Cookie
2.值:Cookie保存的值
3.域名:指的哪些域名可以访问该Cookie
4.路径:哪些路径可以访问该Cookie
5.过期时间:就是过期后该Cookie会自动删除
6.安全标志:指定是否只在HTTPS安全连接下传输Cookie
应用场景
1.保存登录信息,你在某网站登录了,输入你的信息之后,下次访问时自动登录
2.记住用户的喜好,就是用户设置了一些选项,服务器可以通过Cookie保存这些选项,下次访问时自动应用这些选项。
注意事项
Cookie也是有风险的,有人劫持了Cookie,比如获取了你的登录信息,那么你的账号就会出现风险,相关的处理是1.加密Cookie,2.设置过期时间,3.只在HTTPS下传输Cookie,4.别再Cookie中保存敏感信息。
https
HTTPS就是再HTTP协议的基础上加如了SSL/TLS协议来保护web通信的安全,具体是通过加密数据传输,从而防止信息被攻击者操作。
https协议的加密过程
这个了解一下就好了
1.客户端请求建立SSL连接:客户端向服务器发一个请求建立SSL连接
2.服务器响应:服务器收到客户端请求后,给客户端发一个数字证书,证书包含了公钥和别的信息
3.客户端验证证书:客户端收到服务器发来的证书后,通过内置的数字证书机构CA验证证书的合法性并提取服务器的公钥。
4.客户端生成随机数:客户端生一个随机数作为对称加密算法的密钥,并使用服务器的公钥将其加密,然后将加密后的密钥发给服务器。
5.服务器解密随机数:服务器就收到加密后的随机数,使用自己的密钥进行解密,得到在客户端上生成的随机数
6.双方开始加密通信:客户端和服务器使用双方共同拥有的随机数作为对称加密算法的密钥,开始进行加密通信。
HTTPS协议可以保证什么
1.数据传输的机密性:原理就是使用了对称加密算法
2.数据的完整性:通过使用数字签名和摘要算法。
3.身份验证:通过使用数字证书,可以对服务器进行身份验证
注意事项
HTTPS并非绝对安全。要保证证书的真实性,避免伪造证书
别的我就不多说了。
Golang网络编程分类
主要就几种:
1.TCP/UDP网络编程:就是用这两个网络协议然后使用go语言实现客户端和服务器之间的数据传输。
2.HTTP网络编程:Go语言提供了HTTP协议相关的包和函数,可以实现HTTP客户端和服务器
3.WebSocket:基于Http协议的双向通信协议,它可以在浏览器和服务器之间建立长连接,Go语言提供了对WebSocket的支持
4.RPC网络编程:远程过程调用协议,可以让客户端调用远程服务器上的函数。Go语言也提供了对RPC的支持。可以轻松实现
5.Socket编程:Socket是一种实现网络通信的API,可以用于实现底层的网络编程,GO语言也对Socket提供了支持。
后面的学习目标,用go语言把这些都网络编程类型都实现。
Golang网络编程库
也就是实现上面说的网络编程,基本上就是用这些库来实现的。
GO语言的网络编程库可以说是非常的强大,支持各种通信协议还有上面提到的网络编程方式。
所以说熟练掌握这些库,并且利用这些库实现网络编程几个分类,就是学习的最终目标.
关键:
1.net/http:用于构建HTTP服务器和客户端,支持处理常见的HTTP请求和响应
2.net:提供了基本的网络编程功能,包括socket、TCP、UDP等协议的支持,是所有网络编程库的基础。
3.net/rpc:提供了实现源程过程调用的API
4.net/url:提供了解析和生成URL的功能,包括查询参数、路径等等
5.encoding/json:提供了将Json数据转Go语言对象和逆过程的功能,常与http协议使用
6.crypto/tls:提供了用于实现安全通信的TLS/SSL协议支持
7.websocket:提供了实现WebSocket协议的支持,用于实现双向通信的Web应用程序
还有别的很重要的库gRPC,fastHTTP等。
网络编程的目标就是学会使用上面提到的库,然后实现几类网络编程。并且过程一定要懂。
day1总结
今天的学习基本上都是有关理论上的了解和学习,由于之前学过计算机网络,所以大多感觉都是能接受,某些概念不懂就直接去找资料学就行了。明天开始进行对库函数的使用和实操。