计算机基础
操作系统历史:
手工操作--穿孔卡片
概述:
将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
缺点:
手工操作的慢速度和计算机的高速度
批处理系统:
加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
联机批处理系统:
自动读取磁带储存,但cpu还是空闲。作业的输入/输出由CPU来处理。成批地读入、输出。
脱机批处理系统:
增加一台不与主机直接相连而专门用于与输入/输出设备打交道的卫星机。IO脱离cpu,但cpu读取数据时还是空闲
多道程序系统:
指允许多个程序同时进入内存并允许它们交替在CPU中运行。单处理机系统中多道程序
多道批处理系统:
多个任务IO时切换,但不提供人机交互功能,一个任务运行时独占cpu
分时系统:
把cpu运行时间分成很短的时间片,按时间片轮流把cpu分配给各联机作业使用。
对用户响应的及时性,即不至于用户等待每一个命令的处理时间过长。切换任务会降低cpu效率
实时系统:
cpu实时响应,即使空闲也不会执行其他任务。一般都是单片机,PLC等
通用操作系统:
兼容多道批处理系统、分时系统、实时系统的两种或三种功能的系统
进程、线程与协程:
CPU相关知识:
并行度:
一核只能同时干一件事,能切换干很多事情是有着不同程序的执行上下文。
多级反馈队列:
设置多个就绪队列,并为各个队列赋予不同的优先级。优先级越高,时间片越短,越先执行。
程序打开的过程:
创建或双击后,处于就绪状态。cpu开始进程调度,完成后释放资源。
如果未完成,时间片到,返回就绪状态,等待下一次调度。
如果发生事件请求,释放cpu,阻塞直到事件完成,再回到就绪状态。
进程:
概述:
一个程序实例一个进程,里面包括各种资源的调用。仅是资源的合集。
进程要操作cpu,必须先创建一个线程。操作系统动态执行的基本单元。每一个进程都有它自己的地址空间。
多个线程之间共享所有的资源,进程启动时随着启动一个单线程,一般叫主线程,通过线程创建线程。
由于进程之间的数据需要各自持有一份,所以创建进程需要的非常大的开销。
进程切换:
内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化:
1. 保存处理机上下文,包括程序计数器和其他寄存器。
2. 更新PCB信息。
3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
4. 选择另一个进程执行,并更新其PCB。
5. 更新内存管理的数据结构。
6. 恢复处理机上下文。
进程的阻塞:
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达
或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。
可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),
才可能将其转为阻塞状态。当进程进入阻塞状态,是不占用CPU资源的。
阻塞:某些工作(发请求)须交给操作系统硬件来完成,将请求从用户空间拷贝到内核缓冲区,
然后由网卡发给对方的内核缓冲区,再到程序的地址空间。
通信方式:
管道:
一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有命名管道和非命名管道之分,非命名管道只能用于父子进程通讯,命名管道可用于非父子进程。
命名管道就是FIFO,一种先进先出的队列。它类似于一个管道,只允许数据的单向流动。每个FIFO都有一个名字,允许不相关的进程访问同一个FIFO,因此也成为命名管道。
速度慢,容量有限
消息队列queue:
用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。
容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
共享内存:
最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。
套接字socket:
信号:
不能传递复杂消息,只能用来同步。
孤儿进程,僵尸进程?
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
孤儿进程并不会有什么危害。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。
但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。
但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,
如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。因此,当我们寻求如何消灭系统中大量的僵死进程时,答案就是把产生大 量僵死进程的那个元凶枪毙掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。
枪毙了元凶进程之后,它产生的僵死进程就变成了孤儿进程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源,这样,这些已经僵死的孤儿进程 就能释放了。
线程:
概述:
操作系统能够进行运算调度的最小单位。一堆指令,进程中的实际运作单位。(60年代基本单位是进程,但开销大,改进了)
可看作cpu执行一堆指令所需的执行内容。一个线程(执行内容)包含cpu的寄存器值和栈。
栈保留着当前线程的独有变量。而代码、数据、文件等放在进程。
线程之间共享进程内的资源。
资源私有:
所属线程的栈区、程序计数器、栈指针以及函数运行使用的寄存器,以上这些信息有一个统一的名字,就是线程上下文,thread context。
在程序块开始时自动分配内存,结束时自动释放内存
向低地址扩展
分段栈:
golang中的栈会调用runtime.morestack和runtime.newstack创建一个新的栈空间,这些栈空间是不连续的,但是当前 goroutine 的多个栈空间会以双向链表的形式串联起来。
分段栈虽然能够按需为当前 goroutine 分配内存并且及时减少内存的占用。
但是它也存在一个比较大的问题:
如果当前 goroutine 的栈几乎充满,那么任意的函数调用都会触发栈的扩容,当函数返回后又会触发栈的收缩,如果在一个循环中调用函数,栈的分配和释放就会造成巨大的额外开销,这被称为热分裂问题(Hot split)。
连续栈:
每当程序的栈空间不足时,初始化一片比旧栈大两倍的新栈并将原栈中的所有值都迁移到新的栈中,新的局部变量或者函数调用就有了充足的内存空间。
资源共有:
除此之外,剩下的都是线程间共享资源。
堆区:
变量的地址,也就是指针,任何一个线程都可以访问指针指向的数据,因此堆区也是线程共享的属于进程的资源。分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。
运行时堆,用malloc创建的
堆的申请释放工作由程序员控制
由程序员分配和释放,用于存放进程运行中被动态分配的内存段
在golang中有gc实现自动释放,场景是一些大文件读取时,会动态申请的内存空间。
堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。
BBS区未初始化数据区:
全局未初始化变量
未初始化静态变量
数据区:
存放的就是所谓的被初始化后的静态变量、全局变量、常量
代码区:
编译后的可执行机器指令。存放程序的代码,即CPU执行的机器指令,并且是只读的
与进程的区别:
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存共享:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的,要想通信必须通过一个中间代理
子代的区别:
1. 子进程之间的数据不共享,对父进程的克隆。线程之间则共享数据.
2. 新线程很任意创建,子进程要想创建必须对父进程克隆所有的数据。
3. 一个线程可以操作其他的线程,进程只能子进程。
4. 对主线程操作(优先级,取消等)会影响其他线程,但父进程和子进程间没影响。
协程:
协程的适用场景:
当程序中存在大量不需要CPU的操作时(IO),适用于协程;代码级别的线程
协程和线程的主要区别:
一个是运行在内核态,一个是运行在用户态
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。
内存:
虚拟内存:
概述:
计算机系统内存管理的一种技术。对操作系统来说,虚拟内存就是一张张的对照表,P1 获取 A 内存里的数据时应该去物理内存的 A 地址找,而找 B 内存里的数据应该去物理内存的 C 地址。
通过虚拟内存机制,每个进程都以为自己占用了全部内存,进程访问内存时,操作系统都会把进程提供的虚拟内存地址转换为物理地址,再去对应的物理地址上获取数据。
通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
通过引入虚拟内存,每个进程都有自己独立的虚拟地址空间,这个空间理论上可以无限大,因为它并不要钱。一个进程同一时刻不可能所有变量数据都会访问到,只需要在访问某部分数据时,把这一块虚拟内存映射到物理内存,
其他没有实际访问过的虚拟地址空间并不会占用到物理内存,这样对物理内存的消耗就大大减少了 。
其它暂时不需要的内容交换到硬盘存储即可。
与没有使用虚拟内存技术的系统相比,使用这种技术使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。此外,虚拟内存技术可以使多个进程共享同一个运行库,并通过分割不同进程的内存空间来提高系统的安全性。
引入虚拟内存后,让内存的并发访问问题的粒度从多进程级别,降低到多线程级别。
这是更快分配内存的第一个层次。
作用:
虚拟内存不仅通过内存地址转换解决了多个进程访问内存冲突的问题,还带来更多的益处。
有助于进程进行内存管理:
内存完整性:每个进程都认为自己获取的内存是一块连续的地址。
安全:由于进程访问内存时,都要通过页表来寻址,操作系统在页表的各个项目上添加各种访问权限标识位,就可以实现内存的权限控制。
通过swap扩充内存。
Swap交换内存:
含义:
指的是一個交換分區或文件
分类:
交换分区(swap分区)和交换文件(swap文件)
作用:
主要是在內存不夠用的時候,將部分內存上的數據交換到swap空間上,以便讓系統不會因內存不夠用而導致oom或者更致命的情況出現。
实现:
有分页式、段式、段页式3种
页式调度是将逻辑和物理地址空间都分成固定大小的页。主存按页顺序编号,而每个独立编址的程序空间有自己的页号顺序,通过调度辅存中程序的各页可以离散装入主存中不同的页面位置,并可据表一一对应检索。
优点是页内零头小,页表对程序员来说是透明的,地址变换快,调入操作简单;没有外碎片,每个内碎片不超过页的大小。
缺点是各页不是程序的独立模块,不便于实现程序和数据的保护。程序全部装入内存,要求有相应的硬件支持。
页式管理的基本思想是:为了更好地利用分区存储管理中所产生的"零头"问题,允许把一个作业存放在不连续的内存块中,又可以连续运行,它允许只调入用户作业中常用部分,不常用部分不长期驻留内存,有效提高了内存的利用率。
段式调度是按程序的逻辑结构划分地址空间,段的长度是随意的,并且允许伸长,它的优点是消除了内存零头,易于实现存储保护,便于程序动态装配;缺点是调入操作复杂,会产生碎片。
把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,
然后通过地址映射机构把段式虚拟存储地址转化为内存中的实际地址。
将这两种方法结合起来便构成段页式调度。在段页式调度中把物理空间分成页,程序按模块分段,每个段再分成与物理空间页同样小的页面。段页式调度综合了段式和页式的优点。其缺点是增加了硬件成本,软件也较复杂。
大型通用计算机系统多数采用段页式调度。
Linux 系统主要采用了分页管理,但是由于 Intel 处理器的发展史,Linux 系统无法避免分段管理。
操作系统限制:
在32位操作系统中,程序能使用的最大内存是 4GB,也就是2的32次方。
内存管理:
伙伴系统:
伙伴系统是一个结合了2的方幂个分配器和空闲缓冲区合并计技术的内存分配方案, 其基本思想很简单. 内存被分成含有很多页面的大块, 每一块都是2个页面大小的方幂.
如果找不到想要的块, 一个大块会被分成两部分, 这两部分彼此就成为伙伴. 其中一半被用来分配, 而另一半则空闲. 这些块在以后分配的过程中会继续被二分直至产生一个所需大小的块.
当一个块被最终释放时, 其伙伴将被检测出来, 如果伙伴也空闲则合并两者.
内存buffer和cache:
Buffer cache缓冲区缓存
主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。
Page cache页面缓存
Page cache 主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有 read/write 操作的时候。
一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache 的内容会被改变,而 buffer cache 则可以用来将 page 标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。
堆和栈:
程序运行时,每个线程分配一个栈,每个进程分配一个堆。也就是说,栈是线程独占的,堆是线程共用的。
此外,栈创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而堆的大小是不确定的,需要的话可以不断增加。
栈:栈是一种线性的数据结构,读取规则是先进后出。栈中的数据占用的内存空间的大小是确定的,便于代码执行时的入栈、出栈操作,并由系统自动分配和自动释放内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。
栈是向低地址扩展的数据结构,是一块连续的内存的区域。
堆:堆是一种树形数据结构,读取相对复杂。堆是动态分配内存,内存大小不一,也不会自动释放。栈中的数据长度不定,且占空间比较大。便于开辟内存空间,更加方便存储。
堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
用户空间与内核空间:
概述:
操心系统将虚拟内存划分为两部分,一部分为内核空间,一部分为用户空间。
根据寻址空间来划分
用户态和系统态有什么区别:
1.内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态。因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。
2.当程序运行在0级特权级上时,就可以称之为运行在内核态。
3.运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。
4.这两种状态的主要差别是:
处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理机是可被抢占的 ;
而处于核心态执行中的进程,则能访问所有的内存空间和对象,且所占有的处理机是不允许被抢占的。
用户态到内核态的切换:
概述:
系统在运行时由用户态转到内核态,最主要方式有3种,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
分类:
1.系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。比如前例中fork()实际上就是执行了一个创建新进程的系统调用。
而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
2.异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
3.外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,
如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。。
IO模型:
背景:
文件描述符fd
一个用于表述指向文件的引用的抽象化概念。
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,
指向着内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,
内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。
但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
# 注:记录表是有序列表,包含不同文件的文件句柄(对象),有着唯一的文件描述符
# 文件描述符在内核接收数据后发生变化
#
缓存 I/O
缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,
操作系统会将 I/O 的数据缓存在文件系统的页缓存(page cache)中,
也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
# 即操作系统内核的缓冲区,减少频繁I/O操作而引起频繁的系统调用
缓存 I/O 的缺点:
数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,
这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。
事件驱动模型:
概述:
包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。
在事件驱动版本的程序中,任务交错执行,但仍然在一个单独的线程控制中。
当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。
事件循环阻塞等待,当事件到来时将它们分配给等待处理事件的回调函数。
优点:
这种方式让程序尽可能的得以执行而不需要用到额外的线程。
事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。
流程:
1.遇到IO阻塞时,注册事件(句柄)到事件循环中,继续执行其他动作;# 其他动作包括继续发请求和启动事件循环
2.事件循环正式启动后,事件循环轮询进行监听(监听涉及描述符和内核);
# 事件触发后循环轮询查找哪个事件句柄发生变化(select)或者自动触发给循环(epoll);
3.当IO阻塞完时改变\触发事件(句柄),事件循环轮询所有事件,找到后,调用相应函数;
4.执行完相应函数,再继续循环。
特点:
1.由事件的触发顺序决定处理的顺序,这一特性往往被用于保证某些过程的原子化。
2.事件驱动的程序的行为,完全受外部输入的事件控制,事件驱动的系统中,存在大量这种程序,
并以事件作为主要的通信方式。
3.事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。
4.比较典型的事件驱动的程序就是一个死循环,并以一个线程的形式存在,包括接收和处理两部分
- 按照一定的条件接收并选择一个要处理的事件
- 事件的处理过程
当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu
IO模式:
概述:
对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
所以说,当一个read操作发生时,它会经历两个阶段:
1. 等待数据准备 (Waiting for the data to be ready)(判断是否异步)
2. 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)(判断是否阻塞)
正因为这两个阶段,linux系统产生了下面五种网络模式的方案。
1.阻塞 I/O(blocking IO)
2.非阻塞 I/O(nonblocking IO)
3.I/O 多路复用(IO multiplexing)
4.信号驱动 I/O(signal driven IO)
5.异步 I/O(asynchronous IO)
1.阻塞 I/O(blocking IO)
概述:
当用户进程调用了recvfrom这个系统调用,kernel就开始了
IO的第一个阶段:准备数据
(对于网络IO来说,很多时候数据在一开始还没有到达。比如,还没有收到一个完整的UDP包。
这个时候kernel就要等待足够的数据到来)。这个过程需要等待,也就是说数据被拷贝到
操作系统内核的缓冲区中是需要一个过程的。而在用户进程这边,整个进程会被阻塞
(当然,是进程自己选择的阻塞)。
IO的第二个阶段:当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,
然后kernel返回结果,用户进程才解除block的状态,重新运行起来。
常见的阻塞形式:
网络I/O阻塞、磁盘I/O阻塞、用户输入阻塞等。
特点:
在IO执行的两个阶段都被block。
2.非阻塞 I/O(nonblocking IO)
概述:
设置socket使其变为non-blocking
当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。
从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,
于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。
特点:
用户进程需要不断的主动询问kernel数据好了没有。
当返回error时,可以try except捕捉到,然后干其他事情,过段时间再返回进行read看看有没有
缺点:
任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。
3.I/O 多路复用(IO multiplexing)
概述:
当用户进程调用了select/poll/epoll函数,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,
当任何一个socket中的数据准备好了,select就会返回。
这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
特点:
通过select,poll,epoll机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。
需要在文件描述符就绪后再次调用IO读写操作,这个读写过程是阻塞的。
与异步io的区别:
I/O 多路复用在后一步阻塞。而异步IO则都不阻塞,有信号时数据已经在程序内存准备好了。
应用:
Java Nio。
tomcat的NIO,有两个Connector(8080、8443分别对应http、https协议)
验证:
限制tomcat http-nio线程池=1(8080 connector栏,或者使用指定线程池executor="tomcatThreadPool")
验证并发请求实际串行。
场景1: sleep的method(睡眠线程不会切出),需要使用类似netty那种单独线程池避免影响主IO线程。
场景2: 计算型任务
4.信号驱动 I/O
概述:
信号驱动IO不是用循环请求询问的方式去监控数据就绪状态,而是在调用sigaction时候建立一个SIGIO的信号联系,
当内核数据准备好之后再通过SIGIO信号通知线程数据准备好后的可读状态,当线程收到可读状态的信号后,此时再向内核发起recvfrom读取数据的请求,
因为信号驱动IO的模型下应用线程在发出信号监控后即可返回,不会阻塞
5.异步 I/O(asynchronous IO)
背景:
不管是IO复用还是信号驱动,1.等待数据可以读取。2.发送recevform请求读取数据。
概述:
用户进程发起read操作之后,立刻就可以开始去做其它的事。
而另一方面,从kernel的角度,当它收到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。
然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。
真正异步需调用操作系统接口,完成数据检测、内核准备等工作
特点:
通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
无需再次进行读写系统调用,它的实现就会负责内核空间到用户空间的数据拷贝,并通知(内核通知应用程序,属于被动通知)应用程序数据就绪。
Select、Poll、Epoll模型:
Select:
概述:
监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。创建3个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。
当select函数返回后,将之前传入的fd_set拷贝传出到用户态并返回就绪的文件描述符总数。可以通过遍历fdset,来找到就绪的描述符。
描述符的复制给内核,以及描述符的线性扫描,导致开销与描述符的多少有关。
触发模式:
水平触发
优点:
良好跨平台支持
缺点:
打开的socket数量有限,与打开的最多文件数相同,默认1024
Poll:
概述:
它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。
返回后,之前传入的fd数组拷贝传出用户态并返回就绪的文件描述符总数。遍历。
将传入的struct pollfd结构体数组拷贝到内核中进行监听。
触发模式:
水平触发。
适合场景:
一般不用,过渡阶段
Epoll:
概述:
1.执行epoll_create会在内核的高速cache区中建立一颗红黑树以及就绪链表(该链表存储已经就绪的文件描述符)。
2.接着用户执行的epoll_ctl函数添加文件描述符会在红黑树上增加相应的结点,并注册了回调函数。
3.采用基于事件的就绪通知方式,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,检测到某文件描述符可读or可写时会调用回调函数,该回调函数将文件描述符放在就绪链表中,进程调用epoll_wait()时便得到通知。
4.epoll_wait只用观察就绪链表中有无数据即可,最后将链表的数据返回给数组并返回就绪的数量。内核将就绪的文件描述符放在传入的数组中,所以只用遍历依次处理即可。这里返回的文件描述符是通过mmap让内核和用户空间共享同一块内存实现传递的,减少了不必要的拷贝。
底层结构:
int epoll_create(int size) 创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大,当创建好epoll句柄后,它就会占用一个fd值,
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 函数是对指定描述符fd执行op操作。
epfd:是epoll_create()的返回值。
op:表示op操作,用三个宏来表示:添加EPOLL_CTL_ADD,删除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD。分别添加、删除和修改对fd的监听事件。
fd:是需要监听的fd(文件描述符)
epoll_event:是告诉内核需要监听什么事
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); 等待epfd上的io事件,最多返回maxevents个事件。
参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,
这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间
触发模式:
epoll可以同时支持水平触发和边缘触发
适合场景:
虽然epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
三者区别:
1.select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
2.poll的实现和select非常相似,poll没有最大文件描述符数量的限制。原因是它是基于链表来存储的.而select是fd_set数据结构是一个有大小的,相当与一个定长所数组。
3.select & poll在unix系统上都有,epoll只在linux上。
4.文件描述符是否拷贝,还是直接维护
触发方式:
水平触发(level trigger,LT):
概述:
如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知.允许在任意时刻重复检测IO的状态,没有必要每次描述符就绪后尽可能多的执行IO。select,poll就属于水平触发.
触发的时机:
对于读操作,只要缓冲内容不为空,LT模式返回读就绪。
对于写操作,只要缓冲区还不满,LT模式会返回写就绪。
缺点:有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率。
优点:
编程更符合用户直觉,业务层逻辑更简单。
缺点:
LT通知用户后fd还在就绪链表中,随着fd的增多,就绪链表越大。
适合场景:
LT常用于redis
应用较少,一般用于连接请求较少及客户端发送的数据量较少的服务器,可一次性接收所有数据。(数据量大时每次都会返回,不适合)
若使用边沿触发,会多调用一次accept/read等来判断数据是否为空。
关于写就绪的事件:
当我们写的数据包过大时,一次写不完,要多次才能写完或者每次socket写都写一个很小的数据包时,每次写都会被epoll检测到,因此长期关注socket写事件会无故cpu消耗过大甚至导致cpu跑满,所以在水平触发模式下我们一般不关注socket可写事件而是通过直接调用socket write或者send api函数来写socket。(不用等到就绪)
边缘触发(edge trigger,ET):
概述:
如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通知后要尽可能的执行IO操作,因为如果在一次通知中没有执行完IO,
那么就需要等到下一次新的IO活动到来才能获取到就绪的描述符。
信号驱动式IO就属于边缘触发.
触发的时机:
对于读操作
当缓冲区由不可读变为可读的时候,即缓冲区由空变为不空的时候。
当有新数据到达时,即缓冲区中的待读数据变多的时候。
当缓冲区有数据可读,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLIN事件时。
对于写操作
当缓冲区由不可写变为可写时。
当有旧数据被发送走,即缓冲区中的内容变少的时候。
当缓冲区有空间可写,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLOUT事件时。
优点:
每次内核只会通知一次,大大减少了内核资源的浪费,提高效率。
缺点:
不能保证数据的完整。不能及时的取出所有的数据。容易漏数据不安全。
适合场景:
处理大数据的场景。(只用触发一次epoll_wait,就可以读取缓冲区的所有数据。需要搭配非阻塞IO)
边沿触发(EPOLLET)+非阻塞IO:
工作模式为:
epoll_wait触发一次,在while(1)循环内非阻塞IO读取数据,直到缓冲区数据为空(保证了数据的完整性),内核才会继续调用epoll_wait等待事件发生。
优缺点如下:
优点:每次epoll_wait只用触发一次,就可以读取缓冲区的所有数据,工作效率高,大大提升了服务器性能;
缺点:数据量很小时,至少需要调用两次非阻塞IO函数,而边沿触发只用调用一次。
ET常用于nginx。
计算机网络:
因特网:
概述:
互联了数十亿设备(主机或端系统)的网络。为应用程序提供服务的基础设施。
端系统通过通信链路和分组交换机连接到一起。
端系统通过因特网服务提供商(ISP)接入因特网。
分组交换机:
常见路由器、链路层交换机。
因特网服务提供商(ISP):
概述:
每个ISP自身就是一个由多台分组交换机和多段通信链路组成的网络。
因特网就是将端系统彼此互联,因此为端系统提供接入的ISP也必须互联。
较低层的ISP通过国家的、国际的较高层ISP(如Level 3 Communications.AT&T、Sprint和NTT)互联起来。较高层ISP是由通过高速光纤链路互联的高速路由器组成的。
作用:
各ISP为端系统提供了各种不同类型的网络接入,也为内容提供者提供因特网接入服务,将Web站点和视频服务器直接连入因特网。
协议:
背景:
端系统、分组交换机和其他因特网部件都要运行一系列协议(protocol),这些协议控制因特网中信息的接收和发送。
常见TCP和IP协议。
定义:
定义了在两个或多个通信实体之间交换的报文的格式和顺 序,以及报文发送和/或接收一条报文或其他事件所采取的动作。
网络协议
套接字接口:
与因特网相连的端系统提供了一个套接字接口( socket interface),该接口规定了运行 在一个端系统上的程序请求因特网基础设施向运行在另一个端系统上的特定目的地程序交 付数据的方式。
因特网套接字接口是一套发送程序必须遵循的规则集合,因此因特网能够将数据交付给目的地。
网络边缘:
概述:
端系统即我们日常使用的计算机、智能手机和其他设备。
接入网:
指将端系统物理连接到其边缘路由器(edge router)的网络。边缘路由器是端系统到任何其他 远程端系统的路径上的第一台路由器。
1.家庭接入:
DSL数字用户线:
每个用户的DSL调制解调器使用现有的电话线(即双绞铜线)与位于电话公司的计算机网络和因特网本地中心局(CO)中的数字用户线接入复用器(DSLAM)交换数据。
家庭的DSL调制解 调器得到数字数据后将其转换为高频音,以通过电话线传输给本地中心局;来自许多家庭的模拟信号在DSLAM处被转换回数字形式。
家庭电话线同时承载了数据和传统的电话信号,它们用不同的频率进行编码。
适合位于本地中心局的5~10英里
电缆:
利用了有线电视公司现有的有线电视基础设施。电缆因特网接入需要特殊的调制解调器,这种调制解调器称为电缆调制解调器(cable modem)
电缆因特网接入的一个重要特征是共享广播媒体(带宽)。需要一个分布式多路访问协议来协调传输和避免碰撞。
FTTH:
光纤到户。从本地中心局直接到家庭提供了一条光纤路径。
从本地中心局到每户设置一根光纤
从中心局岀来的每根光纤实际上由许多家庭共享,直到相对接近这些家庭的位置,该光纤才分成每户一根光纤
拨号:
使用传统电话线的拨号接入与DSL基于相同的模式:家庭的调制解调器经过电话线连接到ISP的调制解调器。
卫星:
使用卫星链路
2.企业(和家庭)接入:
以太网:
以太网用户使用双绞铜线与一台以太网交换机相连
WiFi
3.广域无线接入:
3G:
通过蜂窝网提供商运营的基站来发送和接收分组。
LTE:
LTE (长期演进“Long-Term Evolution”的缩写,被评为 最差首字母缩写词年度奖候选者)来源于3G技术,它能够取得超过10Mbps的速率。
物理媒体:
概述:
网络接入技术使用的物理媒体。
物理媒体的例子包括双绞铜线、同轴电缆、多模光纤缆、陆地无线电频谱和卫星无线电频谱。
物理媒体分成两种类型:导引型媒体(guided media)和非导引型媒体(unguided media)
对于导引型媒体,电波沿着固体媒体前行,如光缆、双绞铜线或同轴电缆。
对于非导引型媒体,电波在空气或外层空间中传播,例如在无线局域网或数字卫星频道中。
双绞铜线:
由两根绝缘的铜线组成,每根大约lmm粗,以规则的螺旋状排列着。这两根线被绞合起来,以减少邻近类似的双绞线的电气干扰。
同轴电缆:
与双绞线类似,同轴电缆由两个铜导体组成,但是这两个导体是同心的而不是并行的。借助于这种结构及特殊的绝缘体和保护层,同轴电缆能够达到较高的数据传输速率。
光纤:
光纤是一种细而柔软的、能够导引光脉冲的媒体,每个脉冲表示一个比特。
一根光纤能够支持极高的比特速率,高达数十甚至数百Gbps。它们不受电磁干扰,长达100km的光缆信号衰减极低,并且很难窃听。
陆地无线电信道:
能够大致划分为三类:
一类运行在很短距离(如1米或2米,蓝牙设备);另一类运行在局域,通常跨越数十到几百米(wifi);第三类运行在广域,跨越数万米(蜂窝接入技术)
卫星无线电信道:
通信中常使用两类卫星:同步卫星(geostationary satellite)和近地轨道(Low-Earth Orbiting, LEO)卫星。
网络核心:
分组交换:
概述:
为了从源端系统向目的端系统发送一个报文,源将长报文划分为较小的数据块,称之为分组(packet)。
在源和目的地之间,每个分组都通过通信链路和分组交换机(packet switch )传送。
交换机主要有两类:路由器(router)和链路层交换机(link-layer* switch)。
分组以等于该链路最大传输速率的速度传输通过通信链路。
存储转发传输:
在交换机能够开始向输岀链路传输该分组的第一个比特之前,必须接收到整个分组。仅当路由器已经接收完了该分组的所有比特后,它才能开始向出链路传输(即“转 发”)该分组。
延迟大概为L/R。
排队时延和分组丢失:
对于每条相连的链路,该分组交换机具有一个输出缓存(output buffer,也称为输出队列(output queue)),它用于存储路由器准备发往 那条链路的分组。
时延取决于网络的拥塞程度。
转发表:
每台路由器具有一个转发表(forwarding table),用于将目的地址(或目的地址的一部分)映射成为输岀链路。
当某分 组到达一台路由器时,路由器检查该地址,并用这个目的地址搜索其转发表,以发现适当的出链路。路由器则将分组导向该出链路。
路由选择协议:
协议负责自动地设置这些转发表,一个路由选择协议可以决定从每台路由器到每个目的地的最短路径,并使用这些最短路径结果来配置路由器中的转发表。
电路交换:
概述:
通过网络链路和交换机移动数据有两种基本方法:电路交换(circuit switching)和分组交换(packet switching)。
在电路交换网络中,在端系统间通信会话期间,预留了端系统间沿路径通信所需要的 资源(缓存,链路传输速率)。
在分组交换网络中,这些资源则不是预留的;会话的报文 按需使用这些资源,其后果可能是不得不等待(即排队)接入通信线路。
电路交换网络中的复用:
链路中的电路是通过频分复用(Frequency-Division Multiplexing, FDM )或时分复用(Time-Division Multiplexing, TDM)来实现的。
在连接期间链路为每条连接专用一个频段。
缺点是独享。
分组交换与电路交换的对比:
分组交换差不多总是提供了与电路交换相同的性能,并且允许在用户数量是其3倍时情况也是如此。
空闲情况下,分组交换能给单个用户提供更大的链路速率。
网络的网络:
概述:
ISP自身必须互联。如何设计互联?
网络结构1:
用单一的全球传输ISP互联所有接入ISP,向每个连接的接入ISP收费.
网络结构2:
由数十万接ISP和多个全球传输1SP组成。能够根据价格和服务因素在多个竞争的全球传输提供商之间进行选择。
网络结构3:
不仅有多个竞争的第一层ISP,而且在一个区域可能有多个竞争的区域ISP。
第一层1SP不向任何人付费,因为它们位于该等级结构的顶部。每个接入ISP向其连接的区域ISP支付费用,并且每个区域ISP向它连接的第一层ISP支付费用。
网络结构4:
由接入ISP、区域ISP、第一层ISP、PoP、多宿、对等和1XP组成。
任何ISP (除了第一层ISP)可以选择多宿(multi-home),即可以与 两个或更多提供商ISP连接。
位于相同等级结构层次的邻近一对ISP能够对等(peer),它们之间的所有流量经直接连接而不是通过上游的中间ISP传输.
第三方公司 能够创建一个因特网交换点(Internet Exchange Point, TXP) , IXF是一个汇合点,多个ISP 能够在这里一起对等。
网络结构5:
在网络结构4的基础上,增加了内容提供商网络,比如谷歌,通过与较低层 ISP对等(无结算),尝试“绕过”因特网的较高层,采用的方式可以是直接与它们连接,或者在IXP处与它们连接。
分组交换网中的时延、丢包和吞吐量:
时延:
概述:
分组从一台主机(源)出发,通过一系列路由器传输,在另一台主机计算机网络和因特网(目的地)中结束它的历程。
当分组从一个节点(主机或路由器)沿着这条路径到后继节点(主机或路由器),该分组在沿途的每个节点经受了几种不同类型的时延。
这些时延最为重要的是节点处理时延(nodal processing delay) 、排队时延(queuing delay)、传输时延 (transmission delay)和传播时延(propagation delay),
这些时延总体累加起来是节点总时延(tolal nodal delay)。
时延的类型:
处理时延:
检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分。
排队时延:
在队列中,当分组在链路上等待传输时,它经受排队时延。
一个特定分组的排队时延长 度将取决于先期到达的正在排队等待向链路传输的分组数量。如果该队列是空的,并且当前 没有其他分组正在传输,则该分组的排队时延为0。
另一方面,如果流量很大,并且许多其他分组也在等待传输,该排队时延将很长。
传输时延:
将所有分组的比特推向链路(即传输,或者说发射)所需要的时间。
用L比特表示该分组的长度,用R bps (即b/s)表示从路由器A到路由器B的链路传输速率。传输时延是L/R。
传播时延:
一旦一个比特被推向链路,该比特需要向路由器B传播。从该链路的起点到路由器B 传播所需要的时间是传播时延。
传输时延和传播时延的比较:
传输时延是路由器推出分组所需要的时间,它是分组长度和链路传输速率的函 数,而与两台路由器之间的距离无关。
另一方面,传播时延是一个比特从一台路由器传播 到另一台路由器所需要的时间,它是两台路由器之间距离的函数,而与分组长度或链路传 输速率无关。
排队时延:
随着流量强度接近于1,平均排队时延迅速增加。
丢包:
到达的分组将发现一个满的队列。由于没有地方存储这个分组,路由器将丢弃(drop)该分组,即该分组将 会丢失(lost)。
端到端时延:
Traceroute:
当用户指定一个目的主机名字时,源主机中的该程序朝着目的地发送多个特殊的分组。当这些分组向着目的地传送时,它们通过一系列路由器。
当路由器接收到这些特殊分组之一时,它向源回送一个短报文。该短报文包括路由器的名字和地址。
当目的地接收到,也会向源返回一个报文。
以这种方式,源能够重建分组从源到目的地所采用的路由,并且该源能够确定到所有中间路由器的往返时延(包括传输时延、传播时延、路由器处理时延和排队时延)。
端系统、应用程序和其他时延:
除了处理时延、传输时延和传播时延,端系统中还有其他一些重要时延。比如媒体分组化时延、协议时延。
计算机网络中的吞吐量:
当没有其他干扰流量时,其吞吐量能够近似为沿着源和目的地之间路径的最小传输速率。
如果许多其他的数据流也通过这条链路流动,一条具有高传输速率的链 路仍然可能成为文件传输的瓶颈链路。
协议层次及其服务模型:
分层的体系结构:
协议分层:
各层的所有协议被称为协议栈(protocol stack)。
因特网的协议栈由5个层次组成:物理层、链路层、网络层、运输层和应用层。
OSI 7层模型:
物理层:将该帧中的一个个比特从一个节点移动到下一个节点。协议仍然是链路相关的,并且进一步与该链路(例如,双绞铜线、单模光纤)的实际传输媒体相关。
数据链路层:链路层沿着路径将帧传递给下一个节点。协议包含以太网、WiFi和电缆接入网的DOCSIS协议。
网络层:传输数据报。协议包括网际协议IP、决定路由的路由选择协议。
传输层:在应用程序端点之间传送应用层报文。定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP UDP。传输的是报文段。
会话层:建立、管理、终止会话。
表示层:数据的编码、解码、加解密、压解缩
应用层:协议HTTP FTP TFTP SMTP SNMP DNS Telnet HTTPS POP3 DHCP,传输报文。
封装:
在每一层,一个分组都会被该层封装,具有两种类型的字段:首部字段和有效载荷字段(payload field)。有效载荷通常是来自上一层的分组。
网络攻击:
病毒感染
拒绝服务攻击:
弱点攻击
带宽洪泛
连接洪泛
嗅探分组
对嗅探到的分组进行离线分析,就能得出敏感信息。
伪装
IP哄骗
应用层:
应用层协议原理:
网络应用程序体系结构:
客户-服务器体系结构
对等(P2P)体系结构
进程通信:
客户和服务器进程
进程与计算机网络之间的接口(套接字)
进程寻址
可供应用程序使用的运输服务:
可靠数据传输、吞吐量、定时和安全性。
因特网提供的运输服务:
UDP和TCP
应用层协议:
HTTP\SMTP
HTTP协议:
概述:
一套超文本传输的协议。
一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态。
特点:
无连接:
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
每次访问图片都需要建立一次 TCP 连接就显得很低效。后来,Keep-Alive 被提出用来解决这效率低的问题。
Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。
客户端和服务器之间的 HTTP 连接就会被保持,不会断开(超过 Keep-Alive 规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。
无状态:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能改变这个结果。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。
非持续连接和持续连接:
HTTP报文格式
请求报文详解:
格式:
包含请求行、请求头、空行、请求体 四个部分。
请求行:
格式:
请求方式 资源路径 协议/版本
如:POST /web01/login.html HTTP/1.1
请求方式:协议规定7种,常用两种:GET和POST
请求头:
描述了客户端向服务器发送请求时使用的编码,以及发送内容的长度,referer,等等。
Content-Type\User-Agent\Host\Referer\Cookie
常见请求头
Referer浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链
Cookie 与会话有关技术,用于存放浏览器缓存的cookie信息。
User-Agent浏览器通知服务器,客户端浏览器与操作系统相关信息
请求体:
HTTP响应报文
状态行
首部行
实体体
cookie:
概述:
用户与服务器的交互。
Web缓存:
概述:
Web缓存器可以大大减少对客户请 求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与Web缓存器之 间的瓶颈带宽时更是如此
Web缓存器能够大大减少一个机构的接入链路到因特网的通信量。
常见内容分发网络(Content Distribution Network, CDN), Web缓存器
条件GET方法:
请求报文使用GET方法;并且请求报文中包含一个"If-Modified-Since:"首部行
http请求流程:
1.URL解析,域名通过DNS查询解析 -->
2.发起TCP的3次握手 -->
3.建立TCP连接后发起http请求 -->
应用层:发送 HTTP 请求
传输层:TCP 传输报文
网络层:IP协议
链路层:以太网协议,根据以太网协议将数据分为以“帧”为单位的数据包,每一帧分为两个部分:标头:数据包的发送者、接受者、数据类型。数据:数据包具体内容
4.服务器响应http请求,浏览器得到html代码 -->
5.浏览器边解析html代码,边请求html代码中的资源(如js、css、图片等)(多线程) --> 遇到js会阻塞,直到下载完成并执行成功
6.浏览器对页面进行渲染呈现给用户
html\css\javascripts渲染执行
HTTP状态码:
1、(信息类):表示接收到请求并且继续处理
100——(继续)客户必须继续发出请求
101——(切换协议)客户要求服务器根据请求转换HTTP协议版本
2、(响应成功):表示动作被成功接收、理解和接受
200——(成功)表明该请求被成功地完成,所请求的资源发送回客户端
201——(已创建)请求成功并且服务器创建了新的资源。
202——(已接受)服务器已接受请求,但尚未处理。
203——(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源。
204——(无内容) 服务器成功处理了请求,但没有返回任何内容。
205——(重置内容)服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——(部分内容)服务器已经完成了部分用户的GET请求
3、(重定向类):为了完成指定的动作,必须接受进一步处理
300——(多种选择) 请求的资源可在多处得到
301——(永久移动) 本网页被永久性转移到另一个URL
302——(临时移动)请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
303——(查看其他位置)建议客户访问其他URL或访问方式
304——(未修改)自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
305——(使用代理)请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——(临时重定向)申明请求的资源临时性删除
4、(客户端错误类):请求包含错误语法或不能正确执行
400——(错误请求)客户端请求有语法错误,不能被服务器所理解
401——(未授权)请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
402——保留有效ChargeTo头响应
403——(禁止)禁止访问,服务器收到请求,但是拒绝提供服务
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问:IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
404——(未找到)一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL
405——(方法禁用)用户在Request-Line字段定义的方法不允许
406——(不接受)根据用户发送的Accept拖,请求资源不可访问
407——(需要代理授权)类似401,用户必须首先在代理服务器上得到授权
408——(请求超时)客户端没有在用户指定的饿时间内完成请求
409——(冲突)对当前资源状态,请求不能完成
410——(已删除)服务器上不再有此资源且无进一步的参考地址
411——(需要有效长度) 服务器拒绝用户定义的Content-Length属性请求
412——(未满足前提条件) 一个或多个请求头字段在当前请求中错误
413——(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414——(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415——(不支持的媒体类型) 请求的格式不受请求页面的支持。
416——(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417——(未满足期望值) 服务器未满足"期望"请求标头字段的要求.
5、(服务端错误类):服务器不能正确执行一个正确的请求
HTTP 500 - (服务器内部错误)服务器遇到错误,无法完成请求
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
HTTP 501 - 未实现
HTTP 502 - 网关错误
HTTP 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
HTTP 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
HTTP 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
常见问题:
1.http协议是基于是tcp还是udp,为什么?
HTTP是无状态的协议,即可以基于TCP也可以基于UDP,不过大部分实现都是基于TCP的。使用TCP,不用考虑数据包乱序,丢失这些问题,实现起来更简单,高效。
如果数据的内容不大(<65536),而且容忍数据丢失,可以在udp包中使用http的协议格式来封装数据。具体的实例可以参考 upnp协议。
2.一个TCP连接可以对应几个HTTP请求?
在HTTP/1.0中,一个服务器在发送完一个HTTP响应后,会断开TCP链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。
HTTP/1.1 就把Connection: Keep-Alive头写进标准,并且默认开启持久连接,除非请求中写明 Connection: close,那么浏览器和服务器之间是会维持一段时间的 TCP 连接,不会一个请求结束就断掉。
3.一个TCP连接中HTTP请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?
HTTP2中由于 Multiplexing多路传输特性 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。
升级:
管线化->多路复用
为何?
http请求是一个报文,多个报文发送给服务器nginx,nginx分开多个进行转发,最终函数调用。
4.浏览器对同一Host建立TCP连接到数量有没有限制?
Chrome 最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。
5.get和post的区别:
浏览器的GET和POST的区别:
(1)作用不同。GET 用于获取资源,POST 用于更新资源;
(2)携带数据的方式不同。GET 一般将数据已参数的形式放到 URL 中,虽然 HTTP 标准并未对 URL 长度做限制,但是浏览器在实现时,一般会对 URL 的长度做限制,所以携带的数据有限;POST 将数据放到 Body 中,无长度限制;
(3)安全性不同。GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息;
(4)幂等性不同。GET 对访问的数据没有副作用,具有幂等性。POST 用于更新操作往往是有副作用的,不幂等。因为幂等性的差别,GET 产生的 URL 地址可以保存为书签,而 POST 不可以。GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
后台接口中的 GET 和 POST 的区别:
在后台接口调用中,我们可以利用 HTTP 协议进行通信,此时 GET/POST 不光能用在前端和后端的交互中,还能用在后端各个子服务的调用中。当用HTTP实现接口发送请求时,就没有浏览器中那么多限制了,只要是符合 HTTP 格式的就可以发送。
所以该应用场景下,GET 与 POST 除了语义上区别,在作用上并无区别,GET 可以使用 body 协议数据用于更新远端资源,POST 也可以把数据放到 URL 参数中用于获取远端资源,这完全取决于被调接口的具体实现。
结论:
GET和POST方法没有实质区别,只是报文格式不同。
误区:
POST 方法比 GET 方法安全?除了https都是不安全的
GET 方法的长度限制是怎么回事?HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。
POST 方法会产生两个 TCP 数据包?HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,header 和 body 分开发送是部分浏览器或框架的请求方法
HTTPS协议:
概述:
HTTPS 相比 HTTP最大的不同就是多了一层 SSL (Secure Sockets Layer 安全套接层)或 TLS (Transport Layer Security 安全传输层协议)。
SSL 已经逐渐被 TLS 取代
http需要解决的问题:
如果Server服务器给Client客户端的消息是密文的,只有服务器和客户端才能读懂,就可以保证数据的保密性。
那么,问题来了,服务器把数据加密后,客户端如何读懂这些数据呢?这时服务器必须要把加密的密钥告诉客户端,客户端才能利用对称密钥解开密文的内容。
服务器如果将这个对称密钥以明文的方式给客户端,还是会被中间人截获,中间人也会知道对称密钥,依然无法保证通信的保密性。
但是,如果服务器以密文的方式将对称密钥发给客户端,客户端又如何解开这个密文,得到其中的对称密钥呢?
答案是非对称加解密。
对称加密算法的优缺点:
优点:
计算量小、加密速度快、加密效率高。
缺点:
交易双方都使用同样密钥,安全性得不到保证;
每次使用对称加密算法时,都需要使用其他人不知道的惟一密钥,这会使得发收信息双方所拥有的钥匙数量呈几何级数增长,密钥管理成为负担。
非对称加解密:
缺点:
CPU计算资源消耗非常大。非对称加密算法对加密内容的长度有限制,不能超过公钥长度。
所以非对称加解密(极端消耗CPU资源)目前只能用来作对称密钥交换或者CA签名,不适合用来做应用层内容传输的加解密。
流程:
1.客户端发起连接
2.服务器发送公钥给客户端
3.客户端利用公钥加密对称密钥,发送给服务器(握手完成)
4.服务器利用对称密钥传输数据给客户端
两个密钥的区别:
这里的密钥,指的是非对称加解密的密钥,是用于TLS握手阶段的; 对称密钥,指的是对称加解密的密钥,是用于后续传输数据加解密的。
在非对称加解密算法里,公钥加密的数据,有且只有唯一的私钥才能够解密,
服务器只要把公钥发给客户端,客户端就可以用这个公钥来加密进行数据传输的对称密钥。
客户端利用公钥将对称密钥发给服务器时,即使中间人截取了信息,也无法解密,因为私钥只部署在服务器,其他任何人都没有私钥,因此,只有服务器才能够解密。
存在问题(中间人劫持):
中间人在收到服务器发送给客户端的公钥后,并没有发给客户端,而是中间人将伪造公钥发给客户端。
之后,客户端把对称密钥用这个“伪造公钥”加密后,发送过程中经过了中间人,中间人就可以用自己的私钥解密数据并拿到对称密钥,
此时中间人再把对称密钥用“正确的公钥”加密发回给服务器。此时,客户端、中间人、服务器都拥有了一样的对称密钥,后续客户端和服务器的所有加密数据,
中间人都可以通过对称密钥解密出来。
解决:
为了解决此问题,我们引入了数字证书的概念。服务器首先生成公私钥,将公钥提供给相关机构(CA),CA将公钥放入数字证书并将数字证书颁布给服务器,
此时服务器就不是简单的把公钥给客户端,而是给客户端一个数字证书,数字证书中加入了一些数字签名的机制,保证了数字证书一定是服务器给客户端的。
中间人发送的伪造证书,不能够获得CA的认证,此时,客户端和服务器就知道通信被劫持了。
数字证书 + 非对称加解密:
概述:
数字证书由公钥、证书主体、数字签名等内容组成。由服务器将自己私钥对应的公钥发给CA机构,然后CA机构生成数字证书。
数字证书作用:
1、身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站。
2、分发公钥。每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。
3、验证证书合法性。客户端接收到数字证书后,会对证书合法性进行验证。只有验证通过后的证书,才能够进行后续通信过程。
流程:
1.客户端发起ssl/TLS通信,发送client random字符串。
2.服务端返回数字证书和server random字符串。
3.客户端验证数字证书(通过本机的CA的公钥(根证书)),并从数字证书获取公钥,并用公钥加密随机字符串premaster secret给服务端。
客户端和服务器双方使用相同的算法,并使用client random、server random和premaster secret生成相同的对称密钥,用于对称加密。
4.客户端发送经过对称密钥key加密的finished信号
5.服务端发送经过对称密钥key加密的finished信号(客户端验证解密,握手完成,双方基于对称加密通信)
session ticket:
为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念,每一次对话都有一个编号(session ID)。
如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的“对话密钥”,而不必重新生成一把。
session ID通过加密传输,就算被劫持了,不使用对称密钥进行加密发送,还是劫持不了(黑客不知道对称密钥)
session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。
所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。
后续建立新的https会话,就可以利用 session ID 或者 session Tickets , 对称秘钥可以再次使用,从而免去了 https 公私钥交换、CA认证等等过程,
极大地缩短 https 会话连接时间。
双向认证:
概述:
客户端和服务器端都需要验证对方的身份,在建立Https连接的过程中,握手的流程比单向认证多了几步。
单向认证的过程,客户端从服务器端下载服务器端公钥证书进行验证,然后建立安全通信通道。
双向通信流程,客户端除了需要从服务器端下载服务器的公钥证书进行验证外,还需要把客户端的公钥证书上传到服务器端给服务器端进行验证,
等双方都认证通过了,才开始建立安全通信通道进行数据传输。
流程:
1.客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端;
2.服务器端将本机的公钥证书(server.crt)发送给客户端;
3.客户端读取公钥证书(server.crt),取出了服务端公钥;
4.客户端将客户端公钥证书(client.crt)发送给服务器端;
5.服务器端使用根证书(root.crt)解密客户端公钥证书,拿到客户端公钥;
6.客户端发送自己支持的加密方案给服务器端;
7.服务器端根据自己和客户端的能力,选择一个双方都能接受的加密方案,使用客户端的公钥加密后发送给客户端;
8.客户端使用自己的私钥解密加密方案,生成一个随机数R,使用服务器公钥加密后传给服务器端;
9.服务端用自己的私钥去解密这个密文,得到了密钥R
10.服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。
适合场景:
安全级别较高的场景,拥有合法证书的客户端才能正常访问业务。
websocket协议:
WebSocket和HTTP一样都是基于TCP的应用层协议。
因特网中的电子邮件:
组成:
用户代理(user agent):用户代理允许用户阅读、回复、转发、保存和撰写报文。
邮件服务器(mail server):邮件代理向其邮件服务器发送邮件,此时邮件放在邮件服务器的外出报文队列中。
简单邮件传输 协议(Simple Mail Transfer Protocol, SMTP):使用TCP可靠数据传输服务
流程:
1.用户代理写邮件
2.邮件代理向其邮件服务器发送邮件,此时邮件放在邮件服务器的外出报文队列中。
3.用户代理在其邮件服务器的邮箱中取得该报文。
SMTP协议:
SMTP用来将邮件从发送方的邮件 服务器传输到接收方的邮件服务器;
SMTP也用来将邮件从发送方的用户代理传送到发送 方的邮件服务器。
如POP3这样的邮件访问协议用来将邮件从接收方的邮件服务器传送到 接收方的用户代理。
pop3:
邮件访问协议,只能拉取到本地
IMAP:
HTTP:
用户代理就是普通的浏览器
DNS:
协议概述:
一个由分层的DNS服务器实现的分布式数据库,一个使得主机能够查询分布式数据库的应用层协议。
DNS 服务器通常是运行 BIND ( Berkeley Internet Name Domain)软件[BIND 2012 ]的 UNIX机器。DNS协议运行在UDP之上,使用53号端口。
域名解析:
为了使在internet上机器的标识更加适合人们使用,网络主机通常被分配IP地址的同时还分配了一个名称
域名解析就是域名到IP地址的转换过程,在浏览器上输入网站域名时,会去请求DNS服务器获取该域名对应的IP地址,再去访问改地址。
作用:
主机别名
邮件服务器别名
负载分配
架构:
根DNS服务器:
有400多个根名字服务器遍及全世界。这些根名字服务器由13 个不同的组织管理。根名字服务器的全部清单连同管理它们的组织及其中找到。根名字服务器提供TLD服务器的IP地址。
多个顶级域(Top・Level Domain, TLD) DNS服务器:
对于每个顶级域(如com、org、net、edu和gov)和所有 家的顶级域(如uk、fr、ca和jp),都有TLD服务器(或服务器集群)。
多个权威DNS服务器
流程:
1.主机首先向它的本地 DNS服务器发送一个DNS查询报文。该查询报文含有被转换的主机名。
2.本地DNS服务器将该 报文转发到根DNS服务器。该根DNS服务 器注意到其edu前缀并向本地DNS服务器返回负责edu的TLD的IP地址列表。
3.该本地DNS服务器则再次向这些TLD服务器之一发送查询报文。
4.该TLD服务器注意到edu前缀,并用权威DNS服务器的IP地址进行响应。
还可能查询中间的某个DNS服务器,才能知道用于该主机的权威DNS服务器。
5.最后,本地DNS服务器直接向指定IP重发查询报文。
DNS缓存:
每当本地DNS服务器dns. nyu. edu从 某个DNS服务器接收到一个回答,它能够 缓存包含在该回答中的任何信息。
DNS记录和报文:
资源记录RR:
(Name, Valuer, Type, TTL)
如果Type = A,则Name是主机名,Value是该主机名对应的IP地址。因此,一条类型为A的资源记录提供了标准的主机名到IP地址的映射。例如(Tayl. bar. foo. com, 145. 37.93. 126, A)就是一条类型 A 记录。
如果Type = NS,则Name是个域(如foo. com),而Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。这个记录用于沿着查询链来路由DNS查询。例如(fgcom, cins.foo.com, NS)就是一条类型为NS的记录。
如果Type二CNAME,则Value是别名为Name的主机对应的规范主机名。该记录能够向査询的主机提供一个主机名对应的规范主机名,例如(foo.com, relay 1. bar. foo. com, CNAME)就是一条 CNAME 类型的记录。
如果Type = MX,则Value是个别名为Name的邮件服务器的规范主机名。举例来 说,(foo.com, mail. bar. fo<). com, MX)就是一条MX记录。MX记录允许邮件服务器主机名具有简单的别名。值得注意的是,通过使用MX记录,一个公司的邮件服务器和其他服务器(如它的Web服务器)可以使用相同的别名。为了获得邮 件服务器的规范主机名,DNS客户应当请求一条MX记录;而为了获得其他服务器的规范主机名,DNS客户应当请求CNAME记录。
如果一台DNS服务器是用于某特定主机名的权威DNS服务器,那么该DNS服务器会有一条包含用于该主机名的类型A记录(即使该DNS服务器不是其权威DNS服务器,它也可能在缓存中包含有一条类型A记录)。
如果服务器不是用于某主机名的权威服务器, 那么该服务器将包含一条类型NS记录,该记录对应于包含主机名的域;它还将包括一条类型A记录,该记录提供了在NS记录的Value字段中的DNS服务器的IP地址。
在DNS数据库中插入记录:
因特网名字和地址分配机构(Internet Corporation for Assigned Names and Numbers, ICANN)向各种注册登记机构授权。在http://www.intemic.net上可以找到授权的注册登记机构的列表。
当你向某些注册登记机构注册域名networkutopia.com时,需要向该机构提供你的基本和辅助权威DNS服务器的名字和IP地址。
假定该名字和1P地址是dnsl.networkutopia.com 和 dns2.networkutopia.com 及 212.212.212.1 和 212.212.212.2O,对这两个权威 DNS 服务器 的每一个,该注册登记机构确保将一个类型NS和一个类型A的记录输入TLD com服务器。特别是对于用于networkutopia.com的基本权威服务器,该注册登记机构将下列两条资源记录插入该DNS系统中:
(networkutopia.com, dnsl.networkutopia.com, NS)
(dnsl.networkutopia.com, 212.212.212.1r A)
DNS攻击:
分布式拒绝服务(DDoS)带宽洪泛攻,根服务器或者顶级域名服务器
中间人攻击
P2P协议:
概述:
对等方除了是比特的消费者外还是它们的重新分发者。
BitTorrent:
参与一个特定文件分发的所有对等方的集合被称为一个洪流(torrent)。在一个洪流 中的对等方彼此下载等长度的文件块(chu磁),典型的块长度为256KBO当一个对等方首 次加入一个洪流时,它没有块。随着时间的流逝,它累积了越来越多的块。当它下载块 时,也为其他对等方上载了多个块。一旦某对等方获得了整个文件,它也许(自私地)离 开洪流,或(大公无私地)留在该洪流中并继续向其他对等方上载块。同时,任何对等方 可能在任何时候仅具有块的子集就离开该洪流,并在以后重新加入该洪流中。
每个洪流具有一个基础设施节点,称为追踪器(tracker)。当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中。以这种方式,追踪器跟踪参与在洪流中的对等方。一个给定的洪流可能在任何时刻具有数以百计或数以千计的对等方。
当一个新的对等方Alice加入该洪流时,追踪器随机地从参与对等方 的集合中选择对等方的一个子集(为了具体起见,设有50个对等方),并将这50个对等 方的IP地址发送给Aliceo Alice持有对等方的这张列表,试图与该列表上的所有对等方创 建并行的TCP连接。我们称所有这样与Alice成功地创建一个TCP连接的对等方为“邻近 对等方”。
在任何给定的时间,每个对等方将具有来自该文件的块的子集,并且不同的对等方具 有不同的子集。Alice周期性地(经TCP连接)询问每个邻近对等方它们所具有的块列表。 如果Alice具有4个不同的邻居,她将获得厶个块列表。有了这个信息,Alice将对她当前还没有的块发出请求(仍通过TCP连接)。
最稀缺优:
针对她没有的块在她的邻居中决定 最稀缺的块(最稀缺的块就是那些在她的邻居中副本数量最少的块),并首先请求那些最 稀缺的块。这样,最稀缺块得到更为迅速的重新分发,其目标是(大致地)均衡每个块在洪流中的副本数量。
机灵的对换算法:
Alice根据当前能够以最高速率向她提供数据的邻居,给出其优先权。特别是,Alice对于她的每个邻居都持续地测量接收到比特的速率,并确定以最高速率流入的4个邻居。每过10秒,她重新计算该速率并可能修改这4个对等方的集合。用BitTorrent术语来说,这4 个对等方被称为疏通(unchoked)。重要的是,每过30秒,她也要随机地选择另外一个邻居并向其发送块。我们将这个被随机选择的对等方称为Bob。
每过30秒Alice将随机地选择一名新的对换伴侣并开始与那位伴侣进行对换。
随机选择邻居也允许新的对等方得到块,因此它们能够具有对换的东西。
分布式散列表:
其数据库记录分布在一个P2P系统的多个对等方上。
视频流和内容分发网:
因特网视频:
视频是一系列的图像, 通常以一种恒定的速率(如每秒24或30张图像)来展现。一幅未压缩、数字编码的图像由像素阵列组成,其中每个像素是由一些比特编码来表示亮度和颜色。
HTTP流:
当用户要看该视频时,客户与服务器创建一个TCP连接并发送对该URL的HTTP GET请求。
在客户一侧,字节被收集在客户应用缓存中。一旦该 缓存中的字节数量超过预先设定的门限,客户应用程序就开始播放,特别是,流式视频应 用程序周期性地从客户应用程序缓存中抓取帧,对这些帧解压缩并且在用户屏幕上展现。 因此,流式视频应用接收到视频就进行播放,同时缓存该视频后面部分的帧。
经HTTP的动态适应性流:
在DASH中,视频编码为几个不同的版本,其中每个版本 具有不同的比特率,对应于不同的质量水平。’客户动态地请求来自不同版本且长度为几秒 的视频段数据块。
如果端到端带宽在会话过程中改变的话,DASH允许客户适应可用 带宽。
使用DASH后,每个视频版本存储在HTTP服务器中,每个版本都有一个不同的 URL。HTTP服务器也有一个告示文件(manifest file),为每个版本提供了一个URL及其 比特率。
客户首先请求该告示文件并且得知各种各样的版本。然后客户通过在HTTP GET 请求报文中对每块指定一个URL和一个字节范围,一次选择一块。在下载块的同时,客 户也测量接收带宽并运行一个速率决定算法来选择下次请求的块。
内容分发网CDN:
CDN管理分布在多个地理位置 上的服务器,在它的服务器中存储视频(和其他类型的Web内容,包括文档、图片和音频)的副本,并且所有试图将每个用户请求定向到一个将提供最好的用户体验的CDN位置。
服务器安置原则:
深入:
该原则是通过在遍及全球的接入ISP中部署服 务器集群来深入到ISP的接入网中。其目标是靠近端用户,通过减少端用户和CDN集群之间(内容从这里收到)链路和路由器的数量,从而改善了用户感受的时延和吞吐量。因为这种高度分布式设计,维护和管理集群的任务成为挑战。
邀请做客:
这些CDN通常将它们的集群放置在因特网交换点(IXP)。与深入设计原则相比,邀请做客设计通常产生较低的维护和管理开销,可能 以对端用户的较高时延和较低吞吐量为代价。
截获和重定向请求:
大多数CDN利用DNS来截获和重定向请求;服务所在权威DNS服务器并不返回一个IP地址,而是返回一个KingCDN域的主机名,进入CDN专用DNS基础设施。
集群选择策略:
地理上最为邻近:
适合场景有限,因为就网络路径的长度或跳数而言,地理最邻近的集群可能并不是最近的集群。
此外,种所有基于DNS的方法都内在具有的问题是,某些端用户配置使用位于远地的LDNS
实时测量延迟和丢包:
CDN能够让它的每个 集群周期性地向位于全世界的所有LDNS发送探测分组(例如,ping报文或DNS请求)。 这种方法的一个缺点是许多LDNS被配置为不会响应这些探测。
负载平衡:
为了平衡流经集群的负载,有时客户被定向(经DNS)到一个更远的集群。
p2p交付视频:
当一个对等方要看一个视频时,它联系一个跟踪器,以发现在系统中具有该视频副本的其他对等方。这个请求的对等方则并行地从具有该文件的其他对等方请求该视频的块。
然而,不同于使用BitTorrent下载,请求被优先地给予那些即将播放的块,以确保连续播放。
混合CDN-P2P流式系统:
在大多数场合,客户请求来自CDN服务器的内容的开头部分,并且并行地从对等方请求内容。当P2P总流量满足视频播放时,该客户将从CDN停止流并仅从对等方获得流。
但如果P2P流的流量不充分,该客户重新启动CDN连接并且返回 到混合CDN-P2P流模式。
以这种方式,看看能够确保短启动时延,与此同时最小地依赖成本高的基础设施服务器和带宽。
Socket套接字:
概述:
socket通常也称作"套接字",是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
一个文件,双向管道文件(server通过文件描述符进行文件的通信)。
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
协议分类:
UDP:
一个UDP套接字是由一个二元组全面标识的,该二元组包含一个目的IP地址和一个目的端口号。
TCP:
TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来标识的。
运输层:
协议概述:
TCP和UDP运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信。
而网络层提供了主机之间的逻辑通信。
Port端口:
概述:
端口具体是指接口电路中的一些寄存器,这些寄存器分别用来存放数据信息,控制信息和状态信息,相应的㐰分别称为数据端口、控制端口和状态端口。
电脑运行的系统程序,运行到这些端口是,会查看端口是否打开或者关闭,如果关闭,系统继续进行,如果打开,则接受外部数据并执行。
范围:
tcp层使用到的,范围是0-65535,2的16次方。
端口的唯一性的标识不是端口号,而是端口号和协议名称的组合。
分配方式:
端口号有两种基本分配方式:第一种叫全局分配这是一种集中分配方式,由一个公认权威的中央机构根据用户需要进行统一分配,并将结果公布于众,
第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回本地唯一的端口号,进程再通过合适的系统调用,将自己和该端口连接起来(binding,绑定)。
参考pid分配:
除了ID外,它还包括跟这个ID相关的task列表、引用计数器和一个可以方便查找的hashed list。
问题:
服务器响应请求accept后,是新起一个端口号吗?
不是,需要TCP四元组才能确定一个TCP连接,源端口和目标端口都是必须的,也不会新开端口。
socket.accept()调用之后会返回一个新的“通讯描述符”(socket),而以前的那个socket仍然会重新调用accept()方法继续去监听,充当“监听描述符”。
UDP:
特性:
运输层的多路复用 (transport-layer multiplexing)与多路分解(demultiplexing)
在其报文段首部中包括差错检查字段而提供完整性检查
适合场景:
实时性更高的场景,不希望过分地延迟报文段的传送(没有拥塞控制,分组首部开销少,无需建立连接)
实现可靠性传输:
可通过在应用程序自身中建立可靠性机制来完成,例如,可通过增加确认与重传机制来实现
报文段结构:
源端口 目标端口
长度 检验和
报文
检验和:
概述:
检验和用于确定当UDP报文段从源到 达目的地移动时,其中的比特是否发生了改变(例如,由于链路中的噪声干扰或者存储在 路由器中时引入问题)。
为什么提供?不能保证源和目的之间的所有链路都提供差错检测。在系统设计中被称颂的端到端原则(end-encl principle)
原理:
发送方的UDP对报文段中的所有16比特字的和进行反码运算, 求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文段中的检验和字段。
如何实现可靠?
丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制
乱序 –> 加上一个数据包序列号SEQ
针对数据完整性 –> 加上一个16或者32位的CRC验证字段,如果直接发一个超过mtu大小的包,就会在协议层被分片。
如果有一个分片在传输中出错了即校验不正确(这是较容易发生的),整个传输的udp包就被丢弃。
所以一般按照1k多大小发送
每个UDP socket都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。
当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报。
TCP:
特性:
可靠数据传输(流量控制、序号、确认和定时器)
拥塞控制
相关术语:
MTU最大传输单元
MSS最大报文段长度
格式:
源端口号 目的端口号
序号 确认号
首部长度 保留未使用 CWR ECE URG ACK PSH RST SYN FTN 接收窗口
因特网检验和 紧急数据指针
选项
数据
组成:
接收窗口:
16比特的接收窗口字段(receive window field),该字段用于流量控制。我们很快 就会看到,该字段用于指示接收方愿意接受的字节数量。
首部长度:
4比特的首部长度字段(header length field),该字段指示了以32比特的字为单位 的TCP首部长度。由于TCP选项字段的原因,TCP首部的长度是可变的。(通常, 选项字段为空,所以TCP首部的典型长度是20字节。)
选项:
可选与变长的选项字段(options field),该字段用于发送方与接收方协商最大报文 段长度(MSS)时,或在高速网络环境下用作窗口调节因子时使用。首部字段中还定义了一个时间戳选项。
标志:
6比特的标志字段(flag field) o ACK比特用于指示确认字段中的值是有效的,即该报文段包括一个对已被成功接收报文段的确认。RST、SYN和FIN比特用于连接建立和拆除,我们将在本节后面讨论该问题。在明确拥塞通告中使用了CWR和ECE比特,如3.7.2节中讨论的那样。当PSH比特被置位时,就指示接收方应立即将数据交给上层。最后,URG比特用来指示报文段里存在着被发送端的上层实体置为“紧急”的数据。紧急数据的最后一个字节由16比特的紧急数据指针字段(urgent data pointer field)指出。当紧急数据存在并给出指向紧急数据尾指针的时候,TCP必须通知接收端的上层实体。
序号:
报文段首字节的字节流编号。
确认号:
期望从主机收到的下一字节的序号
可靠性传输:
如何估计超时时间?
在任意时刻,仅为一个已发送的但目前尚未被确认的报文段估计Samp-leRTT,从而产生一个接近每个RTT的新SampleRTT值。
EstimatedRTT的新值是由以前的EstimatedRTT值与SampleRTT新值加权组合而成的。这个加权平均对最近的样本赋予的权值要大于对旧样本赋予的权值。(指数加权移动平均)
设置和管理重传超时间隔:
假设已经给岀了 EstimatedRTT值和DevRTT值,那么TCP超时间隔应该用什么值呢? 很明显,超时间隔应该大于等于EstimatedRTT,否则,将造成不必要的重传。
但是超时间 隔也不应该比EstimatedRTT大太多,否则当报文段丢失时,TCP不能很快地重传该报文段,导致数据传输时延大。
Timeoutinterval = EstinMrtedRTT + 4 • DevRTT
推荐的初始Timeoutinterval值为]1秒,同时,当出现超时后,Timeoutlnterval值将加倍,以免即将被确认的后继报文段过早出现超时。然而,只要收到报文段并更 新EstimatedRTT,就使用上述公式再次计算Timeoutinterval。
超时重传的几种情况:
1.ACK丢失,接收方丢失重复收到的分组,并重传ACK。
2.多个ACK丢失,只会重传第一个报文段,并重启定时器,在新的超时发生以前,第二个报文段不会被重传。
3.多个ACK丢失序号小的,那么发送方知道接收方已经全部收到了,不会重传。
超时间隔加倍:
超时间隔在每次重传后会呈指数型增长。然而,每当定时器在另两个事件(即收到上层应用的数据和收到ACK)中的任意一个启动时,Timeoutinterval由最近的EstimatedRTT值与DevRTT值推算得到。
快速重传:
如果一个报文段丢失,就很可能引 起许多一个接一个的冗余ACK。
如果TCP发送方接收到对相同数据的3个冗余ACK,它 把这当作一种指示,说明跟在这个已被确认过3次的报文段之后的报文段已经丢失。
选择确认:
允许TCP接收方有选择地确认 失序报文段,而不是累积地确认最后一个正确接收的有序报文段。
流量控制:
机制:
TCP通过让发送方维护一个称为接收窗口(receive window)的变量来提供流量控制。
主机B通过把当前的rwnd值(缓存可用空间)放入它发给主机A的报文段接收窗口字段中,通知主机A它在该连接的缓存中还有多少可用空间。
主机A轮流跟踪两个变量,LastByteSent和LastByteAcked,就是主机A发送到连接中但未 被确认的数据量。通过将未确认的数据量控制在值rwnd以内,就可以保证主机A不会使主机B的接收缓存溢出。
存在问题:
如果接收方不发送送带有rwrul新值的新报文段,主机A被阻塞而不能再发送数据!
解决:
当主机B的接收窗口为0时,主机A继续发送只有一个字节数据的报文段。这些报文段将会被接收方确认。
三次握手:
前提:
服务器端在调用listen之后(不阻塞),内核会建立两个队列,SYN队列和ACCEPT队列,其中ACCPET队列的长度由backlog指定。
服务器端在调用accpet之后,将阻塞,等待ACCPT队列有元素。
流程:
第一步:
客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不包含应用层数据。但是在报文段的首部中的一个标志位(即SYN比特)被置为1。因此,这个特殊报文段被称为SYN报文段。另外,客户会随机地选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN 报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。
客户TCP进入了 SYN_SENT状态。
第二步:
一旦包含TCP SYN报文段的IP数据报到达服务器主机(假定它的确到达T!),服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。(在完成三次握手的第三步之前分配这些缓存和变量,使得TCP易于受到称为SYN洪泛的拒绝服务攻击。)这个允许连接的报文段也不包含应用层数据。但是,在报文段的首部却包含3个重要的信息。首先,SYN比特被置为1。其次,该TCP报文段 首部的确认号字段被置为client_isn + 1。最后,服务器选择自己的初始序号 (serverjsn),并将其放置到TCP报文段首部的序号字段中。这个允许连接的报文 段实际上表明了:“我收到了你发起建立连接的SYN分组,该分组带有初始序号client-isn。我同意建立该连接。我自己的初始序号是server_isn。该允许连接的报文段被称为SYNACK报文段(SYNACK segment)。
server进入SYN-RCVD状态。
第三步:
在收到SYNACK报文段后,客户也要给该连接分配缓存和变量。客户主 机则向服务器发送另外一个报文段;这最后一个报文段对服务器的允许连接的报文段进行了确认(该客户通过将值server_isn + 1放置到TCP报文段首部的确认字 段中来完成此项工作)。因为连接已经建立了,所以该SYN比特被置为0。该三次 握手的第三个阶段可以在报文段负载中携带客户到服务器的数据。
Client进入ESTABLISHED状态。
server收到ACK后,会把请求方从SYN队列中移出,放至ACCEPT队列中。而accept函数也等到了自己的资源,从阻塞中唤醒,从ACCEPT队列中取出请求方,重新建立一个新的sockfd,并返回。
sockfd进入ESTABLISHED状态
此时client可以发送数据到接收方缓冲区,sockfd通过IO多路复用被唤醒,进行接收。挥手也是和对应的sockfd进行通信。
SYN洪泛攻击:
现象:
如果某客户不发送ACK来完成该三次握手的第三步,最终(通常在一分 多钟之后)服务器将终止该半开连接并回收资源。
攻击者发送大量的TCP SYN报文段,而不完成第三次握手 的步骤。随着这种SYN报文段纷至沓来,服务器不断为这些半开连接分配资源(但从未使用),导致服务器的连接资源被消耗殆尽。
解决:
SYN cookie
当服务器接收到一个SYN报文段时,此服务器不会为该报文段生成一个半开连接。
生成一个初始TCP序列号,该序列号是SYN报文段的源和目的IP地址与端口号以及仅有该服务器知道的秘密数的一个复杂函数(散列函数)。
客户端第三次握手的时候,服务端再次将SYNACK报文段中的源和目的地IP地址与端口号(它们与初始的SYN中的相同)以及秘密数运行相同的散列函数。该函数的结果加1与在客户的 SYNACK中的确认(cookie)值相同的话,服务器认为该ACK对应于较早的SYN报文段,因此它是合法的。服务器则生成一个具有套接字的全开的连接。在另一方面,如果客户没有返回一个ACK报文段,则初始的SYN并没有对服务造成影响。
问题:
为什么第三次握手?
主要防止已经失效的第一次连接请求报文(网络阻塞)突然又传送到了服务器,从而产生错误。
客户端第一个「SYN」包丢了?
进入重传「SYN」包。根据《TCP/IP详解卷Ⅰ:协议》中的描述,此时会尝试三次,间隔时间分别是 5.8s、24s、48s,三次时间大约是 76s 左右,而大多数伯克利系统将建立一个新连接的最长时间,限制为 75s。
服务端收到「SYN」并回复的「SYN,ACK」包丢了?
如果这个回复的「SYN,ACK」包丢了,站在客户端的角度,会认为是最开始的那个「SYN」丢了,那么就继续重传
对服务端而言,如果发送的「SYN,ACK」包丢了,在超时时间内没有收到客户端发来的「ACK」包,也会触发重传,此时客户端处于 SYN_RCVD 状态,会依次等待 3s、6s、12s 后,重新发送「SYN,ACK」包。同时由于客户端在没有收到「SYN,ACK」时,也会进行重传,当客户端重传的「SYN」收到后,会立即重新发送「SYN,ACK」包。
最后一次ACK丢失了怎么办?
Server 端会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。超时后关闭连接,防止SYN洪泛攻击。
Client 向 server端发送数据,当服务端处于 SYN-RCVD 状态下时,接收到客户端真实发送来的数据包时,会认为连接已建立,并进入 ESTABLISHED 状态。
当客户端在 ESTABLISHED 状态下,开始发送数据包时,会携带上一个「ACK」的确认序号,所以哪怕客户端响应的「ACK」包丢了,服务端在收到这个数据包时,能够通过包内 ACK 的确认序号,正常进入 ESTABLISHED 状态。
三次握手过程中可以携带数据吗?
第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手绝对不可以携带数据
原因:
假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,然后疯狂重复发 SYN 报文的话(因为攻击者根本就不用管服务器的接收、发送能力是否正常,它就是要攻击你),这会让服务器花费很多时间、内存空间来接收这些报文。
监听的socket和accept生成的新socket如何区分?
TCP四元组:源IP、源端口号、目的IP、目的端口号。
新的socket源IP、源端口号固定,与其他的请求一样,但目标IP和目标端口号这个组合肯定会不同。
请求的数据通过物理层到达后,解包拿到TCP层报文,找到目标端口,再找到端口产生的所有连接中,符合四元组的文件fd,然后传送到缓冲区。
缓冲区是每个socket一个吗?
内核管理的每一个TCP文件描述符都是一个struct, 它记录TCP相关的信息(如序列号、当前窗口大小等等),以及一个接收缓冲区和一个写缓冲区。
缓冲区有配置的大小,所以fd的上限和内存有关系。
四次挥手:
第一次挥手:客户TCP向服务器进程发送一个特殊的TCP报文段。这个特殊的报文段让其首部中的一个标志位即FIN比特被设置为1。进入FIN_WAIT_1状态。
第二次挥手:当服务器接收到该报文段后,就向发送方回送一个确认报文段。Server进入CLOSE_WAIT状态。客户接收到后进入FIN_WAIT_2状态。
第三次挥手:服务器发送它自己的终止报文段,其FIN比特被置为1。Server进入LAST_ACK状态。
第四次挥手:客户端回复ACK后进入TIME_WAIT状态。Server收到ack后进入CLOSED状态,完成四次挥手。
注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
标志码:
位码即TCP标志码,有6种标示
SYN(synchronous建立联机)\ACK(acknowledgement 确认)\PSH(push传送)\FIN(finish结束\)RST(reset重置)\URG(urgent紧急)
Sequence number(顺序号码)\Acknowledge number(确认号码)
三次握手:
client端:发送 SYN=1 ACK=0 seq=x给Server端 closed-> SYN-SENT -> ESTAB-LISHED
Server端:答复 SYN=1 ACK=1 seq=y,ack=x+1 closed -> LISTEN -> SYN-RCVD -> ESTAB-LISHED
client端:发送 ACK=1 seq=x+1 ack=y+1
数据传输:
write():发送 seq = x+1 ACK=y+1
read():发送 ACK=x+1
四次挥手:
client端:发送 FIN=1 ACK=1 seq=x+2 ack=y+1 ESTAB-LISHED -> FIN-WAIT-1 -> FIN-WAIT-2 -> TIME-WAIT -> CLOSED
Server端:答复 ACK=x+3 seq=y+1 ESTAB-LISHED -> CLOSE-WAIT -> LAST-ACK -> CLOSED
Server端:确认 FIN=1 seq=y+1 ack=x+2
client端:发送 ACK=1 ack=y+2 seq=x
# 为什么挥手要四次:全双工,client不能发送,但还可以收,server端可能数据还没发完,先发ack,需准备好才能回复seq断开。
# 连接时由于是listen状态,ack可以和seq一起发送
问题:
服务端第一次回复的 ACK 丢了?
客户端没有收到「ACK」应答,会尝试重传之前的「FIN」请求,服务端收到后,又会再重传「ACK」。
而此时服务端已经进入 CLOSED-WAIT 状态,开始做断开连接前的准备工作。当准备好之后,会回复「FIN,ACK」,注意这个消息是携带了之前「ACK」的响应序号的。
只要这个消息没丢,客户端可以凭借「FIN,ACK」包中的响应序号,直接从 FIN-WAIT-1 状态,进入 TIME-WAIT 状态,开始长达 2MSL 的等待。
客户端收到 ACK 后,服务端跑路了?
客户端在收到「ACK」后,进入了 FIN-WAIT-2 状态,等待服务端发来的「FIN」包,而如果服务端跑路了,这个包永远都等不到。
在 TCP 协议中,是没有对这个状态的处理机制的。但是协议不管,系统来凑,操作系统会接管这个状态,例如在 Linux 下,就可以通过 tcp_fin_timeout 参数,来对这个状态设定一个超时时间。
TIME_WAIT为什么是2msl?
最后发送的ACK可能会丢失,若丢失,被动关闭连接的一方就会重发。
那么,网络中可能存在来自发起方的数据段,当这些发起方的数据段被服务端处理后又会向客户端发送响应,所以一来一回需要等待 2 倍的时间。去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。
需要处理对端可能重传的FIN报文或其它一些因网络原因而延迟的数据报文,不处理这些报文可能导致前后两个使用相同四元组的连接中的后一个连接出现异常。防止延迟的数据段被其他使用相同源地址、源端口、目的地址以及目的端口的 TCP 连接收到。
异常:
服务端因为没有收到 ACK 消息,所以仍然认为当前连接是合法的,客户端重新发送 SYN 消息请求握手时会收到服务端的 RST 消息,连接建立的过程就会被终止
客户端最后回复的 ACK 丢了,服务端怎么办?
服务端因为没有收到「ACK」的回复,会重试一段时间,直到服务端重试超时后主动断开。
客户端假设一直收到FIN,发的ACK一直到不了,那么服务器最后超时不发FIN,客户端最后2msl后断开。
或者等待新的客户端接入后,收到服务端重试的「FIN」消息后,回复「RST」消息,在收到「RST」消息后,复位服务端的状态。
为什么很多close_wait状态?
原因:
某种情况下client关闭了socket链接,但是服务器忙与读或者写(比如idea断点调试中),没有进一步发出ack信号(阻塞)。
close_wait如果多,服务器代码有问题,无法发送FIN。同时意味着fin_wait_2多。
可能的场景:
1.服务端接口耗时较长,客户端client主动(超时)断开了连接,而服务端还在阻塞(等待唤醒),此时,服务端就会出现 close_wait。
比如mysql的事务没有正确处理,例如:没有close/rollback/commit,导致连接没有释放,请求量到达一定程度后,连接池满。新请求等待可用的连接超时后,请求主动断开,但服务端还在阻塞等待可用的连接,没有发送ACK。
2.服务端代码问题,client发送FIN后,服务端没有执行close方法回复ack。
一般与底层socket开发框架有关。
可以通过类ServerSocket尝试。
影响:
通常来说,一个CLOSE_WAIT会维持至少2个小时的时间(这个时间外网服务器通常会做调整,要不然太危险了)。
close_wait的危害在于,在一个进程上打开的文件描述符超过一定数量,(在linux上默认是1024,可修改),新来的socket连接就无法建立了,因为每个socket连接也算是一个文件描述符。
linux上,每个进程,都有其自身的资源限制,比如最大可以打开的文件描述符数量。
解决:
1.通过修改一下TCP/IP的参数,来缩短这个时间:修改tcp_keepalive_*系列参数有助于解决这个问题。
2.如果是代码没有close,记得close。
3.如果是代码阻塞,尝试解决一下阻塞的地方。
HTTP keep-alive和TCP keepalive的区别?
如果在一段时间(保活时间:tcp_keepalive_time)内此连接都不活跃,开启保活功能的一端会向对端(一般客户端和服务器都有)发送一个保活探测报文。
若由于网络原因或其他原因导致,发送端无法正常收到保活探测报文的响应。那么在一定探测时间间隔(tcp_keepalive_intvl)后,将继续发送保活探测报文。
直到收到对端的响应,或者达到配置的探测循环次数上限(tcp_keepalive_probes)都没有收到对端响应,这时对端会被认为不可达,TCP连接随存在但已失效,需要将连接做中断处理。
为什么是三次握手,四次挥手?
Server端断开连接需要准备。
TIME_WAIT是服务器端的状态 or 客户端的状态?
RE:time_wait 是「主动关闭 TCP 连接」一方的状态,可能是「客服端」的,也可能是「服务器端」的
一般情况下,都是「客户端」所处的状态;「服务器端」一般设置「不主动关闭连接」
在高并发情况下,服务器端存在大量的TIME_WAIT状态的TCP连接,应该如何处理?
背景知识:
TCP的socket套接字对就是一个四元组:源IP、port和目标IP、port。
引起原因:
在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。
TIME_WAIT是主动关闭一方具有的状态,但是Nginx作为7层代理对外它是服务器而对内它是客户端,nginx要转发请求,根据tcp必须要经过三次握手,使用到一个端口号。
客户端解决:
长链接,在HTTP 请求的头部,connection 设置为 keep-alive,保持存活一段时间:现在的浏览器,一般都这么进行了。
服务端解决:
允许 time_wait 状态的 socket 被重用。
打开重复用:echo 1 /proc/sys/net/ipv4/tcp_tw_reuse,同时要确保时间戳tcp_timestamps打开,记录时间
缩减 time_wait 时间,设置为 1 MSL(即,2 mins),快速回收。
等待更少时间:echo 1 /proc/sys/net/ipv4/tcp_tw_recycle 对外服务不能打开
负载均衡来抗这些高并发的短请求。
Nginx通常会开启Keep-alive来让客户端对TCP连接进行复用,对Keep-alive最大请求数量
混淆点:
单个进程能打开的文件句柄数:ulimit -n num
2MSL和resue或者recycle会不会有冲突?
重用TIME_WAIT状态的端口以及快速回收会引发收到该相同4元组之前的重复IP报文。
解决方法:
TCP序列号,也就是Seq位置的数字。
TCP头中的序列号位有长度限制(32位),其最大值为2的32次方个,这就意味着它是循环使用的,也很容易在短时间内完成一个循环(序列号反转),在1Gbps的网络里17秒就可以完成一个循环,所以单纯的通过检查序列号不能完全实现阻挡老IP分组的数据,因为高速网络中这个循环完成的太快,而一个IP分组的最长TTL是2MSL,通常是1分钟,所以最主要还是靠时间戳。
时间戳,所以这也是为什么在开启resue和recycle的时候要求开启时间戳功能。
如果收到的报文时间戳小于最近连接的时间戳就会被丢弃
拥塞控制:
端到端拥塞控制:
概述:
网络层没有为运输层拥塞控制提供显式支持。即使网络中存在拥塞,端系统也必须通过对网络行为的观察(如分组丢失与时延)来推断之。
网络辅助的拥塞控制:
概述:
在网络辅助的拥塞控制中,路由器向发送方提供关于网络中拥塞状态的显式反馈信息。
实现方式:
1.直接反馈信息可以由网络路由器发给发送方。
2.路由器标记或更新从发送方流向接收方的分组中的某个字段来指示拥塞的产生口 一旦收到一个标记的分组后,接收方就会向发送方通知该网络拥塞指示。
TCP拥塞控制:
概述:
①慢启动;②拥塞避免; ③快速恢复。
拥塞窗口与发送窗口:
在一个发送方中未被确认的数据量不会超过cwnd与rwnd中的最小值
慢启动:
cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加1个MSS。(每当过了一个往返延迟时间RTT(Round-Trip Time),指数增长)
方式一:如果存在一个由超时指示的丢包事件,TCP发送方将cwnd设置为1并重新开始慢启动过程,同时将ssthresh置为拥塞窗口值的一半。
方式二:当检测到拥塞时ssthresh设为cwnd的值一半,当cwnd的值等于ssthresh时,结束慢启动并且TCP转移到拥塞避免模式。
方式三:如果检测到3个冗余ACK,这时TCP执行一种快速重传并进入快速恢复状态。
拥塞避免:
一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半,对于TCP发送方无论何时到达一个新的确认,就将cwnd增加一个 MSS/cwnd 字节。
例如,如果MSS是1460字节并且cwnd是14600字节,则在一个RTT内发送10个报文段。每个到达ACK(假定每个报文段一个ACK)增加1/10MSS的拥塞窗口长度,因此在收到对所有10个报文段的确认后,拥塞窗口的值将增加了一个MSS。
当出现超时时,TCP的拥塞避免算法行为相同。与慢启动的情况一样,cwnd的值被设置为1个MSS,
当丢包事件出现时,ssthresh的值被更新为cwnd值的一半,进入快速恢复状态。
快速恢复:
Reno算法新引入的一个阶段,在将丢失的分段重传后,启动一个超时定时器,并等待该丢失分段包的分段确认后,再进入拥塞避免阶段。如果仍然超时,则回到慢启动阶段。
在进入快速恢复之前,cwnd和ssthresh已经被更改为原有cwnd的一半。
流程:
1.重传重复确认对应序列号的分段,并设置定时器等待该重发分段包的分段确认包
2.确认后,再进入拥塞控制阶段。如果仍然超时,则回到慢启动阶段。
TCP New Reno算法:
对TCP Reno中快速恢复阶段的重传进行改善的一种改进算法。
在Reno的快速恢复中,一旦出现3次重复确认,TCP发送方会重发重复确认对应序列号的分段并设置定时器等待该重发分段包的分段确认包,当该分段确认包收到后,就立即退出快速恢复阶段,进入拥塞控制阶段。
问题:
但如果某个导致重复确认的分段包到遇到重复确认期间所发送的分段包存在多个丢失的话,则这些丢失只能等待超时重发,并且导致拥塞窗口多次进入拥塞控制阶段而多次下降。比如发送的分段8,9,10到达后,返回4分段的重复确认,5,6,7分段只会重传5分段。
解决:
一旦出现3次重复确认,TCP发送方先记下3次重复确认时已发送但未确认的分段的最大序列号,然后重发重复确认对应序列号的分段包。如果只有该重复确认的分段丢失,则接收方接收该重发分段包后,会立即返回最大序列号的分段确认包,从而完成重发;但如果重复确认期间的发送包有多个丢失,接收方在接收该重发分段后,会返回非最大序列号的分段确认包,从而发送方继续保持重发这些丢失的分段,直到最大序列号的分段确认包的返回,才退出快速恢复阶段。
性能:
New Reno在低错误率时运行效率和“选择确认”(Selective ACKnowledgement,SACK)相当,在高错误率仍优于Reno。
其他快速恢复算法的实现:
1.cwnd = cwnd + 3 MSS,加3 MSS的原因是因为收到3个重复的ACK。
2.重传DACKs指定的数据包。
3.如果再收到DACKs,那么cwnd大小增加一。(表明有其他高序号的包又到达了)
4.如果收到新的ACK,表明重传的包成功了,那么退出快速恢复算法。将cwnd(即一半的那个值)设置为ssthresh,然后进入拥塞避免算法。
公平性:
当多条连接共享一个共同的瓶颈链路时,那些具有较小RTT的连接能够在链路空 闲时更快地抢到可用带宽(即较快地打开其拥塞窗口),因而将比那些具有较大RTT的连接享用更高的吞吐量。
当一个应用使用多条并行连接时,它占用了一条拥塞链路中较大比例的带宽。
粘包:
现象:
发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
示例:
客户端不断发送单词,服务端偶尔会看到连在一起的单词。
处理时机:
如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象
如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了
原因:
每个TCP socket在内核中都有一个发送缓冲区(SO_SNDBUF )和一个接收缓冲区(SO_RCVBUF)(不同端口独立)
发送端:
MTU (Maxitum Transmission Unit,最大传输单元)是链路层对一次可以发送的最大数据的限制。
Negale 算法:
为了尽可能发送大块数据,避免网络中充斥着许多小数据块。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
注意此时还没有报文头部,只有消息体
接收方:
由于接收方用户进程不及时接收数据,从而导致粘包现象。
注意这时解开了报文,剩下了消息体
IP层为什么没有粘包?
如果消息过长,IP层会按 MTU 长度把消息分成 N 个切片,每个切片带有自身在包里的位置(offset)和同样的IP头信息。
各个切片在网络中进行传输。每个数据包切片可以在不同的路由中流转,然后在最后的终点汇合后再组装。
在接收端收到第一个切片包时会申请一块新内存,创建IP包的数据结构,等待其他切片分包数据到位。
等消息全部到位后就把整个消息包给到上层(传输层)进行处理。
IP 层从按长度切片到把切片组装成一个数据包的过程中,都只管运输,都不需要在意消息的边界和内容,都不在意消息内容了,那就不会有粘包一说了。
UDP为什么不会粘包:
不会使用块的合并优化算法,每一个消息都是独立发送的。
没有发送缓冲区,有接收缓冲区,在UDP协议的接收端,采用链式结构记录每个到达的UDP数据包,使得接收端应用程序一次只能从socket接收缓冲区中读取一个数据包。
换句话说,发送者已经发送(写入)多次,接收者必须接收(读取)多次(无论在 recv 中指定的缓冲区有多大)
udp报文头部有消息长度。
解决:
发送方:
1.关闭Negale 算法。TCP_NODELAY
2.编程设置可以不等待缓冲直接发送,降低了网络发送效率,影响应用程序的性能
接收方:
1.自定义通信协议,比如定长协议,每来一个请求后,接下来读取指定长度的内容。
2.特殊分隔符协议(开始符、结束符),如果重复了,发送端在发送时还会加入各种校验字段(校验和或者对整段完整数据进行 CRC 之后获得的数据)放在标志位后面,在接收端拿到整段数据后校验下确保它就是发送端发来的完整数据。
3.消息分为头部和消息体,头部添加Length字段,比如http的Content-Length
或者前几个字节表示消息长度
4.校验码
多路复用与多路分解:
多路分解:
运输层通过套接字交付数据给用户进程。
每个运输层报文段中具有几个字段。检查这些字段,标识出接收套接字,进而将报文段定向到该套接字。
多路复用:
在源主机从不同套接字中收集数据块,并为每个数据 块封装上首部信息(这将在以后用于分解)从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用(nmhiplexing)。
要求:
①套接字有唯一标识符;
②每个报文段有特殊字段来指示该报文段所要交付到的套接字。特殊字段是源端口号字段(source port number field )和目的端口 号字段(destination port number field)。
套接字:
每个套接字能够分配一个端口号,当报文段到达主机时,运输层检査报文段中的套接字元组,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进程。
可靠数据传输:
经完全可靠信道的可靠数据传输:
发送方和接收方是有限状态机,基于操作变迁状态。
经具有比特差错信道的可靠数据传输:
自动重传请求(Automatic Repeat reQuest, ARQ)协议。
差错检测。
接收方反馈。
重传。
发送方需要经过ACK才能传送下一个分组或者NAK继续传上一个分组,称为停等(stop-and-wait)协议。
接收方只有单一状态,当一个分组接受后,要么回答一个ACK,要么回答一个NAK。
问题:
没有考虑到ACK或NAK分组受损的可能性!
解决:
在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号(sequence mimber)放在该字段。
对于停等协议这种简单情况,1比特序号就足够了,因为它可让接收方知道发送方是否正在重传前一个发送分组(接收到的分组序号与最近收到的分组序号相同),或是一个新分组(序号变化了,用模2运算“前向”移动)。
版本1:
当接收到正常的分组时,接收方对所接收的分组发送一个肯定确认ACK 。如果收到受损的分组,则接收方将发送一个否定确认。
版本2:
如果不发送NAK,而是对上次正确接收的分组发送一个ACK,我们也能实现与NAK—样的效果。发送方接收到对同一个分组的两个ACK (即接收冗余ACK (duplicate ACK))后,就知道接收方没有正确接收到跟在被确认两次的分组后面的分组。
发送方此时必须检查接收到的ACK报文中被确认的分组序号(根据序号来决定上一次发送的分组是否被接收了(序号是否相同为1或者0),进而决定发送上一次or下一次的分组)
接收方此时必须包括由一个ACK报文所确认的分组序号(根据收到的分组是否受损,来决定是否ACK)
经具有比特差错的丢包信道的可靠数据传输:
问题:
怎样检测丢包以及发生丢包后该做些什么。
解决:
假定发送方传输一个数据分组,该分组或 者接收方对该分组的ACK发生了丢失。在这两种情况下,发送方都收不到应当到来的接 收方的响应。如果发送方愿意等待足够长的时间以便确定分组已丢失,则它只需重传该数 据分组即可。
优化:
实践中采取的方法是发送方明智地选择一个时间值,以判定可能发生了丢包(尽管不能确保)。如果在这个时间内没有收到ACK,则重传该分组。注意到如果一个分组经历了一个 特别大的时延,发送方可能会重传该分组,即使该数据分组及其ACK都没有丢失。这就 在发送方到接收方的信道中引入了冗余数据分组(duplicate data packet)的可能性。
实现:
①每次发送一个分组(包括第一次分组和重传分组)时,便启动一个定时器。
②响应定时器中断(采取适当的动作)。
可能的情况:
分组丢失,未发送给对方
丢失ACK了,接收方检测冗余,重复发送ACK1.
过早超时,Pkt还在传输,发送方重发分组,接收方会收到两个相同的分组,发送两次ACK1,
③终止定时器。
流水线可靠数据传输协议:
存在问题:
停等协议,效率不高。
简单的解决:
不以停等方式运行,允许发送方发送多 个分组而无须等待确认。
模型:
必须增加序号范围,因为每个输送中的分组(不计算重传的)必须有一个唯一的 序号,而且也许有多个在输送中的未确认报文。
协议的发送方和接收方两端也许不得不缓存多个分组。发送方最低限度应当能缓冲那些已发送但没有确认的分组。如下面讨论的那样,接收方或许也需要缓存那 些已正确接收的分组。
所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏及延时过大的分组。解决流水线的差错恢复有两种基本方法是:回退N步(Go-Back-N,GBN)和选择重传(Selective Repeat, SR)。
回退N步:
在回退A/步(GBN)协议中,允许发送方发送多个分组(当有多个分组可用时)而不需等待确认,但它也受限于在流水线中未确认的分组数不能超过某个最大允许数N。
如果我们将基序号(base)定义为最早未确认分组的序号,将下一个序号(nextseqnum)定义为最小的未使用序号(即下 一个待发分组的序号),则可将序号范围分割成4段。
[0, base - 1 ]段内的序号对应于已经发送并被确认的分组。
[base, nextseqnum - 1 ]段内对应已经发送但未被确认的分组。
[nextseqnum, base +/V - 1 ]段内的序号能用于那些要被立即发送的分组,如果有数据来自上层的话。
[base+N, ]的序号是不能使用的,直到当前流水线中未被确认的分组(特别是序号为base的分组)已得到确认为止。
滑动窗口协议:
那些已被发送但还未被确认的分组的许可序号范围[base, nextseqnum - 1 ]可以被看成是一个在序号范围内长度为"的窗口。随着协议的运行,该窗口在序号空间向前滑动。因此,N常被称为窗口长度(window size) , GBN协议也常被称为滑动窗口协议。
状态机模型:
发送方
1.进行发送时,需要判断发送窗口是否已满。如果窗口未满,则产生一个分组并将其发送,并相应地更新变量。如果窗口已满,发送方只需将数据返回给上层,隐式地指示上层该窗口已满。然后上层可能会过一会儿再试。
2.对序号为几的分组的确认采取累积确认(cumulative acknowledgment)的方式,表明接收方已正确接收到序号为n的以前且包括n 在内的所有分组。
3.仅使用一个定时器,它可被当作是最早的已发送但未被确认的分组所使用的定时器。如果收到一个ACK,但仍有已发送但未被确认的分组,则定时器被重新启 动。如果没有已发送但未被确认的分组,停止该定时器。
接收方:
如果一个序号为〃的分组被正确接收到,并且按序(即上次交付给上层的数据是序号为〃-1的分组),则接收方为分组“发送一个ACK,并将该分组中的数据部分交付到上层。在所有其他情况下,接收方丢弃该分组,并为最近按序接收的分组重新发送ACK。
缺点:
单个分组的差 错就能够引起GBN重传大量分组,许多分组根本没有必要重传。
选择重传:
通过让发送方仅重传那些它怀疑在接收方出错(即 丢失或受损)的分组而避免了不必要的重传。
接收方将确认一个正确接收的分组(窗口范围内)而不管其是否按序。失序的分组将被缓存直到 所有丢失分组(即序号更小的分组)皆被收到为止,这时才可以将一批分组按序交付给上层。
如果是滑动窗口前的分组,则ACK该分组序号。(因为对于哪些分组已经被正确接收,哪些没有,发送方和接收方并不总是能看到相同的结果)
如果是滑动窗口后的分组,丢弃。
发送方如果收到ACK,倘若该分组序号在窗口内,则将那个被确认的分组标记为已接收。如果该分组的序号等于send_base,则窗口基序号向前移动到具有最小序号的未确认分组处。如果窗口移动了并且 有序号落在窗口内的未发送分组,则发送这些分组。
窗口要求:
如果窗口长度比序号空间小1时协议无法工作。
窗口长度必须小于或等于序号空间大小的一半。
重新排序问题:
对于分组重新排序,信道可被看成基本上是在缓存分组,并在将来任意时刻自然地释放岀这些分组。由于序号可以被重新使用,那么必须小心,以免出现这样的冗余分组。
确保一个序号不被重新使用,直到发送方“确信”任何先前发送的序号为咒的分组都不再在网络中为止。通过假定一个分组在网络中的“存活”时间不会超过某个固定最大时间量来做到这一点。
总结:
检验和
定时器
序号
确认
否定确认
窗口、流水线
网络层:
服务模型:
尽力而为,传送的分组既不能保证以它们发送的顺序被接收,也不能保证它们最终交付;既不能保证端到端时延,也不能保证有最小的带宽。
架构:
数据平面:
决定到达路由器输入链路之一的数据报(即网络层的分组)如何转发到该路由器的输出链路之一。涉及传统的IP转发(其中转发基于数据报的目的地址)和通用的转发(其中可以使用数据报首 部中的几个不同域的值执行转发和其他功能)。
控制平面:
控制数据报沿着从源主机到目的主机的端到端路径中路由器之间的路由方式。路由选择算法,以及广泛用于今天因特网中的诸如OSPF和BGP等路由选择协议。
转发:
概述:
当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组移动到适当的输出链路。因此通常用硬件来实现。
转发表:
路由器检査到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法来转发分组。
路由选择算法决定了插入该路由器转发表的内容。
在一台路由器中的路由选择算法与在其他路由器中的路由选择算法通信,通过根据路由选择协议交换包含路由选择信息的路由选择报文,以计算出它的转发表的值。
流表:
匹配加动作转发表,能够使用网络层和/或链路层源和目的地址做出转发决定
路由选择:
概述:
确定分组从源到目的地所采取的端到端路径的网络范围处理过程。路由选择发生的时间尺度长得多(通常为几秒),因此通常用软件来实现。
SDN:
远程控制器计算并分发转发表。
路由器:
组成:
输入端口:
在路由器中执行终结入物理链路的物理层功能。
还要与位于入链路远端的数据链路层交互来执行数据链路层功能。
通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口。
交换结构:
交换结构将路由器的输入端口连接到它的输岀端口。这种交换结构完全包含在路由器之中,即它是一个网络路由器中的网络!
输出端口:
输出端口存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组。当一条链路是双向的时(即承载两个方向的流量),输出端口通常与该链路的输入端口成对出现在同一线路卡上。
路由选择处理器:
路由选择处理器执行控制平面功能。在传统的路由器中,它执行 路由选择协议,维护路由选择表与关联链路状态信息,并为该路由器计算转发表。
在SDN路由器中,路由选择处理器(在其他活 动中)负责与远程控制器通信,目的是接收由远程控制器计算的转发表项,并在该 路由器的输入端口安装这些表项。
概述:
路由器的输入端口、输出端口和交换结构几乎总是用硬件实现,比如考虑具有1OGbps输入链路和64字节的IP数据报,其输入端口 在另一个数据报到达前仅有51.2ns来处理数据报。这远快过软件实现的速率。
当数据平面以纳秒时间尺度运行时,路由器的控制功能以毫秒或秒时间尺度运行,这些控制功能包括执行路由选择协议、对上线或下线的连接链路进行响应、信(在SDN场合)和执行管理功能。因而这些控制平面(control plane) 件实现并在路由选择处理器(通常是一种传统的CPU)上执行。
输入端口处理和基于目的地转发:
用最长前缀匹配规则和快速查找算法,在基本常数时间内返回对该地址的转发表项的内容。
交换:
经内存交换:
经过共享系统总线一次仅能 执行一个内存读/写。
经总线交换:
经互联网络交换:
非阻塞。并发。
输出端口处理:
输出端口处理取出已经存放在输出端口内存中的分组并将其发送到输出链路上。这包括选择和取岀排队的分组进行传输,执行所需的链路层和物理层传输功能。
IP:
地址分配策略:
一台机器在一个网络内唯一的标识,分为网络地址(高位两位)和主机部分(后两位,又可分为子网和主机地址)
对于B类地址来说是这样,子网掩码是255.255.255.0
其他可能不同,如绕回的127.0.0.1
网关ip:
不同局域网之间要想通信必须通过网关
可以有多个网关地址(与多个网络相连),只有一个地址可以作为默认路由
只有绕回的设备没有网关地址,独立的网络同样也没有网关地址
网络地址转换:
公网与内网ip关系:
一个局域网里所有电脑的内网IP是互不相同的,由路由器分配,但共用一个外网IP。
每台电脑的两个IP同时存在,一个对内(路由器分配的ip),一个对外(路由器即网关上的对应的以太网接口的外网ip)。
对于发出的请求:
1.如果是目的ip是localhost,本地路由表路由到lo绕回设备,请求分发到本地,请求ip是localhost
127.0.0.1同理
2.如果是目的ip是172.31.xx.xx,本地路由表路由到 路由器(网关)或 lo绕回设备,最终回到本地,请求ip都是172.31.xx.xx
- 路由到网关,请求ip是172.31.xx.xx(本机内网ip,由路由器分配的)
- 路由到lo,请求ip是172.31.xx.xx(这个不是localhost还不能理解,还没到达路由器怎么分配,可能是ip层获取到本地ip)
3.如果目的ip是其他外网ip,路由到进出口网关,请求ip是本地外网ip
公有 IP 和私有 IP 的区别
公有地址(Public address):由 Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些 IP 地址分配给注册并向Inter NIC提出申请的组织机构,
公有 IP 全球唯一,通过它直接访问因特网(直接能上网)。
私有地址(Private address):内网地址
端口映射:
端口映射是 NAT 的一种,它将外网主机的 IP 地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该 IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。
现在市场上的家庭路由器都具备 NAT 功能,也可以实现端口映射。
TPLINK的在虚拟服务器里面,填好外网端口、内网端口、以及内网ip即可
路由器,至少有两个端口:WAN 口和 LAN 口。
WAN:接外部 IP 地址用,通常指的是出口,转发来自内部 LAN 接口的 IP 数据包,这个口的 IP 是唯一的。
LAN:接内部 IP 地址用,LAN 内部是交换机。
通用转发:
背景:
基于目的地转发的特征总结为两个步骤:查找目的IP地址(“匹配”),然后将分组发送到有特定输出端口的交换结构(“动作”)。
现在考虑一种更有意义的通用“匹配加动作”范式,其中能够对协议栈的多个首部字段进行“匹配”,这些首部字段是与不同层次的不同协议相关联的。
“动作”能够包括:
将分组转发到一个或多个输出端口(就像在基于目的地转发中一样),
跨越多个通向服务的离开接口进行负载均衡分组(就像在负载均衡中一样),
重写首部值(就像在NAT中一样),
有意识地阻挡/丢弃某个分组(就像在防火墙中一样),
为进一步处理和动作而向某个特定的服务器发送一个分组(就像在DPI —样)。
概述:
一般化的匹配加动作。
维护了流表。
流表:
首部字段值的集合
入分组将与之匹配
计数器集合(当分组与流表项匹配时更新计数器)
这些计数器可以包括已经与该表项匹配的分组数量,以及自从该表项上次更新以来的时间。
当分组匹配流表项时所采取的动作集合。
这些动作可能将分组转发到给定的输出端口,丢弃该分组、复制该分组和将它们发送到多个输岀端口,和/或重写所选的首部字段。
匹配:
字段包括入端口、源MAC、目的MAC、以太网类型、VLAN ID等。
动作:
每个流表项都有零个或多个动作列表,这些动作决定了应用于与 流表项匹配的分组的处理。如果有多个动作,它们以在表中规定的次序执行。
常见:
转发;
丢弃;
修改字段。
控制平面:
控制方法:
每路由器控制:
每台路由器中都包含转发和路由选择功能。
逻辑集中式控制:
该控制器经一种定义良好的协议与每台路由器中的一个控制代理(CA)进行交互, 以配置和管理该路由器的转发表。
路由选择算法:
概述:
目标是找岀从源到目的地间的最低开销路径。
分类1:
集中式/链路路由选择算法:
概述:
用完整的、全局性的网络知识 计算岀从源到目的地之间的最低开销路径。
该算法以所有节点之间的连通性及所有链路的开销为输入。这就要求该算法在真正开始计算以前,要以某种方式获得这些信息。
具有全局状态信息的算法常被称作链路状态算法(Link State, LS)。
设计:
实践中这是通过让每个节点向网络中所有其他节点广播链路状态分组来完成的,其中每个链路状态分组包含它所连接的链路的标识和开销。
节点广播的结果是所有节点都具有该网络的统一、完整的视图。于是每个节点都能够像其他节点一样,运行LS算法并计算出相同的最 低开销路径集合。
算法:
Dijkstra算法计算从某节点(源节点,我们称之为“)到网络中所有其他节点的最低开销路径。
振荡:
每次LS算法计算时,引导流量走向不同的路由上,导致下次再次计算时又发生变化。
解决:
让每台路由器发送链路通告的时间随机化。
分散式路由选择算法:
概述:
路由器以迭代、分布式的方式计算出最低开销路径。
没有节点拥有关于所有网络链路开销的完整信息。 相反,每个节点仅有与其直接相连链路的开销知识即可开始工作。
然后,通过迭 代计算过程以及与相邻节点的信息交换,一个节点逐渐计算出到达某目的节点或一组目的节点的最低开销路径。
这种分散式算法,通过相邻路由器之间的交互式报文交换,也许更为天然地适合那些路由器直接交互的控制平面。
每个节点维护到网络中所有其他节点的开销(距离)估计的向量,称为距离向量(Distance-Vector, DV)算法的分散式路由选择算法。
设计:
在该分布式、异步算法中,每个节点不时地向它的每个邻居发送它的距离向量副本。
当节点x从它的任何一个邻居卫接收到一个新距离向量,它保存v距离向量,然后使用Bellman-Ford方程更新它自己的距离向量。
如果节点x的距离向量因这个更新步骤而改变,节点x接下来将向它的每个邻居发送 其更新后的距离向量,这继而让所有邻居更新它们自己的距离向量。
应用:
在实践中许多类似DV的算法被用于多种路由选择协议中,包括因特网的RIP和BGP、ISO IDRP、Novell IPX和早期的ARPAnet。
链路开销改变与链路故障:
开销减少:
在t0时刻,y检测到链路开销变化(开销从4变为1),更新其距离向量,并通知其邻居这个变化,因为最低开销路径的开销已改变。
在t1时刻,z收到来自y的更新报文并更新了其距离表。它计算出到%的新最低开销(从开销5减为开销2),它向其邻居发送了它的新距离向量。
在t2时刻,y收到来自z的更新并更新其距离表。y的最低开销未变,因此y不发送任何报文给z。该算法进入静止状态。
开销增加:
在t0时刻,会形成选择环路,路由选择环路就像一个黑洞,即目的地为x的分组在儿时刻到达y或Z后,将在这两个节点之间不停地(或 直到转发表发生改变为止)来回反复。
在t1时刻,因为节点y已算出到x的新的最低开销,它在“时刻将该新距离向量通知z。
在t1后某个时间,z收到y的新距离向量,便在t2时刻通知y其新开销。
直到此时,z最低开销路径是经过它到x的直接连接。
增加毒性逆转:
如果z通过y路由选择到目的地x,则z将通告y,z到x的距离是无穷大,也就是z将向y通告D2=∞,迫使y不选择经过z到达x。
涉及3个或更多节点(而不只是两个直接相连的邻居节点)的环路将无法用毒性逆转技术检测到。
分类2:
静态路由选择算法:
路由随时间的变化非常缓慢,通常是人工进行调整(如人为手工编辑一条链路开销)。
动态路由选择算法:
随着网络流量负载或拓扑发生变化而改变路由选择路径。一个动态算法可周期性地运行或直接响应拓扑或链路开销的变化而运行。
虽然动态算法易于对网络的变化做岀反应,但也 更容易受诸如路由选择循环、路由振荡之类问题的影响。
分类3:
负载敏感算法:
链路开销会动态地变化以反映出底层链路的 当前拥塞水平。如果当前拥塞的一条链路与高开销相联系,则路由选择算法趋向于绕开该 拥塞链路来选择路由。
负载迟钝算法:
某条链路的开销不明确地反映其当前(或最近)的拥塞水平。
自治系统AS:
背景:
规模。随着路由器数目变得很大,涉及路由选择信息的通信、计算和存储的开销将高得不可实现。
管理自治。因特网是ISP的网络,其中每个ISP都有它自 己的路由器网络。
ISP通常希望按自己的意愿运行路由器(如在自己的网络中运行它所选择的某种路由选择算法),或对外部隐藏其网络的内部组织面貌。
概述:
自治系统(Autonomous System, AS)。
每个AS由一组通常处在相同管理控制下的路由器组成。通常在一个ISP中的路由器以及互联它们的链路构成一个AS。
然而,某些ISP将它们的网络划分为多个AS。特别是, 某些一级ISP在其整个网络中使用一个庞大的AS,而其他ISP则将它们的ISP拆分为数十个互联的AS。
开放最短路优先(OSPF):
概述:
OSPF是一种链路状态协议,它使用洪泛链路状态信息和Dijkstra最低开销路径算法。
因特网中自治系统内部的路由选择
特点:
安全。
多条相同开销的路径。
对单播与多播路由选择的综合支持。
支持在单个AS中的层次结构。
设置OSPF链路权值:
实现调节网络流的路由选择。
路由选择BGP:
概述:
自治系统间,ISP之间路由选择协议,称为边界网关协议(Broder Gateway Protocol, BGP),对于位于该AS外部的目的地而言。
设计:
BGP允许每个子网向因特网的其余部分通告它的存在。
一台路由器可能知道两条或更多条到特定前缀的不同路由。为了确定最好的路由,该路由器将本地运行一个BGP路由选择过程(使用它经过相邻的路由器获得的前缀可达性信息)
通告BGP路由信息:
跨越两个AS的BGP连接称为外部BGP (eBGP)连接,而在相同AS中的两台路由器之间的BGP会话称为内部BGP (iBGP)连接。
为了传播可达性信息,使用了iBGP和eBGP会话。
一个AS的输出网关路由器会向其他AS的输入网关路由器发送eBGP报文,然后AS的输入网关路由器向本AS内的所有其他路由器(包括输出网关路由器)发送iBGP报文。
确定最好的路由:
术语:
前缀及其属性称为路由(route)。
AS-PATH属性包含了通告已经通过的AS的列表。
NEXT-HOP是AS-PATH起始的路由器接口的IP地址。
热土豆路由选择:
对于路由器lb,尽可能快地将分组送出其AS(更明确地说,用可能的最低开销),而不担心其AS外部到目的地的余下部分的开销
自私的算法,即它试图减小在它自己AS中的开销,而忽略在其AS之外的端到端开销的其他部分。
路由器选择算法:
路由被指派一个本地偏好(local preference)值作为其属性之一
从余下的路由中(所有都具有相同的最高本地偏好值),将选择具有最短AS-PATH的路由。
从余下的路由中(所有都具有相同的最高本地偏好值和相同的AS-PATH长度)使用热土豆路由选择,即选择具有最靠近NEXT-HOP路由器的路由。
如果仍留下多条路由,该路由器使用BGP标识符来选择路由。
优化经验:
任何穿越某ISP主干网的流量必须是其源或目的(或两者)位于该ISP的某个客户网络中;不然的话这些流量将会免费搭车通过该ISP的网络。
应用:
因特网的AS间路由选择协议
IP任播:
在IP任播配置阶段,CDN公司为它的多台服务器指派相同的IP地址,并且使用标准的BGP从这些服务器的每台来通告该IP地址。
当某台BGP路由器收到对于该IP地址的多个路由通告,它将这些通告处理为对相同的物理位置提供不同的路径(事实上,这时这些通告对不同的物理位置是有不同路径的)。
当配置其路由选择表时,每台路由器将本地化地使用 BGP路由选择算法来挑选到该IP地址的“最好的”(例如,由AS跳计数确定的最近的)路由。
例如,如果一个BGP路由(对应于一个位置)离该路由器仅一AS跳的距离,并且所有其他BGP路由(对应于其他位置)是两AS跳和更多AS跳,则该BGP路由器将选择 把分组路由到一跳远的那个位置。
缺点:
实践中CDN通常选择不使用IP任播,因为BGP路由选择变化能够导致相同的TCP连接的不同分组到达Web服务器的不同实例。
SDN控制平面:
概述:
SDN表示了一种意义重大的网络功能的“分类”,即数据平面交换机、SDN控制器和网络控制应用程序是分离的实体,该实体可以由不同的厂商和组织机构所提供。
特征:
基于流的转发:SDN控制的交换机的分组转发工作,能够基于运输层、网络层或链 路层首部中任意数量的首部字段值进行。
数据平面与控制平面分离:
网络控制功能:位于数据平面交换机外部。
可编程的网络:使用了由SDN控制器提供的API来定义和控制网络设备中的数据平面。
SDN控制器:
通信层:SDN控制器和受控网络设备之间的通信。OpenFlow 协议
网络范围状态管理层:要求控制器具有有关网络的主机、链路、交换机和其他SDN控制设备的最新状态信息。
对于网络控制应用程序层的接口:控制器通过它的“北向”接口与网络控制应用程序交互。
OpenFlow 协议:
概述:
运行在SDN控制器和SDN控制的交换 机或其他实现OpenFlow API的设备之间,协议运行在TCP之上,使用6653的默认端口号。
报文分类:
从控制器到受控交换机流动:
配置。该报文允许控制器查询并设置交换机的配置参数。
修改状态。该报文由控制器所使用,以增加/删除或修改交换机流表中的表项,并 且设置交换机端口特性。
读状态。该报文被控制器用于从交换机的流表和端口收集统计数据和计数器值。
发送分组。该报文被控制器用于在受控交换机从特定的端口发送出一个特定的 报文。
从受控交换机到控制器流动的重要报文:
流删除。该报文通知控制器已删除一个流表项,例如由于超时,或作为收到“修改 状态”报文的结果。
端口状态。交换机用该报文向控制器通知端口状态的变化。
分组入。一个分组到达交换机端口,并且不能与任何流表项匹配,那么这个分组将被发送给控制器进行额外处理。匹配的分组也被发送给控制器,作为匹配时所采取的一个动作。“分组入”报文被用于将分组发送给控制器。
流程:
1.交换机向SDN控制器通报该链路状态的更新。
2.SDN控制器接收指示链路状态更新的0penFlow报文,并且通告链路状态管理器,由管理器更新链路状态库。
3.实现Dijkstra链路状态路由选择的网络控制应用程序先前进行了注册,当链路状态 更新时将得到通告。应用程序接收该链路状态更新的通告。
4.链路状态路由选择应用程序与链路状态管理器相互作用,以得到更新的链路状态; 它也会参考状态管理层中的其他组件。然后它计算新的最低开销路径。
5.链路状态路由选择应用则与流表管理器交互,流表管理器决定更新的流表。
6.流表管理器则使用OpenFlow协议更新位于受影响的交换机si、s2和s4的流表项, 其中si此时将经s4将分组的目的地指向s2, s2此时将经中间交换机s4开始接收来自si的分组,S此时必须转发来自si且目的地为s2的分组。
icmp协议:
概述:
互联网控制消息协议,被主机和路由器用来彼此沟通网络层的信息。在某个位置,IP路由器不能找到一条通往HTTP请求中所指定的主机的路径,该路由器就会向你的主机生成并发出一个ICMP报文以指示该错误。
ICMP通常被认为是IP的一部分,但从体系结构上讲它位于IP之上,因为ICMP报文 是承载在IP分组中的
报文内容:
ICMP报文有一个类型字段和一个编码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节(以便发送方能确定引发该差错的数据报)。
应用:
ping程序发送一个ICMP类型8编码0的报文到指定主机。看到回显(echo)请求,目的主机发回一个类型0编码0的ICMP回显回答。
源抑制报文:执行拥塞控制,即使得拥塞的路由器向一台主机发送一个ICMP源抑制报文,以强制该主 机减小其发送速率。
Traceroute:
源主机中的Traceroute向目的地主机发送一系列普通的IP数据报。这些数据报的每个携带了一个具有不可达UDP端口号的UDP报文段。
第一个数据报的TTL为1,第二个的TTL为2,第三个的TTL为3,依次类推。
该源主机也为每个数据报启动定时器。当第□个数据报到达第n台路由器时,第n台路由器观察到这个数据报的TTL正好过期。根据IP协议规则,路由器丢弃该数据报并发送一个ICMP告警报文给源主机(类型11编码0)。
该告警报文包含了路由器的名字和它 的IP地址。当该ICMP报文返回源主机时,源主机从定时器得到往返时延,从ICMP报文中得到第n台路由器的名字与IP地址。
网络管理和SNMP:
网络管理框架:
1.管理服务器是一个应用程序,通常有人的参与,并运行在网络运营中心(NOC)的集中式网络管理工作站上。管理服务器是执行网络管理活动的地方,它控制网络管理信息的收集、处理、分析和/或显示。正是在这里,发起控制网络行为的动作,人类网络管理员与网络设备打交道。
2.被管设备(nwmgecl device)device)是网络装备的一部分(包括它的软件),位于被管理的网络中。被管设备可以是一台主机、路由器、交换机、中间盒、调制解调器、温度计或其他联网的设备。
在一个被管设备中,有几个所谓被管对象。这些被管对象是被管设备中硬件的实际部分(例如,一块网络接口卡只是一 台主机或路由器的一个组件)和用于这些硬件及软件组件的配置参数(例如,像 OSPF这样的AS内部路由选择协议)。
3.一个被管设备中的每个被管对象的关联信息收集在管理信息库(Management InformationBase, MIB)中,我们将看到这些信息的值可供管理服务器所用(并且在许多场合下能够被设置)。
一个MIB对象可以是:
一个计数器,例如由于1P数据报首部差错而由路由器丢弃的IP数据报的数量,或一台主机接收到的UDP报文段的数 量;
运行在一台DNS服务器上的软件版本的描述性信息;
诸如一个特定设备功能 是否正确的状态信息;
或诸如到一个目的地的路由选择路径的特定协议的信息。
MIB 对象由称为 SMI ( Structure of Management Information)的数据描述语言所定义。
使用形式化定义语言可以确保网络管理数据的语法和语义是定义良好的和无二义性的。相关的MIB对象被收集在MIB模块 (module)中。
4.在每个被管设备中还驻留有网络管理代理(network management agent),它是运行 在被管设备中的一个进程,该进程与管理服务器通信,在管理服务器的命令和控制下在被管设备中采取本地动作。网络管理代理类似于我们在图5・2中看到的路由选 择代理。
5.网络管理框架的最后组件是网络管理协议(network management protocol)。该协议 运行在管理服务器和被管设备之间,允许管理服务器查询被管设备的状态,并经过其代理间接地在这些设备上采取行动。代理能够使用网络管理协议向管理服务器通知异常事件(如组件故障或超过了性能阈值)。重要的是注意到网络管理协议自己不能管理网络。恰恰相反,它为网络管理员提供了一种能力,使他们能够管理 (“监视、测试、轮询、配置、分析、评价和控制”)网络。这是一种细微但却重要 的区别。
简单网络管理协议:
概述:
SNMP,一个应用层协议,用于在管理服务器和代表管理服务器执行的代理之间传递网络管理控制和信息报文。
常用模式:
SNMP最常使用的是请求响应模式,其中SNMP管理服务器向SNMP代理发送一个请求,代理接收到该请求后,执行某些动作,然后对该请求发送一个回答。请求通常用于查询(检索)或修改(设置)与某被管设备关联的MIB对象值。
SNMP第二个常被使用的是代理向管理服务器发送的一种非请求报文,该报文称为陷阱报文(trap message)。陷阱报文用于通知管理服务器,一个异常情况(例如一个链路接口启动或关闭)已经导致了 MIB对象值的改变。
链路层:
术语:
运行链路层协议(即第2 层)协议的任何设备均称为节点(node) 。节点包括主机、路由器、交换机和WiFi接入点。
我们也把沿着通信路径连接相邻节点的通信信道称为链路(link) 。
链路层提供的服务:
基本服务:
将数据报通过单一通信链路从一个节点移动到相邻节点,但所提供的服务细节能够随着链路层协议的不同而变化。
链路层协议能够提供的可能服务包括:
1.成帧:
在每个网络层数据报经链路传送之前,几乎所有的链路层协议都要将其用链路层帧封装起来。一个帧由一个数据字段和若干首部字段组成,其中网络层数据报就插在数据字段中。帧的结构由链路层协议规定。
2.链路接入:
媒体访问控制(Medium Access Control,MAC)协议规定了帧在链路上传输的规则。对于在链路的一端仅有一个发送方、链路的另一端仅有一个接收方的点对点链路,MAC协议比较简单(或者不存在),即无论何吋链路空闲,发送 方都能够发送帧。更有趣的情况是当多个节点共享单个广播链路时,即所谓多路访问问题。这里,MAC协议用于协调多个节点的帧传输。
3.可靠交付:
当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个 网络层数据报。前面讲过,某些运输层协议(例如TCP)也提供可靠交付服务。与运输层可靠交付服务类似,链路层的可靠交付服务通常是通过确认和重传取得的。链路层可靠交付服务通常用于易于产生高差错率的链路,例如无线链路,其目的是本地(也就是在差错发生的链路上)纠正一个差错,而不是通过运输层或应用层协议迫使进行端到端的数据重传。然而,对于低比特差错的链路,包括光纤、同轴电缆和许多双绞铜线链路,链路层可靠交付可能会被认为是一种不必要的开销。由于这个原因,许多有线的链路层协议不提供可靠交付服务。
物理结构:
链路层的主体部分是在网络适配器(networkadapter)中实现的,网络适配器有时也称为网络接口卡(Network Interface Card, NIC)。
链路层控制器:
位于网络适配器核心的是链路层控制器,该控制器通常是一个实现了许多链路层服务(成帧、链路接入、差错检测等)的专用芯片。
直到20世纪90年代后期,大部分网络适配器还是物理上分离的卡(如一块PCMCIA卡或者一块插进PC的PCI卡槽中的插入卡),但越来越多的网络适配器被综合进主机的主板,即所谓的局域网在主板配置。
接发流程:
在发送端,控制器取得了由协议栈较高层生成并存储在主机内存中的数据报,在链路层帧中封装该数据报(填写该帧的各个字段),然后遵循链路接入协议将该帧传进通信链路中。
在接收端,控制器接收了整个帧,抽取出网络层数据报。如果链路层执行差错检测,则需要发送控制器在该帧的首部设置差错检测比特,由接收控制器执行差错检测。
软件组件:
链路层的软件组件实现了高层链路层功能,如组装链路层寻址信息和激活控制器硬件。在接收端,链路层软件响应控制器中断(例如,由于一个或多个帧的到达),处理差错条件和将数据报向上传递给网络层。
所以,链路层是硬件和软件的结合体,即此处是协议栈中软件与硬件交接的地方。
差错检测和纠正技术:
概述:
对从一个节点发送到另一个物理上连接的邻近节点的链路层帧中的比特损伤(传输中的比特翻转所致)进行检测和纠正。
常用技术:
奇偶校验:
概述:
它用来描述差错检测 和纠正背后隐含的基本思想。
原理:
发送方:
在偶校验方案中,发送方只需包含一个附加的比特,选择它的值,使得这d + 1比特(初始信息加上一个校验比特)中1的总数是偶数。对于奇校验方案,选择校验比特值使得有奇数个1。
接收方:
接收方只需要数一数接收的d + 1 比特中1的数目即可。如果在采用偶校验方案中发现了奇数个值为1的比特,接收方知道 至少出现了一个比特差错。更精确的说法是,出现了奇数个比特差错。
但是如果出现了偶数个比特差错,会导致检查不到。在突发差错的情况下,使用单比特奇偶校验保护的一帧中未检测出差错的概率能够达到50%。
二维奇偶校验:
d个比特被划分为i行j列。对每行和每列计算奇偶值。产生的i+j+1奇偶比特构成了链路层帧的井错检测比特。(次数增多)
接收方不仅可以检测到出现了单个比特差错的事实,而且还可以利用存在奇偶校验差错的列和行的索引来实际识别发生差错的比特并纠正它!
二维奇偶校验也能够检测(但不能纠正!)一个分组中两个比特差错的任何组合。
前向纠错FEC:
这些技术通常用于如音频CD这样的音频存储和回放设备中。
减少所需的发送方重发的次数。
避免了不得不等待的往返时延,对于实时网络应用[Rubenstein 1998]或者具 有长传播时延的链路(如深空间链路)可能是一种非常重要的优点。
检验和:
概述:
它通常更多地应用于运输层。
一个简单检验和方法就是将这丘比特整数加起来,并且用得到的和作为差错检测比特。因特网检验和(Internet checksum)就基于这种方法,即数据的字节作为16比特的整数对待并求和。
这个和的反码形成了携带在报文段首部的因特网检验和。
具体实现:
在TCP和UDP协议中,对所有字段(包括首部和数据字段)都计算因特网检验和。
在其他协议中,例如XTP,对首部计算一个检验和,对整个分组计算另一个检验和。
优点:
需要相对小的分组开销,提供相对弱的差错保护(相对于CRC),但是简单而快速。适合运输层。
循环冗余检测CRC:
概述:
它通常更多地应用在适配器中的链路层。
CRC编码也称为多项式编码(polynomial code),因为该编码能够将要发送的比特串看作为系数是0和1一个多项式,对比特串的操作被解释为多项式算术。
具体实现:
发送方和接收方首先必须协商一个 r + 1比特模式,称为生成多项式(general),我们将其表示为G。要求G的最高有效位的比特(最左边)是1。
对于一个给定的数据段D,发送方要选择r个附加比特R并将它们附加到D上, 使得得到的d + r比特模式(被解释为一个二进制数)用模2算术恰好能被G整除(即没有余数)。
接收方用G去除接收到的 d + r比特。如果余数为非零,接收方知道出现了差错;否则认为数据正确而被接收。
优点:
每个CRC标准都能检测小于r+1比特的突发差错。 (这意味着所有连续的r比特或者更少的差错都可以检测到。)
此外,在适当的假设下,长度大于r+1比特的突发 差错以概率1-0.5^r被检测到。
每个CRC标准也都能检测任何奇数个比特差错。
多路访问链路和协议:
网络链路分类:
点对点链路:
由链路一端的单个发送方和链路另一端的单个接收方组成。如点对点协议(point-to-point protocol, PPP)和 高级数据链路控制(high・level data link control, HDLC)
广播链路:
多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。
多路访问协议:
问题:
传输的帧在所有的接收方处碰撞(collide)了。通常,当碰撞发生时,没有一个接收节点能够有效地获得任何传输的帧;在某种意义下,碰撞帧的信号纠缠在一起。
因此,涉及此次碰撞的所有帧都丢失了,在碰撞时间间隔 中的广播信道被浪费了。显然,如果许多节点要频繁地传输帧,许多传输将导致碰撞,广播信道的大量带宽将被浪费掉。
以某种方式协调活跃节点的传输是必要的。
信道划分协议:
时分多路复用(TDM);
概述:
TDM将时间划分为时间帧(time frame),并进一步划分每个时间帧为N个时隙(slot)。
把每个时隙分配给N个节点中的一个。无论何时某个节点在有分组要发送的时候,它在循环的TDM帧中指派给它的时隙内传输分组比特。
通常,选择的时隙长度应使一个时隙内能够传输单个分组。
缺点:
首先,节点被限制于R/N bps的 平均速率,即使当它是唯一有分组要发送的节点时。
其次,节点必须总是等待它在传输序列中的轮次,即我们再次看到,即使它是唯一一个有帧要发送的节点。
频分多路复用(FDM):
概述:
将R bps信道划分为不同的频段(每个频段具有R/N带宽),并把每个频率分配给N个节点中的一个。
缺点:
限制一个节点只能使用R/N的带宽,即使当它是唯一一个有分组要发送的节点时。
码分多址:
概述:
CDMA对每个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码。
如果精心选择这些编码,CDMA网络具有一种奇妙的特性,即不同的节点能够同时传输,
并且它们各自相应的接收方仍能正确接收发送方编码的数据比特(假设接收方知道发送方的编码),而不在乎其他节点的干扰传输。
应用:
CDMA已经在军用系统中使用了一段时间(由于它的抗干扰特性),目前已经广泛地 用于民用,尤其是蜂窝电话中。
随机接入协议:
协议概述:
一个传输节点总是以信道的全部速率(即Kbps)进行发送。当有碰撞时,涉及碰撞的每个节点反复地重发它的帧(也就是分组),到该帧无碰撞地通过为止。
但是当一个节点经历一次碰撞时,它 不必立刻重发该帧。相反,它在重发该帧之前等待一个随机时延。涉及碰撞的每个节点独立地选择随机时延。
时隙 ALOHA:
概述:
当节点有一个新帧要发送时,它等到下一个时隙开始并在该时隙传输整个帧。
如果没有碰撞,该节点成功地传输它的帧,从而不需要考虑重传该帧。
如果有碰撞,该节点在时隙结束之前检测到这次碰撞。该节点以概率p在后续的每个时隙中重传它的帧,直到该帧被无碰撞地传输出去。
优点:
与信道划分不同,当某节点是唯一活跃的节点时(一个节点如果有帧要发送就认为它是活跃的),时隙ALOHA允许该节点以全速R连续传输。
时隙ALOHA也是高度分散的,因为每个节点检测碰撞并独立地决定什么时候重传。
效率:
时隙多路访问协议的效率(efficiency)定义为:当有大量的活跃节点且每个 节点总有大量的帧要发送时,长期运行中成功时隙的份额。
协议的最大效率为1/e=0.37
纯ALOHA:
概述:
当一帧首次到达(即一个网络层数据报在发送节点从网络层传递下来),节点立刻将该帧完整地传输进广播信道。
如果一个传输的帧与一个或多个传输经历了碰撞,这个节点将立即(在完全传输完它的碰撞帧之后)以概率p重传该帧。
否则,该节点等待一个帧传输时间。在此等待之后,它则以概率p传输该帧,或者以概率1 - p在另一个帧时间等待(保持空闲)。
效率:
协议的最大效率仅为l/(2e)
载波侦听多路访问(CSMA):
概述:
载波侦听:即一个节点在传输前先听信道。如果来自另一 个节点的帧正向信道上发送,节点则等待直到检测到一小段时间没有传输,然后 开始传输。
碰撞检测:即当一个传输节点在传输时一直在侦听此信道。如果它检测到另 一个节点正在传输干扰帧,它就停止传输,在重复“侦听-当空闲时传输”循环之前等待一段随机时间。
仍然碰撞:
比特沿着广播媒体传播所实际需要的时间不是零(虽然以接近光 的速度)。
广播信道的端到端信道传播时延(channel propagation delay)(信号从一个节 点传播到另一个节点所花费的时间)在决定其性能方面起着关键的作用。
该传播时延越长,载波侦听节点不能侦听到网络中另一个节点已经开始传输的机会就越大。
具有碰撞检测的载波侦听多路访问(CSMA/CD):
流程:
1)适配器从网络层一条获得数据报,准备链路层帧,并将其放入帧适配器缓存中。
2)如果适配器侦听到信道空闲(即无信号能量从信道进入适配器),它开始传输帧。
在另一方面,如果适配器侦听到信道正在忙,它将等待,直到侦听到没有信号能量时才开始传输帧。
3)在传输过程中,适配器监视来自其他使用该广播信道的适配器的信号能量的存在。
4)如果适配器传输整个帧而未检测到来自其他适配器的信号能量,该适配器就完成了该帧。
在另一方面,如果适配器在传输时检测到来自其他适配器的信号能量,它中止传输(即它停止了传输帧)。
5)中止传输后,适配器等待一个随机时间量,然后返回步骤2。
二进制指数后退算法:
作用:
确定随机时间量。
概述:
当传输一个给定帧时,在该帧经历了一连串的几次碰撞后,节点随机地从{0, 1, 2,…,2" -1}中选择一个K值。
因此,一个帧经历的碰撞越多,K选择的间隔越大。
对于以太网,一个节点等待的实际时间量是K*512比特时间(即发送512比特进入以太网所需时间量的K倍),能够取的最大值在10以内。
效率:
如果传播时延是0,碰撞的节点将立即中止而不会浪费信道。同时,当dgns变得很大时,效率也接近于1。
这也和直觉相符,因为当一个帧取得了信道时,它将占有信道很长时间;因此信道在大多数时间都会有效地工作。
轮流协议:
轮询协议:
概述:
主节点首先向节点1发送一个报文,告诉它(节点1) 能够传输的帧的最多数量。在节点1传输了某些帧后,主节点告诉节点2它(节点2)能够传输的帧的最多数量。
(主节点能够通过观察在信道上是否缺乏信号,来决定一个节点 何时完成了帧的发送。)上述过程以这种方式继续进行,主节点以循环的方式轮询了每个节点。
缺点:
该协议引入了轮询时延。
如果主节点有故障,整个信道都变得不可操作。
令牌传递协议:
概述:
在这种协议中没有主节点。 一个称为令牌(token)的小的特殊帧在节点之间以某种固定的次序进行交换。
例如,节点1可能总是把令牌发送给节点2 ,节点2可能总是把令牌发送给节点3 ,而节点N可能总是把令牌发送给节点1。
当一个节点收到令牌时,仅当它有一些帧要发送时,它才持有这个令牌;
否则,它立即向下一个节点转发该令牌。当一个节点收到令牌时,如果它确实有帧要传输,它发送最大数目的帧数,然后把令牌转发给下一个节点。
令牌传递是分散 的,并有很高的效率。
存在问题:
一个节点的故障可能会使整个信道崩溃。
或者如果一个节点偶然忘记了释放令牌,则必须调用某些恢复步骤使令牌返回到循环中来。
用于电缆因特网接入的链路层协议:
一个电缆接入网通常在电缆网头端将几千个住宅电缆调制解调器与一个电缆调制解调器端接系统(Cable Modem Termination System, CMTS)连接。
DOCSIS使用FDM将下行(CMTS到调制解调器)和上行(调制解调器到CMTS)网络段划分为多个频率信道。每个下行信道宽6MHz,每 个信道具有大约40Mbps吞吐量
每条上行信道被划分为时间间隔(类似于TDM),每个时间间隔包含 一个微时隙序列,电缆调制解调器可在该微时隙中向CMTS传输。
CMTS显式地准许各个 电缆调制解调器在特定的微时隙中进行传输。
CMTS在下行信道上通过发送称为MAP报文的控制报文,指定哪个电缆调制解调器(带有要发送的数据)能够在微时隙中传输由控制 报文指定的时间间隔。
由于微时隙明确分配给电缆调制解调器,故CMTS能够确保在微时隙中没有碰撞传输。
但是CMTS一开始是如何知道哪个电缆调制解调器有数据要发送呢?通过让电缆调制解调器在专用于此目的的一组特殊的微时隙间隔内向CMTS发送微时隙请求帧来完成该任务。
这些微时隙请求帧以随机接入方式传输,故可能相互碰撞。
电缆调制解调器既不能侦听上行信道是否忙,也不能检测碰撞。
相反,该电缆调制解调 器如果没有在下一个下行控制报文中收到对请求分配的响应的话,就推断出它的微时隙请求帧经历了一次碰撞。
当推断出一次碰撞,电缆调制解调器使用二进制指数回退将其微时隙请求帧延缓到以后的时隙重新发送。
当在上行信道上有很少的流量,电缆调制解调器可能在名义上分配给微时隙请求帧的时隙内实际传输数据帧(因此避免不得不等待微时隙分配)。
交换局域网:
链路层寻址和ARP:
MAC地址:
概述:
主机或路由器的适配器(即网络接口)具有链路层地址。
链路层交换机并不具有与它们的接口(这些接口是与主机和路由器相连的)相关联的链路层地址。(链路层交换机的任务是在主机与路由器之间承载数据报)
范围:
MAC地址长度为6字节,共有2^48个可能的MAC地址。
当一个公司要生产适配器时,它支付象征性的费用购买组成2^24个地址的一块地址空间。
IEEE分配这块个地址的方式是: 固定一个MAC地址的前24比特,让公司自己为每个适配器生成后24比特的唯一组合。
特点:
适配器的MAC地址具有扁平结构(这与层次结构相反),而且不论适配器到哪里用都不会变化。
作用:
局域网是为任意网络层协议而设计的,而不只是用于IP和因特网。
帧发送:
发送适配器将目的适配器的MAC地址插入到该帧中,并将该帧发送到局域网上。
arp协议:
背景:
有时某发送适配器的确要让局域网上所有其他适配器来接收并处理它打算发送的帧。
在这种情况下,发送适配器在该帧的目的地址字段中插入一个特殊的MAC广播地址(broadcast address)。
概述:
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
只为在同一个子网上的主机和路由器接口解析IP地址。
arp表:
每台主机或路由器在 其内存中具有一个ARP表(ARP table),这张表包含IP地址到MAC地址的映射关系。
子网内寻找流程:
1.主机向它的适配器传递一个ARP查询分组,并且指示适配器应该用MACT播地址(即FF-FF-FF-FF-FF-FF)来发送这个分组。
2.适配器在链路层帧中封装这个ARP分组,用广播地址作为帧的目的地址,并将该帧传输进子网中。
3.包含该ARP查询的帧能被子网上的所有其他链路层和局域网适配器接收到,并且(由于广播地址)每个适配器都把在该帧中的ARP分组向上传递给 ARP模块。
4.这些ARP模块中的每个都检查它的IP地址是否与ARP分组中的目的IP地址相匹配。与之匹配的一个给査询主机发送回一个带有所希望映射的响应ARP分组。
5.然后查询主机能够更新它的ARP表,并发送它的IP数据报,该数据报封装在一个链路层帧中,并且该帧的目的MAC就是对先前ARP请求进行响应的主机或路由器的MAC地址。
跨子网流程:
1.数据报必须首先发送给路由器接口,IP是目标主机,MAC地址是路由器接口的适配器地址(通过arp协议拿到)。
2.在子网1上的路由器适配器看到该链路层帧是向它寻址的,因此把这个帧传递给路由器的网络层。
3.路由器通过查询路由器中的转发表,将该数据报转发到正确接口。
4.接口把这个数据报传递给它的适配器,适配器通过arp协议寻找目标机器的MAC地址,然后把该数据报封装到一个新的帧中,并且将帧发送进子网2中。
协议划分:
一个ARP分组封装在链路层帧中,因而在体系结构上位于链路层之上。
然而,一个 ARP分组具有包含链路层地址的字段,因而可认为是链路层协议,但它也包含网络层地址,因而也可认为是为网络层协议。
所以,可能最好把ARP看成是跨越链路层和网络层边界两边的协议。
以太网:
历史1:
初始的以太局域网使用同轴电缆总线来互联节点,所有传输的帧传送到与该总线连接的所有适配器并被其处理。使用具有二进制指数回退的CSMA/CD多路访问协议。
历史2:
到了20世纪90年代后期,大多数公司和大学使用一种基于集线器的星形拓扑以太网安装替代了它们的局域网。
在这种安装中,主机(和路由器)直接用双绞对铜线与一台集线器相连。集线器(hub)是一种物理层设备,它作用于各个比特而不是作用于帧。
当表示一个0或一个1的比特到达一个接口时,集线器只是重新生成这个比特,将其能量强度放大,并将该比特向其他所有接口传输出去。
因此,采用基于集线器的星形拓扑的以太网 也是一个广播局域网,即无论何时集线器从它的一个接口接收到一个比特,它向其所有其他接口发送该比特的副本。
特别是,如果某集线器同时从两个不同的接口接收到帧,将出现一次碰撞,生成该帧的节点必须重新传输该帧。
历史3:
以太网安装继续使用星形拓扑,但是位于中心的集线器被交换机(switch)所替代。
采用的是存储转发分组交换,交换机协调其传输,在任何时候决不会向相同的接口转发超过一个帧。因此没有必要使用MAC协议了!
以太网帧结构:
数据字段:
这个字段承载了IP数据报。
目的地址:
这个字段包含目的适配器的MAC地址
源地址:
这个字段包含了传输该帧到局域网上的适配器的MAC地址
类型字段:
IP和其他链路层协议、ARP协议
CRC:
CRC(循环冗余检测)字段的目的是使得接收适配器(适配器B)检测帧中是否引入了差错。
前同步码:
前同步码字段的前7字节用于“唤醒”接收适配器,并且将它们的时钟和发送方的时钟同步。
特点:
提供无连接服务
提供不可靠服务
链路层交换机:
转发:
决定一个帧应该被导向哪个接口,并把该帧移动到那些接口的交换 机功能。
过滤:
决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。
交换机表:
概述:
许多现代分组交换机能够被配置,以基于第二层目的MAC地址(即起着第二层交换机的功能)或者第三层IP目的地址(即起着第三层交换机的功能)进行转发。
组成:
交换机表中的一个表项包含:①一个MAC地址;②通向该MAC地址的交换机接口;③表项放置在表中的时间。
更新流程:
目的地址为DD-DD-DD-DD-DD-DD的 帧从交换机接口x到达。
1.表中没有对于DD-DD-DD-DD-DD-DD的表项。在这种情况下,交换机向除接口先外的所有接口前面的输岀缓存转发该帧的副本。换言之,如果没有对于目的地址的表项,交换机广播该帧。
2.表中有一个表项将DD-DD-DD-DD-DD-DD与接口x联系起来。
在这种情况下,该帧从包括适配器DD-DD-DD-DD-DD-DD的局域网网段到来。无须将该帧转发到任何其他接口,交换机通过丢弃该帧执行过滤功能即可。
3.表中有一个表项将DD-DD-DD-DD-DD-DD与接口y!=x联系起来。在这种情况下, 该帧需要被转发到与接口y相连的局域网网段。
交换机通过将该帧放到接口y前面的输出缓存完成转发功能。
自学习:
概述:
表是自动、动态和自治地建立的,即没有来自网络管理员或来自配置协议的任何干预。
流程:
1)交换机表初始为空。
2)对于在每个接口接收到的每个入帧,该交换机在其表中存储:①在该帧源地址字 段中的MAC地址;②该帧到达的接口;③当前时间。交换机以这种方式在它的表中记录 了发送节点所在的局域网网段。如果在局域网上的每个主机最终都发送了一个帧,则每个 主机最终将在这张表中留有记录。 「
3)如果在一段时间(称为老化期)后,交换机没有接收到以该地址作为源地址的帧,就在表中删除这个地址。
以这种方式,如果一台PC被另一台PC (具有不同的适配器)代替,原来PC的MAC地址将最终从该交换机表中被清除掉。
特点:
消除碰撞。在使用交换机(不使用集线器)构建的局域网中,没有因碰撞而浪费的带宽!
交换机缓存帧并且决不会在网段上同时传输多于一个帧。就像使用路由器一样,交换机的最大聚合带宽是该交换机所有接口速率之和。
因此,交换机提供了比使用广播链路的局域网高得多的性能改善。
异质的链路。交换机将链路彼此隔离,因此局域网中的不同链路能够以不同的速率运行并且能够在不同的媒体上运行。
管理。除了提供强化的安全性,交换机也易于进行网络管理。
嗅探交换局域网:
位于局域网上的嗅探器仍然能嗅探某些不是明确寻址的帧,因为交换机广播那些目的地址不在交换机表中的帧。
交换机毒化:
向交换机发送大量的具有不同伪造源MAC地址的分组,因而用伪造表项填满了交换机表,没有为合法主机留下空间
交换机和路由器比较:
交换机是即插即用的
交换机对于广播风暴并不提供任何保护措施
路由器没有生成树限制,所以它们允许以丰富的拓扑结构构建因特网,例如包括欧洲和北美之间的多条活跃链路。
路由器对第二层的广播风暴提供了防火墙保护。
虚拟局域网:
背景:
缺乏流量隔离。
交换机的无效使用
管理用户。
概述:
虚拟局域网(Virtula Local Network, VLAN)
支持VLAN的交换机允许经一个单一的物理局域网基础设施定义多个虚拟局域网。
实现方法:
将VLAN交换机的一个端口与一台外部的路由器相连。
VLAN干线连接。
链路虚拟化:
概述:
网络作为链路层
多协议标签交换:
概述:
对于基于固定长度标签和虚电路的技术,在不放弃基于目的地IP数据报转发的基础设施的前提下,
当可能时通过选择性地标识数据报并允许路由器基于固定长度的标签(而不是目的地IP地址)转发数据报来增强其功能。
硬件:
标签交换路由器:通过在其转发表中查找MPLS标签,然后立即将数据报传递给适当的输岀接口来转发MPLS帧。
应用:
流量工程:能够超越普通的IP路由选择,迫使某些流量沿着一条路径朝着某给定的目的地引导
虚拟专用网(Virtual Private Network, VPN)
数据中心网络:
交换机和路由器等级:
主机 -> 3层交换机 -> 接入路由器 -> 边界路由器
全连接拓扑:
每台第一层交换机都与所有第二层交换机相连,在任意两台二层交换机间有几条不相交的路径。这种设计可以显著地改善主机到主机的容量。
模块化数据中心:
当许多组件岀现故障并且性能已经下降到低于某个阈值时,整个集装箱将会被移除,并用新的来替换。
Web页面请求的历程:
1.主机运行DHCP协议,生成一个DHCP请求报文,放入UDP报文段。
该UDP报文段则被放置在一个具有广播IP目的地址(255.255.255.255)和源IP地址 0. 0. 0. 0的IP数据报中。
2.包含DHCP请求报文的IP数据报则被放置在以太网帧中。该以太网帧具有目的MAC地址FF:FF:FF:FF:FF:FF,使该帧将广播到与交换机连接的所有设备(如果顺利的话也包括DHCP服务器)
3.包含DHCP请求的广播以太网帧是第一个由主机发送到以太网交换机的帧。该交换机在所有的出端口广播入帧,包括连接到路由器的端口。
4.路由器在它的具有MAC地址的接口接收到该广播以太网帧,该帧中包含DHCP请求,并且从该以太网帧中抽取出IP数据报。
该数据报的广播IP目的地址指示了这个IP数据报应当由在该节点的高层协议处理,因此该数据报的载荷(一个UDP报文段)被分解向上到达UDP, DHCP请求报文从此UDP报文段中抽取出来。
此时DHCP服务器有了 DHCP请求报文。
5.DHCP服务器生成包含分配IP地址以及DNS服务器的1P地址、默认网关路由器的IP地址和子网块(等价为“网络掩码”)的一个DHCP ACK报文。
该DHCP报文被放入一个UDP报文段中,UDP报文段被放入一个IP数据报中,IP数据报再被放入一个以太网帧中。
这个以太网帧的源MAC地址是路由器连到归属网络时接口的MAC地址,目的MAC地址是主机的MAC地址。
6.包含DHCP ACK的以太网帧由路由器发送给交换机。因为交换机是自学习的,并且先前从主机收到(包含DHCP请求的)以太网帧,
所以该交换机知道寻址到主机mac地址的帧仅从通向主机的输岀端口转发。
7.主机接收到包含DHCP ACK的以太网帧,从该以太网帧中抽取IP数据报, 从IP数据报中抽取UDP报文段,从UDP报文段抽取DHCP ACK报文。
主机的DHCP客户则记录下它的IP地址和它的DNS服务器的IP地址。它还在其IP转发表中安装默认网关的地址。主机将向该默认网关发送目的地址为其子网以外的所有数据报。
此时,主机已经初始化好它的网络组件,并准备开始处理Web网页获取。
8.主机的操作系统因此生成一个DNS查询报文,将字符串放入DNS报文的问题段中。该DNS报文则放置在一个具有53号(DNS服务器)目的端口的UDP报文段中。
该UDP报文段则被放入具有IP目的地址和源IP地址的IP数据报中。
9.主机则将包含DNS请求报文的数据报放入一个以太网帧中。该帧将发送(在链路层寻址)到网关路由器。
然而,即使主机经过上述第5步中的DHCP ACK报文知道了学校网关路由器的IP地址,但仍不知道该网关路由器的MAC地址。为了获得该网关路由器的MAC地址,主机将需要使用ARP协议。
10.主机生成一个具有目的IP地址(默认网关)的ARP查询报文,将该ARP报文放置在一个具有广播目的地址(FF: FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,
交换机将该帧交付给所有连接的设备,包括网关路由器。
11.网关路由器在通往学校网络的接口上接收到包含该ARP查询报文的帧,发现在ARP报文中目标IP地址匹配其接口的IP地址。
网关路由器因此准备一个ARP答,指示它的MAC地址对应IP地址。它将ARP回答放在一个以太网帧中,其目的地址为主机的mac地址,并向交换机发送该帧,再由交换机将帧交付给主机。
12.主机接收包含ARP回答报文的帧,并从ARP回答报文中抽取网关路由器的 MAC 地址。
13.主机能够使包含DNS查询的以太网帧寻址到网关路由器的MAC地址。注意到在该帧中的IP数据报具有IP目的地址(DNS服务器),而该帧具有目的地址(网关路由器)。
主机向交换机发送该帧, 交换机将该帧交付给网关路由器。
14.网关路由器接收该帧并抽取包含DNS查询的IP数据报。路由器查找该数据报的目的地址,并根据其转发表决定该数据报应当发送到路由器。
IP数据报放置在链路层帧中,该链路适合将学校路由器连接到最左边Comcast路由器,并且该帧经这条链路发送。
15.路由器接收到该帧,抽取IP数据报,检查该数据报的目的地址,并根据其转发表确定出接口,经过该接口朝着DNS服务器转发数据报,
而转发表已根据Comcast的域内协议以及因特网的域间协议BGP所填写。
16.最终包含DNS查询的IP数据报到达了DNS服务器。DNS服务器抽取出DNS查询报文,在它的DNS数据库中查找名字,找到包含对应域名的IP地址的DNS源记录。
(假设它当前缓存在DNS 服务器中。)前面讲过这种缓存数据源于google.com的权威DNS服务器。
该DNS服务器形成了一个包含这种主机名到IP地址映射的DNS回答报文,将该DNS回答报文放入UDP报文段中,该报文段放入寻址到主机的IP数据报中。
该数据报将通过Comcast网络反向转发到学校的路由器,并从这里经过以太网交换机到主机。
17.主机从DNS报文抽取出服务器域名的IP地址。
18.主机生成TCP套接字,该套接字将用于向服务器发送HTTP GET报文。主机的TCP必须首先与服务器中的TCP执行三次握手。
主机因此首先生成一个具有目的端口的TCP SYN报文段,将该TCP报文段放置在具有目的IP地址的IP数据报中,将该数据报放置在MAC地址(网关路由器)的帧中, 并向交换机发送该帧。
19.在学校网络、Comcast网络和谷歌网络中的路由器朝着服务器转发包含TCP SYN的数据报,使用每台路由器中的转发表,如前面步骤14-16那样。
前面讲过支配分组经Comcast和谷歌网络之间域间链路转发的路由器转发表项,是由BGP协议决定的。
20.最终,包含TCP SYN的数据报到达www.googole.com。从数据报抽取出TCP SYN 报文并分解到与端口80相联系的欢迎套接字。
对于谷歌HTTP服务器和主机的TCP连接生成一个连接套接字。产生一个TCP SYNACK报文段, 将其放入向主机寻址的一个数据报中,最后放入链路层帧中。
该链路适合将服务器连接到其第一跳路由器。
21.包含TCP SYNACK报文段的数据报通过谷歌、Comcast和学校网络,最终到达主机的以太网卡。数据报在操作系统中分解到步骤18生成的TCP套接字,从而进入连接状态。
22.借助于主机的套接字,现在准备向服务器发送字节, 浏览器生成包含要获取的URL的HTTP GET报文。HTTP GET报文则写入套接字,其中GET报文成为一个TCP报文段的载荷。
该TCP报文段放置进一个数据报中,并交付到服务器,如前面步骤18-20所述。
23.在服务器的HTTP服务器从TCP套接字读取HTTP GET报文,生成一个HTTP响应报文,将请求的Web页内容放入HTTP响应体中,并将报文发送进TCP套接字中。
24.包含HTTP回答报文的数据报通过谷歌、Comcast和学校网络转发,到达主机。Web浏览器程序从套接字读取HTTP响应,从HTTP响应体中抽取Web网页的html,并最终显示了 Web网页。
子网掩码:
一个比特模板,用来和ip进行按位与运行后比较结果,判断是否同一个子网。结果是局域网的网段,比较前三位
子网地址与网络地址不同,前两个字节是网络地址,后两个字节是主机地址
如128.17.75.20,根据子网掩码如255.255.255.0,则前三位是子网地址,表示128.17网络的75号子网,20是主机地址
绕回设备的地址总是127.0.0.1,子网掩码总是255.0.0.0,没有子网地址.
网段与掩码:
要想判断两个ip地址是不是在同一个网段,只需将ip地址与子网掩码做与运算(同为1才为1),如果得出的结果一样,则这两个ip地址是同一个子网当中。
示例:
192.168.1.9子网掩码:255.255.255.0,192.168.1.10子网掩码:255.255.255.0,192.168.1.3子网掩码255.255.248.0
要将十进制的ip地址转换为二进制的
做与运算
11000000.10101000.00000001.00001001
11111111.11111111.11111111.00000000 与运算
11000000.10101000.00000001.00000000
11000000.10101000.00000001.00001010
11111111.11111111.11111111.00000000 与运算
11000000.10101000.00000001.00000000 结果相同
11000000.10101000.00000001.00000011
11111111.11111111.11111000.00000000 # 值得注意的是,掩码的与运算决定了192.168.5.1/21和192.168.3.1/21的ip范围都是192.168.0.1~192.168.7.255
11000000.10101000.00000000.00000000 两者结果不同,不是同一个子网,但是可以ping通,因为这是跨子网通信,需要默认网关的转发(本质是路由转发)。traceroute可以查看。抓包只能看到ip没有变化。
通信原理(涉及路由器转发):
网络上通讯工作在物理层和数据链路层,源地址和目标地址是通过源和目的的mac地址进行通讯的。
当源主机访问目标主机时,首先看两者的IP在不在同一网段,结果是:
同一个网段,查本地arp缓存,查看IP和Mac的对应表,向网络上发包,包中包括原mac及目标mac。
两者不在同一网段,则把目标地址转为网关地址(也就是平时说的向网关发包),然后查找本地arp缓存,再继续。网关负责转发包。
掩码示例:
由与运算(同为1才为1)决定范围。
128.0.0.1/1的掩码为128.0.0.0,ip范围为128.0.0.1-255.255.255.254,广播地址为255.255.255.255
127.0.0.1/1的掩码为128.0.0.0,ip范围为0.0.0.1-127.255.255.254,广播地址为255.255.255.255
128的二进制为10000000,比128大的数与掩码1的运算结果都相同。
127的二进制为01111111,比127小的数与掩码1与运算的结果都相同。
1的掩码为 10000000,
另外一种情况,126的二进制为01111110,
那么可以用129掩码10000001,那么比126大的结果都不同,比126小的结果都相同
示例2:
10.32.0.0/12,掩码为255.240.0.0,二进制为11110000,32的二进制为00100000,最多只能到47的00101111,48为00110000,云运算结果就不同了。
其实也可以简单从255-240=15,然后32+15=47得到范围。
如果一个数加上(255-掩码),如果超过255,那么属于(255-掩码)这段范围。
应用:
1./etc/exports
如192.168.0.63/255.255.255.0与192.168.0.x/24(16-31)位于同一网段中
11000000.10101000.00000000.00111111
2.与192.168.0.0/8
11000000.10101000.00000000.00000000
11111111.00000000.00000000.00000000
虽然结果不同,但仍然同一网段,原因可能是192.168.0.0属于c类地址,不能用8
或者不同网段时,默认使用最少的掩码。
华为集群看情况是使用/etc/exports的掩码,
A类,只算第一段。
B类,只算第一、二段。
C类,算第一、二、三段。
3.192.168.1.1/21的掩码为什么为
广播地址:
当在子网中一个机器向所有分组广播时使用这个地址,通常情况下,用255替换子网地址的主机地址即可,其他可能用子网地址作广播地址
如子网地址为128.17.75.0的广播地址为128.17.75.255
绕回设备没有广播地址
无线链路和网络:
要素:
无线主机
无线链路:
网络边缘的主机通过无线通信连接到一个基站或者另一台无线主机。
同样应用在一个网络中以连接路由器、交换机和其他网络设备。
基站:
负责向与之关联的无线主机发送数据和从主机那里接收数据(例如分组)。基站通常负责协调与之相关联的多个无线主机的传输。
基站与更大网络相连(如因特网、公司或家庭网、电话网),因此这种 连接在无线主机和与之通信的其他部分之间起着链路层中继的作用。
基础设施模式:
与基站关联的主机运行模式
自组织网络:
主机本身必须提供诸如路由选择、地址分配、类似于DNS的名字转换等服务。
切换:
当一台移动主机的移动超出一个基站的覆盖范围而到达另一个基站的覆盖范围后,它将改变其接入到更大网络的连接点(即改变与之相关联的基站)
网络基础设施:
无线主机希望与之进行通信的更大网络。
无线网络分类:
①在该无线网络中的分组是否跨越了一个无线跳或多个无线跳;
②网络中是否有诸如基站这样的基础设施。
单跳,基于基础设施:
这些网络具有与较大的有线网络(如因特网)连接的基站。 此外,该基站与无线主机之间的所有通信都经过一个无线跳。
单跳,无基础设施:
在这种单跳网络中的一个节点可以协调其他节点的传输。蓝牙网络(该网络连接诸如键盘、扬声器和戴在头上的耳机等小型无线设备)和具有自组织模式的802. 11网络是单跳、无基础设施的网络。
多跳,基于基础设施:
在这些网络中,一个基站表现为以有线方式与较大网络相连。然而,某种无线节点为了经该基站通信,可能不得不通过其他无线节点中继它们的通信。
某些无线传感网络和所谓无线网状网络(wireless mesh network)就属于这种类型。
多跳,无基础设施:
在这些网络中没有基站,并且节点为了到达目的地可能必须在几个其他无线节点之间中继报文。
无线链路和网络特征:
递减的信号强度:
电磁波在穿过物体(如无线电信号穿过墙壁)时强度将减弱。 即使在自由空间中,信号仍将扩散,这使得信号强度随着发送方和接收方距离的增加而减弱(有时称其为路径损耗(path loss))。
来自其他源的干扰:
在同一个频段发送信号的电波源将相互干扰。例如,2. 4GHz无 线电话和802. lib无线LAN在相同的频段中传输。因此,802. 11 b无线LAN用户若 同时利用2.4GHz无线电话通信,将会导致网络和电话都不会工作得特别好。除了来自发送源的干扰,环境中的电磁噪声(如附近的电动机、微波)也能形成干扰。
多径传播:
当电磁波的一部分受物体和地面反射,在发送方和接收方之间走了不同长度的路径,则会出现多径传播(multipath propagation)。这使得接收方收到的信号变得模糊。位于发送方和接收方之间的移动物体可导致多径传播随时间而 改变。
比特差错:
无线链路中的比特差错将比有线链路中更为常见。因此,无线链路协议不仅采用有效的CRC错误检测码,还采 用了链路层ARQ协议来重传受损的帧。
隐藏终端问题:
即使A和C的传输确实是在目的地B发生干扰,环境的物理阻挡(例如,一座大山或者一座建筑)也可能会妨碍A和C互相听到对方的传输。(导致AC之间不能相互检测到)
信号强度的衰减,信号强度不足以使它们相互检测到对方的传输,然而它们的传输足以强到在站点B处相互干扰。
信噪比:
概述:
(Signal-to-Noise Ratio, SNR)是所收到的信号(如被传输的信息)和噪声强度的相对测量。SNR的度量单位通常是分贝(dB)。
较大的SNR使接收方更容易从背景噪声中提取传输的信号。
调制技术:
对于给定的调制方案,SNR越高,BER越低:
由于发送方通过增加它的传输功 率就能够增加SNR,因此发送方能够通过增加它的传输功率来降低接收到差错帧的概率。然而,注意到当该功率超过某个阈值时,如BER从IO-12降低到io-13,可证明几乎不会有实际增益。
增加传输 功率也会伴随着一些缺点:发送方必须消耗更多的能量(对于用电池供电的移动用户,这一点非常重要),并且发送方的传输更可能干扰另一个发送方的传输。
对于给定的SNR,具有较高比特传输率的调制技术(无论差错与否)将具有较高的BER。
物理层调制技术的动态选择能用于适配对信道条件的调制技术:
SNR (因此BER)可能因移动性或由于环境中的改变而变化。在蜂窝数据系统中以及在802.11 WiFi和4G蜂窝数据网络中使用了自适应调制和编码。
例如,这使得对于给定的信道特征选择一种调制技术,在受制于BER约束的 前提下提供最高的可能传输速率。
CDMA码分多址协议:
概述:
属于信道划分协议族。它划分编码空间(与时间或频率相对),并且给每个节点分配一段专用的代码空间。
原理:
要发送的每个比特都通过乘以一个信号(编码)的比特来进行编码,这个信号的变化速率(通常称为码片速率,chipping rate)比初始数据比特序列的变化速率快得多。
存在干扰的情况下,如果仔细地选择发送方的编码,每个接收方只通过同样的方式使用发送方的编码,就能够从聚合的信号中恢复一个给定的发送方发送的数据。
WIFI:
概述:
在IEEE 802.11 (WIFI)协议族中有几套有关无线LAN的802.11标准。不同的802.11标准都具有某些共同的特征。它们都使用相同的媒体访问协议CSMA/CA。
使用相同的帧结构,而且它们都具有减少其传输速率的能力以伸展到更远的距离。
体系结构:
基础设施无线LAN:
基本构件模块是基本服务集(Basic Service Set, BSS)。
一个BSS包含一个或多个无线站点和一个在802.11术语中称为接入点(Access Point, AP)的中央基站(base station)。
AP连接到一个互联设备上(如交换机或者路由器),互联设备又连接到因特网中。
自组织网络:
一个无中心控制和与“外部世界”无连接的网络。这里,该网络是由彼此已经发现相互接近且有通信需求的移动设备“动态”形成,并且在它们所处环境中没有预先存在的网络基础设施。
mac地址:
每个802.11无线站点都具有一个6字节的MAC地址,该地址存储在该站适配器(即802.11网络接口卡)的固件中。
每个AP的无线接口也具有一个MAC地址。与以太网类似,这些MAC地址由IEEE管理,理论上是全球唯一的。
关联:
概述:
每个无线站点在能够发送或者接收网络层数据之前,必须与一个AP相关联。
仅有关联的AP才向你的无线站点发送数据帧,并且你的无线站点也仅仅通过该关联AP向因特网发送数据帧。
信标帧:
每个信标帧包括该AP的SSID和MAC地址。你的无线站点为了得知正在发送信标帧的AP,扫描11个信道,找出来自可能位于该区域的AP所发出的信标帧。
被动扫描:
扫描信道和监听信标帧的过程。
主动扫描:
通过向位于无线主机范围内的所有AP广播探测帧完成的。
AP用一个探测响应帧应答探测请求帧。无线主机则能够在响应的AP中选择某AP与之相关联。
关联流程:
1.无线主机向AP发送一个关联请求帧
2.该AP以一个关联响应帧进行响应。
3.主机通常将通过关联的AP向该子网发送一个DHCP发现报文
信道:
当网络管理员安装一个AP时,管理员为该接入点分配一个单字或双字的服务集标识符(Service Set Identifier, SSID) 。
(例如,当你在iPhone上选择设置WiFi时,将显示某范 围内每个AP的SSID)
管理员还必须为该AP分配一个信道号。
当且仅当两个信道由4个或更多信道隔开时它们才无重叠。 特别是信道1、6和11的集合是唯一的3个非重叠信道的集合。
CSMA/CA多路访问协议:
概述:
与以太网的CSMA/CD相似,CSMA/CA中的“CSMA”代表“载波侦听多路访问”,意味着每个站点在传输之前侦听信道,并且一旦侦听到该信道忙则抑制传输。
尽管以太网和802.11都使用载波侦听随机接入,但这两种MAC协议有重要的区别。
802.11 使用碰撞避免而非碰撞检测。其次,由于无线信道相对较高的误比特率,802.11 (不同于以太网)使用链路层确认/重传(ARQ)方案。
不能检测碰撞的原因:
1.检测碰撞的能力要求站点具有同时发送(站点自己的信号)和接收(检测其他站 点是否也在发送)的能力。因为在802.11适配器上,接收信号的强度通常远远小于发送信号的强度,制造具有检测碰撞能力的硬件代价较大。
2.更重要的是,即使适配器可以同时发送和监听信号(并且假设它一旦侦听到信道忙就放弃发送),适配器也会由于隐藏终端问题和衰减问题而无法检测到所有的碰撞。
链路层确认:
目的站点收到一个通过CRC校验的帧后,它等待一个被称作短帧间间隔的一小段时间,然后发回一个确认帧。
如果发送站点在给定的时间内未收到确认帧,它假定出现了错误并重传该帧,使用CSMA/CA协议访问该信道。
如果在若干固定次重传后仍未收到确认,发送站点将放弃发送并丢弃该帧。
流程:
1.如果某站点最初监听到信道空闲,它将在一个被称作分布式帧间间隔的短时间段后发送该帧。
2.否则,该站点选取一个随机回退值(如我 们在6.3.2节中遇到的那样)并且在侦听信道空闲时递减该值。当侦听到信道忙时,计数值保持不变。
3.当计数值减为0时(注意到这只可能发生在信道被侦听为空闲时),该站点发送整个数据帧并等待确认。
因为802. 11并不检测碰撞和放弃发送,遭受碰撞的帧仍将被完全传输。
4.如果收到确认,发送站点知道它的帧已被目的站正确接收了。如果该站点要发送另一帧,它将从第二步开始CSMA/CA协议。
如果未收到确认,发送站点将重新进入第二步中的回退阶段,并从一个更大的范围内选取随机值。
RTS/CTS处理隐藏终端:
概述:
站点使用一个短请求发送(Request to Send, RTS)控制帧和一个短允许发送 (Clear to Send, CTS)控制帧来预约对信道的访问。当发送方要发送一个data帧时,它能够首先向AP发送一个RTS帧, 指示传输DATA帧和确认(ACK)帧需要的总时间。当AP收到RTS帧后,它广播一个CTS帧作为响应。该CTS帧有两个目的:给发送方明确的发送许可,也指示其他站点在预约期内不要发送。
缺点:
引入了时延以及消耗了信道资源。
应用:
每个无线站点可以设置一个RTS门限值,仅当帧长超过门限值时,才使用RTS/CTS序列。对许多无线站点而言,默认的RTS门限值大于最大帧长值,因此对所有发送的DATA帧,RTS/CTS序列都被跳过。
在相同的IP子网中的移动性:
概述:
主机(非路由器)在两个BSS中的所有站点(包括AP)都属于同一个IP子网。
因此,当H1从BSS1移动到BSS2时,它 可以保持自己的IP地址和所有正在进行的TCP连接。
流程:
随着H1逐步远离API, Hl检测到来自API的信号逐渐减弱并开始扫描一个更强的信号。H1收到来自AP2的信标帧(在许多公司和大学的设置中它与API有相同的SSID)。
Hl然后与API解除关联,并与 AP2关联起来,同时保持其IP地址和维持正在进行的TCP会话。
交换机在其转发表中有一个表项,对应H1的MAC地址与到达H1所通过的出 交换机端口。在新的关联形成后,让AP2以H1的源地址向交换机发送一以太网广播帧。当交换机收到该帧后,更新其转发表,使得H1可以通过AP2到达。
速率适应:
问题:
随着与基站距离的增加,SNR —直在下降。在这种情况下,如果在用户和基站之间运行的802.11协议所使用的调制技术没有改变的话,随着SNR减小,BER将高得不可接受,最终,传输的帧将不能正确收到。
解决:
如果一个节点连续发送两个帧而没有收- 到确认(信道上一个比特差错的隐式指示),该传输速率降低到前一个较低的速率。
如果10个帧连续得到确认,或如果用来跟踪自上次降速以来时间的定时器超时,该传输速率 提高到上一个较高的速率。
功率管理:
通过将802. 11帧首部的功率管理比特设置为1,某节点向接入点指示它将打算睡眠。设置节点中的一个定时器,使得正好在AP计划发送它的信标帧前唤醒节点。
个人域网络:
概述:
蓝牙和ZigBee。
蓝牙:
设备之一被指定为主设备,其余充当从设备。
主节点真正控制皮可网,即它的时钟确定了皮可网中的时间,它可以在每个奇数时隙中发送,而从设备仅当主设备在前一时隙与其通信后才可以发送,并且只能发送给主设备。
除了从设备,网络 中还可以有多达255个的寄放(parked) 设备。这些设备仅当其状态被主节点从寄 放转换为活动之后才可以进行通信。
ZigBee:
家庭温度和光线传感器、安全设备和墙上安装的开关都是非常简单、低功率、低工作周期、低成本设备。ZigBee因此是非常适合于这些设备的。
ZigBee定义了 20kbps、40kbps. 100kbps和250kbps的信道速率,这取决于信道的频率。
蜂窝因特网接入:
2G蜂窝网体系结构:
应用:
语音与电话网连接
架构:
BTS:
每个小区包含一个收发基站(Base Transceiver Station, BTS),负责向位于其小区内的移动站点发送或接收信号。
基站控制器:
一个GSM网络的基站控制器(Base Station Controller, BSC)通常服务于几十个收发基站。
BSC的责任是为移动用户分配BTS无线信道,执行寻呼(paging)(找出某移动用户所在的小区),执行移动用户的切换。
基站控制器及其控制的收发基站共同构成了 GSM基站系统(Base Station System, BSS)。
移动交换中心:
(Mobile switching Center, MSC)起着决定性的作用。单个MSC通常将包含多达5个BSC,因此每个MSC有大约200 000个用户。
一个蜂窝提供商的网络将有若干MSC,使用称为网关MSC的特殊MSC将提供商的蜂 窝网络与更大的公共电话网相连。
多路接入协议:
GSM系统为组合的FDM/TDM系统,GSM系统由多个200kHz的频带组成,每个频带支持8个TDM呼叫。
3G蜂窝数据网:
应用:
接入了因特网
架构:
3G核心网:
概述:
3G核心蜂窝数据网将无线电接入网连接到公共因特网。与现有蜂窝语音网(特别是MSC)的组件协作。
服务通用分组无线服务支持节点SGSN:
负责向位于其连接的无线电接入网中的移动节点交付(或从移动节点获取)数据报。SGSN与该区域蜂窝语音网的MSC进行交互,提供用户认证和切换,维护活跃移动节点的位置(小区)信息,执行位于无线接入网中的移动节点和GGSN之间的数据报转发。
网关GPRS支持节点GGSN:
GGSN起着网关的作用,将多个SGSN连接到更大的因特网。
3G无线电接入网:
无线电网络控制器(Radio Network Controller, RNC):
通常控制几个小区的收发基站。
RNC既通过MSC与电路交换蜂窝语音网连接,又通过SGSN与分组交换 的因特网连接。
多路接入协议:
UMTS不再使用GSM的FDMA/TDMA方案,在TDMA时隙中使用称为直接序列宽带CDMA (Direct Sequence Wideband CDMA, DS-WCDMA)的CDMA技术。TDMA时隙又在多个频率上可供使用。
4G LTE:
结构:
全IP核心网:
3G网络对于语音和数据流量具有分离的网络组件和路径,4G体系结构是 “全IP的”,即语音和数据都承载在IP数据报中,来自/去往无线设备。
eNodeB:
2G基站和3G无线电网络控制器(又称为节点B)的逻辑后代,并且 此时还起着关键作用。它的数据平面作用是在UE和P-GW之间(经过LTE无线电接入网)转发数据报。
分组数据网络网关P-GW:
给UE分配IP地址,并 且保证QoS实施。作为隧道端点,当向或从UE转发数据报时,它也执行数据报 封装/解封装。
服务网关(S-GW):
数据平面移动性锚点,即所有UE流量将通过S-GW传递。该S-GW也执行收费/记账功能以及法定的流量拦截。
移动性管理实体MME:
执行连接和移动性管理。它从HHS接收UE订购信息。
归属用户服务(Home Subscriber Server, HSS):
包含了包括漫游接入能力、服务质 量配置文件和鉴别信息的UE信息。该HSS从UE归属蜂窝提供商得到这些信息。
多路接入协议:
LTE在下行信道采用频分复用和时分复用结合的方法,称之为正交频分复用。
移动管理:
术语:
归属网络:
在一个网络环境中,一个移动节点(如一台便携机或智能手机)的永久居所
归属代理:
在归属网络中代表移动节点执行移动管理功能的实体。
除了负责与外部代理交互以跟踪移动节点的COA外,监视到达的数据报并转发。
外部网络:
移动节点当前所在网络
转交地址(Care-Of Address, COA):
移动节点的外部地址,用于将数据报通过外部代理“重新路由选择”到移动节点。
寻址:
方案1:
概述:
向所有其他网络发通告,告诉它们该移动节点正在它的网络中,当作更新路由选择信息和转发表的正常过程的一部分来做。
当移动节点离开一个外部网络后又加入另一个外部网络时,新的外部网络会通告一条新的通向该移动节点的特别路由,旧的外部网络将撤销其与该移动节点有关的路由选择信息。
缺点:
如果移动性管理是网络路由器的责任的话,则路由器将必须维护可能多达数百万个移动节点的转发表表项。
方案2:
将移动性功能从网络核心搬到网络边缘,由该移动节点的归属网络来实现。
移动节点(或一个代表该移动节点的外部代理)与归属代理之间的协议来更新移动节点的位置。
间接路由选择:
概述:
通信者只是将数据报寻址到移动节点的固定地址,归属代理截获这些数据报,先转发给外部代理,然后再从外部代理转发给移动节点。
流程:
假设某移动节点连到外部网络A,向其归属代理注册了网络A中的一个C0A,并且正在接收通过归属代理间接路由而来的数据报。
该移动节点现在移动到外部网络B中,并向网络B 中的外部代理注册,外部代理将该移动节点的新C0A告诉了其归属代理。
此后,归属代 理将数据报重路由到网络B。
间断性:
只要移动节点与 网络A断开连接(此时它不能再经A接收数据报)再连接到网络B (此时它将向归属代理注册一个新的COA)用的时间少,那么几乎没有丢失数据报。
直接路由选择:
间接路由选择的三角路由选择问题:
即使在通信者与移动节点之间存在一条更有效的路 由,发往移动节点的数据报也要先发给归属代理,然后再发送到外部网络。
概述:
通信者所在网络中的一个通信者代理先知道该移动节点的C0A,通信者代理将数据报直接通过隧道技术发往移动节点的COA。
如何更新COA:
方案1:
需要一个移动用户定位协议(mobile-user location protocol),以便通信者代理向归属代理查询获得移动节点的COA。
方案2:
将首次发现移动节点的外部网络中的外部代理标识为锚外部代理(anchor foreign agent)。
当移动节点到达一个新外部网络后,移动节点向新的外部代理注册,并且新外部代理向锚外部代理提供移动节点的新COA。
当锚外部代理收到一个发往已经离开的移动节点的封装数据报后,它可以使用新的COA重新封装数据报并将其转发给该移动节点。
如果移动节点其后又移到另一个外部 网络中,在该被访网络中的外部代理随后将与锚外部代理联系,以便建立到该新外部网络的转发。
移动IP协议:
协议概述:
代理发现:
移动IP定义了一个归属代理或外部代理用来向移动节点通告其服务的协议,以及移动节点请求一个外部代理或归属代理的服务所使用的协议。
向归属代理注册:
移动IP定义了移动节点和/或外部代理向一个移动节点的归属代理注册或注销COA所使用的协议。
数据报的间接路由选择:
该标准也定义了数据报被一个归属代理转发给移动节点的方式,包括转发数据报使用的规则、处理差错情况的规则和几种不同的封装形式。
代理发现:
概述:
到达一个新网络的某移动IP节点,不管是连到一个外部网络还是返回其归属网络, 它都必须知道相应的外部代理或归属代理的身份。
代理通告:
该代理周期性地在所有连接的链路上广播一个类型字段为9(路由器发现)的ICMP报文。路由器发现报文也包含路由器(即该代理)的1P地址,因此允许一个移动节点知道该代理的IP地址。
代理请求:
移动节点广播一个代理请求报文,该报文只是一个类型值为10的ICMP报文。 收到该请求的代理将直接向该移动节点单播一个代理通告。
向归属代理注册:
概述:
一旦某个移动IP节点收到一个COA,则该地址必须要向归属代理注册。这可通过外部代理(由它向归属代理注册该C0A)或直接通过移动IP节点自己来完成。
流程:
1.当收到一个外部代理通告后,一个移动节点立即向外部代理发送一个移动IP注册报文。
2.外部代理收到注册报文并记录移动节点的永久IP地址,外部 代理然后向归属代理的434端口发送一个移动IP注册报文
3.归属代理接收注册请求并检查真实性和正确性。归属代理把移动节点的永久IP地址与C0A绑定在一起。以后,到达该归属代理的数据报与发往移动节点的数据报将被封装并以隧道方式给C0A。
4.外部代理接收注册响应,然后将其转发给移动节点。
管理蜂窝网中的移动性:
概述:
与移动IP类似,GSM采用了一种间接路由选择方法,首先将通信者的呼叫路由选择到移动节点的归属网络,再从那到达被访网络。
在GSM术语中,移动用户的归属网络被称作该移动用户的归属公共地域移动网络(home Public Land Mobile Network, home PLMN)、归属网络(home network)。
移动用户向某个 蜂窝网提供商订购了服务,该蜂窝网就成为了这些用户的归属网络(即该提供商就按月提供的蜂窝服务收取用户的费用)。
被访问的PLMN,我们直接称其为被访网络(visited network),是移动用户当前所在网络。
归属位置注册器:
如果一个移动用户当前漫游到 另一个提供商的蜂窝网络中,HLR中将包含足够多的信息(通过归属MSC)来获取被访网络中对移动用户的呼叫应该路由选择到的地址。
访问者位置注册:
VLR为每一个当前在其服务网络中的移动用户包含一个表项,VLR表项因此随着移动用户进入和离开网络而出现或消失。
VLR通常与移动交换中心(MSC)在一起,该中心协调到达或离开被访网络的呼叫建立。
流程:
1.通信者拨打移动用户的电话号码。呼叫从通信者通过公共交换电话网到达移动用户归属网络中的归属 MSC。
2.归属MSC收到该呼叫并查询HLR来确定移动用户的位置。
HLR返回移动站点漫游号码,当移动用户进入一个被访网络后,会给移 动用户临时分配一个漫游号码。
3.给定一个漫游号码,归属MSC通过网络到达被访网络的MSC建立呼叫的第二步。
漫游号码:
当一个 移动电话切换或进入一个由新的VLR所覆盖的被访网络中以后,移动用户必须向被访网络注册,这是通过在移动用户和VLR之间交换信令报文来实现的。
被访VLR随后又向移 动用户的HLR发送一个位置更新请求报文。这一报文告知HLR可以用来联系移动用户的 漫游号码,或者VLR地址(它可以用来随后查询以获取移动号码)。
同一个MSC下的切换:
1.旧基站(BS)通知被访问MSC即将要进行一个切换,通知移动用户将要切换到的BS (或可能的BS集)。
2.被访问MSC发起建立到新BS的路径,分配承载重路由选择的呼叫所需的资源, 以及用信令告知新BS一个切换即将出现。
3.新BS分配并激活一个无线信道供移 动用户使用。
4.新BS发出信令返回被访问MSC和旧BS,即已经建立了被访问MSC到新BS的路径并且移动用户应当被告知即将发生的切换。新BS提供移动用户与新的BS相关联所需要的所有信息。
5.移动用户被告知它应当进行一个切换。注意到此时为止,移动用户完全不知网络 已经为切换做好所有底层工作(如在新BS中分配一个信道,分配一条从被访问MSC到新BS的路径)。
6.移动用户和新BS交换一个或多个报文,以完全激活新BS中新的信道。
7.移动用户向新BS发送一个切换完成报文,该报文随后向上转发给被访问MSC。该被访问MSC然后重路由选择到移动用户的正在进行的呼叫,使其经过新BS。
8.沿着到旧BS的路径分配的资源随后被释放。
不同MSC的切换:
不论移动用户进行了多少次MSC间转换,呼叫总是从归属MSC路由选择到锚MSC,然后再到移动用户当前所在的被访问MSCO当移动用户从一个MSC覆盖区到达另一个MSC覆盖区后,正在进行的呼叫被重路由选择,从锚MSC到包含新基站的新被访问 MSC。
无线和移动性对运输层协议的影响:
背景:
在无线网络中比特错误比在有线网络中普遍得多。
运输层协议(特别是TCP)通常在有线和无线网络中有时会有完全不同的性能。
当这样的比特差错或者切换丢失发生时,没理由让TCP发送方降低其拥塞窗口(并因此降低发送速率)。
可能的方法:
本地恢复:
本地恢复方法的目标是在比特差错出现的当时和当地(如在无线链路 中)将其恢复。如802.11 ARQ协议,或者使用ARQ和FEC的更为复杂的方法。
TCP发送方知晓无线链路:
让TCP发送方和接收方知道无线链路的存在, 从而将在有线网络中发生的拥塞性丢包和在无线网络中发生的差错/丢包区分开, 并且仅对有线网络中的拥塞性丢包采用拥塞控制。
分离连接方法:
移动用户和其他端点之间的端到端连接被打断为两个运输层连接:一个从移动主机到无线接入点,一个从无线接入点到其他通信端点(我们假定它是有线的主机)。
该端到端连接因此是由一个无线部分和一个有线部分级连形成的。经无线段的运输层能够是一个标准的TCP连接,或是一个特别定制运行在UDP上的差错恢复协议。
对应用层的影响:
无线链路尤其是蜂窝无线链路上的应用程序,必须将带宽作为稀有物品对待。
计算机网络中的安全:
安全分类:
机密性:
仅有发送方和希望的接收方能够理解传输报文的内容。要求报文在一定程度上进行加密。
报文完整性:
通信的内容在传输过程中未被改变——或者恶意篡改或者意外改动。
端点鉴别:
发送方和接收方都应该能证实通信过程所涉及 的另一方,以确信通信的另一方确实具有其所声称的身份。
运行安全性:
攻击者能够试图在网络主机中安放蠕虫,获取公司秘密,勘察内部网络配置并发起DoS攻击。
诸如防火墙和入侵检测系统等运行设备正被用于反制对机构网络的攻击。
防火墙位于机构网络和公共网络之间,控制接入和来自网络的分组。入侵检测系统执行“深度分组检查”任务,向网络管理员发岀有关可疑活动的警告。
机密性:
对称密钥密码体制:
凯撒密码:
将明文报文中的每个字母用字母表中该字母后第k个字母进行替换。
单码代替密码:
使用字母表中的一个字母替换该字母表中的另一个字母。
如何破解:
通过对明文语言进行统计分析,比如常见的组合,in、the等,使得破解该密文变得相对容易。
事先确定单词,比如alice人名,可以减少检查的可能性组合。
常见破解方法:
唯密文攻击:
有些情况下,入侵者只能得到截取的密文,也不了解明文报文的内容。统计分析有助于对加密方案的唯密文攻击。
已知明文攻击:
当入侵者知道(明文,密文)的一些匹配时,我们将其称为对加密方案的已知明文攻击。
选择明文攻击:
入侵者能够选择某一明文报文并得到该明文报文对应的密文形式。可以一定几率破解使用的加密方案。
多码代替密码:
基本思想:
使用多个单码代替密码,一个单码代替密码用于加密 某明文报文中一个特定位置的字母。因此,在某明文报文中不同位置出现的相同字母可能以不同的方式编码。
块密码:
概述:
要加密的报文被处理为A比特的块。例如,如果k=64,则报文被划分为64比特的块,每块被独立加密(映射为可能的组合)。
为了挫败蛮力攻击,块密码通常使用大得多的块,由64比特甚至更多比特组成。注意到对于通常的丘比特块密码,可能映射数量是2^k,对于即使不大的k值(如k=64),这也是一个天文数字。
缺点:
将要求Alice和Bob维护一张具有2^k个输入值的表,这是一个难以实现的任务。此外,如果Alice和Bob要改变密钥,他们将不得不每人重新生成该表。
优化:
块密码通常使用函数模拟随机排列表。
目前有一些流行的块密码,包括DES ( Data Encryption Standard,数据加密标准)、3DES和AES ( Advanced Encryption Standard,高级加密标准)。
这些标准都使用了函数(而不是预先决定的表)。
DES使用了具有56比特密钥的64比特块。AES使用128比特块,能够使用128、192和256比特长的密钥进行操作。
密码块链接:
概述:
可以在密文中混合某些随机性,使得相同的明文块产生不同的密文块。
过程:
具有密钥S的块密码加密算法,每块选择一个新的比特随机数。用随机数和明文块加密,得到密文。然后发送明文和密文给对方。
对方将通过加密算法、随机比特数和密文一起解开得到明文。
缺点:
传输以前两倍的比特。
优化:
为了有效利用该技术,块密码通常使用了一种称为密码块链接(Cipher Block Chaining, CBC)的技术。
其基本思想是仅随第一个报文发送一个随机值, 然后让发送方和接收方使用计算的编码块代替后继的随机数。
流程:
1.在加密报文(或数据流)之前,发送方生成一个随机的k比特串,称为初始向量IV。发送方以明文方式将IV发送给接收方。
2.对第一个块,发送方计算第一块明文与IV的异或。然后通过块密码算法运行得到的结果以得到对应的密文块。发送方向接收方发送加密块。
3.对于第i个块,发送方根据上一个密文块生成第i个密文块。
公开密钥加密:
概述:
对称密钥要求两方必须就共享密钥达成一致,但是这样做的前提是需要通信(可假定是安全的)!
公钥用这个公钥和一个众所周知的(例如,已标准化的)加密算法,加密要传递给的报文m;
接收到加密报文后,用其私钥和一个众所周知的(例如,已标准化的)解密算法解密的加密报文。
关键点:
1.要使公开密钥密码能工作,密钥选择和加密/解密算法必须保证任意入侵者都不能(至少要困难得几乎不可能)确定出私钥或者以某种方式解密或猜出报文。
2.既然加密密钥是公开的,任何人都可能向发送一个已加密的报文。这就需要用数字签名把发送方和报文绑定起来,限制发送方的范围。
RSA算法:
概述:
广泛地使用了模n算术的算术运算。
一个报文只不过是一种比特模式,并且所有比特模式能唯一地被一个整数 (连同该比特模式的长度)表示。当用RSA加密一个报文时,等价于加密表示该报文的这个唯一的整数。
生成流程:
1)选择两个大素数p和g。那么p和g应该多大呢?该值越大,破解RSA越困难, 而执行加密和解密所用的时间也越长。RSA实验室推荐,公司使用时,p和g的乘积为 1024比特的数量级。
2)计算 n-pq 和 z = (p - 1)(q - 1 )。
3)选择小于n的一个数e, 且使e和z没有(非1的)公因数。(这时称e与z互素。)使用字母e表示是因为这个值将被用于加密。
4)求一个数d,使得ed-1可以被z整除(就是说,没有余数)。使用字母d表示是因为这个值将用于解密。换句话说,给定e我们选择d,使得ed mod 2 = 1
5)Bob使外界可用的公钥是一对数(n,e),其私钥是一对数(n,d)。
加密流程:
执行指数运算,然后计算比特整数m被n除的整数余数,得到加密值c,发送给对方。
解密流程:
私钥执行整除,得到明文。
原理:
目前没有已知的算法可以快速进行一个数的因数分解,这种情况下公开值n无法快速分解成素数p和g。如果已知p和g,则给定公开值e就很容易计算出秘密密钥d。
会话密钥:
概述:
RSA所要求的指数运算是相当耗费时间的过程。DES用软件实现要比RSA快100倍,用硬件实现则要快1000 ~ 10 000倍。
所以,在实际应用中,RSA通常与对称密钥密码结合起来使用。
报文完整性:
需求:
1.该报文的确源自目标。
2.该报文在途中没有被篡改。
密码散列函数:
概述:
与鉴别密钥搭配,可以确保报文没有被篡改。(不然已知散列算法,伪造报文也是可以的)
原理:
找到任意两个不同的报文x和y使得H(x) =H(y),在计算上是不可能的。
检验和:
很容易找到有相同检验和的另一组数据。
MD5散列算法:
概述:
通过4步过程计算得到128比特的散列。
流程:
①填充1,然后填足够多的0,直到报文长度满足一定的条件;
②添 加——在填充前添加一个用64比特表示的报文长度;
③初始化累加器;
④循环——在最后的循环步骤中,对报文的16字块进行4轮处理。
SHA-1:
概述:
算法的原理类似于MD4设计中所使用的原理,而MD4是MD5的前身。
鉴别密钥:
概述:
是一个比特串
流程:
1) Alice生成报文m,用s级联m以生成m+s,并计算散列H(m+s)(例如使用SHA-1)。H(m + s)被称为报文鉴别码(Message Authentication Code, MAC)。
2)然后Alice将MAC附加到报文m上,生成扩展报文(m, H(m+s)),并将该扩展 报文发送给Bob。
3)Bob接收到一个扩展报文(m,h),由于知道s,计算出报文鉴别码H(m+s)。如果W(/n+s)=h, Bob得到结论:一切正常。
如何分发鉴别密钥:
一名网络管理员能够通过物理上访问每台路由器来实际完成这项工作。
每台路由器都有它自己的公钥,那么该网络管理员能够用路由器的公钥加密鉴别密钥并分发给任何一台路由器,从而通过网络向路由器发送加密的密钥。
数字签名:
方案1:
MAC由密钥作用到该报文上而生成的,然后得到该散列值。
缺点:
要求其他人必须具有该密钥的副本才可以验证。
方案2:
公钥密码
使用私钥签署报文,公开的公钥可以验证。
缺点:
加密和解密的计算代价昂贵,报文量大。
方案3:
散列函数对报文生成散列 + 私钥签名散列。
优点:
生成数字签名所需要的计算量大为降低。
解密流程:
先把发送方的公钥应用于报文获得一个散列结果。
然后她再把该散列函数应用于明文报文以得到第二个散列结果。
如果这两个散列匹配,则Alice可以确信报文的完整性及其发送方。
对比MAC技术:
首先取得该报文的散列,然后用我们的私钥加密该报文。因此,数字签名是一种“技术含量更高”的技术,因为它需要一个如后面描述的、具有认证中心支撑的公钥基础设施(PKI)。
公钥认证:
问题:
对方有可能是钓鱼网站传递过来公钥。需要证明对方传递的公钥是合法的。
概述:
需要能够证实具有的公钥实际上就是与要进行通信的实体(人员、路由器、浏览器等)的公钥。
认证中心(Certification Authority, CA):
作用:
1.CA证实一个实体(一个人、一台路由器等)的真实身份。
2.一旦CA验证了某个实体的身份,这个CA会生成一个将其身份和实体的公钥绑定起来的证书。
端点鉴别:
概述:
一个实体经过计算机网络向另一个实体证明其身份的过程。
鉴别协议apl.O:
无任何判断
鉴别协议ap2.0:
通过IP。
IP哄骗:
生成一个IP数据报,并在IP数据报中填入我们希望的任意源地址(伪造源IP),再通过链路层协议把生成的数据报发送到第一跳路由器。
此后,具有不正确源地址的数据报就会忠实地向Bob转发。
鉴别协议ap3.0:
使用秘密口令。
缺点:
窃取口令
鉴别协议ap3.1:
对称秘密密钥加密口令
回放攻击:
Trudy只需窃听Alice的通信,并记录下该口令的加密版本,并向Bob回放该口令的加密版本。
鉴别协议ap4.0:
口令替换为不重数(nonce),在一个协议的生存期中只使用一次的数。
安全电子邮件:
概述:
应用层。
机密性:
公开密钥密码 + 会话密钥
报文完整性:
散列函数对报文生成散列 + 私钥签名散列
整体流程:
1.Alice对她要发送的报文m应用一个散列函数H(例如MD5),从而得到一个报文摘要;
2.用她的私钥对散列函数的结果进行签名,从而得到一个数字签名;
3.把初始报文(未加密)和该数字签名级联起来生成一个包;
4.Alice选择一个随机对称会话密钥K,用这个对称密钥加密她的报文m,用Bob的公钥加密这个对称密钥,级联该加密的报文和加密的对称密钥以形成一个“包”,发送这个包。
对称密钥确保机密性。
5.Bob使用其私钥得到对称密钥,使用这个对称密钥K解密报文,他将Alice的公钥应用到被签名的报文摘要上,将该操作的结果与他自己对该报的散列H进行比较。
即可验证报文的完整性。
TCP连接安全SSL:
概述:
TCP的这种强化版本通常被称为安全套接字层(Secure Socket Layer, SSL)。
SSL版本3的一个稍加修改的版本被称为运输层安全性(Transport Layer Security, TLS),已经由IETF标准化。
三个阶段:握手、密钥导出和数据传输。
握手:
1.与Alice创建一条TCP连接;
2.验证Alice是真实的Alice;
Bob就向Alice发送一个 hello报文。Alice则用她的证书进行响应,证书中包含了她的公钥。因为该证书已被某CA证实过,Bob明白无误地知道该公钥属于Alice。
Bob产生一个主密钥(MS)(该MS将仅用于这个SSL会话),用Alice的公钥加密该MS以生成加密的主密钥(EMS),并将该EMS发送给 Alice。
3.发送给Alice一个主密钥。
Alice用她的私钥解密该EMS从而得到该MS。
详细过程:
1)客户发送它支持的密码算法的列表,连同一个客户的不重数。
2)从该列表中,服务器选择一种对称算法(例如AES)、一种公钥算法(例如具有特定密钥长度的RSA)和一种MAC算法。它把它的选择以及证书和一个服务器不重数返回给客户。
3)客户验证该证书,提取服务器的公钥,生成一个前主密钥(Pe Master Secret, PMS),用服务器的公钥加密该PMS,并将加密的PMS发送给服务器。
4)使用相同的密钥导岀函数(就像SSL标准定义的那样),客户和服务器独立地从PMS和不重数中计算出主密钥(Master Secret, MS)。
然后该MS被切片以生成两个密码和两个MAC密钥。
此外,当选择的对称密码应用于CBC (例如3DES或AES),则两个初始化向量(Initialization Vector, IV)也从该MS获得,这两个IV分别用于该连接的两端。
自此以后,客户和服务器之间发送的所有报文均被加密和鉴别(使用MAC)。
5)客户发送所有握手报文的一个MAC。
6)服务器发送所有握手报文的一个MAC。
最后两个步骤使握手免受篡改危害:
因为这些加密算法和密钥还没有被协商好,所以算法的这张列表以明文形式发送。
Trudy作为中间人,能够从列表中删除较强的算法,迫使客户选择一种较弱的算法。为了防止这种篡改攻击,在步骤5中客户发送一个级联它已发送和接收的所有握手报文的MAC。
服务器能够比较这个MAC与它已接收和发送的握手报文的MAC。如果有不一致,服务器能够终止该连接。
类似地,服务器发送一个它已经看到的握手报文的MAC,允许客户检查不一致性。
不重数的作用:
不重数用于防御“连接重放”,而序号用于防御在一个进行中的会话中重放个别分组。
密钥导出:
概述:
对于Alice和Bob每人而言,使用不同的密码密钥,并且对于加密和完整性检查也使用不同的密钥,通常认为更为安全。
Eb,用于从Bob发送到Alice的数据的会话加密密钥
Mb,用于从Bob发送到Alice的数据的会话MAC密钥
Ea,用于从Alice发送到Bob的数据的会话加密密钥
Ma,用于从Alice发送到Bob的数据的会话MAC密钥。
其中的两个加密密钥将用于加密数据;两个MAC密钥将用于验证数据的完整性。
数据传输:
方案1:
用SSL在传输中加密应用数据,然后将加密的数据在传输中传给TCP。
缺点:
需要望等到TCP会话结束时才验证所有Bob数据的完整性
方案2:
SSL将数据流分割成记录,对每个记录附加一个MAC用于完整性检查,然后加密该“记录+MAC”。为了产生这个MAC, Bob将数据连同密钥Mb放入一个散列函数中。
为了加密“记录+ MAC”这个包,Bob使用他的会话加密密钥Eb。然后这个加密的包将传递给TCP经因特网传输。
存在问题:
记录的颠倒而次序不正确、删除报文段或重放报文段。
解决:
Bob维护一个序号计数器,计数器开始为0, Bob每发送的一个SSL记录它都增加1。
Bob并不实际在记录中包括一个序号,但当他计算MAC时,他把该序号包括在MAC的计算中。
所以,该MAC现在是数据加MAC密钥Mb加当前序号的散列。
连接断开:
截断攻击:
Trudy再一次介入一个进行中的SSL会话中,并用TCP FIN过早地结束了该会话。
解决:
在类型字段中指出该记录是否是用于终止该SSL会话的。
(尽管SSL类型是以明文形式发送的,但在接收方使用了记录的MAC对它进行了鉴别。)
通过包括这样一个字段,如果Alice在收到一个关闭SSL记录之前突然收到了一个TCP FIN,她可能知 道正在进行着某些耍花招的事情。
网络层安全性:
概述:
IPsec和虚拟专用网
IPsec:
利用MAC确保报文完整性。
利用密钥确保报文的机密性。
在路由器之间传输。
无线LAN安全:
IEEE 802.11i:
1.发现
AP通告它的存在以及它能够向无线客户节点提供的鉴别和加密形式。客户则请求它希望的特定鉴别和加密形式。
2.相互鉴别和主密钥(MK)生成。
客户和鉴别服务器彼此相互鉴别,并导岀为双方所知的一个主密钥。
3.成对主密钥(Pairwise Master Key, PMK)生成。
鉴别服务器则向AP发送该PMK。这正是我们所希望达到的目的!客户和AP现在具有一个共享的密钥(前面讲过在WEP中根本不涉及密钥分发的问题),并彼此相互鉴别。
4.临时密钥(Temporal Key, TK)生成。
使用PMK,无线客户和AP现在能够生成附加的、将用于通信的密钥。其中的关键是临时密钥,TK将被用于执行经无线链路向任意远程主机发送数据的链路级的加密。
运行安全性:
概述:
防火墙和入侵检测系统
防火墙:
传统的分组过滤器
状态过滤器:
通过用一张连接表来跟踪所有进行中的TCP连接来解决这个问题
应用程序网关:
应用程序网关除了看IP/TCP/UDP首部外,还基于应用数据来做策略决定。
入侵检测系统:
概述:
为了检测多种攻击类型,我们需要执行深度分组检查,即查看首部字段以外部分,深入查看分组携带的实际应用数据。
入侵检测系统:
概述:
当观察到潜在恶意流量时能产生告警的设备。
能够用于检测多种攻击,包括网络映射(例如使用rmrnp进行分析)、端口扫描、 TCP栈扫描、DoS带宽洪泛攻击、蠕虫和病毒、操作系统脆弱性攻击和应用程序脆弱性攻击。
分类:
基于特征的系统(signature-based system):
维护了一个范围广泛的攻击特征数据库。
一个特征可能只是有关单个分组的特性列表(例如源和目的端口号、协议类型和在分组载荷中的特定比特串),或者可能与一系列分组有关。
这些特征通常由研究了已知攻击、技艺熟练的网络安全工程师生成。
一个机构的网络管理员能够定制这些特征或者将其加进数据库中。
缺点:
基于特征的IDS对不得不记录的新攻击 完全缺乏判断力。
即使与一个特征匹配,它也可能不是一个攻击的结果, 因此产生了一个虚假告警。
基于异常的系统:
会生成一个流量概况文件。然后,它寻找统计上不寻常的分组流。
ICMP分组不寻常的百分比,或端口扫描和ping掠过导致指数性突然增长。基于异常的IDS系统最大的特点是它们不依赖现有攻击的以前知识。
在另一方面,区分正常流量和统计异常流量是一个极具挑战性的问题。
入侵防止系统:
滤除可疑流量的设备。
多媒体网络:
多媒体网络应用:
概述:
分为流式存储音频/视频、会话式IP音频/视频、流式实况音频/视频等几类。
视频:
高比特率
能被压缩
多重版本
音频:
对音频的小失误比视频的小失误更为敏感。
流式存储视频:
类型:
UDP流(UDP streaming)、HTTP流(HTTP streaming)和适应性HTTP流(adaptive HTTP streaming)
UDP流:
概述:
使用UDP流,服务器通过UDP以一种稳定的速率记录下视频块,用与客户的视频消耗速率相匹配的速率传输视频。
除了服务器到客户的视频流外,两者间还并行地维护一个单独的控制连接,通过该连接,客户可发送有关会话状态变化的命令(如暂停、重新 开始、重定位等)。
缺点:
1.由于服务器和控制之间的可用带宽无法预测并且是变化的,恒定速率UDP流不能够提供连续的播放。
2.要求如RTSP服务器这样的媒体控制服务器,以对每个进行中的客户会话处理客户到服务器的交互请求和跟踪客户状态(例如在视频中的客户播放点,视频是否被暂停或播放等)。
这增加了部署大规模的按需视频系统的总体成本和复杂性。
3.许多防火墙配置为阻塞UDP流量,防止这些防火墙后面的用户接收UDP视频°
HTTP流:
预取视频:
对于流式存储视频,客户能够尝试以高于消耗速率的速率下载视频,因此预取(prefetching)将来会被消耗的视频帧。
客户应用缓存和TCP缓存:
一旦客户应用缓存变满,字节不再从客户TCP接收缓存中删除,因此它也会变满。
一旦客户TCP接收缓存变满,字节不再从服务器TCP发送缓存删除,因此它也变满。
一旦客户TCP发送缓存变满, 服务器不能向套接字中发送任何更多的字节。
早期中止和重定位:
HTTP流系统经常利用HTTP GET请求报文中的HTTP字节范围首部(HTTP byte- range header),该首部指示了客户当前要从所希望的视频中获取的字节范围。
许多流系统仅使用了长度适当的客户应用缓存,或者将限制在HTTP请求中使用字节范围首部预取的视频数量。
经HTTP的动态适应流(DASH):
DASH使用了该视频的多个版本,每个版本是以不同速率压缩而成的。
IP语音:
尽力而为服务的限制:
丢包:
从发送方到接收方的路径上的一个或多个缓存有可能是满的,不能接纳该IP数据报。在这种情况下,这个IP数据报就被丢弃了,永远不会到达接收方的应用程序。
通过TCP而不是UDP发送分组可以消除丢失。然而,重传机制对于诸如VoIP这样的会话式实时音频应用,通常认为是不可接受的。
端到端时延:
超过400ms的时延可能严重妨碍语音谈话的交互性。
分组时延抖动:
从在源中产生分组到它在接收方收到的这段时间,对于不同的分组可能 会有波动,这个现象称为时延抖动(jitter) 。
通过使用序号(sequence number)、时间戳(timestamp)和播放时延(play out delay)来消除。
在接收方消除音频的时延抖动:
固定播放时延:
概括地说,如果端到端时延经常发生大的变化,用一个大的q更好;另一方面,如果时延很小并且时延变化也很小,用一个较小的、可能小于150ms的q更好。
适应性播放时延:
估计网络时延和网络时延变化,并且在每个话音突峰期的开始相应地调整播放时延。
在话音突峰期开始时适应性地调整播放时延将导致发送方静默 期的压缩和拉长;
然而,静默期的少量压缩和拉长在谈话中是不易觉察的。
从丢包中恢复:
前向纠错:
概述:
冗余传输
方案1:
每发送几个块之后发送一个冗余编码的块。这个冗余块通过异或"个初始块来获得[Shacham 1990]。
以这种方式,在这n + 1个分组的组中,如果任何一个分组丢失,接收方能够完全重建丢失的分组。但是如果这一组中有两个或更多分组丢失,接收方则无法重建丢失的分组。
缺点:
增加了播放时延,因为接收方在能够开始播 放之前,必须等待收到整个组的分组。
方案2:
发送一个较低分辨率的音频流作为冗余信息。例如,发送方可能创建一个标称的音频流和一个相应的低分辨率、低比特率的音频流。
(这个标称流可能是一个64kbps的PCM编码,而这个较低质量的流可能是一个13kbps的GSM编码。)
这个低比特率流被认为是冗余信息。
以这种方式,只要没有连续分组的丢失,接收方都可以通过播放和后续分组一起到达的低比特率编码块来隐藏丢失。
当然,低比特率块比标称块的质量要低。然而,在一个流主要是由高质量块组成、偶尔出现低质量块并且没有丢失的块的情况下,其整体的音频质量良好。
优点:
接收方在播放前只需接收两个分组,因此增加的时延小。
此外,如果低比特率编码比标称编码少 得多,那么传输速率的额外增加并不大。
交织:
概述:
发送方在传输之前对音频数据单元重新排序,使得最初相邻的单元在传输流中以一定距离分离开来。交织可以减轻丢包的影响(丢包的块分散开,感觉不到)
交织能够明显地提高音频流可感觉到的质量。它的开销也较低。
缺点:
增加了时延。这限制了它在如VoIP这样的会话式应用中的使用,然而它能够很好地处理流式存储音频。交织的一个主要优点是它不增加流的带宽需求。
差错掩盖:
概述:
差错掩盖方案试图为丢失的分组产生一个与初始分组类似的替代物。
常用方案:
分组重复。即用在丢失之前刚到达的分组的副 本来代替丢失的分组。
内插法,使用在丢失之前和之后的音频内插形成一个合适分组来隐藏丢失。
实时会话式应用的协议:
RTP:
概述:
RTP通常运行在UDP之上。发送端在RTP分组中封装媒体块,然后在UDP报文段中封装该分组,然后将该报文段递交给IP。
接收端从UDP报文段中提取岀这个RTP分组,然后从RTP分组中提取出媒体块,并将这个块传递给媒体播放器来解码和呈现。
SIP:
概述:
会话发起协议(Session Initiation Protocol, SIP)
协议内容:
提供了在主叫者和被叫者之间经IP网络创建呼叫的机制。它允许主叫者通知 被叫者它要开始一个呼叫。它允许参与者约定媒体编码,也允许参与者结束呼叫。
提供了主叫者确定被叫者的当前IP地址的机制。
因为用户可能动态地分配到地址 (使用DHCP),而且因为它们可能有多个IP设备,每个都有一个不同的IP地址, 所以用户不具有单一的、固定的IP地址。
提供了用于呼叫管理的机制,这些机制包括在呼叫期间增加新媒体流、在呼叫期 间改变编码、在呼叫期间邀请新的参与者、呼叫转移和呼叫保持等
SIP地址:
用户定位:
将该报文发送给一个SIP代理(SIP proxy)。该代理将以一个SIP回答来响应,该回答中也可能包含目标正在使用的设备的IP地址。
每个SIP用户都有一个相关联的注册器。任何时候用户在设备上发起SIP应用时,该应用给注 册器发送一个SIP注册报文,通知注册器它现在的IP地址。
支持多媒体的网络:
尽力而为服务:
公平处理所有流量,偶然出现丢包和过大的端到端时延。当预见到需求增加,ISP部署额外的带宽和交换能力以持续确保满意的时延和丢包性能。
区分服务:
当两类 流量在一台路由器中排队时,一种类型的流量可以给定严格的优于另一种类型的流量的优先权。
在网络中引入区分服务将要求一些用于分组标记 (指示一个分组的服务类型)、分组调度和其他方面的新机制。
标记分组:
使得路由器区分属于不同类型流量的分组。
流量隔离:
调度机制:
漏桶
漏桶+加权公平排队=队列中可证明的最大时延
区分服务:
边界功能:分组分类和流量调节。
核心功能:转发。
每连接服务质量(QoS)保证:
概述:
首先,我们需要一个协议来代表应用程序,从发送方到其接收方沿路径预约链路带 宽。
第二,在路由器队列中将需要新的调度策略,使每连接带宽预约能够兑现。
最后,为了进行预约,应用程序必须向网络给出描述来说明它们希望发送进网络 的流量,并且网络将需要监管每个应用程序的流量以确保它遵守这个描述。
资源预约:
为了满足一个呼叫所希望的QoS,确保它具有所需的资源(链路带宽、 缓存)的唯一方法是显式地为该呼叫分配这些资源
呼叫准入:
需要为流提供有保证的QoS就需要流来申告它的QoS需求。让流申告它的QoS需求,然后让网络接受该流(以所要求的QoS)或者阻塞该流的过程
其他知识:
跨域问题:
同源策略:
概述:
同源策略是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
同源策略限制以下几种行为:
Cookie、LocalStorage 和 IndexDB 无法读取
DOM和JS对象无法获得
AJAX 请求不能发送
同源策略仅是针对浏览器的安全策略。服务器端调用HTTP接口只是使用HTTP协议,不需要同源策略,也就不存在跨域问题。
什么是跨域:
在前端领域中,跨域是指浏览器允许向服务器发送跨域请求,从而克服Ajax只能同源使用的限制。
form表单不存在跨域,原页面得脚本无法获取新页面中得内容,提交的form表单数据不需要返回,所以浏览器认为是安全的行为。而ajax我们需要返回的数据,浏览器认为不安全,所以会阻止这个请求行为。
解决方案:
1.JSONP跨域
原理:
就是利用<script>标签没有跨域限制,通过<script> 标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。
缺点:
只能发送get一种请求。
2.跨域资源共享(CORS)
概述:
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
浏览器将CORS跨域请求分为简单请求和非简单请求。
简单请求:
概述:
只要同时满足一下两个条件,就属于简单请求
(1)使用下列方法之一:
head
get
post
(2)请求的Heder是
Accept
Accept-Language
Content-Language
Content-Type: 只限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain
如何解决:
浏览器每次请求会带着一个Origin头信息字段
server只需增加响应头:
Access-Control-Allow-Origin: *
非简单请求:
概述:
不同时满足上面的两个条件,就属于非简单请求。浏览器对这两种的处理,是不一样的。
预检请求:
非简单请求会发出一次OPTION预检测请求。
除了Origin字段,"预检"请求的头信息包括两个特殊字段:
(1)Access-Control-Request-Method
该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。
(2)Access-Control-Request-Headers
该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header。
服务器响应:
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "myheader");
可选Access-Control-Max-Age,用来指定本次预检请求的有效期,单位为秒。在此期间,不用发出另一条预检请求。
正常请求:
一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。(无其他字段)
服务器响应:
返回Access-Control-Allow-Origin header即可
如何解决:
服务针对options请求返回,比如定义filter单独处理options请求。针对正常请求,返回响应头。
springboot:
使用注解@CrossOrigin("*")添加config支持跨域
springboot源码:
springboot底层接收options请求的是PreFlightHandler,判断是否配置了CorsConfig,比如Access-Control-Allow-Origin等,否则返回403
PreFlightHandler通过getCorsHandlerExecutionChain中的new HandlerExecutionChain(new AbstractHandlerMapping.PreFlightHandler(config), interceptors)生成handler。
3.nginx代理跨域
概述:
nginx代理跨域,实质和CORS跨域原理一样,通过配置文件设置请求响应头Access-Control-Allow-Origin…等字段。
nginx配置解决iconfont跨域:
浏览器跨域访问js、css、img等常规静态资源被同源策略许可,但iconfont字体文件(eot|otf|ttf|woff|svg)例外,此时可在nginx的静态资源服务器中加入以下配置。
location / {
add_header Access-Control-Allow-Origin *;
}
4.nodejs中间件代理跨域
node中间件实现跨域代理,原理大致与nginx相同,都是通过启一个代理服务器,实现数据的转发,也可以通过设置cookieDomainRewrite参数修改响应头中cookie中域名,实现当前域的cookie写入,方便接口登录认证。
5.document.domain + iframe跨域
该方式只能用于二级域名相同的情况下,比如a.test.com和b.test.com适用于该方式。 只需要给页面添加document.domain ='test.com’表示二级域名都相同就可以实现跨域。
6.location.hash + iframe跨域
实现原理: a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。
具体实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域,所以c可通过parent.parent访问a页面所有对象。
7.window.name + iframe跨域
window.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。
通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。
8.postMessage跨域
postMessage是HTML5 XMLHttpRequest Level 2中的API,且是为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题:
页面和其打开的新窗口的数据传递
多窗口之间消息传递
页面与嵌套的iframe消息传递
上面三个场景的跨域数据传递
9.WebSocket协议跨域
原理:这种方式本质没有使用了 HTTP 的响应头, 因此也没有跨域的限制。
10.浏览器开启跨域
CSRF攻击:
概述:
用户登陆了要攻击的网站A,同时点击了恶意链接(网站B),发送了跨域请求(表单(浏览器允许)或者js请求(浏览器不允许,但是简单请求会发送过去,只是不能返回))
发送请求的时候带上了cookie,网站A根据用户的Cookie信息以用户的权限处理该请求,导致来自网站B的恶意代码被执行
为什么能带上其他域名的cookie?
cookie也是受到同源策略限制的,两个不同源的网站其中一个应该是不会让另一个获得自己的cookie的,那为什么CSRF攻击仍然有效?
浏览器使用 cookie 情况主要包括以下几点:
1.除了跨域 XHR 请求情况下,浏览器在发起请求的时候会把符合要求的 cookie 自动带上 (涉及:域名,有效期,路径,secure 属性)
2.跨域 XHR 的请求的情况下,也可以携带 cookie
3.浏览器允许跨域提交表单
同源策略的作用:
如果没有同源策略CSRF会更猖狂,但是同源策略阻止不了CSRF,同源策略确实是会拦截某些(不是全部)请求后的HTTP回复(而不是禁止请求执行),
有些请求是可以跨域且附带cookie的,还有些情况下你啪的一下子请求成功发出去了,这次的攻击就完成了,后端程序已经执行了,是否有回复已经不重要了
防御措施:
1.Referer: HTTP请求完整来源路径(不完善)
针对通过Referer 字段去判断请求来源是否合法是不太靠谱的,这个字段很有可能会丢失。
a.IE6、7下使用 window.location.href=url 进行界面的跳转或者 window.open,都会造成 Referer 丢失。
b.HTTPS 页面跳转到 HTTP 页面,所有浏览器 Referer 都丢失。
c.点击 Flash 上到达另外一个网站的时候,Referer 的情况就比较杂乱,不太可信。
可以附加使用于判断请求来源,但是仅通过该字段进行判断是不太靠谱的,如果请求头丢失该字段,则服务端无法判断当前请求来源,无法校验请求是否合法。
2.Origin: CORS 中的请求头,当跨域访问时,会携带此请求头(不完善)
在以下情况不存在此请求头。
302 重定向:
1.在 302 重定向之后 Origin 不包含在重定向的请求中,因为 Origin 可能会被认为是其他来源的敏感信息。
2.对于 302 重定向的情况来说都是定向到新的服务器上的 URL,因此浏览器不想将 Origin 泄漏到新的服务器上。
Origin 和 Referer 存在相同的问题,同样有可能丢失该字段。
3.token 校验(常用方式)
校验原理:
a.后端生成 token,并存在 session 中。
b.用户请求成功后,后端将 token 发送到客户端,发送方式主要是为以下两种:
(1)服务端将 token 渲染到 html 中。也就是通过一个 dom 结点保存 token 信息,客户端就可以通过 dom 操作获取到该 token 内容。(同源策略会限制脚本 API 操作)
(2)服务端将 token 设置到 cookie 中。客户端从 cookie 中获取(同源策略限制 cookie 操作)
c.客户端在获取到 token 后,在下一次进行比较关键的请求操作时,将 token 发送到服务端。发送 token 到服务端的方式主要包括两种:
(1)在请求头中将获取到的 token 设置到 cookie 中。
(2)将 token 放到请求参数中。
d.服务端在接收到请求后,会从请求头中取出 token,并和 session 中的 token 进行比较,一致则表示身份验证通过,再返回相应的信息;否则,则校验不通过。
关于同源策略:
token 校验之所以能防御 csrf,是因为相信浏览器的同源策略。
因为只有在同源的情况下,页面才能进行脚本操作和使用 js 获取 cookie 的操作,才能获取到 token。也就是说第三方网站是没有办法拿到 token 的。
只有真正有权限的网站或页面才有办法取到 token,并将 token 传到服务端。所以服务端默认带有相应 token 的请求都是合法的请求。
非同源的情况下:
无法查看页面元素,也就无法通过js拿到token。
CSRF最多也就是通过浏览器自动带上符合条件的cookie,但是无法操作cookie来获取token并加进HTTP请求的参数中,所以伪造的请求携带不了token。
4.samesite
此属性专门为了防止CSRF,有三个值:Strict、Lax、None
Strict:
最严格,完全禁止第三方cookie ,跨站时任何情况下都不会发送cookie,只有同站请求允许携带cookie
Set-Cookie: CookieName=CookieValue; SameSite=Strict;
Lax:
一般严格,大多数情况下不发送第三方cookie,导航到目标网址的GET请求除外,导航到目标网址的GET请求只包括三种情况:链接、预加载请求、GET表单,
即除了同站请求允许携带cookie之外也有特定的情况允许携带cookie
Set-Cookie: CookieName=CookieValue; SameSite=Lax;
附带Strict与Lax之后,基本可以杜绝CSRF
None:
关闭samesite属性(前提是必须同时设置Secure属性,否则无效),同站跨站请求都可以携带cookie
Set-Cookie: widget_session=abc123; SameSite=None; Secure
5.验证码
思路与token类似,发送请求之前需要用户输入基于服务端判断的某种验证码。
这东西强制了用户搞一个人机智障交互后,判断成功了,才能实现正常的请求,很粗暴很有效
这东西说到底是个辅助的二次验证防御手段,如果每次每种操作都有验证码,体验极差,用户直接原地爆炸,不然就是开发者要爆炸
在提交表单或者GET请求的地方,非静态操作处,凡是没有用户进行二次验证或没有token的地方大概率存在csrf漏洞