前言

本学期网络课程使用自底向上的思路学习, 如果思考为什么要做这个东西, 也就是需求的话, 还是要用自顶向下的方法分析. 但是做的时候又要自底向上一层一层建起来的, 有时候又会发现, 有些下层的东西, 又恰好是根据上层的应用才修改的. 只能说两种思路会促使不同角度看问题. 网络内容涉及到前两层的时候东西很多很,个人认为计算机网络的学习的确是全部重心都放到后面的层比较靠谱,奈何学校通信方面倾斜较多,连教材选取都独树一帜,学都学了就加深一下这两层的印象吧。本文以自底向上的方法来回顾学习的内容, 这两层实际上对之后网络编程上层来说已经足够成熟而且与历史上各种方案,所以不希望过分关注细节,而是分离抽象地去看大致地了解一个流程,其中学习的思想方法也能对解决别的问题提供一些思路,其实计算机网络整个下来我印象比较深刻的是中间层的思路以及各层中的向下兼容的包袱和解决某些问题简单思路也能取得好效果。文中穿插讲解一些技术的现实世界中的实际应用点,方便加深印象。之后再总结一遍,能够留下足够的物理层数据链路层印象,之后往上就可以以一种封装好的抽象和透明的思维去看待这两层了。

本文较长,良好基础通读大概需要 20 分钟,如果对其中一些词语和概念不明晰可以通过搜索进一步复习,如果 DFS 式阅读本文大概需要花费 很多很多 分钟。本文不涉及对于掌握思想方法无关的具体的过分细节如各种理论概念计算或编码具体协议格式等的知识。

后续补充全了网络层和运输层的内容, 全文基本涵盖了基本的计网要点.


需求分析

那么我们先从需求开始,请思考假设我们需要从零开始建立一个基于计算机数据传输通信网络我们需要做些什么请假定需求是能实现一定程度上台计算机的互联互通


线

由于要传输数据, 我们上从物理层开始创建一个东西. 既然是数据通信, 就有物理连接, 这个东西就是传输介质.

双绞线

像用的 RJ45 网线, 他为什么是双绞线呢? 这里想到模拟电子技术里面做的那个差动放大电路, 放大的时候放大一个差分信号就是防止两个输入端口的干扰信号, 如果我们把两个端口给减去就能减去干扰了, 所以一般传输的时候都喜欢传输一个差分信号, 为什么不直接用平行线呢, 两个线绞起来更紧密.

同轴线缆就更好理解, 双绞线的干扰也不是那么同步的, 直接让两个线平行包在一起就做了同轴线缆, 当然也更比平行线好. 但是电信号都会被电磁波干扰, 所以就又搞了个光纤, 光波的频率(高)和普通电磁干扰的频率的实在是差得远了, 干扰也干扰不了什么. 而且波分复用(光猫调制解调器就有三棱镜)实在是太好用了, 比容易混叠的FDM 频分复用不知道高到哪里去.

有了传输介质, 我们开始传东西了.


信息

世界的信号既有离散的也有连续的, 比如我传一堆字母, 他是离散的, 传一段声音就可能是连续的, 对不同的信号我们可以传不同的信号, 所以有数字传输模拟传输. 对于数字基带信号, 也就是有方波的信号(为什么基带就是离散和数字呢?实际是这种方波信号我们可以只采样其中的一个点平获取一个值,即离散的、数字的), 这个东西不好用, 为什么? 首先他带宽无穷大不可能无损传出去(传输介质比如铜线等都是有频带范围的,或者说,传输介质在通交流的时候本质是电阻+电感+电容的一个黑盒网络来的,于是就会有谐振,不同频率能不能过的问题), 然后是他低频能量集中, 如果我们要实现 FDM, 时域乘一个调制函数, 也会变成更平缓/或者高频曲线的模拟信号. 在以太网里面我们可以直接用基带传输, 反正距离不远, 直接超快的数字电路传过去就行了, USB也同理, 可以直接用基带传输. 广域网的话, 如果用光纤, 你传的是数字还是模拟都无所谓了反正我编码成光信号再传. 只不过是你一解甲码编乙码来我一解乙码编甲码去地迂回搞来搞去。 电话这个就可直接传模拟频带信号.

如果是无线的话, 肯定要传调制的模拟信号, 基带信号根本传不出去. 但是在获取那些调制后的模拟信号之前, 我们还是先将比特流编码成基带信号先, 这一点好迂回, 由于我们是计算机网络, 就不涉及模拟直接传的(电话), 因为就算是音视频我们都是用的比特的离散采样数据, 所以实际是有个 ADA 的传输过程, 中间 D 肯定是会损失的(取样).

模拟信号

那先说模拟到数字转换,即怎么把自然界的连续信号搞成数字的(这个东西叫ADC, 模数转换器), 我们提出了PAM, 脉冲幅度调制, 脉冲不一定是冲激欸, 原来方波也是一个脉冲对不对, 幅度都很好明白, 总而言之就是用不同的幅度方波脉冲序列表示原来的模拟信号(搞一堆矩形出来). 那和求积分的过程很像吧, 离散化, 然而这里可没办法取极限, 所以必然有采样这一操作, 采样的时候不能隔得太远当时可以隔得很近(无限近就是取极限了), 隔得太近就叫过采样了,, 这里奈奎斯特算了一个奈奎斯特采样率(通过频域上很容易证明)就是两倍信号频率. 注意这里奈奎斯特采样率是针对模拟信号取样,接收端需要恢复模拟的限制。如果我们直接用播放超短时长的音视频序列即数字信号来仿佛输出一个模拟信号, 把采样率搞得越高越好,但是实际传输然后通过低通滤波恢复的情况,2倍已经是不错的效果了.

过采样和欠采样时钟举例

和过采样相对的是欠采样, 拍视频的时候试过拍风扇和车轮的就能看到仿佛他们在倒着转, 考虑一个正弦信号, 第一个采样点在第一个周期的y= 0点, 第二个采样点又到第一个周期的负数点了, 这就把函数上升的部分给搞掉了, 就好比时钟取样, 你第一个点是1点, 第二点隔得超级远选了12点, 什么叫表倒着转啊. PAM 搞了一堆, 好像很厉害, 但是你还有个幅度呢, 这个幅度我不想传过去的啊, 你要分辨1v和1.5v多麻烦啊, 所以我们接下来还能量化再编码, 比如我把1v编成1, 翻译成001, 1.5v变成2, 翻译成010… 之类的再用基带来传, 一共用多少二进制位就看你量化成多少级了. 这样整个流程我们叫做PCM, 脉冲编码调制, 也就是PCM包括了PAM咯. 搞音视频开发的肯定都听过 PCM 的音频编码。量化在之后学音视频编码里面也常常出现的,这种和采样差不多的东西就算是压缩技术了。

PCM 量化成数字编码

还没完, 还有一种编码方法, 之前这个方法你要表示一万个怎么办,无穷上升怎么办…这样编码无穷尽也啊!(虽然实际上用前缀码也能搞扩容的,看 Intel x86 都不知道搞了多少次指令扩展)所以又DM, delta 调制, 我们每升高1就编个1, 降低1就编个0,… 这样就讲完模拟到数字转换了.

基带传输

那接下来就讲怎么做基带信号了,  首先是基带编码的方法, 我们先提出了单极码, 就是1电平表示1, 0电平表示0, 但是这东西不好用, 比如说他容易误码吧0和1也没差多少. 于是又引入了双极码, 双极码一正一负, 平均情况下很好用. 双极NRZ, 正负电平表示1/0, 但是还是有直流成分, 这是由于连续的0和连续的1的时候, 就等于发了长时间的电平了. (要区分平均情况下减少直流和连续的编码存不存在直流).

