计算机网络
一、OSI七层模型
物联网淑慧试用
物理层->链路层->网络层->传输层->会话层->表示层->应用层
二、传输层的功能
- 可靠传输、不可靠传输
- 差错控制
- 流量控制
- 复用分用
三、网络层功能
- 路由选择
- 差错控制
- 流量控制
- 拥塞控制
四、链路层的功能
- 为网络层提供服务。无确认无连接服务,有确认无连接服务,有确认有连接服务。
- 链路管理,连接的建立、维持、释放(用于面向连接的服务)
- 组帧
- 流量控制
- 差错控制(比特错,不是可靠传输,使用奇偶检验、CRC,海明码检验)
四、TCP/IP
- tcp/ip在网际层是无连接的,而在传输层是可以面向连接(TCP)或者无连接(UDP)的
五、QAM
调幅、调相、调频
QAM:调幅+调相
六、中继器、集线器
中继器的作用是再生数字信号。放大器的作用是放大模拟信号。集线器是一个多口的中继器。集线器不能分割冲突域。
七、冲突域、广播域
中继器、集线器不能隔离冲突域和广播域
网桥和交换机可以隔离冲突域,但不能隔离广播域
路由器可以隔离冲突域和广播域
八、内部网关协议:RIP、OSPF
RIP: 每30s和相邻路由器交换自己知道的所有信息,信息内容是到达其他路由器的最短距离以及这一次该跳到哪个路由器。坏消息传的慢。用于小规模
OSPF: 当链路状态发生变化的时候,利用洪泛法向自制系统内所有路由器发送与本路由器相邻的所有路由器的链路状态。每隔30分钟刷新一次。收敛快。用于大规模
九、域名
域名解析是从后往前的,最后面的是根域名服务器
www.qq.com : com-> qq-> www
十、海明码
信息位n, 校验位k
$ 2^k>=n + k +1$
十一、原码、反码、补码
反码是原码转为补码的中间形式,
如果原码符号位为0,表示正数, 补码 = 原码 = 反码
如果原码符号位为0,表示负数,反码:原码数字位每位取反 , 补码 = 反码 +1 = 原码数字位每位取反+1
发现由于原码的负数与整数相加无法有效实现,故通过补码,可实现正负数的相加与一般相加逻辑相同。例如-18 + 18 后正好是111111111+1变成100000000,最高位无效,则变成了0。
十二、三次握手目的
防止失效的连接请求报文段突然又传到主机B。
假如A发送一个SYN连接请求报文,但是在网络中滞留了很久,超过时间限制,A就又发了一个,原来那个就作为无效。但后来这个连接请求又被B接收了,B以为A又发了一个连接请求,所以就会发一个ACK。这里就已经进行了两次握手。如果没有第三次握手,那这次连接就被确认,导致了资源浪费。所以需要第三次握手。A收到B的ACK之后,判断确认号ack是不是现在的seq。如果是,那就给B发送ACK,否则给B发送复位RST报文段,表明之前的两次握手无效。
十三、SYN Flood攻击
ip报文中的原地址不是自己,而是一个其他的ip
解决方法:
- 缩短SYN Timeout时间:只能解决攻击频率不高的
- SYN Cookie:只能处理那些ip固定的,攻击过程中随机改写报文段的ip,就不能处理
- Syn Cache: 在收到SYN的时候不立即分配系统资源,先回应一个ACK报文,并放在一个专用的HASH表中(Cache)保存这种半开连接,直到收到Client发送的ACK,再进行资源的分配
- 硬件防火墙
十四、DDOS攻击
DDOS(Distributed Denial Of Service 分布式拒绝服务)是黑客控制多多台”鸡肉”(僵尸机),展开拒绝服务攻击。
- SYN Flood(这里就是分布式的SYN Flood攻击了,控制多台主机进行攻击)
- TCP全连接攻击
通过许多僵尸机不断与受害服务器建立大量的TCP连接,直到服务器的内存等资源被耗尽,从而造成拒绝服务 - Land攻击
LAND攻击报文的源IP地址和目的IP地址是相同的,都是目标主机的IP。
十五、HTTPS
“SSL/TLS”是干嘛用滴?
SSL 是洋文“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。
为啥要发明 SSL 这个协议捏?
因为原先互联网上使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。
到了1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。
很多相关的文章都把这两者并列称呼(SSL/TLS),因为这两者可以视作同一个东西的不同阶段。
SSL/TLS协议不仅提供信息的机密性,还保证其完整性。
设计背景
兼容性
因为是先有 HTTP 再有 HTTPS。所以,HTTPS 的设计者肯定要考虑到对原有 HTTP 的兼容性。
这里所说的兼容性包括很多方面。比如已有的 Web 应用要尽可能无缝地迁移到 HTTPS;比如对浏览器厂商而言,改动要尽可能小;……
基于“兼容性”方面的考虑,很容易得出如下几个结论:
\1. HTTPS 还是要基于 TCP 来传输
(如果改为 UDP 作传输层,无论是 Web 服务端还是浏览器客户端,都要大改,动静太大了)
\2. 单独使用一个新的协议,把 HTTP 协议包裹起来
(所谓的“HTTP over SSL”,实际上是在原有的 HTTP 数据外面加了一层 SSL 的封装。HTTP 协议原有的 GET、POST 之类的机制,基本上原封不动)
打个比方:如果原来的 HTTP 是塑料水管,容易被戳破;那么如今新设计的 HTTPS 就像是在原有的塑料水管之外,再包一层金属水管。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。
可扩展性
前面说了,HTTPS 相当于是“HTTP over SSL”。
如果 SSL 这个协议在“可扩展性”方面的设计足够牛逼,那么它除了能跟 HTTP 搭配,还能够跟其它的应用层协议搭配。岂不美哉?
现在看来,当初设计 SSL 的人确实比较牛。如今的 SSL/TLS 可以跟很多常用的应用层协议(比如:FTP、SMTP、POP、Telnet)搭配,来强化这些应用层协议的安全性。
接着刚才打的比方:如果把 SSL/TLS 视作一根用来加固的金属管,它不仅可以用来加固输水的管道,还可以用来加固输煤气的管道。
保密性(防泄密)
HTTPS 需要做到足够好的保密性。
说到保密性,首先要能够对抗嗅探(行话叫 Sniffer)。所谓的“嗅探”,通俗而言就是监视你的网络传输流量。如果你使用明文的 HTTP 上网,那么监视者通过嗅探,就知道你在访问哪些网站的哪些页面。
嗅探是最低级的攻击手法。除了嗅探,HTTPS 还需要能对抗其它一些稍微高级的攻击手法——比如“重放攻击”(后面讲协议原理的时候,会再聊)。
完整性(防篡改)
除了“保密性”,还有一个同样重要的目标是“确保完整性”。关于“完整性”这个概念,在之前的博文《扫盲文件完整性校验——关于散列值和数字签名》中大致提过。健忘的同学再去温习一下。
在发明 HTTPS 之前,由于 HTTP 是明文的,不但容易被嗅探,还容易被篡改。
举个例子:
比如咱们天朝的网络运营商(ISP)都比较流氓,经常有网友抱怨说访问某网站(本来是没有广告的),竟然会跳出很多中国电信的广告。为啥会这样捏?因为你的网络流量需要经过 ISP 的线路才能到达公网。如果你使用的是明文的 HTTP,ISP 很容易就可以在你访问的页面中植入广告。
所以,当初设计 HTTPS 的时候,还有一个需求是“确保 HTTP 协议的内容不被篡改”。
真实性(防假冒)
在谈到 HTTPS 的需求时,“真实性”经常被忽略。其实“真实性”的重要程度不亚于前面的“保密性”和“完整性”。
举个例子:
你因为使用网银,需要访问该网银的 Web 站点。那么,你如何确保你访问的网站确实是你想访问的网站?(这话有点绕口令)
有些天真的同学会说:通过看网址里面的域名,来确保。为啥说这样的同学是“天真的”?因为 DNS 系统本身是不可靠的(尤其是在设计 SSL 的那个年代,连 DNSSEC 都还没发明)。由于 DNS 的不可靠(存在“域名欺骗”和“域名劫持”),你看到的网址里面的域名【未必】是真实滴!
(不了解“域名欺骗”和“域名劫持”的同学,可以参见俺之前写的《扫盲 DNS 原理,兼谈“域名劫持”和“域名欺骗/域名污染”》)
所以,HTTPS 协议必须有某种机制来确保“真实性”的需求(至于如何确保,后面会细聊)。
性能
再来说最后一个需求——性能。
引入 HTTPS 之后,【不能】导致性能变得太差。否则的话,谁还愿意用?
为了确保性能,SSL 的设计者至少要考虑如下几点:
\1. 如何选择加密算法(“对称”or“非对称”)?
\2. 如何兼顾 HTTP 采用的“短连接”TCP 方式?
(SSL 是在1995年之前开始设计的,那时候的 HTTP 版本还是 1.0,默认使用的是“短连接”的 TCP 方式——默认不启用 Keep-Alive)
IO多路复用
用DMA控制器处理网络IO连接,保证数据不丢失。
Linux系统中,一切都是文件。都是文件描述符。
遍历文件集合,判断文件描述符是否有数据,如果有的话就处理。
select: 将文件描述符集合拷贝到内核态,通过内核态处理将有数据时的文件描述符置位。只能得到已经有文件传过来了。
poll: 创建了一个结构体,优化文件描述符的存储。
epoll: 用户态和内核态共享的内存区域中处理文件描述符,不需要从用户态拷贝到内核态了。会返回有几个文件操作符对应的文件已经放入。
redis , nginx, java NIO 在Linux中都是通过epoll实现的。
