计算机网络
本文从OSI网络模型出发介绍计算机网络,并涉及多种有关计算机网络的应用。需要注意的是本文有较为浓厚的学术界气息,对于具体的协议使用本文不阐述
计算机网络
分组交换与线路交换
线路交换:早期通信设备所采用的方式,这种方法通过时分,频分等手段将一条宽带分成若干个通讯链路从而使多个设备同时且独享的通信,这种通讯方式适合电话或者早期互联网
随着互联网的发展设备数爆炸式增长,这暴露了线路交换允许同时通信的设备数少的缺点。即当双方通信时,虽然会进行频分或者时分,但是这会占用双方通信时经过的所有路由
分组交换:双方通信时,会在通信的每个路由上开一个buffer来缓存数据,并用两路由之间全部带宽来传输数据。这样就解决了线路交换的缺点。分时交换只会占用传输数据时彼此相邻的两个路由,当buffer里的数据传送完毕后发送方会释放资源。分组交换虽然有这种好处,但这是以延时和丢包为代价的,因为这种传输本身就会增加延时,并且当多个主机同时经过同个路由时就会因为传输队列已满导致丢包
接入互联网
无线方式接入
wlans:常用于建筑物内,代表:wifi
广域无线接入:任何有基站信号的范围,代表:4G
协议层次
对于不同的TCP应用(如webnet,ftp,telnet),他们是通过socket接口来下发报文至TCP的
对于链路层设备(交换机),他是把源主机发来的数据解封装2次到链路层后获得链路层的信息来进行转发的。而对于网络层设备(路由器),是把源主机发来的数据解封装3次到网络层后获得网络层的信息来进行转发的。对于目标主机,他是解封装5次从而获得数据
应用层
socket套接字
socket的优点在于它通过ip地址,端口号等信息统一向OS注册了一个整数,使得每次发报文时不需要重复指定ip地址,端口号等信息。这简化了传输信息的步骤,并且便于OS管理。更重要的是有了socket之后我们就可以进行多进程操作了,这在网络服务器中被称为多路复用,由于可能有多个客户端对服务器同时发起请求,因此有必要让一个端口支持多个客户端会话,那么怎么区分这些会话从而让信息发送到指定应用和客户端呢?那就是通过socket值的不同来判断,而socket是根据源ip和端口号不同而不同的
对于使用TCP传输层协议的应用而言,我们需要指定本机ip及端口号,目的ip及端口号,而对于使用UDP传输层协议的应用而言,我们只需要指定目的ip及端口号就够了。但是现代的操作系统会将本地ip及端口号隐藏在socket操作中,所以无论是TCP还是UDP,仅需要指定目的ip及端口号就够了
TCP以及UDP都是明文传输的,为了改进TCP的安全性,SSL协议提供了加密的TCP连接。对于SSL,现阶段并没有明确究竟是属于应用层还是传输层,但是它的层次依然是高于TCP的,采用了SSL的http服务被称为https
http
http:超文本传输协议
使用TCP协议不会区分报文的界限,这件事是由应用来做的,但是http则会区分
http协议本身是无状态的,这意味着他不会存储客户端状态,例如某用户的历史记录,用户信息等数据。无状态的优点是操作简单方便,同一链路容纳的服务器数量大。但是我们可以通过加入cookie这种补丁来解决这个问题
cookie是一个存储登陆信息的内容,客户端首次访问服务器时服务器会在内部分配一个cookie并发给客户端,等客户端需要再次登陆时只需要把cookie发送给服务器即可,此时服务器会将客户端发来的cookie与内部的数据库进行比对从而确定是哪个用户发来的请求
当链路的流量强度很大时可以通过在本地建立缓存服务器来缓解,根据二八定律和局部性原理,大部分流量被本地缓存服务器处理,少部分通过Internet被源服务器处理。这种方法会减少带宽的成本
ftp
ftp适用于客户端服务器模式的文件传输
ftp:根据TCP协议与服务器21号端口建立连接,采用明文传输,因此会暴露用户名和密码。在21号端口建立的是控制连接,用于发送命令。真正的数据传送是由ftp服务器向客户端发起的,服务器会向客户端20号端口建立连接从而传输文件
用户代理软件:email客户端软件(outlook)是email应用的用户代理,http客户端软件(firefox)是web应用的用户代理,ftp客户端软件(filezilla)是ftp应用的用户代理。我们是通过客户端软件(用户代理)来跟服务器打交道的,不是直接跟服务器打交道的
email使用SMTP协议通过25号端口上传邮件到服务器,之后邮件服务器会进行同步
email使用POP或者IMAP协议进行邮件的下载,IMAP协议有更多的功能,例如它允许用户在服务器组织邮箱目录
dns
TTL:缓存时间,当本地dns没有记录某个ip与域名的对应关系时,本地dns会向权威名字服务器进行查询,查询到结果后会缓存在本地并保留一段时间,当超过这个时间后没有再次查询的请求,本地dns就会把这条记录删除。这是为了保证一致性
p2p
非结构化的p2p:不指定p2p网络结构是什么样子的,例如环状,星状网络等
一般而言,非结构化p2p网络网络分为集中化目录式,完全分布式以及混合式
- 集中化目录式:有一台服务器维护资源表,这个表可以提供资源与对应peer的关系,想要请求资源时必须查询这个表,迅雷属于这种
- 完全分布式:所有资源完全分布在用户手中,用户申请资源时需要对邻居节点进行泛洪操作从而遍历整个p2p网络。值得注意的是用户获得最早的邻居节点来源于下载软件时软件自带的经常活跃的peer的ip地址,因此这种方法有一定的不可靠性,同时由于进行泛洪操作也会对网络造成压力
- 混合式:上述两种方法的混合,peer加入某一个用户组组成的洪流中,bt属于这种
bittorrent:为了提高上传用户保种的积极性,bt应运而生。用户想要获得资源时需要到p2p搜索引擎上找到对应资源,资源内部有tracker文件。如果用户获得了tracker文件就会知道都有哪些peer维护这个文件,这样我们就可以下载这个文件了。当下载时文件会被分成很多文件块,并生成文件位图来表示当前peer是否持有文件块,这些文件块会从那些你曾经给予他们文件支持的那些peer中优先得到,这基于一种算法:上传者会将流量分为三份,前两份来给予曾经帮助过他的peer,最后一份用来随机给陌生用户,这样不仅保证了用户忠诚还有拉新作用。那些在线且文件完整的节点被称为torrent(种子),否则被称为吸血鬼
cdn
cdn是将内容存储在离用户较近的服务器,这不仅降低延迟提高了用户舒适度而且还减轻了源服务器压力
当用户请求音视频资源时,用户主机会向dns进行请求,而后dns会返回一个cdn的dns网址或ip,我们用户再解析这个cdn的dns网址就会得到具体的cdn的ip,这里面就有我们申请的资源。cdn的dns主要起一个重定向的作用,这也是为了负载均衡和优化考虑
传输层
ip(网络层)提供的服务是不可靠的,因此需要tcp/udp(传输层)来提供可靠的传输
tcp
三次握手与四次挥手
建立连接时仅仅两次握手(建立请求-应答回复)是不够的,因为握手时有可能由于延时过大导致客户端重发建立请求从而出现半连接。这样我们就需要双方均发出两次建立请求才可,即:客户端建立请求->服务器端应答回复->服务器端建立请求->客户端应答回复。在发出请求时发出的是随机的同步码,同步码的作用是告知对方哪个数据传输有误从而方便重传,例如92.8的同步码代表92号到99号的字节都已经接收到了,发送方需要从第100个字节处开始传。而在建立请求的第二步和第三步可以统一用一条报文发出,这样就演变成了现在的的三次挥手
断开连接时也类似建立连接,那为什么断开连接就需要四次挥手呢?这是因为在接受来自客户端断开连接请求时的报文上面常常载有数据,服务器端需要对这些数据进行处理,这一过程是耗时的,假如服务器真的想合并第二步第三步使其变成三次挥手,这就可能导致客户端没有收到服务器的ack从而重发连接断开请求。因此断开连接常常需要四次挥手。而建立连接时没有数据解析的需求,我们就可以将服务器端的应答回复和建立请求统一成一步
流量控制
通过协议内部报文标志位从而使网络核心层的路由和边缘层的主机进行通信,路由器进行标志位置位时意味着网络有些拥堵,此时会使边缘层的主机发送速率减半从而防止网络拥堵,这样就进行了流量控制。当网络拥堵时丢包率和延迟也会增加,上述操作不仅减少了网络拥堵同时也改善了丢包率和延迟,这也进行了延时控制
上面操作的缺点:路由向主机发送报文时耗费资源且也容易丢包,这在网络拥堵时也会加重拥堵。因此我们应该从边缘侧来推测网络是否拥堵从而解决这个缺点。我们通常根据下述情况来判断是否网络拥堵:
- 客户端收到服务端3次重发的ack:这可能是网络拥挤造成的,也可能是服务器端缓冲区不足从而进行流量控制造成的
- 客户端发出的数据包超时:这很有可能是网络拥挤造成的
网络层
路由位于网络层,决定数据报怎么转发,即通过路由表计算来算出具体的路由
交换机位于数据链路层,只是进行单纯的数据转发,通过路由器算出的路由来进行转发
网络层还可以对数据报进行许多动作:泛洪,block,转发路径,修改某些字段,这些特性仅在sdn(软件定义网络)转发方式中才支持,对于传统方式则不支持
ip
在子网内部,只有纯交换机的连接而没有路由器的连接,互联网是以网络为单位而进行的路由表计算,到达对应网络后再进行那个网络下子网的路由表计算从而找到子网的子网,这样就可以遍历整个互联网了。由于计算路由表时是按ip地址进行匹配的,一般而言同一个区域的ip地址前若干位大致相同,我们可以通过这一特性将其他区域的ip地址划分到有相同前缀ip的路由表下,这样我们就会加快查找效率。这种技术我们称为路由聚集
特殊约定:0.0.0.0的地址代指本主机地址,1.1.1.1的地址代表广播地址,127.x.x.x代表回路地址,代表本主机,192.168.x.x代表内网地址
子网掩码
为了方便路由器获得主机号和网络号从而做路由运算,ip地址按照一定格式被分为A类,B类,C类地址,A类指的类似255.x.x.x的地址,其子网可容纳6m个主机,B类地址指的是类似255.255.x.x的地址,其子网可容纳65534个设备,C类地址类似,但只能容纳254个设备。如果按子网主机数量来看,大部分厂商需要设备数量处于数百到数千的范围,这样按类划分网络就失去意义了。为了解决这个问题,我们采用了无类地址的方法:设计一个子网掩码,使得路由器再进行路由运算之前先做子网掩码的与运算,从而获得对应的网络号和主机号。这样就可以通过网络号做路由运算找到相应子网,通过主机号在子网中找到对应主机,在表示中有如下例子:200.235.21.15/23,代表前23位是网络号,后9位是主机号
nat
nat(网络地址转换):通过路由器来软件模拟一个新的端口号,从而解决ip地址不足的问题。当内网设备向外网服务器发出请求时,路由器会根据内网设备的内网ip和端口号来生成一个新的端口号并记录在路由表中,发送的时候需要将内网ip转换到外网ip,端口号更改为生成的端口号。这样当外部的资源返回时就可以根据这个路由表来找到真实的内网主机ip和端口号了
隧道技术
ipv6的产生解决了ipv4地址不足的问题,但是同时也带来了兼容性的问题。我们可以在ipv6网络边缘层的网关处设置ipv4/v6双栈协议来解决这个问题,具体原理是在网关路由器处将ipv6的信息二次打包为ipv4的信息,这样我们可以将ipv6的报文在ipv4的网络中传输到另一处ipv6的子网内部。这种技术在ipv4的内部构成了像隧道一样结构,因此我们称这种技术为隧道技术
sdn
sdn的具体模型是:有一个中央服务器跑一个网络操作系统,当需要改变网络功能或者对网络进行其他操作时网络操作系统会自动进行路由表计算并部署到分组交换机中,这样我们就可以通过集中式部署而对网络进行自定义的改造了,改造后的网络在收发数据时不需要中央服务器和网络操作系统的介入,这时报文路由完全靠分组交换机实现
使用sdn后不仅可以大大提高网络弹性,而且isp只需要购买分组交换机这一种设备就可以了,不需要之前的路由器和交换机
路由与路由协议
早期路由通过内存来收发信息,现在的路由通过CPU总线结构来收发信息,这样带宽会更大(30Gbps+),足以满足企业需求
路由协议主要采用BGP协议,其分为外部协议eBGP和内部协议iBGP。外部协议注重策略,内部协议注重性能,例如外部协议以国家,公司为单位,因此需要考虑经济,政治上的原因。内部协议类似内网,由于有多个路由器需要内部协议维护,因此更需要考虑效率。由于采用了网络层次和路由聚集,因此我们可以很轻松的找到对应主机。当一个新的主机上线时,我们需要通过当前子网的网关来通告其他的网关,其他的网关再依次算出路由表并且通知内部的子路由,这样一个网络就建立起来了
链路层
计算机广域网采用点对点连接,这是出于物理上的成本考虑的(中美海底电缆之间并没有连接其他任何国家)。而对局域网来说采用多点连接,这样可以保证效率。但是局域网采用多点连接的同时也会引入一个问题:两个主机同时请求造成冲突怎么办,这种冲突我们称为多点访问冲突
链路层传输报文的单位是帧,传输的时候需要加上mac地址,交换机是按照mac地址工作的
链路层服务:流量控制,纠错码,错误检测,全双工半双工
CRC:循环冗余校验码,用来校验信息是否出错
交换机或者路由一般不组成环状结构,因为这会引发广播风暴,但是为了防止链路出现问题(光缆被挖断),我们需要冗余一条链路以组成环状。这根线路平时不使用,仅在特殊情况下使用,这样既避免了广播风暴问题又解决了线路损坏的问题
数据在子网中传输时需要用到链路层的技术,如arp(存储ip地址,mac地址与端口的表),交换机等,数据在子网间传输的时候需要用到网络层的技术(ip,路由器等)
CSMA/CA(以太网技术)
ap:无线接入点,一般为路由或基站
当两个无线设备同时对同一个ap点发送信号时就会叠加电磁波引发冲突,因为ap无法判断这是一个设备发过来的还是多个设备发过来的信号。但我们可以通过无线设备上的电磁波传感器就可以判断是否有其他设备发送无线信号,并以此作为冲突检测的工具
802.11(wlan)的CSMA/CA方法:当信道忙时,发送方等待信道空闲后给一个自减的随机值,等到随机值减到0时再次尝试发送。假如在随机值自减的过程中发送方发现信道又忙,那就等待信道空闲时再次选一个随机值。对于接收方来说,当帧正确时会给一个ack
CSMA/CA在高负载情况下会有效率低下的问题,但是这个问题可以引入交换机来解决(交换机可以只监听两个端口)
mac地址
在节点和节点间的数据传递过程中交换机并不能识别ip地址,我们需要通过ip地址解析协议(arp协议)来知道下一跳的mac地址以及对应端口,这样交换机的网卡才知道如何发送数据给其他交换机或目标主机
mac地址由IEEE管理和分配,制造商购入mac地址空间来保证其唯一性
当路由器需要发数据给子网内部设备时,我们需要查询arp表。如果没有查到目标ip对应的mac地址和端口,路由器就会进行广播,对应的设备就会进行回应并把自己的mac地址和端口发送给路由器,之后路由器将这个mac地址加入arp表中缓存起来。当查询到mac地址时路由器会直接把数据发送出去,经过若干跳后到达目标主机
lan(以太网)
总线型网络:类似于cpu总线,多个设备挂载到总线上,两端挂载吸收器,这样可以吸收反射的电磁波,防止CSMA/CA技术下设备回声。但是当总线某处出现破损时会造成信号回声,导致任何设备发送数据时都会发现总线忙
集线器(hub):克服总线型网络的缺点,将总线长度大大缩减并放于金属制容器内(hub),使得设备回声只发生在某个设备与集线器的线路上,不会影响整个总线从而利于排障。缺点是通信时类似广播,不能控制每个设备的端口单独发送数据,因此使用CSMA/CA技术后会导致高负载工况效率低下,因为每个端口相互影响,在高负载情况下端口只能等待其他端口发送完成才能使用总线,这样就不能进行总线的复用了
交换机:克服集线器的缺点,允许两个端口相互通信而不受其他端口的影响,因此解决了使用CSMA/CA技术后会导致高负载效率低下的问题
以太网在传输信号前会发送一串101010的同步序列以同步双方设备的时钟频率,同步的过程是依靠锁相环来进行的
编码方式
曼彻斯特编码在传输速率小于10Mbps情况下使用。这种方法采用了在数据内部产生信号跳变来同步时钟,这样不仅知道了源信息是什么还知道了时钟频率是什么。但是会导致传输5M数据需要10M带宽的情况,因此不适合高速传输
4b5b编码适合传输速率小于100Mbps的情况下使用,它采用了用5位bit来代表4位bit的数据,通过把全为1和全为0这种信号剔除来保证传输任何信号时钟都不发生偏移,并且同时也很好的利用了带宽,传输4M数据仅需要5M的带宽
8b10b编码适合传输速率小于1000Mbps的情况下使用
网络安全
证书可以视作公钥的包装,即将通信双方其中一方的信息(公钥,通信一方的信息等)通过ca的私钥签署了的文件
数字签名:通过散列函数(如哈希函数)生成一个128位bit大小的数据来代表原报文,这被称为报文摘要,再通过公钥来加密生成的数据,这个加密后的数据就是数字签名。这种签名不仅有加密的特征而且还代表原报文的所有信息,不仅具有安全性还具有完整性和不可抵赖性
报文摘要常用于长报文的传输,因为对于非对称加密而言加解密的资源消耗太大,我们可以先建立以非对称加密为基础的连接,然后将对称加密的密钥发给对方。这样不仅利用了非对称加密难以破解的优势还利用了对称加密消耗资源少的优点
怎样获得最初的公钥?对于非对称加密而言,例如md5,sha256等加密,在操作系统安装时就已经内置ca(证书颁发机构)的加密证书了,通过这个证书我们就可以获得ca的公钥,那么通信双方又是怎样获得公钥的?首先服务提供方先将自己注册给ca,也就是将公钥和其他信息发送给ca,ca使用私钥签署后将其发送给用户。由于用户在安装操作系统时已经安装了公钥,因此我们可以通过ca的公钥来解出私钥所包含的服务提供方的信息,这样就可以获得服务提供方的公钥从而与其通信了。通过ca的方式可以有效避免中间人攻击
颁发证书的不仅是ca,也可以是其他的服务提供方。当然,与服务提供方通讯时首先要获得他的公钥,而这个公钥不仅可以来自ca也可以来自其他的通讯提供方。这样在互联网中就组成了一个庞大的信任链。有时我们获得证书可能来自于服务提供方本身,这时一般会让我们下载他的证书,常见于中国铁路订票时
pgp加密
pgp加密是流行的email加密格式,它综合了上面所提到的网络技术。当发送email时,发送方首先通过邮件内容和散列函数生成数据签名,之后再用自己的对称式钥加密数据签名并附在pgp协议的开头,而后使用非对称公钥加密对称式钥,最后发送给接收方