对于传输东西, 很害怕直流, 为什么? 一个是我们电路里面为了抗衰减有放大器, 直流会提高放大器静态工作点偏置, 影响放大器性能. 第二个是直流是0频成分, 很容易衰减, 还导致功耗加大, 严重的时候干扰信道传输. 所以我们要避免直流. (实际上交流信号中的直流成分为什么能单独拿出来分析就是电路和电磁学里面叠加定理的理论方面的部分,我们当然不深究)。

然后还有一个问题是自同步, 对于收发两方的通信系统, 他们的时钟又不一定是一样的, 最起码开机的时间都不一样, 所以我们最好能提供一个机制让他两个人在接受一系列信号之后能知道信号的时间点信息. 不过USB说这些缺点都没关系, 不能自同步我一开始发一个0101010来给你校准时钟就行了, 之后连续的时候你已经有时钟信息了, USB也不怕直流, 多大点电费对吧.

但是有的人不想要时钟, 他想每个比特来了都不用时钟就能读数据(像数字电路里面上升沿), 于是就搞出了 RZ 编码, RZ码没有直流是因为他连续1连续0的时候都会跳回0(爬楼梯), 所以直流成分不高. 结果 RZ 跳回中间0会导致难辩别也难做, 跳来跳去跳三个, 也容易误码, 于是又提出了双相码, 不跳0了, 我们一个比特内完成1-0--1 的跳跃, 也没有直流. 非常好, 这就是曼切斯特编码和差分曼切斯特编码. 这个也广泛应用在早期的以太网基带传输上.

后来会认为RZ和曼切斯特都浪费钱, 带宽本来就贵了, 还一个比特用两个波特, 惯着了, 既要自同步也要没有直流, 然而还是选择了跳来跳去跳三个的做法, 就是每个0就0电平, 出现1就高电平, 下一个1翻转一次, 这个叫做AMI, 交替标记翻转. 但是连续0的时候根本不能自同步, 于是又提出了扰码来实现消除长0, 方法和转义类似. 缺点就是要转义, 而且还有RZ的那个跳3步的缺点. 也不知道有谁用. 好像电报用了的那个没有转义的 ?

后来这个扰码的转义思路直接扩展成为了块编码, 直接把每种序列转义成一个序列使得总体的编码符合我的需求就行了(比如0010编码成1010之类的), 区别于这里提到的所有的线性编码, 而且也没有跳三跳的缺点. 扰码和快编码都是了解内容毕竟也记不住. 再提一下后来以太网也有用块编码的了, 毕竟曼切斯特浪费带宽啊, 而计算快编码的计算资源相比并不高….

基带信号讲完了物理层才刚刚开始呢, 刚才说到有了数字基带, 涉及无线和长距离传输还涉及加密和带宽复用的过程, 这些传输可没办法用基带传输, 那就用模拟信号了. 这里就涉及数字到模拟转换(虽然刚刚才讲这么把模拟信号PCM到数字,哈哈,真的是转来转去的)以及模拟信号的调制了.

模拟传输

模拟这里比较复杂, 先讲一个晶体振荡器和乘法器的概念, 然后是功率谱求解用到的傅里叶变换的一个点. 晶体振荡器能够产生正弦波, 乘法器就是乘法器. 傅里叶变换的点主要是讲解如果我有一个时域正弦波, 然后把中间几个周期的函数幅值变成0, 这样之后再做傅里叶变换得到的肯定已经不是正弦波的那个频率了, 直观理解最起码他会从他自己这个频率往高频扩一部分(函数值为0的点本来是斜率最大的点), 也会向低频扩一部分(挖掉的部分没有变换, 平均降低了频率). 所以才有频带信号这一说法.

摩尔斯密码发生器

然后先讲数字信号转模拟信号, 我们把这个技术叫shift keying, 键控, 起因我们从历史去看, 先有电报再有电话才有今天的互联网. 电报是数字转模拟传输的一个应用吧, 电话是模拟直接传(3g是数字电话), 为了解释键控是什么意思先从电报说起, 用摩尔斯电报举例, 按一下就产生一个信号呗, 短和长的就时间不同, 我们可以用一个振荡器和一个乘法器, 乘法器的系数连接一个开关, 这样按一下就产生正弦波, 松开就不产生信号(0), 所以这个也叫OOK, on-off keying, 后来发现可以不仅用0和1两个幅度, 就把他叫做幅度键控了, 两个幅度1和0的就叫2ASK.

组合使用振荡器和乘法器, 我们还能搞出 FSK , 再引入反相器或者移相器我们又能搞出PSK. SK 部分就了解这么多. 3G 的 GSM 用的是后来更多出品的 SK 技术之一. 对于PSK和ASK, 我们可以用星座图来表示比特码元和具体的幅度频率和相位的关系. 篇幅关系不讲解了.

现在我们有了频带信号了, 可以搞一些小技巧来迁移我们的频带达到利用宽带带宽的目的, 比如把800kHz~900kHz搬到1600kHz~1700kHz这种. 像之前说的 2ASK, 用上这个技术就能用来实现基于FDM 频分复用全双工网络构造.(可能还对以太网那个基带传输是怎么实现全双工有疑问, 那个的答案是基于链路的全双工, 就是四根线两根差分工一收, 两根差分工2发, 复习前面提到的差分信号). 具体实现就是乘法器乘上一个  coswt 。

FDM 基础之频移实现方法

还有一种带宽利用是扩频技术, 他是基于加密或者是冗余的需要利用带宽而不是提高传输速率, 主要就是把原来的一整块信息依据某些规律分散到分散的频段上去. 扩频分为DSSS直接序列扩频和FHSS频率跳动扩频. 后者利用随机性质扩频, 机制复杂. 扩频也是根据无线信道容易被监听或者被干扰而广泛采用的技术, GSM就使用了扩频技术抗干扰, 安全性是通过比特流加密保证的. 这两个技术很有意思,知乎有一个涉及截图找人的问题下有个回答分析频域数字盲水印技术中就用到了扩频技术来加密频域水印,用 Matlab 实验了一下挺好玩的。

还有电话没讲, 电话是模拟直接传的但是话音好像频率并不高所以需要编到高频上去做出频带信号, 我们数字到模拟叫键控, 这里就叫调制吧. 一个名词是载波, 载波就是单一频率的正弦信号, 他将会作为调制原始信号的调料.

FDM 基础之频移 jw 频谱图

这里调制分为幅度和角度. 幅度就直接乘起来叫AM.

AM 调制

角度又分为频率和相位. 这里FM很简单就是压控振荡器, 根据你信号的幅度控制产生的正弦波频率. 角度调制的好处是不怕非线性失真, 考虑你AM经过放大之后说不定接收者收不到幅度信息了, 但是角度调制只需要看变换的频率就能还原信息. 相位调制涉及公式运算, 这里不展开讲.

FM 调制

模拟传输应用再讲一个FM广播AM广播的启发. AM广播是中短波电台能转弯, FM是超短波, 高频的时候都近乎直线传播了(类比光超高频直线传播). 但是AM的音质不行(因为划的时候频带较窄), 主要用给语音电台吧. FM对音乐支持好, 这里只讲一个立体声的升级.

FM 调频广播实现双声道 图片来自网络

FM划的频带很宽, 为了满足听众的美好音乐收听的向往,后来就搞了一个双声道升级, 把左声道和右声道的和放到原来的频带的低边, 把差放到频带的高的一边. 对于原来的旧版FM, 仍然能解码听到两个声道合起来的单声道, 新版的设备就可以用和信号和差信号分解出左右声道. 就算是新设备, 对于高频的差信号干扰大了也可以听和信号. 这里实现了无痛升级和兼容. 好思路!


