《自顶向下方法》读书笔记
计算机网络和因特网
注意传输时延
和传播时延
间的区别
应用层

HTTP
幂等与非幂等
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用
幂等:对于同一种行为,如果执行不论多少次,最终的结果都是一致相同的
非幂等:对于同一种行为,如果最终的结果与执行的次数有关,每次执行后结果都不相同
分析常见HTTP方法的幂等性:
GET:
GET http://www.bank.com/account/123456
,不会改变资源的状态,不论调用一次还是N次都没有副作用PUT:PUT所对应的URI是要创建或更新的资源本身
PUT http://www.forum.com/article/4231
,调用一次和N次对系统产生的副作用是相同的,即更新id为4231的帖子,因此多次调用或刷新页面而不必担心引起错误DELETE:
DELETE http://www.forum.com/article/4231
,和PUT同理POST:POST所对应的URI并非创建的资源本身,而是资源的接收者
POST http://www.forum.com/articles
的语义是在 http://www.forum.com/articles下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI
HTTP 1.0/1.1/2.0
- 1.1:
- 长连接:新增 Connection 字段,可以设置 keep-alive 值保持 tcp 连接不断开
- 管道化:基于长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回 (e.g.请求1 –> 请求2 –> 请求3 > 响应1 –> 响应2 –> 响应3)
- 缓存处理:新增字段 cache-control
- 断点传输(分块):新增 Range 和 Content-Range 字段,服务端每产生一块数据,就将其发送
- 2:
- 二进制分帧:HTTP 1.x 的解析是基于文本,HTTP 2 之后将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,提高传输效率
- 多路复用: 在共享 TCP 连接的基础上同时发送请求和响应,避免线程阻塞
- 头部压缩:HTTP 2 可以维护一个头部信息字典,差量进行更新头信息,减少头部信息传输占用的资源
- 服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求
cookie 的工作过程
用户访问某网站,发送请求报文
网站产生唯一识别码(Session ID),以此作为索引在后端数据库产生一个表项
服务器用一个包含
Set-cookie
首部的报文进行响应,其中该首部含有识别码浏览器收到该报文时,会在其管理的 cookie 文件中添加一行,包含服务器主机名和识别码
用户再次访问某网站,浏览器查询 cookie 文件,在请求报文中添加
cookie
首部,值为之前的识别码
A session ID is a unique number that a Web site’s server assigns a specific user for the duration of that user’s visit (session). The session ID can be stored as a cookie, form field, or URL (Uniform Resource Locator). Some Web servers generate session IDs by simply incrementing static numbers.
输入url到展示页面的过程
辨析常见名词
傻傻分不清之 Cookie、Session、Token、JWT
HTTPS
HTTP的问题:消息被窃听、通信方身份被伪装、报文被篡改
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
加密和认证
HTTPS 采用共享密钥加密和公开密钥加密两者并用的混合加密机制(在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式)

安全通信机制
SMTP
为什么客户代理要先将报文发送至自己的邮件服务器
如果不通过自身的邮件服务器进行中继,用户代理没有任何办法到达一个不可达的目的地接收服务器
将邮件存放至自身的邮件服务器,就可以重复尝试向目的地服务器发送报文
FTP
主动模式和被动模式
参考:
主动模式
客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的21端口
客户端开始监听N+1,并发送FTP命令
port N+1
到FTP服务器接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)

主动模式的弊端:
FTP 的客户端并不会主动连接到服务器的数据端口,而是是告诉服务器它正在监听哪个端口,然后服务器发起连接到客户端上指定的端口。但是,这样的连接有时候会被客户端的防火墙阻止
被动模式
- 客户端打开两个任意的非特权本地端口N(N>1024)和 N+1
- 端口N连接服务器的21端口,客户端提交
PASV命令
给服务端 - 服务器开启一个任意的非特权端口(P>1024),并发送
PORT P
命令给客户端 - 接着客户端会从本地端口(N+1)连接到服务器的端口P

网络攻击
XSS
XSS 全称是 Cross Site Scripting(跨站脚本)。是指黑客往 HTML 文件中或者 DOM 中注入恶意脚本,从而在用户浏览页面时利用注入的恶意脚本对用户实施攻击的一种手段,它利用的是用户对指定网站的信任,用户不知道该网站被注入了恶意脚本
两大要素:
- 攻击者提交恶意代码
- 浏览器执行恶意代码
预防:
- 服务器对输入的脚本进行过滤/转码
- 使用 CSP 让服务器决定浏览器可以加载哪些资源,执行哪些脚本。CSP 不仅可以规定资源来源,还可以禁止脚本向第三方提交数据,同时在出现异常时,也能向维护人员及时上报异常
CSP
Content Security Policy 内容安全策略
CSRF
跨站请求伪造,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作。利用的是网站对用户网页浏览器的信任,浏览器的请求(比如转账)不是遵从用户自身的意愿
比如攻击者发给用户一个链接,
假如一家银行用以运行转账操作的URL地址如下:http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码:
1 ><img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">服务器没有做类型判断,把图片资源当xhr处理,如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金
预防:
- 从第三方站点发送请求时,禁止发送 Cookie —— Set-Cookie 中设置 SameSite 为 Strict
- 验证请求的来源站点 —— 通过 Request Header: Referer || Origin
- CSRF Token 验证,服务器要求所有请求必须携带 CSRF Token ,第三方无法拿到 Token ,伪造的请求会被拒绝访问
传输层
为什么需要三次握手
只有三次握手才能确认双方的接收与发送能力是否正常
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常
网络层
ICMP 和 PING: https://zhuanlan.zhihu.com/p/82184458
其他
理解 SOA、RESTful
SOA:Service-Oriented Architecture 面向服务架构
SOA是一种设计方法,其中包含多个服务,而服务之间通过配合最终会提供一系列功能。一个服务通常以独立的形式存在于操作系统进程中。服务之间通过网络调用,而非采用进程内调用的方式进行通信
REST:(Resource) Representational State Transfer
什么是RESTful架构:
- 每一个URI代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。
实际上SOA只是一种架构设计模式,而SOAP、REST、RPC就是根据这种设计模式构建出来的规范
其中SOAP通俗理解就是http+xml的形式,REST就是http+json的形式,RPC是基于socket的形式。
CXF就是典型的SOAP/REST框架,dubbo就是典型的RPC框架,而SpringCloud就是遵守REST规范的生态系统