前言,要完整的学计网看这,韩立刚老师的课,绝对有趣,而我这是参考慕课网:编程必备基础中的网络篇,都是软件的,不是很全,但是对于搞软件的我觉得够了。有错请指出,谢谢
文章目录
应用层包括ISO中的表示层,会话层,应用层。应用层也是工作在终端设备的,包括手机,计算机。
传输层以及以下的层提供了完整的通信服务。应用层中常用的协议:HTTP:80,HTTPS:443,DNS:53,FTP:21,TELNET:23。
还可以面向传输层编程,即java中的网络编程。
传输层中的UDP和TCP在应用层中有不同的服务。
应用层的功能是:定义应用间通信的规则。比如报文类型(请求报文,应答报文),报文的格式和语法,应用进程发送数据的时机、规则。
1. DNS协议
1.1 为什么要有DNS协议?
前面学了网络进程,知道了一个IP地址和一个端口可以确认一个网络进程。像我们平常访问网站时,其实就是访问一个网络进程,但是以IP地址和一个端口号来访问一个网站,比如47.112.195.208:442,47.12.78.197:8800等,一两个我们还可以记得住,但是这些网站一多的话,要记住这么多无规律的IP地址很难,所以这就需要DNS协议,把IP地址映射成一个名称。像:taobao.com,baidu.com。这些就是使用了DNS协议。
当访问 taobao.com时,会先使用DNS协议,去找到对应的IP地址,然后再去访问网络进程。
看看有了DNS协议,每个网站也有了自己的域名,而且很方便记住,现在能看到的网站都是有自己的域名的。因为没有域名的网络可信度不高,所以可能会导致搜索引擎收录你的网站慢的问题,即别人看不到你的网站,除法直接输入你的ip地址和端口去访问。
域名在国内需要备案,用国外的服务器就不需要,但可能网速慢。
当然你跟我说你有收藏夹,那要是在别人的电脑,可能还得去登录,而如果我知道了域名,比如要访问淘宝,直接访问 taobao.com,快不快??
1.2 DNS协议
DNS(Domain Name System,域名系统):用于域名与 IP 地址的相互转换。一个域名对应一个IP地址,当然通过CDN可以让一个域名多多个IP地址,一个IP地址可以对应多个域名。
虽然DNS协议是属于应用层的协议,但它是为应用层的其他协议服务的,比如HTTP、HTTPS等。
域名由点、字母和数字组成;点分割不同的域;域名可以分为顶级域,二级域,三级域。当然还可以继续分割更多的域,但是没有必要,因为域名本就为了方便记住。
比如 www.taobao.com 的解释:com是属于顶级域,taobao属于二级域,www属于三级域。
其中顶级域还可以继续分:
二级域:二级域加上三级域名的话是全球唯一的。多个不同的二级域可对应一个顶级域。
三级域:三级域,常见的有www,也可以自定义,也可以不要三级域(默认)。
这些域其实可以形成一棵树:
一般去阿里云或腾讯云申请域名或其他时,申请的都是带有二级域加顶级域的域名。
这些域名和IP地址的映射其实是部署在服务器上面的,比如在阿里云买的域名,那该映射就在阿里云他们的服务器上,可称为域名服务器或DNS服务器。
1.3 DNS解析
首先放出一张图。
- 根域名服务器即全球性的域名服务器,存储所有的顶级域名服务器的域名和地址。全球共有13个不同IP地址的根域名服务器。由不同的国家管理。但是每分钟要要解析的次数是非常多的,所以就出现了镜像服务器,这些镜像服务器和根服务器的IP是一样的。当对根服务器发出请求时,都是会去访问最近的。比如访问 baidu.com时,先通过根服务器去查询com的顶级域名服务器的ip地址,而不是去查找 baidu.com整个的ip地址,根服务器不存储baidu.com与ip的映射关系。
- 顶级域名服务器管理在此服务器注册的二级域名。比如查找 baidu.com,则通过根域名服务器解析找到com的ip地址,然后找到该顶级服务器,然后到该服务器中查询baidu,如果该服务器有该域名与ip地址的映射关系,则解析完毕。
- 域名服务器:每个二级域名都会有一个域名服务器,负责添加子域名的映射。因为还有二级域名下可能还有三级域名、四级域名等等,比如www.baidu.com。
比如查询 www.baidu.com:
-
会先去访问浏览器中的DNS缓存(即看看有没有缓存该域名与IP地址的映射关系),如果有就直接拿出来访问。
-
如果找不到就去本地计算机中的host文件(C:\Windows\System32\drivers\etc的host文件),如果有就直接拿出来访问。
-
如果找不到就会去路由器的DNS缓存中查询,如果有就直接访问。
-
如果找不到,就会根据本地计算机设置的DNS服务器去找,我们把服务器称为本地DNS服务器(如图,一般是由ISP提供的),该服务器会收到我们的DNS请求,它会去查询它是否有缓存在记录,如果有则将解析结果返回给客户机。
(在CMD输入ipconfig/all,即可看到。如果DNS代理模式开启和DHCP模式开启(待讲),则主机自动获取到的DNS一般也是路由器ip,路由器通过NAT技术获得真实的DNS服务器的IP地址,该真实的DNS服务器IP地址是由ISP提供的。也可以自己指定真实的DNS服务器IP地址)
(或者这样)
- 如果本地DNS服务器没有,那就会从本地DNS服务器跳转到根域名服务器查询,根据域名所携带的顶级域名来从根域名服务器查询对应的顶级域名服务器。找到com域名服务器的ip地址跳转到该服务器,发出请求查询baidu,如果就跳转到该域名的服务器。
- 在baidu这台DNS服务器中查找是否有该www的子域名服务器(三级域名服务器),如果三级域名服务器有映射关系,则把解析成功结果返回到顶级域名服务器,再从顶级域名服务器回到根域名服务器,最后把结果送回到本地DNS服务器,然后本地DNS服务器会把结果给我们客户机;如果没有则会告诉客户机访问不到该网站。那假设如果是这样:aa.bb.cc.baidu.com,那就会从baidu这台DNS服务器,先找到cc然后找到bb然后扎到aa,最后查看有没有记录映射关系。
额外:
- 对于对应到的IP,可能1个,也可能多个,最终的应用或系统j解析服务,从中随机挑选一个。
- 域名还可以与另一个域名有映射关系,其实就是别名,称为CNAME。会找到别名后通过CNAME找到IP地址。
前面也说了这些域其实可以看出一棵树,从我们计算机发出请求,到本地DNS服务器然后再跳转到其他DNS服务器,最终把结果一层一层归还回来,送到我们计算机,这属于递归查询。而服务器与服务器之间属于迭代查询,比如查询com顶级域名服务器。
浏览器DNS缓存和计算机DNS缓存(host)和路由器DNS缓存的区别?
- 浏览器DNS缓存是有时间限制的。
- 计算机DNS缓存没有时间限制,但是只能在该计算机生效。
- 路由器DNS缓存,所有设备连入该路由器,DNS缓存就都会在这些设备生效。
1.4 CDN技术(了解)
CDN(Content Delivery Network,内容分发网络)
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
作用:加快服务器的访问速度。
就比如我的网站部署在广东的一台服务器上,那么我在广东内访问肯定很快,那我要是在新疆访问,可能会比较慢(网线,距离)。如果使用了CDN技术,那么就好像我在每个省都有一台服务器,这时无论在国内哪个地区都可以很快的访问。
所以DNS解析时可能可以解析出很多不同的IP地址,但实际上真实的IP地址只有一个,其他的IP地址可能是代理而已。
1.5 一些网站访问慢的原因
这里可以提一提,访问国外网站,比如github,有时候非常慢,学了DNS解析就知道为什么慢了,其实就是DNS解析需要去跨很多很多服务器去找,这就非常慢。
这时可能脑子就有点子了,比如可以提前在本地计算机的host先缓存了github域名和对应的ip地址。但是只是免了DNS解析(没有访问目的服务器),因为我们对该域名发出请求时,该请求还得送到国外的服务器,这过程是很长的,加上国内对国外网络的屏蔽,所以也是非常不稳定。
借助:NDS查询,输入域名来查询IP地址。可以自己在C:\Windows\System32\drivers\etc的host文件中添加映射的这种方法其实没什么用,因为如果本身访问国外服务器就有困难,那即使做了映射也没上面用。而且做了映射后关系就是死的,一直只能访问到那个IP地址。
众所周知,网络会通过路由器寻找最合适的路线访问。所以有时可能正常访问github。
我自己测试了很多次,映射完访问github还是有难度。
2. DHCP协议
DHCP(Dynamic Host Configuration Protocol,动态主机设置协议):是一个局域网协议
,应用UDP协议的应用层协议。
比如我们的手机,笔记本经常需要移动,比如在家,在公司,在学校,但是联网时并不需要进行IP地址配置。这就是DHCP的功能,它提供一种即插即用联网机制。
那么如何启用DHCP?那计算机来做,只需如下操作:就启动了DHCP。这样就临时地分配一个IP地址给计算机让它联网,一般是一个内网IP地址。如果要跟外部网络通信就使用NAT技术。
DHCP服务器一般是指具备DHCP功能的网络设备,一般路由器都具备DHCP功能的。DHCP服务器监听默认端口:67。
2.1 DHCP协议获取IP地址的过程
- 主机使用UDP协议广播DHCP发现报文;
- DHCP服务器发出DHCP提供报文;
- 主机向DHCP服务器发出DHCP请求报文;
- DHCP服务器回应并提供IP地址给主机。
2.2 作用
即为临时加入局域网的设备提供一个临时的IP地址。
3. HTTP协议
HTTP(HyperText Transfer Protocol,超文本传输协议):简单理解为“带有超链接的文本”,可以从网站的一个地方到另一个地方(服务器)。是一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP协议是属于可靠数据传输的协议,依赖于传输层的TCP协议。像图片,视频,文件等都是通过HTTP协议去传输的。
但是HTTP是一种不保存状态,即无状态(stateless)协议,比如每当有新的请求发送时,就会有对应的新响应产生(即使失败),但是协议不会保留之前一切的请求或响应报文的信息。主要是为了能够更快处理大量事务,确保协议的可伸缩性。
当然可以借助Cookie来保持状态功能。
3.1 超链接URL
URL(Uniform Resource Locator,统一资源定位符),简单地讲就是网络上的一个站点、网页的完整路径。
URL的一般格式为:协议://[主机]:[端口]/[路径]?[字段]=[字段值]
协议:
- 最常见的就是HTTP协议。
- file:资源是本地计算机上的文件
- ftp:文件传输访问。
- 等等。
http协议的默认端口是80,而https属于安全协议用的是443端口(待讲)。所以在输入URL时可以省略端口。
[路径]和[字段]=[字段值]都是可选的。像直接输入域名(主机)就默认访问index.html。
比如:https://www.baidu.com/index.html
3.2 URI和URL(了解)
【摘选 《图解HTTP》】
URI:(Uniform Resource Identifier,统一资源标识符):
- Uniform:规定统一的格式可方便处理多种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式。(http、https、ftp等)
- Resource:资源的定义是“可标识的任何东西”。不仅是文档文件,图像或服务(天气预报)等能够区别于其他类型的,全都可作为资源。资源不仅仅可以单一,也可以是多数的集合体。
- Identifier:标识可标识的对象,可称为标识符。
URI和URL的区别:URI用字符串标识某一互联网资源,而URL表示资源的地址(互联网上所处的位置),URL是URI的子集。
列举几种URI:转自:URI和URL的区别(图解HTTP也有但是没标出有哪些可以用URL来表示)
ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
mailto:[email protected] (also a URL because of the protocol)
news:comp.infosystems.www.servers.unix (also a URL because of the protocol)
tel:+1-816-555-1212
telnet://192.0.2.16:80/ (also a URL because of the protocol)
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
可看到这些全是URI,其中一些URI也可以用URL来代替。所以了解一下。像http的URL叫URI或URL都可以。
3.2 服务器对客户端请求报文的处理
3.3 HTTP的请求方法(method)
HTTP的请求方法有很多,但是最常见的就4个:GET,POST,DELETE,UPDATE。
- GET:获取指定的服务端资源
- POST:提交数据到服务端
- DELETE:提交数据到服务端
- UPDATE:更新指定的服务端资源
如何指定资源?有两种方式:
- 在URL地址请求,比如获取图片:https://coding.imooc.com/lesson/355.html
- 在请求报文中指定。看下面。
3.4 请求报文
例如:
对于请求头:了解
3.5 应答报文
状态码和状态解释都是一对的:都需要看看。
- 1xx:信息性状态码,表示接收的请求正在处理。
- 2xx:成功状态码。
- 200 OK:表示客户端发来的请求在服务器被正常处理了。
- 204 No Content:请求处理成功,但没有资源可返回。一般在需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
- 206 Partial Content:对资源某部分的请求,范围请求。响应报文中包含由Content-Range指定范围的实体内容(请求内容)。
- 3xx:重定向状态码。
- 301 Moved Permanently:永久性重定向,表示请求的资源已经被分配新的URL,以后要访问应该使用新的URL。
- 302 Found:临时重定向,表示请求的资源已经被分配新的URL,本次要访问应该使用新的URL。
- 303 See Other:表示请求对应的资源存在另一个URL,应使用GET方法定向获取请求的资源。(与302功能一样,但303表明应该使用GET方法)
- 304 Not Modified:表示客户端发送附带条件的请求时,服务器允许请求访问资源,但因发送请求未满足条件后直接返回304。304虽然被划分在3xx中,但跟重定向没有关系。
- 307 Temporary Redirect:临时重定向。在302中虽然标准禁止POST变成GET,但使用时不遵循该规则也可以使用。而307就是来明确禁止从POST变成GET。
- 4xx:客户端错误状态码。
- 400 Bad Request:表示请求报文存在错误语法。当错误发送时,需要修改请求内容在重新发送。注意:浏览器会像200 OK对待该状态。
- 401 Unauthorized:表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。
- 403 Forbidden:表明对请求资源的访问被服务器拒绝了,通常是因为权限问题,特别是linux的服务器,注意文件的访问权限,nginx或tomcat的权限等。
- 404 Not Found:表明服务器上无法找到请求的资源。检查URL有没有写错,不然就服务器真的没有该URL的访问资源。
- 5xx:服务端错误状态码。
- 500 Internal Server Error:服务器在执行请求时出现异常。可能是bug或临时故障。
- 503 Service Unavailable:服务器正在忙。表明服务器暂时处于超负载或在进行停机维护,现在无法处理请求。
3.4 web缓存(了解)
二八原则:即一个网站会把百分之20的热门内容先缓存起来,提高访问速度。
存储器层次结构:从上到下可以分为:缓存,主存,辅存。Redis就是一种基础主存的数据库。可以把热门数据先缓存到Redis中,然后很快取出来。
3.5 web代理(了解)
代理作用:可以把服务端部署的架构屏蔽掉。也可以保证服务端的安全,因为在代理里面可以设置一些规则,也就是常说的防护墙。
代理可以分为正向代理和反向代理:
最常见的代理软件:Nginx,HAProxy
3.6 爬虫(了解)
网络就好像一个大网,而有一只蜘蛛在网上走来走去,然后可以采集相关的信息。像百度,谷歌等搜索引擎其实就是利用爬虫,把网络上的数据爬下来,做一定的索引,然后我们就可以搜索了。
当然爬虫既然是去整个网络上爬,那可能就会爬到一些不好的(不利的),会导致网络拥塞,损耗服务器资源。
4. HTTPS协议
因为HTTP是明文传输的(不加密的),很容易被黑客获取数据。所以就有了HTTPS协议。
加的S,其实是Secure。HTTPS从原来的80端口变成现在的443端口。
4.1 加密模型
- 对称加密
- 非对称加密
A、B是拥有一定数学关系的一组秘钥。密匙可分为:
- 私钥:自己使用,不对外公开。
- 公钥:大家都可以使用的。
既然是加密,那信息肯定不对外公开,只有自己可以解密,所以私钥是解密的,公钥是加密的。
数字证书:是可信任组织颁发给特定对象的认证,即签名,也就是让那些可信的机构来证明你是本人,然后本人发送的信息别人就可以信任。就类似我们的身份证。
签名也有加密和解密。既然不希望别人冒着我,那可以用私钥来签名,而公钥就是来验证是不是你本人。
- SSL(Secure Sockets Layer: 安全套接层):数据安全和数据完整,对传输层数据进行加密后传输。
而SSL是数字证书的一种,腾讯云就可以免费申请。
4.2 HTTPS的请求过程
来看看第二步是怎么构成安全传输的: