自顶向下方法 -- 第一章 概论
[TOC]
概论internet概览网络
局域网(local area network,LAN):一个家庭、公司内部的网络,主要是按照需求进行的划分
广域网(wide area network,WAN):广域网的连接范围更大(全世界),局域网是互联主机,广域网是互联交换机、路由器、调解器等设备
互联网络:下图表示了公司的两个分部要进行通讯的网络结构,局域网内消息通过交换机分发,跨境通讯通过路由进行传输,搭建了一个私有互联网
路由器:将网络连接到其他网络
交换机:将设备连接到一起,在过去网络中所有主机连接到一个公共电缆上,这个时候的通讯是广播的方式,目标接收者接收信息,其他主机丢弃数据包,交换机的作用就是帮助识别数据包的接收者,避免出现广播的方式进行传递,减轻了局域网中的流量
调解器:变换数据类型
交换这里直接说网络通过交换机进行连接,有两种交换模型,电路交换和分组交换
电路交换:以前的电话网络常采用电路交换,假如两个交换机各有4个电话,每个电话与交换机连线的容量为1,那么两个交换机之间的数据主线容量是4,这样才能支持4组电话能同时运行
分 ...
自顶向下方法 -- 第一章 计算机网络与因特网
什么是因特网具体构成描述一个全世界范围内的计算机网络,但是近些年很多智能终端接入,单纯说是计算机构成的网络不太准确了,所有的接入设备称为主机或端系统
端系统通过通信链路和分组交换机(packet switch)连接到一起;
通信时发送方端系统将数据分段并在每段加上首部子节形成信息包,这个过程叫做分组,接收方还原数据
分组交换机收到分组信息,并投递到接收方,常见两个类型的分组交换机-路由器和链路层交换机,路由器常用语网络核心中,链路层交换机通常用于接入网中
英特尔网络服务供应商(ISP)端系统通过ISP联入因特网,也就是像中国的联通电信之类的,低层的ISP通过高层ISP(国际)进行连接,每个ISP都是独立管理的
协议Protocol
TCP:传输控制协议
IP:网际协议,定义了分组在路由器和终端系统之间的传输格式
服务描述套接字接口 socket:端系统与端系统之间的通讯通过套接字接口完成,socket定义了一系列的接口规范来保证数据能交付给目的地,好比寄信的时候要写邮编地址之类的来保证信能被送达
什么是协议
人类活动类比:先要打招呼吸引到注意力,然后进行对 ...
自顶向下方法 -- 第二章 应用层
[TOC]
应用层协议原理
网络应用程序体系客户-服务器典型的web应用,需要服务器主机一直运行,随时处理来自客户端的请求;对于大型网站来说,单个的服务器不能应对海量的请求,配备大量主机的数据中心常用来创建强大的虚拟服务器;
P2P体系结构对服务器没有依赖或者依赖很小,两个主机之间直接进行通信,优点很明显不需要厂家提供海量的服务器,每个用户主机的资源都可以作为服务的一部分,缺点是稳定性和安全性难得到保障
进程通信最终进行通信的单元是进程不是程序,这里也不会太多的研究同一主机上的进程间通信,来看看跨越计算机网络交换报文的不同端系统上的进程间的通信
客户和服务器进程在web应用中很明显浏览器进程是客户进程,但对于P2P来说呢,我们认为发起通信的进程是客户,等待联系的进程是服务器
进程与计算机网络之间的接口
套接字:如上所述,多数应用程序是有通信进程对组成,相互发送报文,这些报文必须通过下层网络进行传输,定义了一个叫套接字(socket)的软件接口来让进程发送和接收报文
API:套接字是应用层和传输层之间的接口,也称为应用程序和网络之间的应用程序编程接口(API),开发者可以控 ...
自顶向下方法 -- 第四章 网络层-数据平面
[TOC]
网络层概述大概就是把运输层的数据拿过来再做一次封装加入自己需要的标识信息之后在路由器之前传递报文,然后目标路由器再丢给运输层
转发和路由选择:数据平面和控制平面
转发:当一个分组到达某个路由器的一条输入链路时,改路由器将分组移动到适当的输出链路
路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组锁采用的路由或路径,计算的方式叫做路由选择算法
每台网络路由器中有一个转发表,分组会根据表示字段到转发表中进行索引来决定分组的输出链路
控制平面:传统方法路由器之间通过路由选择报文进行通信,以计算出转发表的值;如果所有的转发表是人工配置的那就不需要路由选择算法了,但是这种情况下人工效率低且容易出错
控制平面:SDN方法(Software-Defined Networking)通过一个远程控制器来计算并分发转发表,路由器仅执行转发,远程控制器和路由器之间通过交换包含转发表和其他路由选择信息的报文来进行通信
网络服务模型思考一些问题:运输层可以指望网络层完成分组的交付吗?网络层会顺序的交付分组吗?分组发送的间隔和交付的间隔会一致吗?网络层会提供拥塞信息反馈吗?
这些问 ...
自顶向下方法 -- 第三章 运输层
[TOC]
概述与运输层服务
运输层为不同主机上的进程提供逻辑通信功能,是在端系统而不是路由器中实现的
运输层从应用程序中接收到报文转换为运输层分组(报文段segment),一般是将应用报文划分为较小的块,为每个块加上运输层的协议信息,然后将这些报文段传递给网络层,网络层将其封装为网络层分组(数据报)向目的地发送,注意网络路由器仅作用与该数据报的网络层字段不检查运输层报文字段,接收端从网络层数据报中提取运输层报文并上交给运输层,运输层处理收到的报文后再交给应用进程使用
运输层和网络层的关系这里书中举了一个例子:两个远房亲戚家族通信,家族A让小刘统一负责收发信件,家族B让小张负责收发信件,于是两个家族里面的人都只合负责收发信件的小刘小张打交道就行,邮政服务将信件从一个家族送往另一个家族,而不是具体的一个人到另一个人
应用层报文 = 信封里的内容
进程 = 家族里的亲戚
主机(端系统) = 家族
运输层协议 = 小刘和小张
网络层协议 = 邮政服务(包括邮车)
在这里小刘和小张都是在各自家里工作的,他们不参与到邮件的分拣和传输,类似的运输层协议值工作在端系统中
运输 ...
数据持久化 -- 事务原理
一、事务概念事务是一组满足ACID特征的操作,可以通过commit提交或者Rollback回滚
ACID
原子性(Atomicity)
这个地方的原子性和物理里面的原子性是一个道理,事务被认为是对数据库操作的最小单元,为什么这么说呢,为了数据库的信息安全性,我们规定事务要么整个成功要么整个失败,不可能是执行了半个事务,那样开发者就无法确定数据库中信息的状态
回滚:事务在执行的过程中出现了错误可以进行回滚,有个东西叫做回滚日志,里面记录了事务所执行的修改操作,回滚的时候再反向执行这些操作
一致性:数据在事务执行前后都保持一致性状态,在一致性状态下,所有事务对一个数据的读取结果都是相同的
隔离性:一个事务所做的修改在最终提交前,对其他事务是不可见的。
持久性:
一旦事务提交,则其所作的修改将会永远保存到数据库中,即使系统发生崩溃,事务执行的结果也不能丢失,使用重做日志来保证持久性。
事务之所以有这么个性质就是为了能营地数据库崩溃的情况AUTOCOMMITMySQL默认采用自动提交模式,如果不是显式使用start transaction语句来开始一个事务的话,每个查询都会被当做一个事务来 ...
网络基础 -- DNS
DNS(Domain Name System)
定义:
网络通信中通过ip确定主机的地址,但这个ip是一串数字,不便于记忆,所以有了dns解析,把这些ip地址包装成一个容易记忆的域名。
域名解析:
dns通过域名去定位真实ip的过程叫做域名解析,这个地方有两种方法,一种是在本机的host文件中配置相应的域名映射,这样在本机上即已可以通过域名去访问对应的ip;但是明显是不可能为每个客户端都去配置host文件的,所以需要在一台主机上搭建一个dns服务器,网络中没个请求都通过这个dns去做域名解析;
这个地方本地的域名对应配置叫做静态解析,dns叫做动态解析,本地发出的请求是先走静态解析再做dns解析,所以可以把常用的域名映射写入本地的静态映射中从而提高访问效率。
域名层级:
提供一个案例域名www.google.com 理论上说后面省略了根域名.root 也就是完整的应该是www.google.com.root 但我访问这个域名实际是访问不通的
.root 是根域名 .com 是顶级域名 .google 是次级域名 www 是三级域名
域名解析的原理是通过根域名服务器找 ...
网络基础 -- HTTP
一、基础概念URIURI包含URL和URN(不是很明白这是什么,后面在看看)
URI(Uniform Resource Identifier,统一资源标识符)
URL(Uniform Resource Locator,统一资源定位符)
URN(Uniform Resource Name,统一资源名称)
请求和响应
请求
响应
二、HTTP方法从上面的请求报文中能看到在第一行开头就是方法字段
GET:获取资源,目前使用最多的方法
HEAD:获取报文首部,和GET类似,只是不返回报文实体主体部分,多用于确认url的有效性以及资源更新的日期等(大概意思是只返回了请求资源的描述信息而不要内容)
POST:传输实体,主要用来传输数据,get主要用来获取资源,很多时候请求中包含了用户数据,当然也可以把数据都拼接到get的url中,但是这样会暴露用户信息,关于get和post后面还会详细说明
PUT:上传文件,该方法自身不带验证机制,任何人都可以上传文件,存在安全问题,一般不会去使用
PATCH:对资源进行部分修改,没见过
DELETE:和put的 ...
网络基础 -- SSH原理
以前互联网的通讯都是明文的,被拦截了信息就泄露了,到了1995年的时候,有个芬兰学者不知道是啥名的设计了SSH协议,对登录信息进行加密,这个东西也是使用非对称加密的方式。
远程登录方法一:客户端向主机发起请求,主机就抛给你一个公钥,然后你把自己的用户名和密码用这个公钥进行加密,加密完成后再传输给主机,主机用自己当私钥进行解密,然后验证你的登录信息是否合法
这个地方有一个问题,要是有人在中间拦截了客户端发起的请求,然后将自己的公钥丢给了客户端,那客户端拿这个公钥去做加密并把数据给这个中间人的话信息就泄露了,整个安全系统也就崩溃了,这个SSH又不像https那样有一个证书认证,所以没有什么好办法,当主机第一次给你公钥的时候系统会警告你自己去核对这个公钥,公钥一般是那种2048位反人类的东西,只好又把他做下转换弄成一个指纹(其实就是一个短一点的字符串,容易做识别),拿到这个指纹就没有好办法了,自己去主机的官网上查询他的公钥去吧,对比完成后选择接受这个公钥,然后你就能做登录了,并且这个公钥还会被保存到本地的$HOME/.ssh/known_hosts这个地方,本地还有一个/etc/ssh/ss ...