广播互联

物理层还有一个章节是讲交换技术的, 但是由于交换技术主要广泛用于互联互通的时候用, 事实上下三层都有交换技术. 这里就只讲物理层用到的电路交换技术. 事实上这基本都不用的了…就讲中国以前的电话网络吧, 每个电话交换节点都有一个办公室, 区域订户会打电话给这个办公室, 告诉他帮我接谁, 如果是同一个区的就给他接条线, 不过一般打长途电话, 就接一条线给下一个办公室, 一般有专线打过去, 告诉他帮我继续接下去. 直到电话线全部接通.(办公室要打电话給订户, 不过一般订户都是企事业单位, 这时专门的传话员接电话然后去单位里叫人,是不是很高级).

电话交换网络

还有一种就是集线器hub, 他是一层交换机, 一堆RJ45口, 然后如果他是10Mbps半双工的话就直接CSMA/CD乱广播一通, 家和学校用的十块钱的网口扩展交换机就算这种集线器, 不过他连交换都不算吧, 直接全连接….

好, 物理层就讲到这里. 我们做物理层是为了为上层提供比特流的传输, 他是完全透明的, 上层给我什么我也不管, 就传出去, 透明性是网路分层的一个重要性质, 尽管不同层的透明性可能指的是完全不同的意思, 但是请牢记这个词. 但是由于这一层没有计算机的参与(说不定上一段的hub也算计算机了是吧), 所以没有任何机制能保证可靠传输, 一个比特变成另一个也不知道, 如果是电报网络和电话网络这种曾经的即时传输的应用, 好像也就够用了. 往上一层, 我们就要做第一个互联的层了, 怎么依靠物理层的这个提供不可靠比特流传输功能的下层来做一个能实现多个设备之间互联互通的网络, 就是数据链路层这一实现局域网的层了.

现在假定我们已经拥有一个能传比特流的下层了, 编码的过程我不用管, 我直接传串行比特流给他他就会帮我发过去. 那么现在就来构建数据链路层, 先从两个设备的通信开始讲到多个设备. 这里开始就主要是计算机设备在工作了, 有更多的灵活性.


冲突和差错

这次主要以一层Hub和二层交换机为设备讲这一层. 用到的传输介质是双绞线的RJ45接口网线, 之前说过可以通过多线实现全双工, 但是我们先以历史悠久的没有全双工即半双工的版本讲起. 不过如果用低带宽的全双工线来兼容高带宽的一种办法就是让他工作在半双工模式(把收发改成收或发两路并行).

两个设备通信, 我们就把两台设备用RJ45连起来就行了. 但是有一个问题是两个设备都想给对方发数据, 半双工就冲突了. 除了两个设备, 为了实现多设备的网络构建, 我们发明了Hub集线器, 集线器的工作原理就是通过RJ45口把所有的电脑链接到一个集中式的管理员上, 就是一个简单集中式网络了(不过现在所有人都能听见.). 这个管理员就是Hub, 他不断的把一个口的数据传到其他口. 我们可以想到直接把铜线和一些MUX和放大器给连起来就好了. 但是就涉及到一个问题了, 同一时刻如果有两个网口都想对外传信息的时候, 就造成了冲突. 物理层不管你这么多, 又没有计算机, 所以他不管你冲突不冲突的, 他就直接在一个冲突的信道上传比特.

这样可不行, 为了尽力把我们的比特流传对了, 必须要加入一些机制来识别比特流是不是发送方想要发的. 接下来就讲差错控制.

差错控制

于是就开始研究一些措施, 比如冗余数据内带校验和等. 这里涉及信息论的两个概念 , 一个是线性分组编码循环码. 线性分组编码就是合法码构成的集合满足线性(认为加法是异或就好了). 至于为什么要用线性我也不知道(涉及群论数论的东西). 循环码也是线性分组编码. 那这里循环冗余码就是循环码, 汉明码就是线性分组编码. 汉明码是纠错的产物, ECC用到, 通信很少用, 但是汉明的理论很重要, 关于纠错检错而计算冗余的位数, 具体公式本总结不涉及(因为理解了就能推了). CRC主要是检错, 而且效果很好, 通过合理选择多项式能覆盖各种单比特多比特错误. 考虑通信里错了就重发, 所以CRC广泛应用. 具体的多项式探究太复杂, 记住两个点, 一个是含有X+1能检测任意奇数错误. 实际上应用我们抄作业就行了. 然后还有一个校验方法是校验和, 主要是求和高位补到低位, 最后取反. 接收方同样操作得到0就正常.

有了CRC和Checksum, 就能实现之前说的冲突信号比特流判定了. 但是在此之前还有一个问题, 那就是CRC和Checksum都是局部性的东西, 为了这个, 我们必须把数据分开成一块一块地发, 于是就有了帧这个东西. 要做, 我们就要保存信息, 具体的帧怎么搞我也不讲了, 讲两个点, 一个是透明性, 透明性要求我们不能改比特流, 但是有帧要区分头尾CRC数据和实际的比特流, 那怎么办呢, 就用转义Escape 就行了.

流量控制

插入一个东西, 流量控制,互联网用的是TCP/IP 协议, 其中上层的针对进程端口的传输层TCP协议是面向连接的, 而IP(网络层)是无连接的Best-effort, 但是MAC的数据链路层又是点对点链路, 你还做了重传(流量控制), 这不是面向连接了吗?  我也不知道怎么理解, 数据链路层如果发错东西了就丢掉就好了, 但是考虑这样就会慢速扩散到上层, 上层知道丢失了才能重传数据, 这样代价可能太大了, 为了实现best-effort, OSI说要不能重发就重发吧. (实际上以太网是完全无连接的, CRC错了就丢掉了). 第二点是如果搞私有ad hoc协议的话, 想要快就要只用下三层, 甚至USB这种岂不是直接物理层, 所以实际保留对流控支持才是好选择, 实际这部分在802 Ethernet里是体现在LLC链路逻辑控制子层里面的, 有控制字段来要求数据链路层提供流控服务, 但是TCP/IP用的时候又没用到, 所以支持TCP/IP的设备又不需要具体实现这个LLC层, 说不定在adhoc上有用, 毕竟Ethernet也并不总是服务于TCP/IP协议的.

针对帧的重传机制, 提出ARQ 自动重传请求, 涉及停止等待, 就是每个都等ACK, 非常慢, 直接讲窗口吧, 回退N帧是接收方没收到一个就阻塞在那里, 往后的都要重传, 选择性重传是TCP那种收方缓存的方案. 到这里讲完了DLC数据链路控制了. (实际上Ethernet的数据链路层并没有流量控制,所以我们说 OSI 这个东西只是空有理论,不搞实践,一只靴子高高挂起,根本不落地).

HDLC 和 PPP (扩展)

除了Ethernet, 还有HDLC和PPP协议用于DLC, HDLC实现的是可靠的面向连接的数据链路层, 用了滑动窗口, 帧有序号. PPP后来也是实现在Ethernet层之上的一个中间层,其子层LCP是链路控制, AP是鉴别, NCP是网络控制. PPP没有用滑动窗口, 但是有ISP服务器和拨号用户之间的一个逻辑连接(这个叫数据链路), 实际连接的保证已经到应用层了. PPP的设计(1999)是在全双工网口即100Mbps RJ45出现(1992)之后,这时候普遍的局域网交换机也不用CSMA/CD 来检测冲突了,同样为了简单起见,PPP约定在全双工网络上提供支持,也就不用约定冲突检测的手段。但是既然可以通过over Ethernet 实现兼容,那PPP也没有必要做冲突检测了,PPPoE提出主要是为了让Ethernet支持AP等功能,PPPoE一开始是用在ADSL非对称用户数字线路上的,电话线路(接口4条线都是备用的)是全双工的,两路话音双绞线4芯,ADSL技术通过频分实现复用能用来上网。

