网络应用程序的体系结构
CS结构 : 客户端服务端 (微信,QQ)
P2P结构 : 端到端 (百度网盘,迅雷) Pear to Pear
CS 体系结构
客户端通过网络跟服务器进行交互
比如网页服务,发消息:都不是把信息直接给想要发的那个人,而是把信息交给服务器,服务器转发给那个人
服务端大多数不是一个机器,而是一个数据中心,组成了一个虚拟的服务器。
P2P
不需要一个中心存在的服务器,所用用户通过这个服务连接到一起,拓展性很强,密集型强,流量密集。
缺点:对于用户来说,只想享受便利,不想享受服务。比如在百度云盘中的积分政策,用自己的流量上传服务,但是没有给用户相应的福利。
挑战:
ISP 友好:所有的ISP 想限制P2P的流量,大多数ISP 住宅受制于“非对等的”宽带应用(上行和下行有较大的差异,一般来说,上载的流量比较小所以,也有限制),P2P 模式会改变从服务器到住宅ISP 的上传流量(占用大量的上载流量,没有给ISP 的效益)。
安全性:本地数据可能会以某种方式上传上去
合理的激励:上传和下载的流量不匹配,被使用的流量和给的福利不对等。
进程通信:
所有CS结构的网络应用程序,都是由成对的进程组构成。
由server 和 client
在P2P 结构中,发起通信的为客户端,等待服务的进程为服务端
进程与计算机网络之间的接口
Socket是应用程序与网络之间的API;
应用程序对于运输层的控制仅限于
选择运输层协议
设置简单参数
比如设置,地址重用
可供应用程序使用的运输服务
应用程序服务要求
可靠数据传输:TCP支持(发送的对方一定能收到)
吞吐量 : 网络有一定的吞吐量
定时 : 允许的延迟,超过一定延迟,则完成不了服务
安全性 : 在抓包时候,可以抓取数据,在WiFi接口处,可以获得所有经由该WiFi的包,可以解析包中的数据。
想获取一个信息:
1. 做WIFI 伪装(公共网络),当手机或者其他开放一个热点,那么,所以连到这个热点的所有机器都会经由你的手机,然后安装一个抓包工具,去解析,那么就可以获得信息。
TCP:
面向连接的服务
可靠的数据传输
UDP:
不提供必要服务的轻量级运输服务
不可靠的数据传输
有的文件传输,使用的也是UDP ,所以我们这个时候,可以用一个UDP 模拟一个 TCP
应用层协议定义了:
交换报文类型,例如请求报文和响应报文
各种报文类型的语法,如报文中各个字段的定义以及这些字段的描述
字段的语义,即这些字段中包含的信息的含义
一个进程何时以及如何发送报文,对报文进行响应的规则(同步事件发生的顺序)
WEB 与 HTTP 协议
HTTP(超文本传输协议, HyperText Transfer Protocol)
客户程序和服务器运行在不同的端系统中,通过交换HTTP报文进行会话。
使用C/S
Web 术语
Web页面 (Web page, 文档) (页面源码)
对象 (图片,标签…都可以是对象,可以把文档解析成一个对象树)
HTML 基本文件
URL (统一资源定位符, 可以通过他知道对象在什么地方)
Web浏览器 (Chorm 浏览器, 替用户发起请求响应)
Web服务器 (安装在服务器上的,例如 httpd apache tomcat 在 80 端口监听,等用户发起请求报文,解析之后,查看本地数据,如果有,读取,响应发回来,如果没有not found 404)
发送请求报文, 收到响应报文。
HTTP 特点:
HTTP 协议不同担心数据丢失,也不用关注TCP 在网络中的数据丢失和乱序故障等细节
HTTP 是一个无状态协议,服务器补存储关于客户的状态信息,服务不会记录客户做了什么。
HTTP服务器总是处于打开状态,具有一个固定的IP
HTTP使用了客户——服务应用程序结构
记录客户的服务,是附加的服务。
非持续连接和持续连接
1. HTTP客户进程发起一个到服务器的TCP连接,使用默认端口80, 在服务器上可客户端上都有一个套接字与之对应。
2. HTTP客户经它的套接字向服务器发送请求报文。报文中包好了要请求的对象
3. HTTP服务器接收该报文,从服务器上检索对象,在HTTP响应报文中封装该对象,并通过套接字发送
4. HTTP服务器通知TCP断开TCP连接
5. HTTP客户接收响应报文,TCP连接关闭
对于多个对象重复以上步骤
对于短连接,也就是非持续连接,每次请求一个对象,HTTP都会建立一个连接
再这里,第三次握手,会发送请求的数据。
上图方法包括:GET POST HEAD(用来测试,发送,但是主体为空) PUT(本地数据放在远端) DELETE(在远端删除)
URL 是要处理的数据的具体的一个链接
版本是HTTP 的具体版本
首部字段名是浏览器的版本以及类型
实体主体是向服务器递送的消息
例如:使用POST 递送一个表单,表单放在实体主体里面,使用GET 是为了请求一个主体是实体主体里面没有东西
PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
就像前面所讲的一样,既然PUT和POST操作都是向服务器端发送数据的,那么两者有什么区别呢。。。POST主要作用在一个集合资源之上的(url),而PUT主要作用在一个具体资源之上的(url/xxx),通俗一下讲就是,如URL可以在客户端确定,那么可使用PUT,否则用POST。
综上所述,我们可理解为以下:
1、POST /url 创建
2、PUT /url/xxx 更新
版本:HTTP 的版本
状态码: 404(NOT FOUND) 200(OK) 括号内容是短语
实体主体是从服务器给的内容
HTTP 为无状态,但是在我们访问浏览器的时候,会发现推送的消息与我们有关,这些东西是由cookie实现的
用户与服务器的交互——cookie
在HTTP 响应报文中的一个cookie首部行
在HTTP请求报文中的一个cookie首部行
在用户端由浏览器管理的cookie文件
位于WEB后端的一个数据库
圆柱形为存储,假设最开始只有淘宝的cookie 1731,
后来有一天想要访问京东, HTTP 向京东发送请求
服务器发现没有cookie 于是创建cookie:8888 ,并将信息保存在本地,在响应报文中set-cookie:8888
浏览器将cookie 8888 保存在本地
在之后做的所有操作,即使不登陆,浏览的所有产品的信息都存储在cookie 8888 中,
登录之后带上cookie 8888 ,浏览记录递交给服务器中
服务器推送相关内容
在购买东西的时候,服务器绑定人物画像,有相关的产品,定向推送
很多时候,商家相互买用户数据,以致于共享用户数据,联合割韭菜。。。
更多的信息存储的服务器,用来做用户分析
WEB缓存器(代理服务器)
流量增加,系统超负载,如果某个站点,爆某个信息,且只能在一个地方看,如果所有人都访问这个站点,那么这个站点一定会爆,在计算机网络中,使用WEB缓存器来减轻这个状况
在取数据的时候,不是一定要从数据源来获取数据,
如,教育部下发一个文件,该文件从教育部到各省的教育局,再到各个城市,到乡,县,到各个学校,每个学生在学校拿到这个文件。
如:假如下载一个电影(1G),如果30人下载,那么服务器面临30G的流量负载,
WEB 缓存器,将数据下载到本地服务器上,局域网内用户从局域网服务器下载该文件
例如:CDN
在局域网中,可以用一个机器配置为WEB缓存器,
浏览器建立一个到WEB 缓存器的TCP连接,请求资源
WEB缓存器收到请求之后,web缓存器在本地找有无文件,如果有,直接下发,如果没有,访问,下载文件,本地存一份,下发文件并存储文件。本地存储的数据,web缓存器,也会定时去检查更新一份。
(WEB缓存器也未必会在源服务器找到文件)
WEB 缓存器收到的数据过期怎么办?
WEB缓存器会定时与上层服务器发送请求,会发送一个modify since (time) ,当服务器在时间之后没有修改,发空报文
WEB 缓存器的优点:
大大减少对客户请求的响应时间
减少了机构的接入链路到因特网的通信量
从整体上大大减少因特网上的WEB流量,改善所有的应用的性能
HTTP 和 HTTPS
HTTPS 在 HTTP 上提供了加密
HTTPS (SECURE HTTP)
- https协议需要到ca申请证书,一般免费证书很少,需要缴费
ca 证书管理机构, 一般是收费的,价格不是很便宜,免费的解密比较容易- http是超文本传输协议,信息是明文传输, https 则是具有安全性的ssl加密传输协议
http 是明文,可以抓包看做的事情,使用http 传输是一定可以抓包的
那么使用https就一定抓不了么?
未必,比如在大厂,涉密单位,每个人都被告知,不要通过公司的网络传输信息,在https架构下,只要愿意还是可以解密的,
在海量的数量中,想抓包自己想要的,还是不太可能,所以想在很多人之中,只监管想要的人,很困难。
但是公司中所有的人都是需要被监管,所以监管所有人是有意义的,所以是可行的。- http 和 https 使用的是完全不同的连接方式用的端口也不一样,前者使用的是80端口,后者使用的是443端口
小于1024的端口是周知端口,是vip端口,只有一些进程,可以常驻在这些端口上。
周知端口只有超管可以用,普通用户使用权限被拒绝。- http 的连接很简单是无状态的
- HTTPS 协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,要比http协议安全。
HTTP 2.0,增加原先的短连接,变成了一个长连接。也是连接复用
在计算机中,建立连接是用成本的,http2.0 相比 http1.0 降低的连接的成本,减少了连接的次数
http2.0 可以在一个连接发送多个对象,由对方解析,看把信息给谁。
在本地通讯靠吼,电信号经过就能读到信息,不过读不读取是另一个方面。
早期HTTP需要一问一答,后期不需要。(图下,所以现在可以一次发出多个请求,没有同步的限制)
FTP 协议 (现在用的场景少,基于本地局域网)
FTP :双连接
FTP 文本传输协议组成:本地文件系统,远程文件系统。
本地需要FTP客户端,给用户一些接口,可以是浏览器,可以是终端。
用户通过命令登录到远程服务器,然后通过命令形式查看文件,传输回来,或者发送过去
FTP 第一条连接是控制连接,用户通过这个连接,走控制指令,走上级的命令。(长连接)
FTP 第二条连接时数据连接,用来传输数据,每次传输完毕数据,会关闭连接。(短连接)
这样做的好处:
在上传数据,或者下载数据,第二条连接是阻塞状态。
(在数据连接被占用,控制连接是空的,为什么不是用控制连接,而是新建立一条数据连接,这样多建立一条连接,是不是不合理?):
有两条连接,在人使用中,人不会发出很多TCP连接,成本下,与网页不同,百度获取信息,是有大量爬虫在爬取网页信息,会有很多连接,FTP连接中,没有太多的连接,并发量小。
使用双连接,会让我们业务实现,变得简单,使用专线下发命令,便于对指令的控制,以及对指令的解析,能够区分指令和信息的区别,一个控制连接,不会超过512 字节,底层传数据,不用管数据多大,发完数据,就关闭连接,FTP服务器只管接收数据,接收到EOF就停止。
数据传输和指令容易发生冲突,容易对指令产生歧义。
SMTP 、POP3、IMAP协议
SMTP : 简单邮件传输协议
用户A写完邮件,会以TCP协议(传输层,应用层是SMTP)传输到用户A的邮件服务器
在A的邮件服务器上需要用户登录,提供账号密码
在用户A的邮件服务器有一个任务队列
任务队列存储多个即将发送的邮件
用户A的邮件服务器会拆开邮件,来寻找接收方,也会查看邮件内容,判断邮件是否为垃圾邮件,如果是垃圾邮件,会丢弃。
用户A的邮件服务器会将邮件发送给B的邮件服务器(通过SMTP)
用户B的邮件服务器将接收到的邮件放入缓冲池等待操作,等B的客户端获取邮件
此后没有SMTP协议, SMTP协议是服务推的过程,目标是服务器端
代理会定时访问有无邮件到来,(浪费资源)(守护进程)
用户B的邮件服务器会通过POP3 、IMAP、HTTP形式到用户B的端口
DNS 域名解析协议
提供的服务:
- 将主机名和IP地址进行转换
- 主机名别
- 邮件服务器别名
- 负载均衡: 很多用户访问服务器端,如果有多个服务端可以可以服务,DNS会将用户分配给不同的服务端,来减少服务端的压力
集中式DNS可能遇到的问题
集中式(只有一个DNS 服务器)
- 单点故障:一个节点出问题,所有都崩溃
- 通信容量大 : 所有客户都访问一个,增加了存储量
- 远距离集中式数据库,时延高
- 维护不易 : 牵一发动全身
业务要低耦合
根DNS服务器
因特网上有13个
顶级域DNS服务器(TLD)(com. / cn.)
权威DNS服务器
本地域名服务器
迭代查询
DNS记录(Name, Value, Type, TTL)
TTL是当前域名和IP地址绑定关系的有效时长,默认情况下(Aliyun)时长是10 min, 10min内是有效的,不会查询,10min钟之后会超过时间,会丢弃
Type = A : name 主机名, value为IP地址
Type = NS:name是个域, value则为对应的权威DNS服务器主机名
Type = CNAME:name是主机别名, value是个规范主机名
Type = MX:name是邮件主机别名, value是规范主机名
例: baidu.com 主机别名