PPPoE 的中间层兼容思想

继续补充, 以太网best-effort够用是基于他的有线链路稳定的基础上的. 我们实际上在信道质量差的无线网上是在数据链路层实现了可靠传输的, 这也是上面说的防止错误积累到上层. 这种区别对待的专家系统是很常见的(if决策).

解决冲突

还是讲回来我们搞CRC解决的那个多路访问冲突检测的问题, 我们实际是怎么检测的呢?  这是在半双工网络里, 我们直接一边往铜线给模拟信号, 一边检测模拟信号, 然后你一直比较是不是正在发的数据就行了, 这样实现也只用一些数字电路组合逻辑就行了吧. 这种方案不用ACK, 很方便. 涉及一个计算问题,  信号有传播时延, 保证在帧发送的同时我们能监听到最晚的冲突信号到达, 就会限定帧的长度最小值. 我们具体计算是选了局域网的5.12km有效长度倒推定下了帧长度至少512bits. 具体推导要专题复习了. 这个方案叫做CSMA/CD, 冲突检测. 无线的时候不能用了, 因为存在一些问题, 然后又引入了CSMA/CA冲突避免, 那个有竞争窗口和ACK, 还有分配向量让别人别发数据, 具体的我也不想看了,不过今天我们已经大部分的网用的物理全双工连接不用这个机制了. 总结一下, 这里我们采用冲突重发错误丢弃的方法来实现差错控制. 当然无线的还是要用 CA 的,如果你购买一个无线网卡,说不定就能看到 CSMA/CA 字样出现在包装背后的规格说明上,看来计网这两层他的确不是白读的,至少能玩明白个包装纸。


非广播互联

到目前讲到的还是基于上面说的那个一层Hub设备, 他等于一个中介, 但是数据链路层实际发生在计算机的NIC网络接口卡里, 接下来引入一个二层设备, 也就是二层交换机, 他本质上也是一个计算机, 所以他也有NIC. 集线器的问题是他只能广播. 不过我们现在也只能广播, 为了能实现和特定的人说话, 基于解决错误检测的帧添加一些信息, 就能实现指定发收设备了, 这里我们添加的信息就是硬件地址. 在以太网里面, 这个地址叫MAC地址, 多路访问地址或者媒体访问地址. 为了方便, 交换机只用了一个学习发送者地址和端口的机制, 只要发送过帧给交换机的设备的MAC地址和端口将被记录在交换表里. 这是为了减少交换的性能损失, 首先必须基于对原来的广播方式的支持, 因为电脑并不需要知道交换机的硬件地址, 他只需要知道接收方的硬件地址, 但是他发给接收方的帧要能被交换机偷听,而且我们具体的网络连接并不总是星形的, 我们可能会有总线型等连接(总线型实际上泛洪严重), 所以必须仍然基于广播来传送帧. 我们将在三层路由上看到完全不一样的转发机制.( 另外还有多播和广播帧, 多播必须要在网络层讲, 这是因为硬件地址的多播是和IP的密切相关的, 我认为MAC多播要自顶向下才能讲明白.  当然具体交换机还有很多扩展功能比如什么VLAN技术之类的.)

物理层总结说过交换技术无处不在, 这里, 可以发现以太网的数据链路层的交换技术也是使用了数据包/分组交换方法的即只指定目标地址和发送地址, 中间的寻址由中间设备完成, 不过实际上二层只是简单的广播而已(所以要避免做环路引发广播风暴), 三层才涉及路由技术技术.

为什么我们要用分组交换或者说一个无连接的方案呢?这是因为计算机里面用到通信链路的情况常常都是突发性的,并不是长时间连续的,建立连接的过程可能都足够完成一次数据传输了,以及维持一个连接也浪费链路,那就必须时不时地拆除电路了。

实际上在以太网这种分组交换技术之外还有一种虚电路技术, 虚电路的要点是实体电路存在环, 虚电路会有机制决定路径, 比如帧中继协议, 但是这个过时了

我们之后会讲一个很好用的虚电路模式ATM异步传输模式做的过时的异步传输网络ATM网络,如果你上中国电信 ChinaNet 的官方网站,就能看到这个 ATM 网络的字样出现在介绍骨干网 Backbone 的网络协议上. 我们上面讲解Ethernet的整个构建过程的时候我们是从解决问题直接给出一种方案来的, 实际上具体设计的话每一步都可能出现多种方案, 需要决策选用哪一种, 这种实际的先丰富的理论再实践的视角和我们刚才的简单的视角是不一样的.

回顾我们刚才所说的Ethernet, 我们可以想到, 分组交换实际上是无连接的, 这个就是常见的一个词尽最大努力交付Best-effort, 我们做的网络实际上是广播的, 就算是交换机, 也是偷听所有的帧, 然后实现广播或选择性发送出去(如果学习过的话).

这样的网络很明显是不可靠的, 发送方根本不知道能不能到达, 嗯发就完事了.

回想我们物理层的打电话要建立线路的过程, 那个就算可靠的网络了, 因为如果电话没有接通, 你就知道你说话也只有接线员能听见.

TDM 时分多路

二层交换机还有一个点没有说, 以上的视角基本都是小局域网的视角, 事实上如果我们做一个广域网, 就涉及到两台交换机之间一个链路传输多个数据的问题, 即两个局域网之间只有一个链路时常见的情况, 这就涉及多路复用了, 以太网交换机采用的是异步的TDM, 也叫ATDM/STDM, 统计时分复用. 其他技术这里不说多了.

马上可以想到CSMA不就是TDM的一种吗, 的确. 但是CSMA是从单车道完成双向来车的问题(炸车), 这里说的TDM是完成单车道过多辆车的问题. CSMA两边信息不对称, 存在博弈。


长距离光纤

所以我们回来做广域网了. 考虑我们还在10Mbps的半双工网络时代, 这个时候你会发现我们的Ethernet局限性太大了, 首先我们设计的时候要解决冲突, 引入了CSMA/CD, 但是为了能在发完帧之前检测到冲突的传播时延, 我们限制了五千米下的512bits的最小帧长度, 这太离谱了吧, 也就是距离越长, 我们的帧长度就越大. 而且本来也只规定了最小帧, 实际的帧长度是变长的, 为什么讨厌长帧呢? 这里涉及到平等的问题。

长帧带来恶果!自私的长帧影响网络流畅

考虑你是ISP(互联网服务供应商), 你为好多客户提供了互联服务, 但是每个用户都想要尽快的速度, 在城际的交换机 TDM 时沦为了排队抢先了, 慢了1微秒就等一年…这样肯定不行. 我们在操作系统里实现作业调度的时候是通过分片执行的, 给用户一种大家在并行执行的假象. 这也是我们想要的. (这里不涉及限速部分, 讲限速必须讲PPPoE以及宽带接入服务器BAS和网络层的路由器).

目前的铜线半双工必须要用CSMA就有局限性, 而且铜线本来长距离衰减和干扰就很烦. 那就不用铜线了, 我们寻找新的介质光纤.  之前说的WDM分粗的Coarse和稠密的Dense, 还有一种光纤时分复用的技术SONET, SONET本来是利用光实现通信的一个网络模式, 后来扩展变成一个中间层了, 因为你局域网用了Ethernet, 广域网应该也兼容Ethernet才对. 所以SONET就演变成兼容各种数据链路协议的一个翻译而已. WDM也是这样.

然后我们讲曾经投入使用的一个网络叫ATM网络, 异步传输模式网络(注意这个是和LAN内的Ethernet技术并列的一种网络,我们讲他只是为了了解虚电路的存在,实际上我们已经不用这个东西了,但是这个可以作为一个学习的点提供解决一些别的问题的思路), 我们现在想要在光纤上建立一个可靠的二层, 点对点虚电路是很稳定的方案.

还是说一下为什么要用有连接的吧, 当时我们在骨干网希望能最大速率提高支撑服务。

ChinaNet 国内骨干网节点连接拓扑图
​​​​​

我们学过网络层知道为了避免浪费和造成网络拥塞, 我们TCP/IP判断不可达是使用TTL限制跳数为零未到达才返回不可达的. 在此时的低速骨干网我们不希望造成这种情况,  一个无效的帧飘散很占用通道和交换机的处理资源. 所以希望还是用有连接的网络. 比如打电话说了一大堆最后对方都收不到.

我们指定了 VirtualPath-VirtualCircuit 两级路径(和进程-线程的级别类似), ATM交换机实现路径的路由和交换(通过路径表), 这样一旦连接建立了, 也不需要物理地址了. 建立连接的控制信息叫做信令, 和之前有线电话的过程差不多, ATM交换机会涉及路径的建立问题, 解释了ATM交换机昂贵复杂. 为了实现刚刚说的异步时分QoS网络质量管控, 我们限定ATM帧是定长的, 其中头5bytes, 数据48bytes, 共53bytes, 比Ethernet 的64bytes小, 这个帧结构叫做信元Cell, 因为他是固定的, 小室能体现这一点区分以太网帧. ATM成为骨干网的好选择, 但是非骨干部分是Ethernet的, 所以要在骨干网完成一个转换. 涉及混合体系结构和局域网仿真LANE, LANE就是让ATM交换机假装自己是以太网二层交换机,骨干网内全是ATM交换机, 骨干网内流通完到出口的时候又转回普通的以太网帧了, 也就是骨干网有连接, Ethernet整体还是无连接, 又是一个中间层的思想.

不过好景不长, 自从有了千兆和吉兆以及全双工技术之后, 我们在骨干网采用超高速率网, 这样 Ethernet 的best effort 都够用了, ATM又贵, 也就面临危机了.

然后是 Real World 部分, 这里篇幅主要讲CSMA去了, 实际上我们有两条线的全双工RJ45很久了, 都不用CD了…. 无线的网由于圆形区域的隐藏站与暴露站的问题导致无法正确监听不能用CD, 就需要CSMA/CA技术, 具体这里不讲了. 主要是串一下复习.

  所以讲了这么多都是没有用的,心态崩了, 实际上的以太网数据链路层日常就是出错了就丢, 不管什么帧都全部当广播发, 收到了再丢….实在是一个看起来很奢侈用起来却很好用的暴力美学。当然涉及到一些特殊情况这样搞可能弄瘫痪整个网络,实际的二层交换机也是可以配置一些机制来减少不必要的无效帧飘散的。

数据链路就这么多, 接下来的网络层和传输层涉及的算法比较多, 串讲的方法就不涉及具体内容了, 因为还要搞专题复习的. 从部件在整个系统的角度和整体上去观察一个东西的确能更加清楚他是什么, 但是涉及具体的每一个小点, 都是好多研究弄出来的. 很难一两句话去概括.

补充一个东西我觉得值得了解,用于Ethernet 的 RJ45和用于电话的RJ11都是做了多个线头,的接触点

RJ 11 接口

但是实际用只用一两个,这一点是留冗余方便未来升级或者添加功能或者故障时保障传输。

USB 3.0 兼容 2.0

USB3.0 兼容2.0则是套壳,做了一套2.0 4接触口和3.0 6接触口,多亏2.0的时候横向留了一些空间放第二套接触点。


前两层总结

经过这么长的流水账,我们思想上假想地建立了一个能实现广域网局域网互联的下两层支撑。下面回顾一下。
    我们从有线开始,根据差分减去干扰的思路我们做了好多种线。接着我们在信道上传输数字信号的编码,而数字信号又可能采样自模拟信号,数字信号又通过编码通过数字基带传输或者调制后的模拟传输。由此我们建立好了一个基础设施
    于是我们用这个设施去广播通信。
    用这个基础设施的时候,我们发现设备和线路可能出错,而由于同时发言可能会出现冲突。为了解决差错我们提出了校验码。为了解决冲突一开始基于差错检测提出了各种方案(Aloha、CSMA),后来我们直接用两条线路实现物理意义上的全双工避免了冲突,无线上沿用之前的方案。由于两边计算机处理信息速度可能不一样,我们想到流量控制,后来实际把流量控制留给高层做,底层不管这么多。
    然后我们继续用这个基础设施,我们不仅想广播,还想说悄悄话,单播,于是我们给每个网口编了物理地址(Ethernet 中的MAC),中间提供二层交换机作为中介,建立了地址交换来实现非广播通信,为了简单我们没有指定寻路的方法,只是广播地飘散。
    来到长距离上我们想用另一种线(光纤)和另一种编码和寻址方案,我们采用中间层的思路完成转换。
    我们发现物理地址寻址和网卡接口有关(唯一电话号码),这样不方便,于是提出了再建设一个中间层(网络层)来完成 ARP 寻址(通讯录)的功能。这一切都值得。持续往上就是持续的抽象和不断地扩展中间层,比如 DNS 也是一个中间层。上面的层本文不再涉及了。

之后有时间再写以下往上走的网络层传输层以及应用层的一些要点,主要关注 IP 层和路由器是如何履行其功能, TCP 的一个对连接的控制和流量控制 Flow Control 以及其 Congestion Conctrol 是怎么用分布式的算法解决网络全局性的拥塞问题,顺便读一下谷歌的 BBR 算法论文,应用层则十分广泛学习,不妨从 Linux 网络编程学习 HTTP 协议结合学习开始,这部分可能需要更多篇幅。


逻辑地址

这次我们从网络层开始讲了,还是按谢希仁书来吧。

上回说到我们构建了一个下两层,这个下层的特点是,通过物理地址寻址, 实际传输帧是通过广播,然后他具备一些校验机制(CRC),能够 best effort 传送数据(retransmission, 这个主要是指针对冲突的,而不是收没收到的),而且我们已经能够进行局域网和广域网通信了(当然实际上并不是这样自底向上的思路的,基本是同步设计出来的)。

接下来我们出现了问题,我们希望建立一个和硬件地址无关的东西,思想实验很容易想到,可以通过一个 hashmap 来匹配一个假地址(逻辑地址)和一个物理地址,只需要我们分配这个逻辑地址的时候就填充我的 hashmap 就行了。这样我们就讲完了 DHCP 地址分配了,这个 hashmap 的组件则是 arp 地址解析协议。


ARP 寻址协议

然后就是网络层的构建,我们从逻辑地址开始做,有了前面的基础,直接套娃式的加一个 header 就行了,这样我们的 packet 就能辨析逻辑地址了。然后每台计算机都要具备 ARP 组件来完成寻址,这个东西就是 arp 表,所有的节点(包括路由器都要有 arp 表)。

但是我们还没有决定怎么管理这些 ip 地址,除了简单的手动设置,实际上很简单,我们可以做一个 CS 结构,在网络中设定一台服务器,就叫做 dhcp 服务器,他会维护一个地址池,他本身则需要作为一个固定 ip 地址可供其他设备访问,就是我们说的网关了,这一点很重要,如果我们不手动配 ip,就必须由网关指定我们的 ip 地址。那么这个固定 ip 地址怎么去获取呢?很简单,如果有人需要ip地址,他需要发一个dhcp发现请求广播到网络中,然后他本身又还没有 ip 地址,这一部分就必须通过数据链路的 mac 层广播实现了,服务器收到请求后会map 这个 mac 地址到他地址池的一个 ip 地址,然后返一个定向包回去,这样就有 ip 地址了。当然,有些时候每个子网都配备 dhcp 服务器是不现实的,所以可以让某个路由器做代理,去向更上层的dhcp服务器发请求,这样就不用泛滥广播了。(实际上 dhcp 是做在 udp 层上的,这一点很鸡蛋问题,但是没办法, 历史遗留了属于是)。

我们说了 ip 和 mac 要映射起来,那么怎么完成这个映射呢?参照上面 dhcp 的思路,我们要基于之前的物理地址层来做一套东西,这个东西就是 arp 请求和 arp 响应,回想之前说的广播,对我们就直接广播这个 arp 请求,然后谁是相应的就给他回一个包。他建立这个 arp 表。然后就有人说了,如果没有这样的主机怎么办呢?所以有必要定义一套 arp 请求响应的超集,这就是 ICMP ,这个东西能指示终点的可达性,时间的超时性,改路由等东西。像 ping 就是用 icmp 来实现的,注意 icmp 是和 udp tcp 平行的(他作为 ip 数据包的 payload),然后 ping 里面的 ttl 就是一个允许的最大 hop 数量而已,traceroute 可以用来跟踪所有的 hop 点,这个原理是将 ttl 设置成 1,然后访问的是目标主机,这样到第一个点就会回报终点不可达,然后他再发第二个 TTL 为2 的继续去探(什么 BFS)。

路由这个东西怎么工作我不想讲了,实际就是一些算法策略而已。多播组播也不讲了,因为现在国内的运营商个人家庭宽带实际禁止多播的,IPTV 可能还会用,但是个人应用基本用不到。


NAT

直接讲 NAT 和 V*N 吧,为什么需要 NAT 呢,就是因为 IP 地址不够用,所以他划出了几种不同的地址,基本是内网和外网之分,主要的公网IP地址通过某个组织发放,然后比如一家网络运营商只分配到了1000个ip地址,但是他有10,000个用户,这时候就麻烦了,所以需要一种技术能够隔离开一个内网和外网。

先讲 V*N,为什么在校外访问校内的需要使用 V*N 呢,这是因为校内的很多服务器,网站服务是没有使用公网 IP 的,这不一定是 IP 地址不够用,比如公司等情况,还有一种因素是基于安全考虑,有些东西本来就不需要被外网访问。但是他们有可能需要远程建立这个内网,这就麻烦了,你不可能购买昂贵的物理专线去完成连接(学校教育网南北校区这种不算,这种财大气粗的),所以 V*N 技术诞生了,他通过在公共互联网上搭建一个加密隧道,即一个内网里有一台中断能够访问外网,其余的都可以通过他去访问一个隧道,完成远程内网的搭建。实现也很简单,就是通过一些元信息进行 ip地址替换或者套娃打包(比如把原数据包整个ip包加密打包,即 ip 地址也不会被别人看见, 保证了无法伪装连接进入内网)都可以。V*N 技术和某个技术不是同一个东西,这里不详细说了。

但是还有一个问题,内网设备太多了,他们想要和外网通信怎么办,这次不是想和远程的内网通信了,这样也很容易思想实验,只需要让有公网ip的主机作为 NAT 路由器,然后他维护一个表格实现转换就行了. 但是这里涉及一个问题就是多对一的情况我怎么知道哪些包是给哪些包的呢?所以这样的 NAT 没用,只能宏观上也时分多路,这下一次只能指定一台电脑去通信了,别的不能同时发接包,不然就不知道传给谁,所以新版的 NAT 利用上传输层的 UDP 和 TCP 的端口号,由于端口号可以实现多对多的模式,这样就能实现通过代理人(NAT路由器)对外通信了。


内网穿透

然而 NAT 有一个问题就是主机无法做服务器,有了多对多的 IP:port map 为什么不能实现呢?首先我们要清楚 nat 是怎么分配端口号的,我们必须要让内网主机向外发送网络连接请求(low level 看到的就是一个对外的 ip packet,但是 src ip addr 是内网地址)然后NAT路由才分配一个端口号并加到 map 里面。

由于我们面向实用速通,这里有必要详细讲解如今网络运营商提供的NAT的不同分类,以及网络穿透等概念还有NAT P2P 实现原理。

NAT 又分为 Cone 型和 Symmetric 型。我们下面具体讲解,但是注意下面说的都是NAPT,即带 port 的NAT,原始 NAT 的缺点我们说过了,所以 Real world 已经没有这个东西了,如果配置一些 adhoc 网络可能会用但是我们不讲。

补充一个点, 就是我们说 nat 的时候不说这些 cone 和 symmetric, 所以读完本文起码要知道 nat1 nat2 nat3 nat4 分别是什么, 他们依次是 full cone, ip 受限 cone, port 受限 cone, symmetric.

我们对外产生一个连接之后绑定一个 ip:port 对给一个连接,如果此时内网主机又产生一个连接, 那么路由器是再分配一个端口号还是维系用原来那个端口号呢?这就是区分 cone 和 symmetric 的要素了,cone 就像名字那样是一个锥地保留一对多,即内网主机分配一个 ip:port 对完成全部对外连接, symmetric 则是对等的产生新的 ip:port 对。这个东西怎么影响我们的 P2P 呢?我们知道 P2P 需要双方都做服务器(请注意单方请求建立连接之后的双方通信不属于P2P,这样就是集中式的了,等价于网盘,集中式IM 而不是 P2P 下载),而 Nat 的这个特性导致了无法响应外部请求,必须先内部发请求才能建立出对外连接,这样对方知道了这个 ip:port 对才能以这个为目标主机发送一个请求,所以理所当然我们想到用一个公网主机做总结来记录这个 ip:port 对,这样首先双方都向公网主机 register 自己的 ip:port 对,然后公网主机分发这些信息出去,这一点是可以接受的,因为试想实现一个 p2p 资源分享系统也本身就需要注册各主机的分布信息和公网ip地址,P2P im 同理,不可能能够直接知道对方ip地址。

这时候就又有一个安全问题了,如果提供了锥形nat,似乎就会很危险,因为本来建立的是对某个目标的连接,现在允许其他主机通过这个ip:port 对连接进来,所以nat cone 型下面又有 ip地址限制型和端口限制型,禁止其他我没有主动请求过的主机ip或端口通过该连接接进来。

然后就讲到内网穿透了,首先明确一个点,家用路由器本质上都是 nat 路由器,他经过运营商的一个 nat 之后再做了一层 nat,所以内网穿透实际上穿了好几层了属于是。

先考虑最简单的情况,只要有一方是公网不管是限制ip还是限制端口都不怕,考虑一方nat是cone限制型,我们让中介server承担这样的角色,先让A机(内)B机(公)建立 A《-》server(注册)B《-》Server,然后此时cone原因我们A的地址已经公开了,但是B(公网ip)还不能访问A,我们再让A机发一个对 B 机的请求(这是为什么需要B机公网,不然A无法向B请求,又是鸡蛋问题),这样B机就能访问A机了,同理。这种方法就叫做反向连接技术(connection reversal)

但是我们一般的都是双方内网的,所以就需要打洞技术了。最轻松的情况是双方都是 full cone,即没有任何限制,这样register之后就允许互相请求访问了。但是实际上会有限制,需要让 nat 路由认为我是访问过对方的才能接受对方来包,很容易想到 A B(都是cone nat)同时建立请求就行了,A 请求 B的时候,B也请求A(as server),这时双方的 nat 都会无视对方发来的包,但是会响应这边发出去的包,于是在原来的 ip:port对的许可ip或者port表下添加一个条目,这样之后双方再请求,就成功通信了,然后双方就能做为网络上的服务器继续服务其他打洞(链式反应)。

当然具体的还要分同一个 nat 和不同 nat 的情况,同一个 nat 下可以通过一些判断建立内网连接,这里就不讲了。上面讲的P2P打洞实际是基于UDP的,为什么不是 TCP 呢?因为 TCP 涉及连接,主要问题就是 API 上,TCP 无法用一个端口实现两个连接,因为他的 socket api 设定认为需要创建一个连接就用一个端口号,这样就会导致 nat 两套地址出来,所以这里问题就 double了,即我们 A——》B请求之后建立了一条连接,根据 NAT 限制 cone,这时 B的确可以向 A 发包,但是这样就不是 P2P了,必须明确P2P需要如果A没有请求B,B能够请求A,一种思路就是如果 B 需要连接 A,他就向中介请求,让 A 主动连接B,但是这样是搞笑的,因为我们说过了,这是B还没有发送过向 A 的请求,所以A不能连接B。而之前的那个方案两条连接给 nat 提供信息之后,对方再过来的包无法被 socket api 访问tcp api 无法同时接受和发送,当然一些 hook 或者想办法端口复用(和udp一样都是服务套原来客户的端口),但是 NAPT 我们之前说了他要到运输层的了,运输层TCP包头是 四个字节源目port,然后紧接着是4个字节序号和确认号,安全因素我可以设计 nat 路由器让他nat映射表再配上一个序列号,实际也是这样. 部分NAT可以通过syn包打通连接(看nat怎么判断应该关闭一个映射),部分NAT则需要三次握手TCP连接建立之后才行(这个是NAT协议RFC5382 规定要支持的Simultaneous TCP Open),有的不标准NAT又完全不行,所以笑死,根本打不通。(这部分内容的参考连接:匿名信使:木马隐蔽通信浅谈 - 博客 - 腾讯安全应急响应中心 (tencent.com), [讨论]关于 TCP打洞的碎事,我提观点,你们喷。-编程技术-看雪论坛-安全社区|安全招聘|bbs.pediy.com, P2P通信原理与实现 - evilpan).我然后看 TCP/IP 卷一, NAT 的端口映射建立很容易设想, 但是撤销就要一些手段了, 比如计时器(UDP), FIN + 计时器(TCP)等, 所以这里 NAT 映射的行为是不确定的, 他可能会再没有 ACK 的连接上计时清空之后马上就解除绑定了(不过他可能会 probe 一下内网终端看看是不是还在持续发送, 只不过是外网超时了), 所以一个方案是同时发起连接(SYN), 然后对方返回(SYN+ACK), 即内网到 nat 总是比外网过来要快的, 所以我打通洞之后, 外网包才到达, 就能进来了. 然而还是有可能有这个时间差问题, 最后结果是会有一个连接的 SYN 不能穿过(这边还没打通),  但是还是建立起了一个连接, 实际 NAT 规定(RFC5328) 可能会需要NAT设备支持延迟丢弃, 这个是保证 simultaneous tcp open 的规定, 即等 6s 中如果有打洞过来了, 就不丢弃. (什么cone 复用端口, 不是很理解!)


传输层

讲了这么久 napt 这个跨传输层的东西,接着讲传输层,传输层的本质不过是应对现代操作系统的多进程时间片复用模型而提出的又一层套娃东西而已. 我先一笔带过 TCP,因为TCP这个东西做了很多内容,实际是现代很多网络引用的基础,但是我们定制的时候一般不做 TCP,不然就要对抗他 kernel 层实现好的东西(除非定制驱动模块像 BBR 那种). 定制 UDP而不用 TCP 的原因看我的另一篇笔记讲 TCP 拥塞控制的, 里面讲了为什么要基于UDP定制用户栈协议.

我就讲 UDP 的,UDP 是不基于连接的,所以他可以一对一一对多等,实时应用不管拥塞的都很实用. 但是他没有拥塞控制(拥塞控制见另一篇笔记). UDP 头也很简单,就是端口号,长度,校验和, 值得注意的是这里的检验和是包括IP地址(这个nat要注意)头部以及 payload 的校验和 while ip 校验首部 ttl 那些但是没有ip地址, 实际上无非是分工而已,至于为什么IP的校验要放到transport layer,这一点试想一个 IP 层的 middle man  attack 马上就能理解了!端到端的transport layer 做这个校验更加安全, [e2e] purpose of pseudo header in TCP checksum (postel.org)这里有引用设计tcpip的人的解释. 然后如果端口号非法, 目地应该返回一个 ICMP 不可达,这个 ICMP 之前说了可以认为是平行(或者先于)于 UDP TCP 的.


域名与 DNS

至此所有的 TCP/IP 梳理也过了一遍, 接下来是再上一层, www 这个东西! 就是大名鼎鼎的 DNS! 主要是理解 DNS 缓存,递归查询和迭代查询. 然后重要的是 DNS 本身一般是通过 UDP 来传输的(不用握手开销, 不负责拥塞控制,因为 DNS 都查不到也不用上网了), 如果查询的结果很大, 可能会升级到 TCP. 下面主要讲解配置网站时可能遇到的知识点.

首先是 A 记录和 AAAA 记录, 这个东西是记录一个 ip 地址, 比如使用 nslookup, 然后查询 A/AAAA, 请求一个域名, 这样查询返回的就是一个 ip 地址. 随后终端就可以做 域名到 ip地址的绑定(实际是本地 dns 缓存). 然后是 CNAME 记录,记录的是一个 canonical name 的别名. 就讲这两个了.

然后是 DNS 查询的过程,首先全球共有 13 个根服务器, 然后近到本地 Isp 会配置多个缓存服务器(DHCP分配的 dns 就是 isp 提供的缓存服务器).终端设备进行 DNS 查询的时候, 首先是本机缓存,然后是 host文件(本质是user define), 如果都没有就会到(网络配置)指定的 DNS 服务器去查找, 比如是 a 服务器,那么就会在 a 的服务器去查询一个请求, 比如查询 xx.com, 如果 a 缓存了这个记录, 就返回了, 如果没有这个记录或者缓存过期, 他就会进行递归查询或者迭代查询, let 递归, 这样任务递归委托到 ISP 的上一层 DNS 服务器,本质还是一个缓存, 如果还是没有, 就会去请求13台根服务器中的一台, 根服务器不可能进行递归查询(性能问题), 所以他只会查询到顶级的, 比如 com 服务器, 而 com 服务器会有很多台,这些是授权服务器来的, ISP再向任意一台发查询请求, 之后如果还有多级的依次查询, 不然就查到了返回. 所以说你购买域名之后, 需要配置 A 记录和 CNAME 记录, 域名提供商就要把这个记录给添加到顶级域名的数据库里, 然后访问一会后等待全世界各级缓存超时更新之后就绑定好了你的域名. 这就是为什么顶级域名要这么多钱, 因为要维护全世界的顶级服务器(虽然就十几台), 而且很好理解为什么这些一定是迭代查询, 因为他们千万亿级高并发的.


CA 与 TLS

之后是到了现代网络,我们要讲一下安全, 先从证书开始, 我们需要认证一些网络服务器的安全性和真实性, 这就需要一些证书. 非对称加密这个数学课接触过了,这里不详细说了. 很理所当然的我们想到像 dns 查询那样构建一些根证书颁发机构, CA, 然后让浏览器和操作系统等出厂自带这些根证书颁发机构的证书(公钥), 从而保证对 CA的访问是可以认证的, 即你访问CA的时候那个非对称的公钥一定要和我出厂自带的那个吻合, 不然之后的 AP(鉴权)过程就不用做了(全是不安全的).

然后就是具体分层实现了,下层认证接入有 WAP 等. IP层有 IPSec, 运输层有 TLS, 应用层比如 DNSSEC… 我们主要讲 TLS, TLS 是 transport layer security 的缩写, 为什么要做到 transport layer , 这个其实和 pseudo header 是异曲同工之妙的, 因为我们必须保证 end-to-end 的安全, 这个当然就包括端口的认证, 而不是单验证 IP 地址!

TLS 实现类似于 TCP 三次握手, TLS 同样需要握手而决定一些元信息, 包括密钥, session id 等信息传授, 所以实际的 TCP + TLS 要经三次握手之后, 再进行 TLS 握手, 最后才能传输数据, 而且数据必须是加密的 (当然终端看到的可能会是明文). 所以为什么fiddler 还能抓 https?  https 过 fiddler 会让浏览器显示没有认证? 就是因为fiddler 配置的时候会往操作系统装一个证书, 就把自己变成 CA 了, 然后系统开启代理之后, 浏览器请求获取网站证书(公钥)进行 tls/ssl 认证的时候, fiddler 直接拦截, 并且返回自己的证书, 这样之后的加密全都委托到 fiddler上来了. 当然装了证书到操作系统之后可以拦截涉及系统直接通过底层 tls 的api联网的包, 但是浏览器的不行, 因为浏览器自己实际内置了证书, 直接就提示不安全访问了… 那么科网为什么能保留安全认证呢?这也很简单,,,因为科网又不抓包….他直接全部请求转发, 不涉及偷证书行为.


全四层总结

暂时留空, 先看前面的前二层总结我觉得我说得很好了.

后面的还有 TCP/IP 的具体协议上怎么处理差错流控和拥塞的内容,主要做在这两篇笔记里。TCP拥塞控制及其缺点 与 基于UDP应用层自定义可靠有连接协议_我说我谁呢 --CSDN博客https://blog.csdn.net/u010180372/article/details/119792353

传输层协议《TCP/IP详解 卷1:协议》学习笔记_我说我谁呢 --CSDN博客https://blog.csdn.net/u010180372/article/details/120379381

从无到有构建计算机网络相关推荐

  1. 构建计算机网络的难点,2017中国石油大学继续教育计算机网络基础答案难点.docx...

    2017中国石油大学继续教育计算机网络基础答案难点 计算机网络基础单项选择题1.?在路由器的特权EXEC模式发出cd nvram:命令,然后发出dir命令有什么作用?(3 分)A.清除NVRAM的内容 ...

  2. 从无到有构建Angular2 后台管理系统的前端架构

    该项目很久已不做维护,谢谢大家的支持 最近公司的项目需求,需要设计一套后台管理系统的前端框架,我使用了Angular-cli构建Angualr2的模板,并按照需求,添加了ng2-charts/ng2- ...

  3. 计算机网络技术实践教学条件,【网络技术论文】计算机网络技术专业实践教学体系的构建(共4644字)...

    摘要:随着科学技术以及互联网的不断发展,社会对于网络型技术人才的需求标准也在发生着变化,并对网络技术专业人员的综合素质提出了更高的要求.这就要求对于计算机网络技术专业在人才培养方面要进行全面的改革,从 ...

  4. 计算机网络中的拓扑结构教案,计算机网络拓扑结构教案

    <计算机网络拓扑结构教案>由会员分享,可在线阅读,更多相关<计算机网络拓扑结构教案(6页珍藏版)>请在人人文库网上搜索. 1.计算机网络技术基础课题网络拓扑结构教学要求知识目标 ...

  5. 计算机强化课程计算机网络,大学计算机网络技术课程教学改革

    [摘要]在课程体系建设上,要将计算机网络技术课程理论内容与实践应用相结合,在高校应与学生的未来职业生涯建立必然联系.在计算机网络教学理念上,不断开拓思路,合理调整课程体系结构,从而实现课程改革的创新. ...

  6. 计算机网络与影视多媒体技术 南京理工大学,计算机网络多媒体数学库和课件结构设计-计算机仿真论文-计算机论文(8页)-原创力文档...

    计算机网络多媒体数学库和课件结构设计-计算机仿真论文-计算机论文 --文章均为WORD文档,下载后可直接编辑使用亦可打印-- 摘要:随着互联网时代的来临,计算机技术被广泛应用于各行各业.教育信息的改革 ...

  7. 用ACL构建防火墙体系

    用ACL构建防火墙体系 随着Internet/Intranet的飞速发展,全国各企事业单位都在建设局域网并连入互联网,但信息网络安全一直是我们关心的问题,所以本文提出了在路由器下通过访问控制列表(AC ...

  8. 计算机网络在实践中的应用,计算机网络技术及在实践中的应用

    摘 要隨着社会的快速发展,计算机网络技术也得到迅猛发展,计算机网络技术已经广泛应用于人们的生活和工作中.如今,计算机网络技术已经趋向成熟,应用范围也在不断扩大.计算机网络技术实际上是以下几种技术的结合 ...

  9. 计算机网络技术主要课程阐述,计算机网络技术专业实训课程体系研究

    计算机网络技术专业实训课程体系研究 本文关键词:实训,课程体系,计算机网络技术,研究,专业 计算机网络技术专业实训课程体系研究 本文简介:摘要:实践教学本身就在职业教育中发挥着重要的作用.只有不断地加 ...

  10. 计算机网络浅谈,浅谈计算机网络的重要性

    浅谈计算机网络的重要性 摘要:当现代社会逐渐变为具有高度的相互依赖的巨大网络时,我们所生活的世界无法不变成一个被计算机网络紧密联结起来的世界.计算机网络从技术角度来说,是作为一种布局,将经有关联但相距 ...

最新文章

  1. 求单独出现的数,冒泡排序优化,strncpy的优化
  2. Windows 下连接mysql工具NavicatForMysql
  3. error: Upgrade DB using Essex release first.
  4. scala maven plugin
  5. 华为语音解锁设置_华为手机备忘录的秘密功能
  6. C/C++的64位整型
  7. Eclipse 快捷键 查看方法在那里被调用~
  8. Ionic2 分享(微信分享+QQ分享+复制到剪贴板+微博分享)
  9. 南自以太网103规约
  10. Android期末项目2048小游戏
  11. [置顶] iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创, 多图]
  12. python人脸比对算法_用Python实现一个简单的——人脸相似度对比
  13. 怎么把ipad中超大文件传输到电脑
  14. HTML 后台管理页面布局
  15. java验证用户名和密码_java验证用户名和密码详解
  16. 什么是html5页面ui,H5页面UI设计和APP设计有什么区别?
  17. 兜儿.生活(三)之《太阳照常升起》杜兜儿版
  18. php安全新闻早八点-高级持续渗透-第一季关于后门
  19. LIKE语句通配符:%|_|[]
  20. 财报前瞻 | 互联网告别粗放经营,精耕行业价值成腾讯音乐年报看点

热门文章

  1. Enterprise Architect(EA)画UML之用例图,敲详细讲解+实战举例
  2. stm8s + si4463 寄存器配置
  3. 工程结算的23个问题及技巧
  4. win10建立符号链接
  5. VS2015使用FDDB数据库检查人脸检测算法并生成ROC曲线教程
  6. 幼儿园连锁管理系统源码
  7. 2012-11-25 3 00 发喜讯,终于把S5pv210 VGA 分辨率提升到1440 x 900/1920 x 1
  8. Windows正在配置Xftp6在下面的框输入包含安装程序包“Xftp 6.msi“的文件夹的路径
  9. 百度地图、腾讯地图、高德地图经纬度转换
  10. 《上海悠悠接口自动化平台》体验地址与使用教程