精华内容
下载资源
问答
  • windows7知识点总结
    千次阅读
    2020-07-23 15:04:41

    1、Windows简介

    Microsoft公司从1983年开始研制Windows系统,最初的研制目标是在MS-DOS的基础上提供一个多任务的图形用户界面。第一个版本的Windows 1.0于1985年问世,它是一个具有图形用户界面的系统软件。1987年推出了Windows 2.0版,最明显的变化是采用了相互叠盖的多窗口界面形式。但这一切都没有引起人们的关注。直到1990年微软推出Windows 3.0成为一个重要的里程碑,它以压倒性的商业成功确定了Windows系统在PC领域的垄断地位,现今流行的Windows窗口界面的基本形式也是从Windows3.0开始基本确定的。1992年主要针对Windows 3.0的缺点推出了Windows 3.1,为程序开发提供了功能强大的窗口控制能力,使Windows和在其环境下运行的应用程序具有了风格统一、操纵灵活、使用简便的用户界面。Windows3.1在内存管理上也取得了突破性进展。它使应用程序可以超过常规内存空间限制,不仅支持16MB内存寻址,而且在80386及以上的硬件配置上通过虚拟存储方式可以支持几倍于实际物理存储器大小的地址空间。Windows 3.1还提供了一定程度的网络支持、多媒体管理、超文本形式的联机帮助设施等,对应用程序的开发有很大影响。1

    Windows系列

    Windows采用了图形化模式GUI,比起从前的Dos需要输入指令使用的方式更为人性化。随着计算机硬件和软件的不断升级,微软的 Windows也在不断升级,从架构的16位、32位再到64位,系统版本从最初的 Windows 1.0到大家熟知的 Windows 95、 Windows 98、 Windows 2000、 Windows XP、 Windows Vista、 Windows 7、Windows 8、Windows 8.1、Windows 10。微软一直在致力于Windows操作系统的开发和完善。2

    1.Windows 1.0

    Microsoft Windows 1.0是Windows系列的第一个产品,于1985年开始发行。当时很多人认为Windows 1.0只是一个低劣的产品。当时最好的GUI电脑平台是GEM。另外一个选择是Desqview/X。Windows 1.0中鼠标作用得到特别的重视,用户可以通过点击鼠标完成大部分的操作。Windows 1.0 自带了一些简单的应用程序,包括日历、记事本、计算器等等。总之,刚诞生的Windows 1.0,总会让人感到它像是一个PDA,甚至可能功能还赶不上PDA,不过这在Windows 1.0诞生时已经相当吸引人了。Windows 1.0的另外一个显著特点就是允许用户同时执行多个程序,并在各个程序之间进行切换,这对于DOS来说是不可想象的。Windows 1.0 可以显示256种颜色,窗口可以任意缩放,当窗口最小化的时候桌面上会有专门的空间放置这些窗口(其实就是现在的任务栏)。 在Windows 1.0中已经出现了控制面板(Control Panel),对驱动程序、虚拟内存有了明确的定义,不过功能非常有限。3

    2.Windows 2.0

    1987年12月9日,Windows 2.0发布,最初售价为100美元;是一个基于MS-DOS操作系统、看起来像Mac OS的微软Windows图形用户界面的Windows版本。但这个版本依然没有获得用户认同。之后又推出了Windows 386和Windows 286版本,有所改进,并为之后的Windows 3.0的成功作好了技术铺垫。并且具有比Windows 1.0更多的功能。3
    在Windows 2.0中,用户不但可以缩放窗口,而且可以在桌面上同时显示多个窗口(也就是现在的层叠模式),而在Windows 1.0中屏幕上不能同时显示多个窗口,打开一个窗口时其他窗口必须最小化。Windows 2.0的另外一个重大突破是在1987年的年底,微软为Windows 2.0增加了386扩展模式支持,Windows第一次跳出了640 K基地址内存的束缚,更多的内存可以充分发挥Windows的优势。3

    3.Windows 3.0

    1990年5月22日, Microsoft迎来了第一个具有时代意义的作品— Windows 3.0,虽然很多人更愿意将 Windows 3.1作为Microsoft跨时代的作品,但毕竟 Windows 3.0是 Windows 3.x系列的起点,假如没有 Windows 3.0的成功,也不会有更多人对后续产品的关注。 Windows 3.0的主要特点有:具备了模拟32位操作系统的功能,图片显示效果大有长进,对当时最先进的386处理器有良好的支持;提供了对虚拟设备驱动(VxDs)的支持,极大改善了系统的可扩展性;用户界面和运行环境得到了很大的改进,系统开始支持16位色,DOS的文件管理程序被基于图标的程序管理器以及基于列表的文件管理器所取代;简化了程序的启动,打印管理器也诞生了,控制面板成为系统设置的核心;模仿了苹果公司 Macintosh的设计,使用一些新的图标;开发了 Software Development Kit(SDK)来帮助硬件厂商开发驱动程序,使操作系统能与硬件完美结合。3
    1992年4月,一个更为成熟的版本 Windows 3.1诞生了。Windows 3.1添加了多媒体功能、CD播放器以及对桌面排版很重要的 True Type字体。次年发布的 Windows for Workgroups 3.11又引人了对网络的支持―包括以太网和当时如日中天的Novell netware,并利用对等网络的概念构建 Windows工作组网络。1994年 Windows3.2发布,这也是 Windows系统第一次有了中文版。由于消除了语言障碍,降低了学习门槛,因此在国内得到了较为广泛的应用。3

    4.Windows 95

    1995年8月24日,微软公司推出了Windows 95,它是第一个不要求先安装DOS的32位操作系统。Windows 95的大部分内核代码都重新改写,虽然仍有部分16位代码(如USER.EXE和GDI.EXE)存在于Windows 95之中,但大多数代码是32位的。Windows 95的大多数I/O操作、存储管理和进程管理是保护模式的。但所有的Windows 95系统都先以实模式方式引导,以便有机会装载旧的设备和网络驱动程序。其文件系统还承担着一定数量的实模式管理任务,以便将重要的系统事件通知1日的应用程序。Windows 95具有全新的图形川户界面,提高了用户的可学性、可用性和高效率。Windows 95支持多达255个字符的文件名和扩展名,而在DOS提示符下又可转换成8.3规则的别名以保持兼容性。Windows 95自身的32位Windows应用程序接口(Win32)能使应用程序得到更快的响应,能更快地处理CPU密集的任务。Windows 95不需要利用DOS或进入实模式来访问磁盈,使得运行频繁的I/O程序仍具有很高的效率。Windows 95采用优先级多任务使运行的几个应用程序更平滑,系统反应更迅速。其线程允许一个应用程序在自身范围内进行多任务处理,使得响应更加迅速。Windows 95将32位的OLE集成为系统的一部分,性能有了极大的提高。Windows 95还集成了网络的连接和管理,其连接特性也从LAN扩展到了拨号访问。它还支持TCP/IP结构和PnP技术。4

    5.Windows 98

    1998年6月25日发布的Windows 98是Windows 95的改进版。Windows 98中集成了Intemet Explorer 4.0。Windows 98具有Web集成和活动桌面,增加了频道等网络功能,Windows 98采用FAT32文件系统,并提供FAT32转换工具,Windows 98支持ACPI电源管理、USB总线,IEEE1394总线和AGP总线。它同时支持DVD功能,DirectX是Windows 98中增强多媒体功能的实用程序。4

    6.Windows 98 SE

    Windows 98 SE(第二版)发行于1999年5月5日。它包括一系列改进,如Internet Explorer 5、Windows Netmeeting 3、Internet Connection Sharing、对DVD-ROM和对USB的支持。另外98SE的核心部分比Windows 98多支援了影音流媒体接收能力,以及5.1声道支持。

    7.Windows ME

    2000年9月14日微软公司发布Windows ME( Windows Millennium Edition,简称Windows ME),Windows ME是在Windows 9X的基础上开发的,主要针对的是家庭和个人用户,Windows ME重点改进了对多媒体和硬件设备的支持,但同时也加入了不少在Windows 2000上拥有的新概念。主要增加的功能包括系统恢复、UPnP即插即用、自动更新等。由于Windows ME的稳定性和可靠性较差,相当多的1日Dos程序无法在Windows ME上运行。相比其他版本的Windows系统,Windows ME只延续了短短一年,就被Windows XP取代了。4

    8.Windows NT

    Windows NT是基于OS/2 NT的基础编制的。OS/2是由微软和IBM联合研制,分为微软的Microsoft OS/2 NT与IBM的IBM OS/2。由于种种原因,协作后来不欢而散,IBM继续向市场提供先前的OS/2版本,而微软则把自己的OS/2 NT的名称改为Windows NT,即第一代的Windows NT 3.1(1993年8月31日发布)。Windows NT是纯32位操作系统,采用先进的NT核心技术,NT即新技术(New Technology)。1996年4月发布的Windows NT 4.0是NT系列的一个里程碑,该系统面向工作站、网络服务器和大型计算机,它与通信服务紧密集成,提供文件和打印服务,能运行客户机/服务器应用程序,内置了Internet/Intranet功能。4
    Windows NT具有以下特点:
    (1) 32位操作系统,多重引导功能,可与其他操作系统共存。4
    (2) 实现了“抢先式”多任务和多线程操作。4
    (3) 采用SMP(对称多处理)技术,支持多CPU系统。4
    (4) 支持CISC(如Intel系统)和RISC(如Power PC、R4400等)多种硬件平台。4
    (5) 可与各种网络操作系统实现互操作,如真INIX、Novel Netware、Macintosh等系统;对客户操作系统提供广泛支持,如MS-DOS、Windows、Windows NT Workstation、urNX、OS/2、Macintosh等系统:支持多种协议,如TCP /IP、NetBEUI、DLC、AppleTalk、NWLINK等。4
    (6) 安全性达到美国国防部的C2标准。4

    9.Windows 2000

    Microsoft Windows 2000是沿袭微软公司Windows NT系列的32位视窗操作系统,是Windows操作系统发展的一个新里程碑。Windows 2000起初称为Windows NT 5.0。它的英文版于1999年12月19日上市,中文版于次年2月上市。Windows 2000是一个先占式多任务、可中断的、面向商业环境的图形化操作系统,为单一处理器或对称多处理器的32位Intelx86电脑而设计。它的客户机版本(Professional版本)在2001年l0月被Windows XP所取代;而服务器版本则在2003年4月被Windows Server 2003所取代。4

    10.Windows XP

    Windows XP是Microsoft公司于2001年10月发布的一款操作系统。它不再采用微软公司一贯的以年份命名的方式(如先前的Windows 95、Windows 98和Windows 2000),而是以一个全新的名字WindowsXP来命名这款全新的操作系统。按照微软公司的解释,XP是experience的缩写,旨在在全新技术和功能的引导下,让使用者拥有更加丰富而广泛的全新计算机使用体验,感受科技带来的乐趣。
    Windows XP是个人计算机的一个重要里程碑,它集成了数码媒体、远程网络等最新的技术规范,还具有很强的兼容性,外观清新美观,能够带给用户良好的视觉享受。Windows XP产品功能几乎包含了所有计算机领域的需求。同时,根据不同用户的需求,Windows XP又包括了多个版本。其中最为常见的是针对个人用户的家庭版Windows XP Home Edition和针对商业用户的专业版Windows XP Professional。家庭版的消费者是家庭用户,专业版则在家庭版的基础上添加了新的面向商业而设计的网络认证、双处理器等特性。

    11.Windows Vista

    2005年7月22日,微软宣布 Windows Vista 为这款新操作系统的名字。微软于2006 年11月2日完成GA版本,向OEM和企业用户发布。2007年1月30日,正式向普通用户出售,这是Windows 历史上间隔时间最久的一次发布。

    Windows Vista较上一个版本Windows XP增加了上百种新功能,其中包括被称为“Aero”的全新图形用户界面、关机特效、加强后的搜索功能(WindowsIndexing Service)、新的媒体创作工具(例如Windows DVD Maker)以及重新设计的网络、音频、输出(打印)和显示子系统。Vista也使用点对点技术(Peer-to-peer)提升了计算机系统在家庭网络中的显示通信能力,将让在不同计算机或装置之间分享文件与多媒体内容变得更简单。针对开发者的方面,Windows Vista使用.NET Framework 3.0版本,比起传统的Windows API更能让开发者能简单写出高品质的程序。微软也在Vista的安全性方面进行改良,Vista较Windows XP增加了用户管理机制(UAC)以及内置的恶意软件查杀工具(Windows Defender)等。

    12.Windows 7

    2009年10月,微软公司推出了Windows 7,核心版本号为Windows NT 6.1。Windows 7可供家庭及商业工作环境、笔记本电脑、平板电脑、多媒体中心等使用。Windows 7先后推出了简易版、家庭普通版、家庭高级版、专业版、企业版等多个版本。Windows 7的启动时间大幅缩减,增加了简洁的搜索和信息使用方式,改进了安全和功能合法性,使用Aero效果更显华丽和美观。5

    13.Windows 8

    2012年10月26日,微软正式推出Windows 8。Windows 8是由微软公司开发的具有革命性变化的操作系统。该系统旨在让人们的日常电脑操作更加简单和快捷,为人们提供高效易行的工作环境。Windows 8支持个人电脑(X86构架)及平板电脑(X86构架或ARM构架)。Windows 8大幅改变以往的操作逻辑,提供更佳的屏幕触控支持。新系统画面与操作方式变化极大,采用全新的Metro风格用户界面,各种应用程序、快捷方式等能以动态方块的样式呈现在屏幕上,用户可自行将常用的浏览器、社交网络、游戏、操作界面融入。5

    14.Windows 8.1

    Windows 8.1是微软公司在2012年10月推出Windows 8之后,着手开发的 Windows 8更新。在代号为“Blue”的项目中,微软将实现操作系统升级标准化,以便向用户提供更常规的升级。Windows 8.1 具有承上启下的作用,为Windows 10铺路。

    15.Windows 10

    2015年7月29日,美国微软公司正式发布计算机和平板电脑操作系统Windows 10。6
    2014年10月1日,微软在旧金山召开新品发布会,对外展示了新一代Windows操作系统,将它命名为“Windows 10”,新系统的名称跳过了数字“9”。2015年1月21日,微软在华盛顿发布新一代Windows系统,并表示向运行Windows 7、Windows 8.1以及Windows Phone 8.1的所有设备提供,用户可以在Windows 10发布后的第一年享受免费升级服务。 2月13日,微软正式开启Windows 10手机预览版更新推送计划。 3月18日,微软中国官网正式推出了Windows 10中文介绍页面。 4月22日,微软推出了Windows Hello和微软Passport用户认证系统,微软又公布了名为“Device Guard”(设备卫士)的安全功能。 4月29日,微软宣布Windows 10将采用同一个应用商店,即可展示给Windows 10覆盖的所有设备用,同时支持Android和iOS程序。 7月29日,微软发布Windows 10正式版。6

    Windows Server

    Windows系列网络操作系统先后推出了多个版本,每个版本都有其独有特点和范围。

    1.Windows NT4.0 Server

    Windows server NT是 Microsoft公司1993年推出的32位网络操作系统,是向分布式图形应用程序的完整的交叉平台系统,可运行于nteX86、 Digital、 Alpha、SiliGraphics MIPS及 Power pc等主要计算机系统。7

    Windows server nt4.0网络操作系统与其他网络操作系统相比,有以下的特点:
    (1) 基于32位结构的操作系统,处理速度较快。7
    (2) 采用了流行的图形用户界面GUI。7
    (3) 提供较全面的网络管理工具。7
    (4) 通用性好,可以安装在不同的计算机上。这是因为 Windows server NT4.0除核是用汇编语言编写的以外,其他部分都是用C语言编写的,而C语言的通用性很好。同时 Windows server nt4.0用一系列的小模块来构筑某些底层部件,将依赖硬件的封装于一个动态链接库中,这样就可以做到与应用程序隔离,应用程序则通过一个接口与 Windows server NT4.0相连。7
    (5) 支持FAT和NTFS两种文件系统,保证了 Windows server NT4.0与以前的操统的兼容性。7
    (6) 具有较高的安全性,能够控制用户对网络的访问。7
    (7) 集成了多种传输协议,因此它可以与其他网络操作系统共同组网。7

    2.Windows Server 2003

    Windows server 2003是 Windows server NT4.0的后续版本,它继了 Windows server NT和 Windows server 95/98的优点,并且增加了许多新的功能,这使得它的实用性、靠性、安全性和网络功能等方面都得到了加强,适应了信息技术发展和应用的需要。7

    3.Windows Server 2008

    Windows server 2008是微软开发的一个服务器操作系统。 Windows server 2008是一套相当于 Windows Vista的服务器系统,两者有很多相同功能,使用 Windows server 2008,管理员对服务器和网络基础结构的控制能力更强Windows server 2008通过加强操作系统和保护网络环境提高了安全性。通过加快系统的部署与维护,使服务器和应用程序的合并与虚拟化更加简单, Windows server 2008任何组织的服务器和网络基础结构奠定了最好的基础。7

    4.Windows Server 2008 R2

    Windows Server 2008 R2是一款服务器操作系统。同2008年1月发布的Windows Server 2008相比,Windows Server 2008 R2继续提升了虚拟化、系统管理弹一个强项。并强化Power Shell对各个服务器角色的管理指令。Windows Server 2008 R2是第一个只提供64位版本的服务器操作系统。

    5.Windows Server 2012

    Windows Server 2012是微软于2012年9月4日发布的服务器系统。它是Windows 8的服务器版本,并且是Windows Server 2008 R2的继任者。它可向企业和服务提供商提供可伸缩、动态、支持多租户以及通过云计算得到优化的基础结构。Windows Server 2012包含了大量的更新以及新功能,通过虚拟化技术、Hyper-V、云计算、构建私有云等新特性,让 Windows Server 2012 变成一个无比强大且灵活的平台。8

    6.Windows Server 2012 R2

    Windows Server 2012 R2是微软的服务器系统,是 Windows Server 2012 的升级版本。Windows Server 2012 R2 功能涵盖服务器虚拟化、存储、软件定义网络、服务器管理和自动化、Web 和应用程序平台、访问和信息保护、虚拟桌面基础结构等。

    7.Windows Server 2016

    Windows Server 2016是微软于2016年10月13日正式发布的最新服务器操作系统。是基于Win10 1607(LTSB)内核所开发。虽然在Windows Server 2016系统中,微软官方发布了许多Windows Server 2016新的功能和特性,但是Windows Server 2016在用户组策略功能上却与以前的系统版本没有大的变化。尽管微软公司有可能在Windows Server 2016和Windows 10中引入一些特殊的组策略功能,但是整个Windows Server 2016组策略架构仍没有改变。

    8.Windows Server 2019

    Windows Server 2019是微软于2018年11月13日发布的新一代Windows Server服务器操作系统,基于Win10 1809(LTSC)内核开发而成。Windows Server 2019进一步融合了更多云计算、大数据时代的新特性,包括更先进的安全性,广泛支持容器基础,原生支持混合云扩展,提供低成本的超融合架构等方面。
    在Windows Server 2019中,加入了混合云场景,可以通过Project Honolulu将现有的Windows Server部署连接到Azure服务。客户能够轻松集成Azure备份,Azure文件同步,灾难恢复等Azure服务,从而能够在不中断其应用程序和基础架构的情况下利用这些Azure服务。
    在安全方面,在Windows Server 2019中,屏蔽虚拟机现在支持Linux虚拟机。Windows Server 2019还嵌入了Windows Defender高级威胁防护(ATP),提供预防性保护,检测攻击和零日攻击等功能。
    在应用平台方面,Windows Server 2019带来了Windows Server容器和Linux上的Windows子系统(WSL)的改进。
    Windows Server 2019还引入了超融合基础设施(HCI),通过增加规模,性能和可靠性来构建此平台。还增加了在檀香山项目中管理HCI部署的能力,以简化HCI环境中的管理和日常活动。9

    Windows移动版

    众所周知,Windows在个人计算机领域是普及度很高的操作系统。当计算机的体积不断变小,发展成掌上电脑的形态时,Windows系统自然电延伸到这类便携式产品的领域。然而,掌上电脑在续航能力、显示屏幕、输入界面等方面与普通的PC还是有很大差别的,考虑功耗和用户使用习惯等方面的因素,Windows系统针对手持设备的特点进行了多次调整和优化,先后形成了Windows CE,Windows Mobile,Windows Phone等移动版本的系统。10

    早期的Windows移动版本系统并未充分考虑智能手机的特点,更多的是从掌上电脑的角度在设计系统。例如,开始菜单虽然在PC上早已为人们所习惯和熟知,但将开始菜单放到手机屏幕上使用时,层层展开的菜单在狭小的屏幕上会让用户很难找到自己所需要的程序。因此,当微软充分认识到移动互联网的发展潜力后,Windows针对智能手机系统的各种设计才逐渐朝着扁平化的风格演变,其中一个特色就是动态磁贴的概念。10

    Windows Mobile是Microsoft为手持设备推出的“移动版Windows”,使用Windows Mobile操作系统的设备主要有智能手机、个人数字终端、随身音乐播放器等。Windows Mobile的前身为20世纪末推出的Windows CE,后又于2003、2005年分别推出Windows Mobile 2003和Windows Mobile 5.0。2007年推出的Windows Mobilc 6.5。11

    Windows Mobile采用了用户熟悉的Windows桌面系统的操作界面,并将Microsoft -贯使用的媒体播放软件Windows Mcdia Player捆绑其中,因而支持其专有的DRM保护技术。同时,为了扩大Windows Mobile的市场份额。Microsofi推出了名为Windows MarketPlace的在线服务,用户可以通过在线方式下载获得丰富的运行于Windows Mobile之上的第三方应用软件,这无疑对吸引更多的用户具有明显的帮助作用。从DRM技术领域看,Windows Mobilc有可能加剧移动DRM的市场分化,甚至形成OMA DRM与Microsoft分庭抗礼的局面。11

    目前,虽然Windows Mobile和Windows Phone系统凭借Windows系统在桌面计算领域的优势,以及其办公软件Office多年培养起来的庞大用户群体和操作习惯,一直试图在移动计算领域扩大份额。然而,决定一个系统生命力的是应用程序的数量和质量,在这一点上,Windows Phone系统似乎起步太晚了,如何将开发者和用户从已经较为成熟的安卓和iOS系统吸引到这个平台上来是WP面临的最大挑战。Windows 10 Mobile是微软发布的最后一个手机系统。10

    2、Windows常见文件扩展名

    扩展名文件类型
    .exe可执行文件
    .bat批处理文件
    .pslpowershell 脚本文件
    .txt文本文件
    .docword文件
    .docm加载宏的 Word 文档
    .xml可扩展标记语音编写的文件
    .xlsExcel 文件
    .xlsm加载宏的 Microsoft Excel 文件
    .pptppt文件
    .ppa加载了宏的ppt文件
    .jpg图片文件
    .bmpWindows或OS/2位图文件
    .avi/rmvb/mp4视频格式文件
    .rar/zip压缩格式文件
    .aac/adt/adts音频文件
    .aif/aifc/aiff音频交换文件格式文件
    .bin二进制压缩文件
    .aspxASP.NET Active Server 页面
    .cdaCD 音频曲目
    .flv与 Flash 兼容的视频文件
    .gif图形交换格式文件
    .htm/html超文本标记语言页面
    .iso光盘映像文件
    .jarJava 体系结构文件
    .pptxPowerPoint 演示文稿文件
    .sldxPowerPoint 幻灯片文件
    .sldm加载宏的 Microsoft PowerPoint 幻灯片文件
    .sysMicrosoft DOS 和 Windows 系统设置和变量文件
    .tmp临时数据文件
    .vsdVisio 绘图
    .vsdm加载宏的 Microsoft Visio 绘图
    .vsdxVisio 绘图文件
    .vssVisio 模具
    .vssm加载宏的 Microsoft Visio 模具
    .vstVisio 模板
    .vstm加载宏的 Microsoft Visio 模板
    .wbkWord 备份文档
    .wmaMedia 音频文件
    .wmdMedia 下载文件
    .wmvMedia 视频文件
    .wmz/wmsMedia 皮肤文件
    .xlaExcel 加载项或宏文件
    .xllExcel 基于 DLL 的加载项
    .xltExcel 模板
    .xltm加载宏的 Microsoft Excel 模板

    3、Windows常用快捷键

    1.Ctrl+系列

    按键作用
    Ctrl+z撤销
    Ctrl+c复制
    Ctrl+x剪切
    Ctrl+v粘贴
    Ctrl+a全选
    Ctrl+↑将光标移动到上一段落起始处
    Ctrl+↓将光标移动到下一段落起始处
    Ctrl+d删除所选目标(文件、文件夹等),放到回收站
    Ctrl+f在任何大量文字网页或bai文档内等等,快速找到位置
    Ctrl+n新建窗口
    Ctrl+w关闭活动窗口
    Ctrl+Tab选项卡中向前移动
    Ctrl+Shift+Tab选项卡中向后移动
    Ctrl+数字(1~9)移动到第n个选项卡
    Ctrl+Shift+n新建文件夹
    Ctrl+Shift+Esc打开任务管理器
    Ctrl+Alt+Delete打开任务管理器

    2.Win+系列

    按键作用
    win打开或关闭“开始”菜单栏
    win+D显示桌面
    win+E打开文件资源管理器即我的电脑
    win+R打开“运行”对话框
    win+↑放大当前窗口
    win+↓缩小当前窗口
    win+←左侧屏幕最大窗口
    win+→右侧屏幕最大窗口
    win+Tab打开任务视图,按Tab实现转换
    win+F打开“文件查找”对话框
    win+L锁定电脑或切换账户
    win+M最小化所有窗口
    win+Shift+M将最小化的窗口还原到桌面
    win+U打开轻松访问中心/轻松访问
    win+U+U关机
    win+U+R重启
    win+U+S待机
    win+数字(1~9)打开任务栏中第n个应用

    3.Alt+系列

    按键作用
    Alt+ F4关闭当前程序
    Alt+Tab在桌面进行窗口切换
    Alt+Z切换自动换行
    Alt+ F打开文件菜单搜索
    Alt+ V打开视图菜单
    Alt+ O打开格式菜单
    Alt+ W关闭当前程序
    Alt+←返回
    Alt+ →前进

    4.Shitf+系列

    按键作用
    Shift+ F3切换字母大写
    Shift+ Spacebar (空格键)切换输入法半全角
    Shift+ Ctrl+ T还原上次关闭的标签页
    Shift+Del永久删除文件
    Shift+Ctrl+ T还原上次关闭的标签页
    Shift+Ctrl+ N新建文件夹
    Shift+ F10选中文件的右菜单
    Shift+Tab在选项之间往后移动

    4、Windows文件结构

    Windows目录的文件结构采用的是一种树形结构。树形结构指的是数据元素之间在“一对多”的关系数据结构,是一类重要的非线性数据结构。
    Windows目录树根节点为盘符,盘符常见包括(C、D、E)。A盘盘符为保留盘符,在Windows古老体系中用于3.5英寸软盘驱动器的使用,B盘盘符同样为保留盘符,用于5.25英寸软盘驱动器的使用。

    C盘常见文件夹

    1. Documents and Settings/用户

    Windows 7/10中的“用户”文件夹其实就是XP中的Documents and Settings文件夹,这里储存了用户的设置,包括用户文档、上网浏览信息、 配置文件等数据。
    默认情况下位于系统分区根目录下,下包括:
    Administrator All Users、Default User、用户文件夹等。All Users针对所有用户,这里的更改对所有用户有效, Administrator针对系统管理员账户。

    • 桌面
    • 开始菜单
    • Application Data:通用应用程序数据文件夹
    • Favorites:收藏夹
    • Local Settings:保存应用程序数据、历史和临时文件,可清理
    • My Documents:我的文档
      另外C盘还有以下文件,一般是隐藏状态
      Temp: 存放系统或其他软件临时文件,经常清理。
      hiberfil.sys: 系统的休眠功能所占用的硬盘空间的文件,不建议删除。
      .pagefile.sys: 虚拟内存页面文件,不建议删除。
      PerfLogs:Windows 7/10系统日志,记录如磁盘扫描错误等信息,没有必要删除。

    2. Program Files

    应用程序文件夹,- 般软件默认都安装在这里,也有一些系统自带的应用程序。在Windows7系统中,64位用户会多出一个Program Files (X86) 文件夹,这是系统中32位软件的安装录。
    Program Files和Program Files (x86)这两个录都是软件程序目录, -般来说,这个目录是存放安装软件的目录的。其中Program Files目录为64位程序默认安装目录, Program Files(x86)为32位程序默认安装目录。为什么32位的系统没有Program Files目录呢,因为Program Files默认就是当前位数系统的默认安装目录啦。
    那么,64位系统Program Files (x86)目录的作用是:没乱用,就是用来区分的位数的,但是不安装在这个目录也行。
    32位程序需要访问Program Files或者System32中的系统文件时,系统会自动转向到Program Files (x86)或者SysWoW64中。
    以64位软件为例,所有安装程序的默认的安装目录为C:\Program Files。

    3. Program Files常见文件夹

    • Common Files: 共用程序文件夹,于系列不同程序软件共同使用或调用数据,比如微软和Adobe的各种软件。
    • ComPlus Applications:微软COM +组件使用的文件夹,删除后可能|起COM+组件不能运行。
    • DIFX:DIFX是一种高效的XML索引方法,此文件夹与数据索引有关,不可以删除。
    • NstallShield Installation Information:专门存储安装程序信息的文件夹,用于某些程序的卸载和更新。
    • MSECache:MS Office运行时自动创建。
    • MSXML6.0:微软XML解析器程序的文件夹。
    • Microsoft FrontPage:FrontPage是微软推出的一款网页设计软件,此文件夹通常为空。
    • Movie Maker:系统自带的一款视频编辑软件。
    • Outlook Express:Outlook Express是Windows内置的邮件收发端,不用可删。
    • Online Services:网络服务文件夹,不能删。
    • Windows Media Player:系统自带的一款多媒体播放器。
    • Xerox:用作自带的一些图像处理软件的临时空间, 文件夹不能删除,但通常为空。

    4. Program Data

    Program Data目录位程序数据目录,这个目录是隐藏的,需要设置查看隐藏文件夹才能看到。这个目录也是垃圾文件的重灾区,很多程序的配置都在这儿,并且很多软件卸载后并没有删除配置,需要我们手动删除。
    目录有类似于{7F40DE3E-8294-4E24- B2EA-80F6C6BB173C}名字的文件,看起来不太友好,这个目录并不是所谓的病毒目录,这个是软件的唯一标示GUID,有些软件为了区分,会生成一个唯一的名称以保证唯一 性,那么这个目录,就是软件为区分同名软件所创建的唯一配置文件保存目录,且这个软件的注册表,很有可能也是这个名称。
    大部分的文件夹还是挺好识别的,比如Adobe目 录保存了常用的设计软件如PS,Al,AE等软件配置,Tencent保存了qq和微信等软件的配置。

    Windows系统文件夹

    Windows目录,就是我们的Windows安装目录了,用来放置程序的使用数据、设置等文件,不建议删除。这个录里面的东西是不能乱删除的,删除一个文件可能就会导致电脑无法启动了。
    在Windows目录中,我们可以看到熟悉的软件,你的桌面,其实是一个软件, 全名叫文件资源管理器,也就是explorer.exe, 我们如果结束这个程序的进程,可能你的桌面就消失了。还有regedit.exe,注册表编辑器,notepad.exe,记事本等系统程序。

    Windows系统临时目录

    临时文件目录隐藏的很深,我们很难找到,在C:\Users\当前用户\AppData\Local\Temp目录下,很多垃圾文件也会在此,包括使用压缩软件等解压的临时文件也在这儿。快捷打开这个目录,win+ R调出运行窗口,输入%tmp%, 回车,即呵打开。面的文件可以删除。


    1. 佚名.数字教育资源应用培训教程:云南大学出版社,2015.06:第60页。 ↩︎

    2. 王晓英等主编.计算机系统平台:中国铁道出版社,2016.08:第113页。 ↩︎

    3. 汤艳君主编.常见操作系统分析:群众出版社,2008.07:第2页。 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    4. 王化文,胡岚,李燕主编;陈奇,王智超,温静副主编.WINDOWS SERVER 2008网络构建与系统管理:武汉大学出版社,2011.09:第2页。 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    5. 杜根远,张火林编著.信息技术概论:武汉大学出版社,2015.09:第44页。 ↩︎ ↩︎

    6. 四年前的今天,微软正式发布Window 10 .新浪[引用日期2019-10-10]。 ↩︎ ↩︎

    7. 刘前主编;李博,刘永波,张竞艳副主编.计算机网络技术:国防工业出版社,2012.01:第172页。 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    8. 刘邦桂 .服务器配置与管理 Windows Server 2012:清华大学出版社,2017.7。 ↩︎

    9. 微软宣布Windows Server 2019正式商用(附新特性) .IT之家,Win10资讯[引用日期2020-01-14]。 ↩︎

    10. 陈乙雄,汪成亮,尹云飞主编.移动设备新技术简明教程:重庆大学出版社,2016.08:第16页。 ↩︎ ↩︎ ↩︎

    11. 张文俊,倪受春,许春明著.数字新媒体版权管理:复旦大学出版社,2014.06:第199页。 ↩︎ ↩︎

    更多相关内容
  • 多达77个知识点,都是一些大家非常实用的知识点,可以让你运用起来更加的得心应手.
  • 408 计算机网络 知识点总结

    千次阅读 多人点赞 2021-07-05 21:45:17
    我在准备21年408考研的过程中,根据王道考研书的内容和其它相关资料,将计算机网络的知识点总结如下。大家复制后可以根据自身需求增删知识点、打印成册以方便学习。其中一些公式和特殊符号无法显示,可以点击此处...

    我在准备21年408考研的过程中,根据王道考研书的内容和其它相关资料,将计算机网络的知识点总结如下。大家复制后可以根据自身需求增删知识点、打印成册以方便学习。其中一些公式和特殊符号无法显示,可以点击此处(csdn要积分)下载docx文件查看,也可以点这里下载(提取码:s2do)。

    第1章 计算机网络体系结构

    1.1 计算机网络的概述

    计算机网络的概念

    计算机网络的定义:多个独立的计算机通过通信线路和通信设备互连起来的系统,以实现彼此交换信息(通信)和共享资源的目的。

    计算机网络功能:(1) 数据通信 。(2) 资源共享 。(3)并行和分布式处理(数据处理)。(4)提高可靠性。(5)负载均衡。

    计算机网络的分类

    按网络的分布范围来分,网络可分为广域网WAN,城域网MAN,局域网LAN,个人区域网PAN。

    计算机网络基本网络拓扑结构有五种: 总线形、星形、树形、环形、网状形

    计算机网络按使用者分类,可分为公用网,专用网。

    计算机网络从逻辑功能上可以分为资源子网和通信子网。

    计算机网络的性能指标

    带宽

    时延 是衡量计算机网络性能的一个重要指标,数据经历的总时延一般是指 发送时延、传播时延、排队时延和处理时延

    吞吐量

    速率(数据率,比特率) :bit/s

    信道利用率

    1.2 计算机网络体系结构与参考模型

    网络体系结构:计算机网络的各个层次及其相关协议的集合,是对计算机网络所完成功能的精确定义。

    接口数据单元IDU、服务数据单元SDU、协议数据单元PDU以及他们之间的关系。

    协议

    网络协议:为主机与主机之间、主机与通信子网之间或子网中各通信节点之间的通信而使用的,是通信双方必须遵守的,事先约定好的规则、标准或约定。

    网络协议的三要素: 语法、语义、时序(同步)

    网络协议采用分层方式的优点:各层之间是独立的。灵活性好。结构上可分隔开。易于实现和维护。有利于标准化工作。

    协议族:协议栈,许多成员协议的集合。

    接口

    相邻实体间的通信是通过它们的边界进行的,该边界称为相邻层间的接口,每一层都定义了向它的相邻高层提供的一组服务。

    服务由服务访问点(SAP)提供上层使用,某一层的SAP就是上一层可以访问本层服务的地方,每个SAP都有一个唯一属于它的地址。服务访问点SAP:同一系统中相邻两层的实体进行交互的地方。

    服务

    服务原语主要分为:请求原语,指示原语,响应原语,证实原语。

    按是否面向连接可将服务分为面向连接和面向无连接的服务。

    面向连接的网络服务 :基于分组交换的虚电路方式。为数据传输建立一条虚电路,这条电路在整个数据传输过程中都是有效的,属于这次数据传输过程的所有包都将按顺序沿着这条电路传输。优点:顺序性、差错和流量控制,使用较少的协议控制信息。缺点:一旦连接建立,路由就不再具有灵活性。

    面向非连接的网络服务 :基于分组交换的数据报方式。每个包被当作一个独立的单元,不提供逻辑连接。优点:服务简单,不同路径并行传输。缺点:可靠性低,所需的额外开销大。不按顺序传输。

    面向连接和面向无连接的服务主要的区别有两条:其一,面向连接的服务进行数据传送分为三个阶段。其二,面向连接的通信具有数据的保序性,而面向无连接的通信不能保证接收数据的顺序与发送数据的顺序一致。

    OSI参考模型

    OSI参考模型的系统结构是层次,从底层到高层依次是 物理层、数据链路层、网络层、运输层、会话层、表示层和应用层

    1)物理层:实现透明地传送比特流。负责建立、保持和拆除物理链路;比特如何编码。传送单位是比特(bit)。

    2)数据链路层:实现无差错帧传送,包括把原始比特流分帧、排序、设置检错、确认、重发、流控等功能;负责建立、维护和释放数据链路;传送信息的单位是帧(frame)。

    3)网络层:实现分组传送,选择合适的路由器和交换节点,透明地向目的站交付发送站所发送的分组或包。传送的信息单位是分组或包(packet)。路由选择、拥塞控制与网络互连。

    4)传输层:实现端到端的数据发送,透明地传送报文(message)。

    5)会话层:为完成一个相对独立的统一任务而进行的双方按序传送报文和有关的非传送操作的过程。需要解决会话的顺序,同步问题,活动管理。会话层的功能是为进行通信的高层之间建立、维护一个会话连接,并对高层之间的通信进行同步控制。

    6)表示层:主要解决用户信息的语法表示问题。数据格式变换、数据加密与解密、数据压缩与恢复。

    7)应用层:解决应用的共性问题:包括应用基础和典型应用。

    TCP/IP参考模型

    TCP/IP参考模型有四层,每一层完成的主要功能和使用的主要协议如下:

    第一层: 网络接口层 ,对应于基本网络硬件,并规定了怎样把数据组织成帧及计算机怎样在网络中传输帧,这一层和各物理网络的具体实现有关,只要能够传输IP分组的任何协议都是允许的,如局域网MAC层协议Ethernet, Token Ring, 串行链路点点协议PPP等;

    第二层: 网际层 ,规定了互联网中传输的包格式及从一台计算机通过一个或多个路由器到最终目的地的包转发机制,主要解决路由选择、拥塞控制和网络互连等问题,使用的主要协议有IP(网际协议,用于传输IP分组,实现的是不可靠的无连接数据报服务),ICMP(网际控制报文协议,使用ICMP报文传送一些控制信息)等;

    第三层: 运输层 ,负责在源主机和目的主机的应用程序间提供端-端的数据传输服务,使用的主要协议有TCP(传输控制协议,提供可靠的端-端的字节流服务),UDP(用户数据报协议,一种简单的面向数据报的传输协议);

    第四层: 应用层 ,面向用户的各种应用,包含了所有的高层协议,常见的如文件传输协议FTP,虚拟终端协议TELNET, 简单邮件传输协议SMTP,域名系统DNS(负责域名解析),简单网络管理协议SNMP,访问WWW站点的超文本传输协议HTTP等。

    第2章 物理层

    2.1 通信基础

    数据通信系统可以分为源系统(信源),传输系统(信道)和目的系统(信宿)三大部分。

    在物理层,数据传输的基本单位是 比特 。在数据链路层,数据传输的基本单位是帧。

    信道带宽 :信道的发送和接受两端传输比特信号的最大速率称为信道的带宽。单位为赫兹Hz。

    信道容量 :单位时间内信道上所传输的最大比特数。单位为每秒比特数b/s。

    基带传输,宽带传输

    基带传输:利用数字通信信道直接传输数字信号的方法称为基带传输。适用于近距离传输。

    宽带传输:在数据通信技术中,利用模拟通信信道,通过调制解调器传输模拟数据信号的方法称为宽带传输。适用于远距离传输。

    从通信的双方信息交互的方式来看,可以有 单工通信,半双工通信和全双工通信 三种基本方式。

    码元传输速率

    信息传输速率

    奈奎斯特定理

    理想低通信道下的极限数据传输率(单位为b/s)

    香农定理

    信道的极限数据传输率(单位为b/s )

    信噪比(单位为dB)

    奈氏准则与香农公式在数据通信中的 意义 :奈氏准则与香农公式的意义在于揭示了信道对数据传输率的限制,只是两者作用的范围不同。奈氏准则给出了每赫带宽的理想低通信道的最高码元的传输速率是每秒2个码元。香农公式则推导出了带宽受限且有高斯白噪声干扰的信道的极限信息传输速率,其中W为信道的带宽(以赫兹为单位),S为信道内所传信号的平均功率,N为信道内部的高斯噪声功率。

    1) 数字数据编码为数字信号

    归零编码(RZ):

    非归零编码(NRZ):1为高电平,0为低电平

    反向非归零编码(NRZI):信号不变为1,信号翻转为零

    曼彻斯特编码 :1=负电压到正电压的跳变,0=正电压到负电压的跳变。信号变化发生在比特中间位置。

    差分曼彻斯特编码:

    以10011010为例

    在这里插入图片描述

    在这里插入图片描述

    4B/5B编码:

    2) 数字数据调制为模拟信号

    幅移键控ASK:

    频移键控FSK:

    相移键控PSK:

    正交振幅调制QAM QAM技术的数据传输率为(单位为b/s )

    #模拟信号传输的基础是载波,载波有三大要素,即振幅,频率和初相位。进行数据传输时,将数字信号转换成模拟信号的过程称为 调制

    3)模拟数据编码为数字信号

    采样: 采样频率必须大于等于最大频率的两倍

    量化

    编码

    4)模拟数字调制为模拟信号

    线路交换、报文交换和分组交换

    在现代通信过程中比较常见的交换技术有三种,他们分别是电路交换、报文交换和分组交换。

    电路交换 :一种有连接的交换方式

    报文交换 :携带目标地址和源地址等信息,无须建立连接

    分组交换 :线路利用率最高,且实时性好,时延比报文交换少,是当今计算机网络主要采用的方式。

    在这里插入图片描述

    常用的分组交换方法分为:数据报和虚电路

    1)数据报:无须连接,更适用于出错率高的线路

    2)虚电路:需要连接,虚电路中只需要提供虚地址就可以,并不需要目标地址

    虚电路有2种实现形式:交换虚电路和永久虚电路。

    在这里插入图片描述

    2.2 传输介质

    导向传输介质

    1)双绞线(非屏蔽UTP,屏蔽STP):

    2)同轴电缆:

    3)光纤:

    #光纤通信中,光纤按光束是否在光纤中全反射、在光纤中光经过的通路数不同可分为单模光纤和多模光纤。在常用的传输介质中,带宽最宽、信号传输衰减最小、抗干扰能力最强的一类传输介质是光缆。

    非导向传输介质

    无线传输介质:1)无线电波2)微波,红外线,激光。

    物理层接口的特性: 机械特性,电气特性,功能特性,规程特性

    2.3 物理层设备

    中继器 :物理层设备。用于扩展局域网的硬件设备,将信号放大并传输到另一个网段。中继器用于扩大广播域,放大信号。

    集线器 :一种特殊的中继器。简单的集线器可将总线型的连线方式改造为星型。复杂的集线器可以用做网桥或路由器的替代品减少网络拥塞。高级的集线器为FDDI、帧中继、ATM网络提供了非常高速的连通性。

    第3章 数据链路层

    3.1 数据链路层的功能

    数据链路层主要提供如下服务 功能 :线路规程(通信双方的协议),差错控制(发送-校验-应答的重发模式,控制和纠正错误),流量控制(防止发送端发送数据过快,造成数据丢失和信道拥挤)。

    数据链路层的必须解决的三个基本问题是 封装成帧、透明传输、差错检测

    流量控制 :一组过程,告诉发送方在等待接收方的应答之前,最多可以发送多少数据。流量控制的2个要点:(1)数据流不能使接收方过载。(2)应答。

    差错控制 :错误检测(CRC)和重传(ARQ)。 自动重传请求(ARQ) :即自动请求重发,当接收方接收到发送方的数据包后,如果发现数据传输出错,则返回一个否认响应,接收方根据该响应自动重发该数据包。数据重传的3种情况:帧破坏,帧丢失,应答丢失。

    3.2 组帧

    字符计数法

    在帧头部使用一个计数字段来标明帧内字符数。

    字符填充的首尾界定符法

    使用一些特定的字符来定界一帧的开始和结束,在信息位使用填充字符防止误判。

    零比特填充的首尾标志法

    使用比特01111110进行首位标记,而在信息位为了防止误判,如果遇到有连续的5个1时,自动的在末尾添加一位0,之后在接收端,有连续的五个1去掉一位0即可。

    在这里插入图片描述

    违规编码法

    例如,曼彻斯特编码中利用未使用到的电平来表示起始和终止。

    3.3 差错控制

    差错控制通过两种途径解决:通过检错码编码来发现传输差错。通过差错恢复达到正确传输的目的。

    检错编码(奇偶效验码,循环冗余码)

    循环冗余校验码生成方法:(1)生成多项式(2)除法采用模2法则(3)余数即为CRC校验码。

    纠错编码(海明码)

    海明码生成:(1)确定冗余位的位数(2)冗余位定位(3)计算冗余位值。

    3.4 流量控制与可靠传输机制

    流量控制和差错控制通常有2种实现技术:停止等待协议,滑动窗口协议。

    停止等待协议 :发送方每发送一帧后就等待一个应答帧,只有当接到应答帧之后,发送方才发送下一帧,直到发送方发送一个传输结束帧(EOT)。优点:简单。缺点:效率低。线路上总是只有一帧,距离长时,等待ACK时间长。

    滑动窗口协议 :发送方在收到应答消息前可以发送若干帧,即链路上可能同时存在多个数据帧。一个ACK帧可以对多个数据帧的接收进行确认。使用窗口技术。

    滑动窗口协议中差错控制有两种实现自动重复请求(ARQ)的技术:回退n自动重复请求、选择拒绝自动重复请求。

    单帧滑动窗口和停止 -等待协议

    停止-等待协议是发送一个帧必须等待到确认帧的返回,才可以继续传送。

    多帧滑动窗口和后退N帧协议(GBN)

    后退N帧协议是不必收到上一个帧的ACK(确认帧)后才开始发送。但接收方只能按顺序接收,如果没传成功,则需要将没有确认的帧全部重传。

    go-back-n策略: 回退 N:如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做 Go-back-N(回退 N),表示需要再退回来重传已发送过的 N 个分组。

    多帧滑动窗口和选择重传协议(SR)

    只会重传出现差错的帧或计时器超时的数据帧。

    信道利用率 是指发送方在一个发送周期的时间内,有效发送数据所需要的时间占整个发送周期的比率。发送方从开始发送数据到收到第一个确认帧为止,成为一个发送周期,记作T,发送法在这个周期内共发送L比特的数据,发送方的数据传输率为C,信道利用率就为(L/C)/T。

    信道吞吐率 =信道利用率*发送方的发送速率。

    3.5 介质访问控制

    MAC:介质访问控制子层,它负责处理如何接入到相关的传输介质和进行介质共享访问。

    信道划分介质访问控制

    在现代通信过程中常用的信道复用技术有时分、频分、波分、码分四种复用。其中:光纤使用波分复用,有线电视使用频分复用,第三代移动通信使用码分复用。

    1)频分多路复用(FDM):所有用户在同样的时间占用不同的带宽资源。

    2)时分多路复用(TDM):一种多路复用技术,它将信道的传输时间划分成多个时间片,多个信源轮流使用时间片,在每一时间片中传输某一路子信号。一般用来传输数字信号。

    3)波分多路复用( WDM )

    4)码分多路复用(CDM ) 码分多址

    随机访问介质访问控制

    1)ALOHA协议

    纯ALOHA协议 :当网络中的任何一个站点需要发送数据时,可以不进行任何检测就发送数据。

    时隙ALOHA协议 :将时间划分为一段等长的时隙,只能在每个时隙的开始时才能发送一个帧。减少发送冲突的可能性。

    2)CSMA协议

    1-坚持CSMA

    非坚持CSMA

    p-坚持CSMA

    在这里插入图片描述

    3)CSMA/CD

    CSMA/CD即载波侦听多路访问与冲突检测技术

    在这里插入图片描述

    在这里插入图片描述

    CSMA/CD算法:1)发送数据的站点先侦听链路上的通信情况,如果链路是空闲的,开始传送,并同时检测冲突;2)若线路忙,则继续侦听,直到检测为线路空闲,发送数据并检测冲突。3)由于信道的传播延迟,会导致冲突发生,因此站点在传输的时候继续侦听链路,一旦检测到冲突,就立即停止发送,并向链路上发一串阻塞信号,通知链路上各站冲突已经发生。等一段时间,转1)。4)等待的时间由 二进制指数回避算法 确定。

    4)CSMA/CA协议

    轮询访问介质访问控制:令牌协议

    令牌环网:拥有令牌的站点才能发送数据,一次发送一帧。优点:解决以太网可能出现的冲突重试造成的无法预测的延迟。访问模式是令牌传递。环形拓扑,单向通信。

    令牌总线网:将以太网的总线拓扑和令牌环的可预测的延迟特性相结合,物理上是一条总线,逻辑上使用令牌环。将各站点构成一个逻辑环,令牌在逻辑环上传递。

    3.6 局域网

    局域网的基本概念和体系结构

    局域网的特性由3个因素决定, 拓扑结构,传输介质,介质访问控制方式。

    主要有4种结构的局域网:以太网、令牌总线、令牌环网、光纤分布式数据接口FDDI。

    IEEE802.3对应以太网,IEEE802.11对应无线局域网,IEEE802.5对应令牌环网。

    IEEE802标准将数据链路层分为两个子层:上面的子层是 逻辑链路控制子层(LLC) ,下面的子层是 媒体访问控制子层(MAC) 。LLC帧首提供数据链路层的目的服务访问点和源服务访问点,是逻辑地址。MAC帧首提供目的站地址和源站地址,各为6个字节,是物理地址。

    所有的基带以太网都被配置成逻辑总线形式(物理上可以是总线型、星形结构)。每个帧传送给链路上的所有站点,但只有地址与帧目的地址相同的站点才能接收该帧。

    以太网和IEEE 802.3

    以太网的主要特点:以太网标准由IEEE802.3扩展而来,是目前应用最广泛的一类局域网,属于 基带总线局域网 。以无源电缆作为总线来传送数据帧,并以曾经在历史上表示传播电磁波的以太网(Ether)来命名。当不涉及到网络的协议细节时, 将802.3简称为以太网 。以太网的 核心技术是采用CSMA/CD (载波侦听多路访问/冲突检测)通信控制机制。以太网 采用无连接的工作方式,提供不可靠的服务 。以太网的连接距离有一定限制。以太网MAC帧的 最大帧长度为1518字节

    网卡分类:按带宽分:10M,100M,10M/100M自适应,1000M。按总线分:PCI网卡,ISA网卡,EISA网卡。网卡的 MAC地址是48位的。

    MTU: 最大传送单元,为数据链路层帧中的数据字段最大字节数

    速率达到或超过100MB/s的以太网称为 高速以太网

    IEEE 802.11

    在IEEE.802标准中,IEEE802.11是无线局域网标准。

    无线自组网: 无线网络无固定基础设施(AP),由一些处于平等状态的移动站之间相互通信组成的临时网络。

    无线局域网可分为两大类,第一类是 有固定基础设施 的,在基本服务集BSS中包括一个基站和若干个移动站;另一类是 无固定基础设施 的,它没有基站而是由一些处于平等状态的移动站间相互通信组成的临时网络,我们称它为无线自组网。

    令牌环网的基本原理

    3.7 广域网

    广域网的基本概念

    就规模而言, Internet属于广域网

    **PPP协议:**点对点协议,是为在同等单元之间传输数据包的简单链路而设计的数据链路层协议。用户和ISP进行通信时所使用的数据链路层协议。面向字节,只支持全双工链路。

    PPP协议在 异步传输(逐个字符传送) 时,为实现透明传输而使用 字节填充法

    PPP协议为实现透明传输,在异步传输和同步传输时使用了不同的方法。PPP在 同步传输(一连串比特连续传送) 时使用了0比特插入删除技术( 零比特填充法

    HDLC协议 :高级数据链路控制,有3类帧:信息帧、监管帧、无编号帧。标志域为" 01111110"。表示帧的开始和结束。HDLC的协议信息帧使用了编号和确认机制,能够提供可靠传输。由于TCP提供可靠服务,现实中常用PPP协议而不是HDLC协议。

    3.8 数据链路层设备

    网桥的概念及其基本原理

    网桥 :数据链路层设备,用于连接多个网段,将两个相似的网络连接起来,并对网络数据的流通进行管理。应用的场合:互联两个采用不同数据链路层的协议、不同传输介质与不同传输速率的网络。以接收、存储、地址过滤与转发的方式实现两个互联网络之间的通信。

    透明网桥 :选择的不是最佳路由

    源路由网桥 :选择的是最佳路由

    局域网交换机及其原理

    以太网交换机中的端口/MAC地址映射表是交换机在数据转发过程中通过学习动态建立的

    交换机优于网桥

    两种交换模式: 直通式交换机存储转发式交换机

    直通式交换机:只检查帧的目的地址,速度快,缺乏智能性和安全性

    存储转发式交换机:缓存到高速缓存器,并检查是否正确,错误则丢弃,可靠性高,延迟较大

    第4章 网络层

    4.1 网络层的功能

    网络层提供两种主要功能: 分组转发路由选择

    网络层的具体任务有:信源到信宿的传输,逻辑寻址,路由,地址转换,复用,流量和拥塞控制,网络互连。

    网络层中,数据传输的单位是分组。

    拥塞控制

    拥塞:网络或其中一部分出现过多的包,导致网络性能下降的现象。

    拥塞原因主要是1)节点处理速度有限;2)链路传输速度有限。

    拥塞控制方法有5种:配缓冲区,丢弃包,限制网内包数量,流量控制,阻塞包。

    拥塞控制的两种方法,开环控制和闭环控制。

    流量控制 :保证发送方发送的信息量不会超过接收方的接受能力。

    4.2 路由算法

    静态路由算法:

    动态路由算法:

    路由算法用于寻找最佳路径(距离最短)。常用2种方法:距离向量路由、链路状态路由。

    距离-向量路由算法

    距离向量路由特点:每个路由器周期性地将自己关于整个网络的信息发送给它的邻居。

    距离向量路由选择算法的缺点是 收敛较慢 ,路由变化的消息不能很快传播到所有的节点。

    链路状态路由算法

    链路状态路由特点:每个路由器和互连网络中的所有其它路由器共享关于它邻居的信息。

    链路状态路由选择算法能计算出当前的最佳路由,但计算时间较长。

    4.3 IPv4

    IP协议 :TCP/IP协议族中的核心协议,是一个 不可靠的、无连接的数据报协议,不按发送顺序接收;不提供差错检测或跟踪。以分组为单位的数据叫做数据报。

    IPv4分组

    ipv4分由首部和数据两部分组成的

    在这里插入图片描述

    首部长度:
    总长度:
    标识:
    标志:
    片偏移:
    生存时间(TTL(Time to Live)):占8位,表明是数据报在网络中的寿命,即数据报在网络中可通过的路由器数的最大值。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网路资源。
    源地址:
    目的地址:

    IP数据报分片

    在这里插入图片描述

    在这里插入图片描述

    网络层转发分组的流程

    对IP数据报分片的重组通常发生目的主机上。分片发生在路由器上。

    IPv4地址

    IP编址:一个32位的地址,它唯一地定义了一个在因特网上的主机或路由器(IPv6地址是128位)。每一个地址由两部分组成:netid(网络号)和hostid(主机号)。Netid定义一个网络,hostid则标识在该网络上的一个主机。

    IP地址按层次结构划分为5类:A类、B类、C类、D类、E类。

    IP地址的表示:点分十进制表示法。如192.192.192.6

    IP地址按通信方式划分为3类:单播地址、广播地址、多播地址。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    NAT

    NAT: 网络地址转换,使用本地地址的主机在和外界通信时,要使用NAT路由器将其本地地址转换成一个有效的外部全球地址,才能和因特网连接。

    私有地址

    在这里插入图片描述

    子网划分

    子网编址不是把IP地址看成由单纯的一个网络号和一个主机号组成,而是把主机号进一步划分为一个子网号和一个主机号。获得IP网络号后,由网络系统管理员决定是否建立子网,以及分配多少比特给子网号和主机号。子网编址意义:避免广播风暴,降低损失。

    子网掩码

    子网掩码是一个32比特的数值,确定哪些位用于子网号或主机号。其中1=网络号和子网号,0=主机号。IP地址中与子网掩码的1相对应的位构成了网络号和子网号,IP地址中与子网掩码的0相对应的位构成了主机号。

    CIDR

    CIDR: 无分类域间路由选择(无分类编址)。

    使用"网络前缀"的概念代替子网络的概念。将网络前缀都相同的连续IP地址组成的"CIDR地址块"。一个CIDR地址块可以表示很多地址,这种地址的聚合称为路由聚合,或称构成超网。

    ARP

    ARP: 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。是低层协议,将一个IP地址与其物理地址(MAC地址)联系起来,动态完成从逻辑地址到物理地址的映射。

    ARP高速缓存:存放最近IP地址到硬件地址的映射;其中每一项都有生存时间;使用高速缓存的目的是避免远程访问的开销,提高效率;ARP高速缓存中的内容要定期进行更新。

    ARP的实现:首先检查自己的高速缓存,寻找该IP地址到物理地址的映射,如果找到,就提取相应的物理地址,把数据放到相应数据帧中,转发出去,如果没有发现,必须广播一个ARP请求,并等待回答。

    RARP 反向地址解析协议,从硬件地址获得IP地址的协议,是设计用来解析地址映射问题,这就是当一个机器知道它的物理地址但不知道其逻辑地址,通过发送RARP广播,请求网络中的某个主机响应其IP地址。(主要用在无盘系统中)。

    DHCP

    DHCP: 动态主机配置协议,是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

    ICMP

    ICMP: 网络控制报文协议,允许主机或路由器报告差错情况和提供有关异常情况的报告,有 ICMP 差错控制报文ICMP 询问报文两种。

    ICMP差错控制报文:5种类型1>终点不可达 2> 源点抑制 3>时间超过 4>参数问题 5>改变路由(重定向)

    PING(ICMP回送请求和回答报文,即ICMP询问报文): 分组网间探测,测试两台主机的连通性。PING工作在应用层。

    在Windows操作系统中,用户跟踪一个分组从源点到终点的路径的命令是 tracert(ICMP时间超过报文,即ICMP差错控制报文)。Unix为traceroute。Tracert工作在网络层。

    ICMP协议减少分组的丢失,帮助主机完成某些网络参数测试,允许主机或路由器报告差错和提供有关异常情况报告,但它没有办法减少分组丢失,这是高层协议应该完成的事情。IP协议只是尽最大可能交付,至于交付是否成功,它自己无法控制。

    4.4 IPv6

    IPv6的主要特点

    IPv6地址

    IPv6地址的位数是128

    4.5 路由协议

    AS: Autonomous System,自治系统,是由若干路由器组成的一部分互联网络,由一个单位进行管理,使用同样的路由选择协议

    域内路由:内部网关协议(IGP):RIP,OSPF

    域间路由:外部网关协议(EGP):BGP

    RIP: 路由信息协议,是一种分布式的基于距离向量的内部网关路由选择协议。

    OSPF :开发路径优先协议,使用了分布式链路状态路由算法。

    BGP :边界网关协议,是不同自治系统的路由器之间交换路由信息的协议。

    1>打开报文,2> 更新报文,3>保活报文,4>通知报文

    在这里插入图片描述

    4.6 IP组播

    组播的概念

    IP组播,需要组播路由器的支持,可以实现计算机发送单个分组可以抵达一个组地址标识的若干目标主机,被它们正确接收。

    IP组播地址

    IGMP与组播路由算法

    4.7 移动IP

    移动IP的概念

    移动IP,一个移动结点把连接点从一个网络或子网改变到另一个网络或子网的主机。使用移动IP,一个移动结点可以在不改变其IP地址的情况下改变其驻留位置。

    移动IP的通信过程

    4.8 网络层设备

    路由器的组成和功能

    路由器 :网络层设备,是一种专用的计算机设备,具有多个输入、输出端口,交换结构,内置路由选择协议软件,协议转换模块,可与其他路由器交换信息,构建、维护路由表。主要的功能: 分组转发路由计算 ,隔离广播信息,进行网络控制与管理。

    路由器的基本特征:1)为2或3个以上网络之间的数据传输解决最佳路径选择。2)从路径选择的角度为不同的逻辑上独立的子网用户之间的数据传输提供传输的线路。3)要求结点在网络层以上的各层使用相同或兼容的协议。

    路由表

    路由表:路由器生成并维护路由表,该表跟踪和记录相邻其他路由器的地址和状态信息。路由器根据路由信息表并根据传输距离和通信费用等要素通过优化算法来决定一个特定的数据包的最佳传输路径。

    IP路由表有4个项目:(1)目的IP地址。(2)子网掩码。(3)下一跳的IP地址。(4)接口。其中一个标志指明目的IP地址是网络地址还是主机地址;另一个标志指明下一跳路由器是否为真正的下一跳路由器,还是直接相连的接口。

    路由转发

    路由器数据包转发的具体过程:1)网络接收数据包。2)根据网络物理层接口,路由器调用相应的链路层功能模块以解释处理此数据包的链路层协议报头。3)在链路层完成对数据帧的完整性检验后,路由器开始处理此数据帧的IP层。

    路由选择主要完成的功能:(1)寻找能与目的IP地址完全匹配表项。(2)寻找能与目的网络号相匹配的表项。(3)寻找标为"默认"的选项。

    网关在网络层以上实现网络互连 ,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。

    网络互连设备分4类:重发器(用于物理层),网桥(用于物理层和数据链路层),路由器(用于物理层、数据链路层和网络层),网关(用于OSI模型的所有七层)。

    路由器与网桥的对比:路由器执行的功能与网桥类似,可以学习、过滤、转发。不同之处在于路由器具有内置的智能。这种智能可以检测网络交通并使路由器快速适应检测到的网络变化。网桥对端节点透明,路由器被端节点认识。

    路由器与交换机的对比:路由器主要工作是路由选择,交换机主要工作是线路交换,主要工作在数据链路层,在二层交换机上增加路由模块,称为三层交换机。路由器功能很全,可处理的节点可以很大,但交换机功能单一,处理量小。

    网络层使用的中间设备路由器为数据包提供路由,就是为数据包提供下一跳的地址,路由器是连接在不同网络之间的。网络层以上使用的中间设备 网关 也是 路由器 ,局域网的出口路由一般叫做网关。转发器或网桥时仅仅把一个网络扩大了,从网络层的角度仍然是一个网络,路由器用来进行网络互连和路由选择。

    第5章 运输层

    5.1 传输层提供的服务

    传输层的地位:为源主机上的进程和目的主机上的进程提供可靠透明的数据传送,使其不关心具体通信细节。传输层是协议层最核心的一层。

    传输层的功能:1)端到端的报文传递。2)服务点的寻址。3)报文的拆分、组装。4)连接控制。

    在传输层,可靠传输包括如下四个方面:差错控制、次序控制、丢失控制、重复控制。

    传输层一个很重要的功能就是 复用和分用

    复用 :应用层不同进程的报文通过不同的端口向下交到传输层,再往下就共用网络层提供的服务。

    分用 :当这些报文到达目的主机后,目的主机的传输层就使用其分用功能,通过不同的端口将报文分别交付到相应的进程。

    熟知的端口号

    在这里插入图片描述

    套接字 =(主机 IP地址,端口号)

    5.2 UDP协议

    UDP数据报

    UDP: 用户数据报协议,是一种无连接的,提供不可靠交付的运输层协议。进程的每个输出操作刚好产生一个UDP数据报,进而导致一个IP数据报的发送。

    在这里插入图片描述

    源端口:
    目的端口
    长度:
    校验和:

    UDP校验

    UDP协议与TCP协议的主要特点

    在这里插入图片描述

    5.3 TCP协议

    TCP: 传输控制协议,提供面向连接的运输服务。提供一种可靠的面向连接的字节流传输层服务,TCP将用户数据打包形成报文段;它发送数据后启动一个定时器;通信的另一端对收到的数据进行确认,对乱序的数据重新排列,丢弃重复数据;TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检查和。网络应用程序Telnet、FTP、SMTP都使用TCP。

    TCP报文段

    一个TCP报文段分为TCP首部和TCP数据部分

    在这里插入图片描述

    源端口:
    目的端口:
    序号字段:
    确认号字段:
    数据偏移:
    确认位ACK:
    同步位SYN:
    终止位FIN :
    窗口字段:
    校验和:

    TCP连接管理

    TCP连接的建立: 三次握手

    在这里插入图片描述

    TCP连接的释放: TCP采用对称释放法来释放连接,通信的双方必须都向对方发送FIN置1的TCP段并得到对方的应答,连接才能被释放。四次握手

    在这里插入图片描述

    TCP可靠传输

    TCP使用了 校验、序号、确认和重传 等机制来保证接收方的进程从缓存区读出的字节流与发送方发出的字节流 完全一样

    重传又分为超时和冗余ACK

    超时 :超时重传时间,加权平均往返时间RTTs

    冗余ACK :发送方收到对同一个报文段的 3 个冗余ACK 时,就可以认为报文段 已经丢失

    TCP流量控制

    TCP流量控制:在数据链路层或传输层中,控制发送方的数据传输速率,从而不超过接收方的接收能力,以免数据被丢弃。流量控制的方法有停等协议和滑窗协议。

    TCP采用可变长度的滑动窗口进行流量控制。

    在这里插入图片描述

    TCP拥塞控制

    拥塞 :拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象。严重时甚至导致网络通信业务陷入停顿,即出现死锁现象。

    发送窗口的上限值=min[接收窗口rwnd,拥塞窗口cwnd]

    TCP进行的拥塞控制,其工作过程可以分为3个阶段:开始时为 慢开始(慢启动) 阶段,拥塞窗口cwnd的初始值为1,随着传输轮次增加,cwnd 按指数规律增长 ,当拥塞窗口cwnd增长到门限值ssthresh时,进入拥塞避免阶段,此时拥塞窗口 按线性规律增长当网络出现超时,拥塞窗口变为1,又重新执行慢开始算法。

    在这里插入图片描述

    慢开始拥塞避免 算法的基础上,又增加了两个新的TCP拥塞控制算法是 快重传快恢复

    快重传

    快恢复 :从ssthresh开始

    拥塞控制和流量控制的区别与联系

    拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。 拥塞控制是一个全局性的过程 ,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

    流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制 。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

    第6章 应用层

    6.1 网络应用模型

    应用层:应用层实现的是通常的网络服务,包含用户所需要的任何功能。

    网络应用模型

    1) 客户/服务器模型(C/S):在网络平台上实现应用的一种传统计算模式。特点是软件从服务器下载到工作站上,在工作站上进行处理。

    2) P2P模型(对等网,Peer to Pee):每台客户机实现平等操作,共享彼此的信息资源和硬件资源,例:Windows95/98以上版本。灵活方便,但难管理和控制、安全性较低,适合小企业内部和家庭。

    在这里插入图片描述

    6.2 域名系统(DNS)

    DNS: 因特网命名系统,用来把便于人们使用的机器名字转换为IP地址。域名与IP地址一一对应。

    层次域名空间

    域名服务器

    域名解析过程

    域名的解析 把域名映射成IP地址或把IP地址映射成域名的过程,前者称为 正则解析 ,后者称为 反向解析

    递归查询:

    递归与迭代相结合方式:

    在这里插入图片描述

    6.3 文件传输协议(FTP)

    FTP提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限。适用于异构的网络。

    FTP的工作原理

    控制连接端口号21

    数据连接端口号20

    6.4 电子邮件

    电子邮件系统的组成结构

    电子邮件是一种异步通信方式。由用户代理,部件服务器和电子邮件使用协议组成

    在这里插入图片描述

    电子邮件格式:一个电子邮件分为信封和内容,内容又分为首部和主体两部分

    MIME: Multipurpose Internet Mail Extension,即通用Internet邮件扩展,其基本思想是电子邮件仍沿用RFC822的基本格式,但对信头和信体部分作一些必要的扩充,使其 能够传输 ASCII 文本以外的信息类型。解决了SMTP因为只能传送一定长度的ASCII码,许多其他非英语国家的文字无法传送,且无法传送可执行文件及其他二进制对象的问题。

    相关协议: SMTP 、IMAP和 POP3 协议

    默认的 SMTP 服务的 端口号25

    要将信件从Mail Server上 收回 ,要借助协议 POP3

    6.5 万维网(WWW)

    WWW: 万维网,一个大规模的,联机式的信息储藏所

    万维网的内核部分由以下三个标准构成

    URL: 统一资源定位器,用于在全网范围内确定一个网页。其一般格式为:协议名://主机域名/路径名

    HTTP: 超文本传送协议,定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎么把文档传送浏览器

    HTML: 超文本标记语言

    HTTP

    Web浏览器同Web服务器之间的应用层通信协议是HTTP,默认端口号 80

    HTTP是无状态的

    Cookie:跟踪用户的活动

    HTTP采用TCP作为运输层协议 ,保证了数据的可靠传输,但 HTTP本身是无连接 的,即交换HTTP报文之前不需要先建立HTTP连接。

    HTTP即可以使用 非持久连接 ,也可以使用 持久链接 。持久连接又分为非流水线和流水线两种方式。

    HTTP报文分为请求报文和响应报文

    在这里插入图片描述

    展开全文
  • Java常用基础知识点总结(最全)

    万次阅读 多人点赞 2020-08-02 20:58:01
    Java基础知识点总结 大纲 一、Java基础(语言、集合框架、OOP、设计模式等) 二、Java高级(JavaEE、框架、服务器、工具等) 三、多线程和并发 四、Java虚拟机 五、数据库(Sql、MySQL、Redis等) 六、算法与数据...

    Java基础知识点总结

    大纲

    • 一、Java基础(语言、集合框架、OOP、设计模式等)
    • 二、Java高级(JavaEE、框架、服务器、工具等)
    • 三、多线程和并发
    • 四、Java虚拟机
    • 五、数据库(Sql、MySQL、Redis等)
    • 六、算法与数据结构
    • 七、计算机网络
    • 八、操作系统(OS基础、Linux等)
    • 九、其他

    ### 一、Java基础(语言、集合框架、OOP、设计模式等)

    1. HashMap和Hashtable的区别

    • Hashtable是基于陈旧的Dictionary的Map接口的实现,而HashMap是基于哈希表的Map接口的实现
    • 从方法上看,HashMap去掉了Hashtable的contains方法
    • HashTable是同步的(线程安全),而HashMap线程不安全,效率上HashMap更快
    • HashMap允许空键值,而Hashtable不允许
    • HashMap的iterator迭代器执行快速失败机制,也就是说在迭代过程中修改集合结构,除非调用迭代器自身的remove方法,否则以其他任何方式的修改都将抛出并发修改异常。而Hashtable返回的Enumeration不是快速失败的。

    注:Fast-fail机制:在使用迭代器的过程中有其它线程修改了集合对象结构或元素数量,都将抛出ConcurrentModifiedException,但是抛出这个异常是不保证的,我们不能编写依赖于此异常的程序。

    2. java的线程安全

    Vector、Stack、HashTable、ConcurrentHashMap、Properties

    3. java集合框架(常用)

    Collection - List - ArrayList
    Collection - List - LinkedList
    Collection - List - Vector
    Collection - List - Vector - Stack
    Collection - Set - HashSet
    Collection - Set - TreeSet
    Collection - List - LinkedHashSet
    Map - HashMap
    Map - TreeMap
    Map - HashTable
    Map - LinkedHashMap
    Map - ConcurrentHashMap
    

    3.1 List集合和Set集合

    List中元素存取是有序的、可重复的;Set集合中元素是无序的,不可重复的。

    CopyOnWriteArrayList:COW的策略,即写时复制的策略。适用于读多写少的并发场景

    Set集合元素存取无序,且元素不可重复。

    HashSet不保证迭代顺序,线程不安全;LinkedHashSet是Set接口的哈希表和链接列表的实现,保证迭代顺序,线程不安全。

    TreeSet:可以对Set集合中的元素排序,元素以二叉树形式存放,线程不安全。

    3.2 ArrayList、LinkedList、Vector的区别

    首先它们均是List接口的实现。

    ArrayList、LinkedList的区别

    1.随机存取:ArrayList是基于可变大小的数组实现,LinkedList是链接列表的实现。这也就决定了对于随机访问的get和set的操作,ArrayList要优于LinkedList,因为LinkedList要移动指针。

    2.插入和删除:LinkedList要好一些,因为ArrayList要移动数据,更新索引。

    3.内存消耗:LinkedList需要更多的内存,因为需要维护指向后继结点的指针。

    Vector从JDK 1.0起就存在,在1.2时改为实现List接口,功能与ArrayList类似,但是Vector具备线程安全。

    3.3 Map集合

    Hashtable:基于Dictionary类,线程安全,速度快。底层是哈希表数据结构。是同步的。
    不允许null作为键,null作为值。

    Properties:Hashtable的子类。用于配置文件的定义和操作,使用频率非常高,同时键和值都是字符串。

    HashMap:线程不安全,底层是数组加链表实现的哈希表。允许null作为键,null作为值。HashMap去掉了contains方法。
    注意:HashMap不保证元素的迭代顺序。如果需要元素存取有序,请使用LinkedHashMap

    TreeMap:可以用来对Map集合中的键进行排序。

    ConcurrentHashMap:是JUC包下的一个并发集合。

    3.4 为什么使用ConcurrentHashMap而不是HashMap或Hashtable?

    HashMap的缺点:主要是多线程同时put时,如果同时触发了rehash操作,会导致HashMap中的链表中出现循环节点,进而使得后面get的时候,会死循环,CPU达到100%,所以在并发情况下不能使用HashMap。让HashMap同步:Map m = Collections.synchronizeMap(hashMap);而Hashtable虽然是同步的,使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。

    ConcurrentHashMap的原理:

    HashTable容器在竞争激烈的并发环境下表现出效率低下的原因在于所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

    ConcurrentHashMap的结构:

    ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入互斥锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,当对某个HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

    ConcurrentHashMap的构造、get、put操作:

    构造函数:传入参数分别为 1、初始容量,默认16 2、装载因子 装载因子用于rehash的判定,就是当ConcurrentHashMap中的元素大于装载因子*最大容量时进行扩容,默认0.75 3、并发级别 这个值用来确定Segment的个数,Segment的个数是大于等于concurrencyLevel的第一个2的n次方的数。比如,如果concurrencyLevel为12,13,14,15,16这些数,则Segment的数目为16(2的4次方)。默认值为static final int DEFAULT_CONCURRENCY_LEVEL = 16;。理想情况下ConcurrentHashMap的真正的并发访问量能够达到concurrencyLevel,因为有concurrencyLevel个Segment,假如有concurrencyLevel个线程需要访问Map,并且需要访问的数据都恰好分别落在不同的Segment中,则这些线程能够无竞争地自由访问(因为他们不需要竞争同一把锁),达到同时访问的效果。这也是为什么这个参数起名为“并发级别”的原因。默认16.

    初始化的一些动作:

    初始化segments数组(根据并发级别得到数组大小ssize),默认16

    初始化segmentShift和segmentMask(这两个全局变量在定位segment时的哈希算法里需要使用),默认情况下segmentShift为28,segmentMask为15

    初始化每个Segment,这一步会确定Segment里HashEntry数组的长度.

    put操作:

    1、判断value是否为null,如果为null,直接抛出异常。

    2、key通过一次hash运算得到一个hash值。将得到hash值向右按位移动segmentShift位,然后再与segmentMask做&运算得到segment的索引j。即segmentFor方法

    3、使用Unsafe的方式从Segment数组中获取该索引对应的Segment对象。向这个Segment对象中put值,这个put操作也基本是一样的步骤(通过&运算获取HashEntry的索引,然后set)。

    get操作:

    1、和put操作一样,先通过key进行hash确定应该去哪个Segment中取数据。

    2、使用Unsafe获取对应的Segment,然后再进行一次&运算得到HashEntry链表的位置,然后从链表头开始遍历整个链表(因为Hash可能会有碰撞,所以用一个链表保存),如果找到对应的key,则返回对应的value值,如果链表遍历完都没有找到对应的key,则说明Map中不包含该key,返回null。

    定位Segment的hash算法:(hash >>> segmentShift) & segmentMask

    定位HashEntry所使用的hash算法:int index = hash & (tab.length - 1);

    注:

    1.tab为HashEntry数组

    2.ConcurrentHashMap既不允许null key也不允许null value

    3.5 Collection 和 Collections的区别

    Collection是集合类的上级接口,子接口主要有Set 和List、Queue
    Collections是针对集合类的一个辅助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

    3.6 Map、Set、List、Queue、Stack的特点与用法

    Set集合类似于一个罐子,"丢进"Set集合里的多个对象之间没有明显的顺序。 List集合代表元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。 Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出) Queue用于模拟"队列"这种数据结构(先进先出 FIFO)。 Map用于保存具有"映射关系"的数据,因此Map集合里保存着两组值。

    3.7 HashMap的工作原理

    HashMap维护了一个Entry数组,Entry内部类有key,value,hash和next四个字段,其中next也是一个Entry类型。可以将Entry数组理解为一个个的散列桶。每一个桶实际上是一个单链表。当执行put操作时,会根据key的hashcode定位到相应的桶。遍历单链表检查该key是否已经存在,如果存在,覆盖该value,反之,新建一个新的Entry,并放在单链表的头部。当通过传递key调用get方法时,它再次使用key.hashCode()来找到相应的散列桶,然后使用key.equals()方法找出单链表中正确的Entry,然后返回它的值。

    3.8 Map的实现类的介绍

    HashMap基于散列表来的实现,即使用hashCode()进行快速查询元素的位置,显著提高性能。插入和查询“键值对”的开销是固定的。可以通过设置容量和装载因子,以调整容器的性能。

    LinkedHashMap, 类似于HashMap,但是迭代遍历它时,保证迭代的顺序是其插入的次序,因为它使用链表维护内部次序。此外可以在构造器中设定LinkedHashMap,使之采用LRU算法。使没有被访问过的元素或较少访问的元素出现在前面,访问过的或访问多的出现在后面。这对于需要定期清理元素以节省空间的程序员来说,此功能使得程序员很容易得以实现。

    TreeMap, 是基于红黑树的实现。同时TreeMap实现了SortedMap接口,该接口可以确保键处于排序状态。所以查看“键”和“键值对”时,所有得到的结果都是经过排序的,次序由自然排序或提供的Comparator决定。SortedMap接口拥有其他额外的功能,如:返回当前Map使用的Comparator比较强,firstKey(),lastKey(),headMap(toKey),tailMap(fromKey)以及可以返回一个子树的subMap()方法等。

    WeakHashMap,表示弱键映射,WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收。

    ConcurrentHashMap, 在HashMap基础上分段锁机制实现的线程安全的HashMap。

    IdentityHashMap 使用==代替equals() 对“键”进行比较的散列映射。专为解决特殊问题而设计。

    HashTable:基于Dictionary类的Map接口的实现,它是线程安全的。

    3.9 LinkedList 和 PriorityQueue 的区别

    它们均是Queue接口的实现。拥有FIFO的特点,它们的区别在于排序行为。LinkedList 支持双向列表操作,
    PriorityQueue 按优先级组织的队列,元素的出队次序由元素的自然排序或者由Comparator比较器指定。

    3.10 线程安全的集合类。Vector、Hashtable、Properties和Stack、ConcurrentHashMap

    3.11 BlockingQueue

    Java.util.concurrent.BlockingQueue是一个队列,在进行获取元素时,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。

    3.12 如何对一组对象进行排序

    如果需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。如果我们需要排序一个对象列表,我们可以使用Collections.sort()方法。排序时是默认根据元素的自然排序(使用Comparable)或使用Comparator外部比较器。Collections内部使用数组排序方法,所有它们两者都有相同的性能,只是Collections需要花时间将列表转换为数组。

    4. ArrayList

    • 无参构造 容量为10
    • ArrayList(Collections<?extends E> c)构造包含指定collection的元素的列表
    • ArrayList(int initialCapacity) 指定初始容量

    5. final关键字

    final修饰的变量是常量,必须进行初始化,可以显示初始化,也可以通过构造进行初始化,如果不初始化编译会报错。

    6. 接口与抽象类

    6.1 一个子类只能继承一个抽象类,但能实现多个接口
    6.2 抽象类可以有构造方法,接口没有构造方法
    6.3 抽象类可以有普通成员变量,接口没有普通成员变量
    6.4 抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
    6.5 抽象类可以没有抽象方法,抽象类可以有普通方法,接口中都是抽象方法
    6.6 抽象类可以有静态方法,接口不能有静态方法
    6.7 抽象类中的方法可以是public、protected;接口方法只有public abstract

    7. 抽象类和最终类

    抽象类可以没有抽象方法, 最终类可以没有最终方法

    最终类不能被继承, 最终方法不能被重写(可以重载)

    8.异常

    相关的关键字 throw、throws、try…catch、finally

    • throws 用在方法签名上, 以便抛出的异常可以被调用者处理
    • throw 方法内部通过throw抛出异常
    • try 用于检测包住的语句块, 若有异常, catch子句捕获并执行catch块

    9. 关于finally

    • finally不管有没有异常都要处理
    • 当try和catch中有return时,finally仍然会执行,finally比return先执行
    • 不管有木有异常抛出, finally在return返回前执行
    • finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的

    注意:finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值

    finally不执行的几种情况:程序提前终止如调用了System.exit, 病毒,断电

    10. 受检查异常和运行时异常

    10.1 粉红色的是受检查的异常(checked exceptions),其必须被try…catch语句块所捕获, 或者在方法签名里通过throws子句声明。受检查的异常必须在编译时被捕捉处理,命名为Checked Exception是因为Java编译器要进行检查, Java虚拟机也要进行检查, 以确保这个规则得到遵守。

    常见的checked exception:ClassNotFoundException IOException FileNotFoundException EOFException

    10.2 绿色的异常是运行时异常(runtime exceptions), 需要程序员自己分析代码决定是否捕获和处理,比如空指针,被0除…

    常见的runtime exception:NullPointerException ArithmeticException ClassCastException IllegalArgumentException IllegalStateException IndexOutOfBoundsException NoSuchElementException

    10.3 而声明为Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕获。

    11. this & super

    11.1 super出现在父类的子类中。有三种存在方式

    1. super.xxx(xxx为变量名或对象名)意思是获取父类中xxx的变量或引用
    2. super.xxx(); (xxx为方法名)意思是直接访问并调用父类中的方法
    3. super() 调用父类构造

    注:super只能指代其直接父类

    11.2 this() & super()在构造方法中的区别

    1. 调用super()必须写在子类构造方法的第一行, 否则编译不通过
    2. super从子类调用父类构造, this在同一类中调用其他构造
    3. 均需要放在第一行
    4. 尽管可以用this调用一个构造器, 却不能调用2个
    5. this和super不能出现在同一个构造器中, 否则编译不通过
    6. this()、super()都指的对象,不可以在static环境中使用
    7. 本质this指向本对象的指针。super是一个关键字

    12. 修饰符一览

    修饰符 			类内部  	同一个包		子类 		任何地方
    private 		yes
    default         yes			yes
    protected		yes			yes				yes
    public			yes			yes				yes			yes
    

    13. 构造内部类和静态内部类对象

    public class Enclosingone {
    	public class Insideone {}
    	public static class Insideone{}
    }
    
    public class Test {
    	public static void main(String[] args) {
    	// 构造内部类对象需要外部类的引用
    	Enclosingone.Insideone obj1 = new Enclosingone().new Insideone();
    	// 构造静态内部类的对象
    	Enclosingone.Insideone obj2 = new Enclosingone.Insideone();
    	}
    }
    

    静态内部类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。非静态内部类能够访问外部类的静态和非静态成员。静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员。

    14. 序列化

    声明为static和transient类型的数据不能被序列化, 反序列化需要一个无参构造函数

    序列化参见我的笔记Java-note-序列化.md

    15.正则表达式

    次数符号

    * 0或多次
    + 1或多次
    ?0或1次
    {n} 恰n次
    {n,m} 从n到m次
    

    其他符号

    符号 等价形式

    \d		[0-9]
    \D      [^0-9]  
    \w 		[a-zA-Z_0-9]
    \W 		[^a-zA-Z_0-9]
    \s 		[\t\n\r\f]
    \S 		[^\t\n\r\f]
    . 		任何字符
    

    边界匹配器

    行开头 ^
    行结尾 $
    单词边界 \b

    贪婪模式:最大长度匹配 非贪婪模式:匹配到结果就好,最短匹配

    环视

    字符 				描述 					匹配对象
    .					单个任意字符			
    [...] 				字符组 					列出的任意字符
    [^...] 										未列出的任意字符
    ^ 					caret 					行的起始位置
    $     				dollar 					行的结束位置
    \<   										单词的起始位置
    \> 											单词的结束位置
    \b   				单词边界
    \B 					非单词边界
    (?=Expression)		顺序肯定环视			成功,如果右边能够匹配
    (?!Expression)		顺序否定环视			成功,如果右边不能够匹配
    (?<=Expression)		逆序肯定环视			成功,如果左边能够匹配
    (?<!Expression) 	逆序否定环视			成功,如果左边不能够匹配
    

    举例:北京市(海淀区)(朝阳区)(西城区)

    Regex: .*(?=\()

    模式和匹配器的典型调用次序

    1. 把正则表达式编译到模式中
      Pattern p = Pattern.compile(“a*b”);
    2. 创建给定输入与此模式的匹配器
      Matcher m = p.matcher(“aaab”);
    3. 尝试将整个区域与此模式匹配
      boolean b = m.matches();

    16. 面向对象的五大基本原则(solid)

    1. S单一职责SRP:Single-Responsibility Principle
      一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合,高内聚在面向对象原则的引申,将职责定义为引起变化的原因,以提高内聚性减少引起变化的原因。

    2. O开放封闭原则OCP:Open-Closed Principle
      软件实体应该是可扩展的,而不是可修改的。对扩展开放,对修改封闭

    3. L里氏替换原则LSP:Liskov-Substitution Principle
      子类必须能够替换其基类。这一思想表现为对继承机制的约束规范,只有子类能够替换其基类时,才能够保证系统在运行期内识别子类,这是保证继承复用的基础。

    4. I接口隔离原则ISP:Interface-Segregation Principle
      使用多个小的接口,而不是一个大的总接口

    5. D依赖倒置原则DIP:Dependency-Inversion Principle
      依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者共同依赖于抽象。抽象不依赖于具体,具体依赖于抽象。

    17. 面向对象设计其他原则

    1. 封装变化

    2. 少用继承 多用组合

    3. 针对接口编程 不针对实现编程

    4. 为交互对象之间的松耦合设计而努力

    5. 类应该对扩展开发 对修改封闭(开闭OCP原则)

    6. 依赖抽象,不要依赖于具体类(依赖倒置DIP原则)

    7. 密友原则:只和朋友交谈(最少知识原则,迪米特法则)

      说明:一个对象应当对其他对象有尽可能少的了解,将方法调用保持在界限内,只调用属于以下范围的方法:
      该对象本身(本地方法)对象的组件 被当作方法参数传进来的对象 此方法创建或实例化的任何对象

    8. 别找我(调用我) 我会找你(调用你)(好莱坞原则)

    9. 一个类只有一个引起它变化的原因(单一职责SRP原则)

    18. null可以被强制转型为任意类型的对象

    19.代码执行次序

    1. 多个静态成员变量, 静态代码块按顺序执行
    2. 单个类中: 静态代码 -> main方法 -> 构造块 -> 构造方法
    3. 构造块在每一次创建对象时执行
    4. 涉及父类和子类的初始化过程
      a.初始化父类中的静态成员变量和静态代码块
      b.初始化子类中的静态成员变量和静态代码块
      c.初始化父类的普通成员变量和构造代码块(按次序),再执行父类的构造方法(注意父类构造方法中的子类方法覆盖)
      d.初始化子类的普通成员变量和构造代码块(按次序),再执行子类的构造方法

    20. 数组复制方法

    1. for逐一复制
    2. System.arraycopy() -> 效率最高native方法
    3. Arrays.copyOf() -> 本质调用arraycopy
    4. clone方法 -> 返回Object[],需要强制类型转换

    21. 多态

    1. Java通过方法重写和方法重载实现多态
    2. 方法重写是指子类重写了父类的同名方法
    3. 方法重载是指在同一个类中,方法的名字相同,但是参数列表不同

    22. Java文件

    .java文件可以包含多个类,唯一的限制就是:一个文件中只能有一个public类, 并且此public类必须与
    文件名相同。而且这些类和写在多个文件中没有区别。

    23. Java移位运算符

    java中有三种移位运算符

    1. << :左移运算符,x << 1,相当于x乘以2(不溢出的情况下),低位补0
    2. >> :带符号右移,x >> 1,相当于x除以2,正数高位补0,负数高位补1
    3. >>> :无符号右移,忽略符号位,空位都以0补齐

    参见我的GitHub,Java移位符

    24. 形参&实参

    1. 形式参数可被视为local variable.形参和局部变量一样都不能离开方法。只有在方法中使用,不会在方法外可见。
    2. 形式参数只能用final修饰符,其它任何修饰符都会引起编译器错误。但是用这个修饰符也有一定的限制,就是在方法中不能对参数做任何修改。不过一般情况下,一个方法的形参不用final修饰。只有在特殊情况下,那就是:方法内部类。一个方法内的内部类如果使用了这个方法的参数或者局部变量的话,这个参数或局部变量应该是final。
    3. 形参的值在调用时根据调用者更改,实参则用自身的值更改形参的值(指针、引用皆在此列),也就是说真正被传递的是实参。

    25. IO流一览

    26. 局部变量为什么要初始化

    局部变量是指类方法中的变量,必须初始化。局部变量运行时被分配在栈中,量大,生命周期短,如果虚拟机给每个局部变量都初始化一下,是一笔很大的开销,但变量不初始化为默认值就使用是不安全的。出于速度和安全性两个方面的综合考虑,解决方案就是虚拟机不初始化,但要求编写者一定要在使用前给变量赋值。

    27. Java语言的鲁棒性

    Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。通过集成的面向对象的例外处理机制,在编译时,Java揭示出可能出现但未被处理的异常,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。

    28. Java语言特性

    1. Java致力于检查程序在编译和运行时的错误
    2. Java虚拟机实现了跨平台接口
    3. 类型检查帮助检查出许多开发早期出现的错误
    4. Java自己操纵内存减少了内存出错的可能性
    5. Java还实现了真数组,避免了覆盖数据的可能

    29. 包装类的equals()方法不处理数据转型,必须类型和值都一样才相等。

    30. 子类可以继承父类的静态方法!但是不能覆盖。因为静态方法是在编译时确定了,不能多态,也就是不能运行时绑定。

    31. Java语法糖

    1. Java7的switch用字符串 - hashcode方法 switch用于enum枚举
    2. 伪泛型 - List原始类型
    3. 自动装箱拆箱 - Integer.valueOf和Integer.intValue
    4. foreach遍历 - Iterator迭代器实现
    5. 条件编译
    6. enum枚举类、内部类
    7. 可变参数 - 数组
    8. 断言语言
    9. try语句中定义和关闭资源

    32. Java 中应该使用什么数据类型来代表价格?

    如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。

    33. 怎么将 byte 转换为 String?

    可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。

    34. Java 中怎样将 bytes 转换为 long 类型?

    String接收bytes的构造器转成String,再Long.parseLong

    35. 我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?

    是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 127。

    36. 存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = © B;

    可以,向下转型。但是不建议使用,容易出现类型转型异常.

    37. 哪个类包含 clone 方法?是 Cloneable 还是 Object?

    java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ 或 其他本地语言实现的。

    38. Java 中 ++ 操作符是线程安全的吗?

    不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。还会存在竞态条件(读取-修改-写入)。

    39. a = a + b 与 a += b 的区别

    += 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。

    byte a = 127;
    byte b = 127;
    b = a + b; // error : cannot convert from int to byte
    b += a; // ok
    
    

    (因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)

    40. 我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?

    不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。

    41. 3*0.1 == 0.3 将会返回什么?true 还是 false?

    false,因为有些浮点数不能完全精确的表示出来。

    42. int 和 Integer 哪个会占用更多的内存?

    Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。

    43. 为什么 Java 中的 String 是不可变的(Immutable)?

    Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。更详细的内容参见答案。

    44. 我们能在 Switch 中使用 String 吗?

    从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。

    45. Java 中的构造器链是什么?

    当你从一个构造器中调用另一个构造器,就是Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。

    46. 枚举类

    JDK1.5出现 每个枚举值都需要调用一次构造函数

    48. 什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?

    不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。

    如何在Java中写出Immutable的类?

    要写出这样的类,需要遵循以下几个原则:

    1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。

    2)Immutable类的所有的属性都应该是final的。

    3)对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak)。

    4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。

    5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)

    49. 我们能创建一个包含可变对象的不可变对象吗?

    是的,我们是可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。

    50. List和Set

    List 是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是 List 接口保证的。Set 是一个无序集合。

    51. poll() 方法和 remove() 方法的区别?

    poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

    52. Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?

    PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue 时,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。

    53. ArrayList 与 LinkedList 的区别?

    最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

    54. 用哪两种方式来实现集合的排序?

    你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。

    55. Java 中怎么打印数组?

    你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。

    56. Java 中的 LinkedList 是单向链表还是双向链表?

    是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。

    57. Java 中的 TreeMap 是采用什么树实现的?

    Java 中的 TreeMap 是使用红黑树实现的。

    58. Java 中的 HashSet,内部是如何工作的?

    HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。

    59. 写一段代码在遍历 ArrayList 时移除一个元素?

    该问题的关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的 remove()方法。这有一段示例代码,是使用正确的方式来实现在遍历的过程中移除元素,而不会出现 ConcurrentModificationException 异常的示例代码。

    60. 我们能自己写一个容器类,然后使用 for-each 循环吗?

    可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。

    61. ArrayList 和 HashMap 的默认大小是多数?

    在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段:

    // from ArrayList.java JDK 1.7
    private static final int DEFAULT_CAPACITY = 10;
     
    //from HashMap.java JDK 7
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
    

    62. 有没有可能两个不相等的对象有有相同的 hashcode?

    有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的hashcode 值,但是没有关于不相等对象的任何规定。

    63. 两个相同的对象会有不同的的 hash code 吗?

    不能,根据 hash code 的规定,这是不可能的。

    64. 我们可以在 hashcode() 中使用随机数字吗?

    不行,因为对象的 hashcode 值必须是相同的。

    65. Java 中,Comparator 与 Comparable 有什么不同?

    Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。

    66. 为什么在重写 equals 方法的时候需要重写 hashCode 方法?

    因为有强制的规范指定需要同时重写 hashcode 与 equal 是方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。

    67. “a==b”和”a.equals(b)”有什么区别?

    如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

    68. a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

    简介:hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。

    1、hashcode的作用

    List和Set,如何保证Set不重复呢?通过迭代使用equals方法来判断,数据量小还可以接受,数据量大怎么解决?引入hashcode,实际上hashcode扮演的角色就是寻址,大大减少查询匹配次数。

    2、hashcode重要吗

    对于数组、List集合就是一个累赘。而对于hashmap, hashset, hashtable就异常重要了。

    3、equals方法遵循的原则

    • 对称性 若x.equals(y)true,则y.equals(x)true
    • 自反性 x.equals(x)必须true
    • 传递性 若x.equals(y)true,y.equals(z)true,则x.equals(z)必为true
    • 一致性 只要x,y内容不变,无论调用多少次结果不变
    • 其他 x.equals(null) 永远false,x.equals(和x数据类型不同)始终false

    两者的关系

    69. final、finalize 和 finally 的不同之处?

    final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

    70. Java 中的编译期常量是什么?使用它又什么风险?

    变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。

    71. 说出几点 Java 中使用 Collections 的最佳实践

    这是我在使用 Java 中 Collectionc 类的一些最佳实践:

    a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector。

    b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。

    c)使用接口代表和访问集合,如使用List存储 ArrayList,使用 Map 存储 HashMap 等等。

    d)使用迭代器来循环集合。

    e)使用集合的时候使用泛型。

    72. 静态内部类与顶级类有什么区别?

    一个公共的顶级类的源文件名称与类名相同,而嵌套静态类没有这个要求。一个嵌套类位于顶级类内部,需要使用顶级类的名称来引用嵌套静态类,如 HashMap.Entry 是一个嵌套静态类,HashMap 是一个顶级类,Entry是一个嵌套静态类。

    73. Java 中,Serializable 与 Externalizable 的区别?

    Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。

    74. 说出 JDK 1.7 中的三个新特性?

    虽然 JDK 1.7 不像 JDK 5 和 8 一样的大版本,但是,还是有很多新的特性,如 try-with-resource 语句,这样你在使用流或者资源的时候,就不需要手动关闭,Java 会自动关闭。Fork-Join 池某种程度上实现 Java 版的 Map-reduce。允许 Switch 中有 String 变量和文本。菱形操作符(<>)用于泛型推断,不再需要在变量声明的右边申明泛型,因此可以写出可读写更强、更简洁的代码。另一个值得一提的特性是改善异常处理,如允许在同一个 catch 块中捕获多个异常。

    75. 说出 5 个 JDK 1.8 引入的新特性?

    Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:
    Lambda 表达式,允许像对象一样传递匿名函数
    Stream API,充分利用现代多核 CPU,可以写出很简洁的代码
    Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用
    扩展方法,现在,接口中可以有静态、默认方法。
    重复注解,现在你可以将相同的注解在同一类型上使用多次。

    下述包含 Java 面试过程中关于 SOLID 的设计原则,OOP 基础,如类,对象,接口,继承,多态,封装,抽象以及更高级的一些概念,如组合、聚合及关联。也包含了 GOF 设计模式的问题。

    76. 接口是什么?为什么要使用接口而不是直接使用具体类?

    接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许普通方法,以此来保证抽象,但是 Java 8 中你可以在接口声明静态方法和默认普通方法。

    77. Java 中,抽象类与接口之间有什么不同?

    Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制
    参见第六条。

    78. 除了单例模式,你在生产环境中还用过什么设计模式?

    这需要根据你的经验来回答。一般情况下,你可以说依赖注入,工厂模式,装饰模式或者观察者模式,随意选择你使用过的一种即可。不过你要准备回答接下的基于你选择的模式的问题。

    79. 你能解释一下里氏替换原则吗?

    严格定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象用o1替换o2时,程序P的行为没有变化,那么类型S是类型T的子类型。

    通俗表述:所有引用基类(父类)的地方必须能透明地使用其子类的对象。也就是说子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义:

    1. 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
    2. 子类中可以增加自己特有的方法。
    3. 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
    4. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

    80.什么情况下会违反迪米特法则?为什么会有这个问题?

    迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。

    81. 适配器模式是什么?什么时候使用?

    适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。

    82. 构造器注入和 setter 依赖注入,那种方式更好?

    每种方式都有它的缺点和优点。构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖,Setter 注入的可读写会更强。经验法则是强制依赖使用构造器注入,可选依赖使用 setter 注入。

    83. 依赖注入和工厂模式之间有什么不同?

    虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工程模式更清晰。通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。使用工厂模式,你的类需要通过工厂来获取依赖。因此,使用 DI 会比使用工厂模式更容易测试。

    84. 适配器模式和装饰器模式有什么区别?

    虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。

    85. 适配器模式和代理模式之前有什么不同?

    这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。

    86. 什么是模板方法模式?

    模板方法提供算法的框架,你可以自己去配置或定义步骤。例如,你可以将排序算法看做是一个模板。它定义了排序的步骤,但是具体的比较,可以使用 Comparable 或者其语言中类似东西,具体策略由你去配置。列出算法概要的方法就是众所周知的模板方法。

    87. 什么时候使用访问者模式?

    访问者模式用于解决在类的继承层次上增加操作,但是不直接与之关联。这种模式采用双派发的形式来增加中间层。

    88. 什么时候使用组合模式?

    组合模式使用树结构来展示部分与整体继承关系。它允许客户端采用统一的形式来对待单个对象和对象容器。当你想要展示对象这种部分与整体的继承关系时采用组合模式。

    89. 继承和组合之间有什么不同?

    虽然两种都可以实现代码复用,但是组合比继承共灵活,因为组合允许你在运行时选择不同的实现。用组合实现的代码也比继承测试起来更加简单。

    90. 描述 Java 中的重载和重写?

    重载和重写都允许你用相同的名称来实现不同的功能,但是重载是编译时活动,而重写是运行时活动。你可以在同一个类中重载方法,但是只能在子类中重写方法。重写必须要有继承。

    91. OOP 中的 组合、聚合和关联有什么区别?

    如果两个对象彼此有关系,就说他们是彼此相关联的。组合和聚合是面向对象中的两种形式的关联。组合是一种比聚合更强力的关联。组合中,一个对象是另一个的拥有者,而聚合则是指一个对象使用另一个对象。如果对象 A 是由对象 B 组合的,则 A 不存在的话,B一定不存在,但是如果 A 对象聚合了一个对象 B,则即使 A 不存在了,B 也可以单独存在。

    92. 给我一个符合开闭原则的设计模式的例子?

    开闭原则要求你的代码对扩展开放,对修改关闭。这个意思就是说,如果你想增加一个新的功能,你可以很容易的在不改变已测试过的代码的前提下增加新的代码。有好几个设计模式是基于开闭原则的,如策略模式,如果你需要一个新的策略,只需要实现接口,增加配置,不需要改变核心逻辑。一个正在工作的例子是 Collections.sort() 方法,这就是基于策略模式,遵循开闭原则的,你不需为新的对象修改 sort() 方法,你需要做的仅仅是实现你自己的 Comparator 接口。

    93. 什么时候使用享元模式(蝇量模式)?

    享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。

    94. Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?

    Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期。DateFormat 类允许你使用多种流行的格式来格式化日期。

    95. Java 中,怎么在格式化的日期中显示时区?

    pattern中加z yyyy-MM-dd HH:mm:ss.SSS Z

    96. Java 中 java.util.Date 与 java.sql.Date 有什么区别?

    java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分,它们都有getTime方法返回毫秒数,自然就可以直接构建。java.util.Date 是 java.sql.Date 的父类,前者是常用的表示时间的类,我们通常格式化或者得到当前时间都是用他,后者之后在读写数据库的时候用他,因为PreparedStament的setDate()的第2参数和ResultSet的getDate()方法的第2个参数都是java.sql.Date。

    97. Java 中,如何计算两个日期之间的差距?

    public static int dateDiff(Date d1, Date d2) throws Exception {
    long n1 = d1.getTime();
    long n2 = d2.getTime();
    long diff = Math.abs(n1 - n2);
    
    diff /= 3600 * 1000 * 24;
    return diff;
    }
    

    98. Java 中,如何将字符串 YYYYMMDD 转换为日期?

    SimpleDateFormat的parse方法

    99. 说出几条 Java 中方法重载的最佳实践?

    下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱。

    a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。

    b)不要重载参数数量一致,而只是参数顺序不同的方法。

    c)如果重载的方法参数个数多于 5 个,采用可变参数。

    100. 说出 5 条 IO 的最佳实践

    IO 对 Java 应用的性能非常重要。理想情况下,你应该在你应用的关键路径上避免 IO 操作。下面是一些你应该遵循的 Java IO 最佳实践:

    a)使用有缓冲区的 IO 类,而不要单独读取字节或字符

    b)使用 NIO 和 NIO2

    c)在 finally 块中关闭流,或者使用 try-with-resource(Java7) 语句

    d)使用内存映射文件获取更快的 IO

    101. Object有哪些公用方法?

    clone equals hashcode wait notify notifyall finalize toString getClass
    除了clone和finalize其他均为公共方法。

    11个方法,wait被重载了两次

    102. equals与==的区别

    区别1. ==是一个运算符 equals是Object类的方法

    区别2. 比较时的区别

    a. 用于基本类型的变量比较时:==用于比较值是否相等,equals不能直接用于基本数据类型的比较,需要转换为其对应的包装类型。
    b. 用于引用类型的比较时。==和equals都是比较栈内存中的地址是否相等 。相等为true 否则为false。但是通常会重写equals方法去实现对象内容的比较。

    103. String、StringBuffer与StringBuilder的区别

    第一点:可变和适用范围。String对象是不可变的,而StringBuffer和StringBuilder是可变字符序列。每次对String的操作相当于生成一个新的String对象,而对StringBuffer和StringBuilder的操作是对对象本身的操作,而不会生成新的对象,所以对于频繁改变内容的字符串避免使用String,因为频繁的生成对象将会对系统性能产生影响。

    第二点:线程安全。String由于有final修饰,是immutable的,安全性是简单而纯粹的。StringBuilder和StringBuffer的区别在于StringBuilder不保证同步,也就是说如果需要线程安全需要使用StringBuffer,不需要同步的StringBuilder效率更高。

    104. switch能否用String做参数

    Java1.7开始支持,但实际这是一颗Java语法糖。除此之外,byte,short,long,枚举,boolean均可用于switch,只有浮点型不可以。

    105. 封装、继承、多态

    封装

    1.概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。

    2.好处:

    (1)隐藏内部实现细节。

    继承

    1.概念:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力

    2.好处:提高代码的复用,缩短开发周期。

    多态

    1.概念:多态(Polymorphism)按字面的意思就是“多种状态,即同一个实体同时具有多种形式。一般表现形式是程序在运行的过程中,同一种类型在不同的条件下表现不同的结果。多态也称为动态绑定,一般是在运行时刻才能确定方法的具体执行对象。

    2.好处:
    1)将接口和实现分开,改善代码的组织结构和可读性,还能创建可拓展的程序。
    2)消除类型之间的耦合关系。允许将多个类型视为同一个类型。
    3)一个多态方法的调用允许有多种表现形式

    106. Comparable和Comparator接口区别

    Comparator位于包java.util下,而Comparable位于包java.lang下

    如果我们需要使用Arrays或Collections的排序方法对对象进行排序时,我们需要在自定义类中实现Comparable接口并重写compareTo方法,compareTo方法接收一个参数,如果this对象比传递的参数小,相等或大时分别返回负整数、0、正整数。Comparable被用来提供对象的自然排序。String、Integer实现了该接口。

    Comparator比较器的compare方法接收2个参数,根据参数的比较大小分别返回负整数、0和正整数。
    Comparator 是一个外部的比较器,当这个对象自然排序不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。

    107. 与Java集合框架相关的有哪些最好的实践

    (1)根据需要选择正确的集合类型。比如,如果指定了大小,我们会选用Array而非ArrayList。如果我们想根据插入顺序遍历一个Map,我们需要使用TreeMap。如果我们不想重复,我们应该使用Set。

    (2)一些集合类允许指定初始容量,所以如果我们能够估计到存储元素的数量,我们可以使用它,就避免了重新哈希或大小调整。

    (3)基于接口编程,而非基于实现编程,它允许我们后来轻易地改变实现。

    (4)总是使用类型安全的泛型,避免在运行时出现ClassCastException。

    (5)使用JDK提供的不可变类作为Map的key,可以避免自己实现hashCode()和equals()。

    108. IO和NIO简述

    1、简述

    在以前的Java IO中,都是阻塞式IO,NIO引入了非阻塞式IO。
    第一种方式:我从硬盘读取数据,然后程序一直等,数据读完后,继续操作。这种方式是最简单的,叫阻塞IO。
    第二种方式:我从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程序(对硬件来说叫中断,对程序来说叫回调),然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。

    2.流与块的比较

    原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。这样做是相对简单的。不利的一面是,面向流的 I/O 通常相当慢。
    一个 面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。

    3.通道与流

    Channel是一个对象,可以通过它读取和写入数据。通道与流功能类似,不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类), 而通道可以用于读、写或者同时用于读写。

    4.缓冲区Buffer

    在 NIO 库中,所有数据都是用缓冲区处理的。在 NIO 库中,所有数据都是用缓冲区处理的。

    Position: 表示下一次访问的缓冲区位置
    Limit: 表示当前缓冲区存放的数据容量。
    Capacity:表示缓冲区最大容量

    flip()方法:读写模式切换

    clear方法:它将 limit 设置为与 capacity 相同。它设置 position 为 0。


    二、Java高级(JavaEE、框架、服务器、工具等)

    1. Servlet

    1.1 Servlet继承实现结构

    Servlet (接口) 			-->      init|service|destroy方法
    GenericServlet(抽象类)  -->      与协议无关的Servlet
    HttpServlet(抽象类)		-->		 实现了http协议
    自定义Servlet			-->		 重写doGet/doPost
    

    1.2 编写Servlet的步骤

    1. 继承HttpServlet
    2. 重写doGet/doPost方法
    3. 在web.xml中注册servlet

    1.3 Servlet生命周期

    1. init:仅执行一次,负责装载servlet时初始化servlet对象
    2. service:核心方法,一般get/post两种方式
    3. destroy:停止并卸载servlet,释放资源

    1.4 过程

    1. 客户端request请求 -> 服务器检查Servlet实例是否存在 -> 若存在调用相应service方法
    2. 客户端request请求 -> 服务器检查Servlet实例是否存在 -> 若不存在装载Servlet类并创建实例 -> 调用init初始化 -> 调用service
    3. 加载和实例化、初始化、处理请求、服务结束

    1.5 doPost方法要抛出的异常:ServletExcception、IOException

    1.6 Servlet容器装载Servlet

    1. web.xml中配置load-on-startup启动时装载
    2. 客户首次向Servlet发送请求
    3. Servlet类文件被更新后, 重新装载Servlet

    1.7 HttpServlet容器响应web客户请求流程

    1. Web客户向servlet容器发出http请求
    2. servlet容器解析Web客户的http请求
    3. servlet容器创建一个HttpRequest对象, 封装http请求信息
    4. servlet容器创建一个HttpResponse对象
    5. servlet容器调用HttpServlet的service方法, 把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象
    6. HttpServlet调用httprequest的有关方法, 获取http请求信息
    7. httpservlet调用httpresponse的有关方法, 生成响应数据
    8. Servlet容器把HttpServlet的响应结果传给web客户

    1.8 HttpServletRequest完成的一些功能

    1. request.getCookie()
    2. request.getHeader(String s)
    3. request.getContextPath()
    4. request.getSession()
    HttpSession session = request.getSession(boolean create)
    返回当前请求的会话
    

    1.9 HttpServletResponse完成一些的功能

    1. 设http响应头
    2. 设置Cookie
    3. 输出返回数据

    1.10 Servlet与JSP九大内置对象的关系

    JSP对象 怎样获得

    1. out				->		response.getWriter
    2. request 		->		Service方法中的req参数
    3. response 		->		Service方法中的resp参数
    4. session 		->		request.getSession
    5. application 	->		getServletContext
    6. exception 		->		Throwable
    7. page  			->		this
    8. pageContext  	->		PageContext
    9. Config 			->		getServletConfig
    

    exception是JSP九大内置对象之一,其实例代表其他页面的异常和错误。只有当页面是错误处理页面时,即isErroePage为 true时,该对象才可以使用。

    2. JSP

    JSP的前身就是Servlet

    3. Tomcat

    3.1 Tomcat容器的等级

    Tomcat - Container - Engine - Host - Servlet - 多个Context(一个Context对应一个web工程)-Wrapper

    4. struts

    1. struts可进行文件上传
    2. struts基于MVC模式
    3. struts让流程结构更清晰
    4. struts有许多action类, 会增加类文件数目

    5. Hibernate的7大鼓励措施

    1. 尽量使用many-to-one, 避免使用单项one-to-many
    2. 灵活使用单项one-to-many
    3. 不用一对一, 使用多对一代替一对一
    4. 配置对象缓存, 不使用集合对象
    5. 一对多使用bag, 多对一使用set
    6. 继承使用显示多态
    7. 消除大表, 使用二级缓存

    6. Hibernate延迟加载

    1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
    2. Hibernate3 提供了属性的延迟加载功能
      当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
    3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
    4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

    7. Java 中,DOM 和 SAX 解析器有什么不同?

    DOM 解析器将整个 XML 文档加载到内存来创建一棵 DOM 模型树,这样可以更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器,不会将整个 XML 文档加载到内存。由于这个原因,DOM 比 SAX 更快,也要求更多的内存,但不适合于解析大的 XML 文件。

    8. Java 中,Maven 和 ANT 有什么区别?

    虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多,在基于“约定优于配置”的概念下,提供标准的Java 项目结构,同时能为应用自动管理依赖(应用中所依赖的 JAR 文件)。

    9. 解析XML不同方式对比

    DOM、SAX、JDOM、DOM4J

    • DOM DOM树驻留内存

    可以进行修改和写入,耗费内存。

    步骤:创建DocumentBuilderFactory对象 -> 创建DocumentBuilder对象 -> Document document = db.parse(“xml”)

    • SAX 事件驱动模式

    获取一个SAXParserFactory工厂的实例 -> 根据该实例获取SAXParser -> 创建Handler对象 -> 调用SAXParser的parse方法解析

    用于读取节点数据 不易编码 事件有顺序 很难同时访问xml的多处数据

    • JDOM

    创建一个SAXBuilder的对象 -> 创建一个输入流,加载xml文件 ->通过saxBuilder的build方法将输入流加载至saxBuilder并接收Document对象

    使用具体类而不使用接口

    • DOM4J

    通过SAXReader的read方法加载xml文件并获取document对象

    使用接口和抽象类,灵活性好,功能强大

    10. Nginx相关

    请参考我的Nginx

    11. XML与JSON对比和区别

    XML

    1)应用广泛,可扩展性强,被广泛应用各种场合
    2)读取、解析没有JSON快
    3)可读性强,可描述复杂结构
    

    JSON

    1)结构简单,都是键值对
    2)读取、解析速度快,很多语言支持
    3)传输数据量小,传输速率大大提高
    4)描述复杂结构能力较弱
    
    JavaScript、PHP等原生支持,简化了读取解析。成为当前互联网时代普遍应用的数据结构。
    

    三、多线程和并发

    0. Java 中的 volatile 变量是什么

    Java 语言提供了一种稍弱的同步机制,即volatile变量。但是volatile并不容易完全被正确、完整的理解。
    一般来说,volatile具备2条语义,或者说2个特性。第一是保证volatile修饰的变量对所有线程的可见性,这里的可见性是指当一条线程修改了该变量,新值对于其它线程来说是立即可以得知的。而普通变量做不到这一点。

    第二条语义是禁止指令重排序优化,这条语义在JDK1.5才被修复。

    关于第一点:根据JMM,所有的变量存储在主内存,而每个线程还有自己的工作内存,线程的工作内存保存该线程使用到的变量的主内存副本拷贝,线程对变量的操作在工作内存中进行,不能直接读写主内存的变量。在volatile可见性这一点上,普通变量做不到的原因正因如此。比如,线程A修改了一个普通变量的值,然后向主内存进行回写,线程B在线程A回写完成后再从主内存读取,新变量才能对线程B可见。其实,按照虚拟机规范,volatile变量依然有工作内存的拷贝,要借助主内存来实现可见性。但由于volatile的特殊规则保证了新值能立即同步回主内存,以及每次使用从主内存刷新,以此保证了多线程操作volatile变量的可见性。

    关于第二点:先说指令重排序,指令重排序是指CPU采用了允许将多条指令不按规定顺序分开发送给相应的处理单元处理,但并不是说任意重排,CPU需要正确处理指令依赖情况确保最终的正确结果,指令重排序是机器级的优化操作。那么为什么volatile要禁止指令重排序呢,又是如何去做的。举例,DCL(双重检查加锁)的单例模式。volatile修饰后,代码中将会插入许多内存屏障指令保证处理器不发生乱序执行。同时由于Happens-before规则的保证,在刚才的例子中写操作会发生在后续的读操作之前。

    除了以上2点,volatile还保证对于64位long和double的读取是原子性的。因为在JMM中允许虚拟机对未被volatile修饰的64位的long和double读写操作分为2次32位的操作来执行,这也就是所谓的long和double的非原子性协定。

    基于以上几点,我们知道volatile虽然有这些语义和特性在并发的情况下仍然不能保证线程安全。大部分情况下仍然需要加锁。

    除非是以下2种情况,1.运算结果不依赖变量的当前值,或者能够确保只有单一线程修改变量的值;2.变量不需要与其他的状态变量共同参与不变约束。

    1. volatile简述

    Java 语言提供了一种稍弱的同步机制,即volatile变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的。volatile修饰变量,每次被线程访问时强迫其从主内存重读该值,修改后再写回。保证读取的可见性,对其他线程立即可见。volatile的另一个语义是禁止指令重排序优化。但是volatile并不保证原子性,也就不能保证线程安全。

    2. Java 中能创建 volatile 数组吗?

    能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 就不能起到之前的保护作用了。

    3. volatile 能使得一个非原子操作变成原子操作吗?

    一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。

    4. volatile 禁止指令重排序的底层原理
    指令重排序,是指CPU允许多条指令不按程序规定的顺序分开发送给相应电路单元处理。但并不是说任意重排,CPU需要能正确处理指令依赖情况以正确的执行结果。volatile禁止指令重排序是通过内存屏障实现的,指令重排序不能把后面的指令重排序到内存屏障之前。由内存屏障保证一致性。注:该条语义在JDK1.5才得以修复,这点也是JDK1.5之前无法通过双重检查加锁来实现单例模式的原因。

    5. volatile 类型变量提供什么保证?

    volatile 变量提供有序性和可见性保证,例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。 volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。某些情况下,volatile 还能提供原子性,如读 64 位数据类型,像 long 和 double 都不是原子的,但 volatile 类型的 double 和 long 就是原子的。

    volatile的使用场景:

    1. 运算结果不依赖变量的当前值,或者能够确保只有单一的线程修改该值

    2. 变量不需要与其他状态变量共同参与不变约束

    6. volatile的性能

    volatile变量的读操作性能消耗和普通变量差不多,但是写操作可能相对慢一些,因为它需要在本地代码中插入许多内存屏障指令以确保处理器不发生乱序执行。大多数情况下,volatile总开销比锁低,但我们要注意volatile的语义能否满足使用场景。

    7. 10 个线程和 2 个线程的同步代码,哪个更容易写?

    从写代码的角度来说,两者的复杂度是相同的,因为同步代码与线程数量是相互独立的。但是同步策略的选择依赖于线程的数量,因为越多的线程意味着更大的竞争,所以你需要利用同步技术,如锁分离,这要求更复杂的代码和专业知识。

    8. 你是如何调用 wait()方法的?使用 if 块还是循环?为什么?

    wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:

    // The standard idiom for using the wait method
    synchronized (obj) {
    while (condition does not hold)
    obj.wait(); // (Releases lock, and reacquires on wakeup)
    ... // Perform action appropriate to condition
    }
    
    

    参见 Effective Java 第 69 条,获取更多关于为什么应该在循环中来调用 wait 方法的内容。

    9. 什么是多线程环境下的伪共享(false sharing)?

    伪共享是多线程系统(每个处理器有自己的局部缓存)中一个众所周知的性能问题。伪共享发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSHFkwHb-1596373001450)(http://jbcdn2.b0.upaiyun.com/2015/11/2bccd7f52a70db95aa72524ef3a55164.gif)]

    伪共享问题很难被发现,因为线程可能访问完全不同的全局变量,内存中却碰巧在很相近的位置上。如其他诸多的并发问题,避免伪共享的最基本方式是仔细审查代码,根据缓存行来调整你的数据结构。

    10. 线程的run方法和start方法

    • run方法

    只是thread类的一个普通方法,若直接调用程序中依然只有主线程这一个线程,还要顺序执行,依然要等待run方法体执行完毕才可执行下面的代码。

    • start方法

    用start方法来启动线程,是真正实现了多线程。调用thread类的start方法来启动一个线程,此时线程处于就绪状态,一旦得到cpu时间片,就开始执行run方法。

    11. ReadWriteLock(读写锁)

    写写互斥 读写互斥 读读并发, 在读多写少的情况下可以提高效率

    12. resume(继续挂起的线程)和suspend(挂起线程)一起用

    13. wait与notify、notifyall一起用

    14. sleep与wait的异同点

    • sleep是Thread类的静态方法, wait来自object类
    • sleep方法短暂停顿不释放锁, wait方法条件等待要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁。
    • wait, notify, notifyall必须在同步代码块中使用, sleep可以在任何地方使用
    • 都可以抛出InterruptedException

    15. 让一个线程停止执行

    异常 - 停止执行
    休眠 - 停止执行
    阻塞 - 停止执行

    16. ThreadLocal简介

    16.1 ThreadLocal解决了变量并发访问的冲突问题

    当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。线程隔离的秘密在于ThreadLocalMap类(ThreadLocal的静态内部类)

    16.2 与synchronized同步机制的比较

    首先,它们都是为了解决多线程中相同变量访问冲突问题。不过,在同步机制中,要通过对象的锁机制保证同一时间只有一个线程访问该变量。该变量是线程共享的, 使用同步机制要求程序缜密地分析什么时候对该变量读写, 什么时候需要锁定某个对象, 什么时候释放对象锁等复杂的问题,程序设计编写难度较大, 是一种“以时间换空间”的方式。
    而ThreadLocal采用了以“以空间换时间”的方式。

    17. 线程局部变量原理

    当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。线程隔离的秘密在于ThreadLocalMap类(ThreadLocal的静态内部类)

    线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。

    ThreadLocal的方法:void set(T value)、T get()以及T initialValue()。

    ThreadLocal是如何为每个线程创建变量的副本的:

    首先,在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。

    总结:

    1. 实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的

    2. 为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量,就像上面代码中的longLocal和stringLocal;

    3. 在进行get之前,必须先set,否则会报空指针异常;如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法

    18. JDK提供的用于并发编程的同步器

    1. Semaphore Java并发库的Semaphore可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
    2. CyclicBarrier 主要的方法就是一个:await()。await()方法每被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此CyclicBarrier上面阻塞的线程开始运行。
    3. CountDownLatch 直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程。

    19. 什么是 Busy spin?我们为什么要使用它?

    Busy spin 是一种在不释放 CPU 的基础上等待事件的技术。它经常用于避免丢失 CPU 缓存中的数据(如果线程先暂停,之后在其他CPU上运行就会丢失)。所以,如果你的工作要求低延迟,并且你的线程目前没有任何顺序,这样你就可以通过循环检测队列中的新消息来代替调用 sleep() 或 wait() 方法。它唯一的好处就是你只需等待很短的时间,如几微秒或几纳秒。LMAX 分布式框架是一个高性能线程间通信的库,该库有一个 BusySpinWaitStrategy 类就是基于这个概念实现的,使用 busy spin 循环 EventProcessors 等待屏障。

    20. Java 中怎么获取一份线程 dump 文件?

    在 Linux 下,你可以通过命令 kill -3 PID (Java 进程的进程 ID)来获取 Java 应用的 dump 文件。在 Windows 下,你可以按下 Ctrl + Break 来获取。这样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中,它可能打印在控制台或者日志文件中,具体位置依赖应用的配置。

    21. Swing 是线程安全的?

    不是,Swing 不是线程安全的。你不能通过任何线程来更新 Swing 组件,如 JTable、JList 或 JPanel,事实上,它们只能通过 GUI 或 AWT 线程来更新。这就是为什么 Swing 提供 invokeAndWait() 和 invokeLater() 方法来获取其他线程的 GUI 更新请求。这些方法将更新请求放入 AWT 的线程队列中,可以一直等待,也可以通过异步更新直接返回结果。

    22. 用 wait-notify 写一段代码来解决生产者-消费者问题?

    记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件。

    23. 用 Java 写一个线程安全的单例模式(Singleton)?

    当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例。Java 中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。参见我整理的单例的文章6种单例模式的实现以及double check的剖析

    24. Java 中,编写多线程程序的时候你会遵循哪些最佳实践?

    这是我在写Java 并发程序的时候遵循的一些最佳实践:

    a)给线程命名,这样可以帮助调试。

    b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。

    c)如果可以,更偏向于使用 volatile 而不是 synchronized。

    d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。

    e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。

    25. 说出至少 5 点在 Java 中使用线程的最佳实践。

    这个问题与之前的问题类似,你可以使用上面的答案。对线程来说,你应该:

    a)对线程命名

    b)将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。

    c)使用线程池

    26. 在多线程环境下,SimpleDateFormat 是线程安全的吗?

    不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐 joda-time 库。

    27. Happens-Before规则

    • 程序次序规则

    按控制流顺序先后发生

    • 管程锁定规则

    一个unlock操作先行发生于后面对同一个锁的lock操作

    • volatile变量规则

    对一个volatile变量的写操作先行发生于后面对这个变量的读操作

    • 线程启动规则

    start方法先行发生于线程的每一个动作

    • 线程中断规则

    对线程的interrupt方法调用先行发生于被中断线程的代码检测到中断时间的发生

    • 线程终止规则

    线程内的所有操作都先行发生于对此线程的终止检测

    • 对象终结规则

    一个对象的初始化完成先行发生于它的finalize方法的开始

    • 传递性

    如果A先行发生于操作B,B先行发生于操作C,则A先行发生于操作C

    28. 什么是线程

    线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100 毫秒,那么用十个线程完成改任务只需 10 毫秒。Java在语言层面对多线程提供了很好的支持。

    29. 线程和进程有什么区别

    从概念上:

    进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。
    线程:存在于进程内,是进程内的基本调度单位。共享进程的资源。

    从执行过程中来看:

    进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。
    线程:每一个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

    从逻辑角度来看:(重要区别)

    多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。

    简言之,一个程序至少有一个进程,一个进程至少有一个线程。进程是资源分配的基本单位,线程共享进程的资源。

    30. 用 Runnable 还是 Thread

    Java 不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是实现Runnable接口好了。

    31. Java 中 Runnable 和 Callable 有什么不同

    Runnable和 Callable 都代表那些要在不同的线程中执行的任务。Runnable 从 JDK1.0 开始就有了,Callable 是在 JDK1.5 增加的。它们的主要区别是 Callable 的 call () 方法可以返回值和抛出异常,而 Runnable 的 run ()方法没有这些功能。

    32. Java 中 CyclicBarrier 和 CountDownLatch 有什么不同

    它们都是JUC下的类,CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。区别在于CountdownLatch计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。

    33. Java 内存模型是什么

    Java 内存模型规定和指引Java 程序在不同的内存架构、CPU 和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。

    线程内的代码能够按先后顺序执行,这被称为程序次序规则。

    对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。

    前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。

    一个线程内的任何操作必需在这个线程的 start ()调用之后,也叫作线程启动规则。

    一个线程的所有操作都会在线程终止之前,线程终止规则。

    一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。

    a先行于b,b先行于c,传递性

    34. 什么是线程安全?Vector 是一个线程安全类吗

    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的,而和它相似的 ArrayList 不是线程安全的。

    35. Java 中什么是竞态条件? 举个例子说明。

    竞态条件会导致程序在并发情况下出现一些 bugs。多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那么整个程序就会出现一些不确定的 bugs。这种 bugs 很难发现而且会重复出现,因为线程间的随机竞争。几类竞态条件check-and-act、读取-修改-写入、put-if-absent。

    36. Java 中如何停止一个线程

    当 run () 或者 call () 方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用 volatile 布尔变量来退出 run ()方法的循环或者是取消任务来中断线程。其他情形:异常 - 停止执行 休眠 - 停止执行 阻塞 - 停止执行

    37. 一个线程运行时发生异常会怎样

    简单的说,如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler 是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候 JVM 会使用 Thread.getUncaughtExceptionHandler ()来查询线程的 UncaughtExceptionHandler 并将线程和异常作为参数传递给 handler 的 uncaughtException ()方法进行处理。

    38. 如何在两个线程间共享数据?

    通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构

    39. Java 中 notify 和 notifyAll 有什么区别

    notify ()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地。而 notifyAll ()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。

    40. 为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面

    一个很明显的原因是 JAVA 提供的锁是对象级的而不是线程级的。如果线程需要等待某些锁那么调用对象中的 wait ()方法就有意义了。如果 wait ()方法定义在 Thread 类中,线程正在等待的是哪个锁就不明显了。简单的说,由于 wait,notify 和 notifyAll 都是锁级别的操作,所以把他们定义在 Object 类中因为锁属于对象。

    41. 什么是 FutureTask?

    在 Java 并发程序中 FutureTask 表示一个可以取消的异步运算。它有启动和取消运算、查询运算是否完成和取回运算结果等方法。只有当运算完成的时候结果才能取回,如果运算尚未完成 get 方法将会阻塞。一个 FutureTask 对象可以对调用了 Callable 和 Runnable 的对象进行包装,由于 FutureTask 也是调用了 Runnable 接口所以它可以提交给 Executor 来执行。

    42. Java 中 interrupted 和 isInterruptedd 方法的区别

    interrupted是静态方法,isInterruptedd是一个普通方法

    如果当前线程被中断(没有抛出中断异常,否则中断状态就会被清除),你调用interrupted方法,第一次会返回true。然后,当前线程的中断状态被方法内部清除了。第二次调用时就会返回false。如果你刚开始一直调用isInterrupted,则会一直返回true,除非中间线程的中断状态被其他操作清除了。也就是说isInterrupted 只是简单的查询中断状态,不会对状态进行修改。

    43. 为什么 wait 和 notify 方法要在同步块中调用

    如果不这么做,代码会抛出 IllegalMonitorStateException异常。还有一个原因是为了避免 wait 和 notify 之间产生竞态条件。

    44. 为什么你应该在循环中检查等待条件?

    处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。因此,当一个等待线程醒来时,不能认为它原来的等待状态仍然是有效的,在 notify 方法调用之后和等待线程醒来之前这段时间它可能会改变。这就是在循环中使用 wait 方法效果更好的原因。

    45. Java 中的同步集合与并发集合有什么区别

    同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。在 Java1.5 之前程序员们只有同步集合来用且在多线程并发的时候会导致争用,阻碍了系统的扩展性。Java1.5加入了并发集合像 ConcurrentHashMap,不仅提供线程安全还用锁分离和内部分区等现代技术提高了可扩展性。它们大部分位于JUC包下。

    46. 什么是线程池? 为什么要使用它?

    创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从 JDK1.5 开始,Java API 提供了 Executor 框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。

    47. 如何写代码来解决生产者消费者问题?

    在现实中你解决的许多线程问题都属于生产者消费者模型,就是一个线程生产任务供其它线程进行消费,你必须知道怎么进行线程间通信来解决这个问题。比较低级的办法是用 wait 和 notify 来解决这个问题,比较赞的办法是用 Semaphore 或者 BlockingQueue 来实现生产者消费者模型。

    48.如何避免死锁?

    死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:

    互斥条件:一个资源每次只能被一个进程使用。

    请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

    不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

    循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。

    49. Java 中活锁和死锁有什么区别?

    活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是不断改变的,活锁可以认为是一种特殊的饥饿。一个现实的活锁例子是两个人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊。简单的说就是,活锁和死锁的主要区别是前者进程的状态可以改变但是却不能继续执行。

    50. 怎么检测一个线程是否拥有锁

    在 java.lang.Thread 中有一个方法叫 holdsLock,当且仅当当前线程拥有某个具体对象的锁时它返回true。

    51. 你如何在 Java 中获取线程堆栈

    在 Linux 下,你可以通过命令 kill -3 PID (Java 进程的进程 ID)来获取 Java 应用的 dump 文件。在 Windows 下,你可以按下 Ctrl + Break 来获取。这样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中,它可能打印在控制台或者日志文件中,具体位置依赖应用的配置。

    52.Java 中 synchronized 和 ReentrantLock 有什么不同

    Java 在过去很长一段时间只能通过 synchronized 关键字来实现互斥,它有一些缺点。比如你不能扩展锁之外的方法或者块边界,尝试获取锁时不能中途取消等。Java 5 通过 Lock 接口提供了更复杂的控制来解决这些问题。 ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发性和内存语义且它还具有可扩展性。

    53.有三个线程 T1,T2,T3,怎么确保它们按顺序执行

    可以用线程类的 join ()方法。具体操作是在T3的run方法中调用t2.join(),让t2执行完再执行t3;T2的run方法中调用t1.join(),让t1执行完再执行t2。这样就按T1,T2,T3的顺序执行了

    54.Thread 类中的 yield 方法有什么作用

    Yield 方法可以暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。它是一个静态方法而且只保证当前线程放弃 CPU 占用而不能保证使其它线程一定能占用 CPU,执行 yield的线程有可能在进入到暂停状态后马上又被执行。

    55.Java 中 ConcurrentHashMap 的并发度是什么

    ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的,它是 ConcurrentHashMap 类构造函数的一个可选参数,默认值为 16,这样在多线程情况下就能避免争用。

    56.Java 中 Semaphore是什么

    JUC下的一种新的同步类,它是一个计数信号。从概念上讲,Semaphore信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire,然后再获取该许可。每个 release添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。信号量常常用于多线程的代码中,比如数据库连接池。

    57.如果你提交任务时,线程池队列已满。会发会生什么?

    这个问题问得很狡猾,许多程序员会认为该任务会阻塞直到线程池队列有空位。事实上如果一个任务不能被调度执行那么 ThreadPoolExecutor’s submit ()方法将会抛出一个 RejectedExecutionException 异常。

    58.Java 线程池中 submit () 和 execute ()方法有什么区别

    两个方法都可以向线程池提交任务,execute ()方法的返回类型是 void,它定义在 Executor 接口中, 而 submit ()方法可以返回持有计算结果的 Future 对象,它定义在 ExecutorService 接口中,它扩展了 Executor 接口,其它线程池类像 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 都有这些方法。

    59.什么是阻塞式方法?

    阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket 的 accept ()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。

    60.Swing 是线程安全的吗?

    你可以很肯定的给出回答,Swing 不是线程安全的。你不能通过任何线程来更新 Swing 组件,如 JTable、JList 或 JPanel,事实上,它们只能通过 GUI 或 AWT 线程来更新。这就是为什么 Swing 提供 invokeAndWait() 和 invokeLater() 方法来获取其他线程的 GUI 更新请求。这些方法将更新请求放入 AWT 的线程队列中,可以一直等待,也可以通过异步更新直接返回结果。

    61.Java 中 invokeAndWait 和 invokeLater 有什么区别

    这两个方法是 Swing API 提供给 Java 开发者用来从当前线程而不是事件派发线程更新 GUI 组件用的。InvokeAndWait ()同步更新 GUI 组件,比如一个进度条,一旦进度更新了,进度条也要做出相应改变。如果进度被多个线程跟踪,那么就调用 invokeAndWait ()方法请求事件派发线程对组件进行相应更新。而 invokeLater ()方法是异步调用更新组件的。

    62.Swing API 中那些方法是线程安全的?

    虽然Swing不是线程安全的但是有一些方法是可以被多线程安全调用的。如repaint (), revalidate ()。 JTextComponent 的 setText ()方法和 JTextArea 的 insert () 和 append () 方法也是线程安全的。

    63.如何在 Java 中创建 Immutable 对象

    Immutable 对象可以在没有同步的情况下共享,降低了对该对象进行并发访问时的同步化开销。可是 Java 没有@Immutable 这个注解符,要创建不可变类,要实现下面几个步骤:通过构造方法初始化所有成员、对变量不要提供 setter 方法、将所有的成员声明为私有的,这样就不允许直接访问这些成员、在 getter 方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝。

    64.Java 中的 ReadWriteLock 是什么?

    一般而言,读写锁是用来提升并发程序性能的锁分离技术的成果。Java 中的 ReadWriteLock 是 Java 5 中新增的一个接口,一个 ReadWriteLock 维护一对关联的锁,一个用于只读操作一个用于写。在没有写线程的情况下一个读锁可能会同时被多个读线程持有。写锁是独占的,你可以使用 JDK 中的 ReentrantReadWriteLock 来实现这个规则,它最多支持 65535 个写锁和 65535 个读锁。

    65.多线程中的忙循环是什么?

    忙循环就是程序员用循环让一个线程等待,不像传统方法 wait (), sleep () 或 yield () 它们都放弃了 CPU 控制,而忙循环不会放弃 CPU,它就是在运行一个空循环。这么做的目的是为了保留 CPU 缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。

    66.volatile 变量和 atomic 变量有什么不同

    volatile 变量和 atomic 变量看起来很像,但功能却不一样。volatile 变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性。例如用 volatile 修饰 count 变量那么 count++ 操作并不是原子性的。而 AtomicInteger 类提供的 atomic 方法可以让这种操作具有原子性如 getAndIncrement ()方法会原子性的进行增量操作把当前值加一,其它数据类型和引用变量也可以进行相似操作。

    67.如果同步块内的线程抛出异常会发生什么?

    无论你的同步块是正常还是异常退出的,里面的线程都会释放锁,所以对比锁接口我更喜欢同步块,因为它不用我花费精力去释放锁,该功能可以在 finally block 里释放锁实现。

    68.如何在 Java 中创建线程安全的 Singleton

    5种,急加载,同步方法,双检锁,静态内部类,枚举

    69.如何强制启动一个线程?

    这个问题就像是如何强制进行 Java 垃圾回收,目前还没有觉得方法,虽然你可以使用 System.gc ()来进行垃圾回收,但是不保证能成功。在 Java 里面没有办法强制启动一个线程,它是被线程调度器控制着且 Java 没有公布相关的 API。

    70.Java 中的 fork join 框架是什么?

    fork join 框架是 JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。

    71.Java 多线程中调用 wait () 和 sleep ()方法有什么不同?

    Java 程序中 wait 和 sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法意味着条件等待,如果等待条件为真且其它线程被唤醒时它会释放锁,而 sleep ()方法仅仅释放 CPU 资源或者让当前线程短暂停顿,但不会释放锁。

    72.可重入锁

    可重入锁:如果当前线程已经获得了某个监视器对象所持有的锁,那么该线程在该方法中调用另外一个同步方法也同样持有该锁。

    public synchrnozied void test() {
        xxxxxx;
        test2();
    }
    
    public synchronized void test2() {
        yyyyy;
    }
    

    在上面代码段中,执行 test 方法需要获得当前对象作为监视器的对象锁,但方法中又调用了 test2 的同步方法。

    如果锁是具有可重入性的话,那么该线程在调用 test2 时并不需要再次获得当前对象的锁,可以直接进入 test2 方法进行操作。

    如果锁是不具有可重入性的话,那么该线程在调用test2前会等待当前对象锁的释放,实际上该对象锁已被当前线程所持有,不可能再次获得。

    如果锁是不具有可重入性特点的话,那么线程在调用同步方法、含有锁的方法时就会产生死锁。

    73. 同步方法和同步代码块

    同步方法默认用this或者当前类class对象作为锁;
    同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法。


    四、Java虚拟机

    0. 对哪些区域回收

    Java运行时数据区域:程序计数器、JVM栈、本地方法栈、方法区和堆。

    由于程序计数器、JVM栈、本地方法栈3个区域随线程而生随线程而灭,对这几个区域内存的回收和分配具有确定性。而方法区和堆则不一样,程序需要在运行时才知道创建哪些对象,对这部分内存的分配是动态的,GC关注的也就是这部分内存。

    1. 主动GC

    调用system.gc() Runtime.getRuntime.gc()

    2. 垃圾回收

    释放那些不在持有任何引用的对象的内存

    3. 怎样判断是否需要收集

    • 引用计数法:对象没有任何引用与之关联(无法解决循环引用)

    ext:Python使用引用计数法

    • 可达性分析法:通过一组称为GC Root的对象为起点,从这些节点向下搜索,如果某对象不能从这些根对象的一个(至少一个)所到达,则判定该对象应当回收。

    ext:可作为GCRoot的对象:虚拟机栈中引用的对象。方法区中类静态属性引用的对象,方法区中类常量引用的对象,本地方法栈中JNI引用的对象

    4.对象的自我救赎

    即使在可达性算法中判定为不可达时,也并非一定被回收。对象存在自我救赎的可能。要真正宣告对象的死亡,需要经历2次标记的过程。如果对象经过可达性分析法发现不可达时,对象将被第一次标记被进行筛选,筛选的条件是此对象是否有必要执行finalize方法。如果对象没有重写finalize方法或finalize方法已经被JVM调用过,则判定为不需要执行。

    如果对象被判定为需要执行finalize方法,该对象将被放置在一个叫做F-Queue的队列中,JVM会建立一个低优先级的线程执行finalize方法,如果对象想要完成自我救赎需要在finalize方法中与引用链上的对象关联,比如把自己也就是this赋值给某个类变量。当GC第二次对F-Queue中对象标记时,该对象将被移出“即将回收”的集合,完成自我救赎。简言之,finalize方法是对象逃脱死亡命运的最后机会,并且任何对象的finalize方法只会被JVM调用一次。

    5.垃圾回收算法

    Mark-Sweep法:标记清除法 容易产生内存碎片,导致分配较大对象时没有足够的连续内存空间而提前出发GC。这里涉及到另一个问题,即对象创建时的内存分配,对象创建内存分配主要有2种方法,分别是指针碰撞法和空闲列表法。指针碰撞法:使用的内存在一侧,空闲的在另一侧,中间使用一个指针作为分界点指示器,对象内存分配时只要指针向空闲的移动对象大小的距离即可。
    空闲列表法:使用的和空闲的内存相互交错无法进行指针碰撞,JVM必须维护一个列表记录哪些内存块可用,分配时从列表中找出一个足够的分配给对象,并更新列表记录。所以,当采用Mark-Sweep算法的垃圾回收器时,内存分配通常采用空闲列表法。

    Copy法:将内存分为2块,每次使用其中的一块,当一块满了,将存活的对象复制到另一块,把使用过的那一块一次性清除。显然,Copy法解决了内存碎片的问题,但算法的代价是内存缩小为原来的一半。现代的垃圾收集器对新生代采用的正是Copy算法。但通常不执行1:1的策略,HotSpot虚拟机默认Eden区Survivor区8:1。每次使用Eden和其中一块Survivor区。也就是说新生代可用内存为新生代内存空间的90%。

    Mark-Compact法:标记整理法。它的第一阶段与Mark-Sweep法一样,但不直接清除,而是将存活对象向一端移动,然后清除端边界以外的内存,这样也不存在内存碎片。

    分代收集算法:将堆内存划分为新生代,老年代,根据新生代老年代的特点选取不同的收集算法。因为新生代对象大多朝生夕死,而老年代对象存活率高,没有额外空间进行分配担保,通常对新生代执行复制算法,老年代执行Mark-Sweep算法或Mark-Compact算法。

    6.垃圾收集器

    通常来说,新生代老年代使用不同的垃圾收集器。新生代的垃圾收集器有Serial(单线程)、ParNew(Serial的多线程版本)、ParallelScavenge(吞吐量优先的垃圾收集器),老年代有SerialOld(单线程老年代)、ParallelOld(与ParallelScavenge搭配的多线程执行标记整理算法的老年代收集器)、CMS(标记清除算法,容易产生内存碎片,可以开启内存整理的参数),以及当前最先进的垃圾收集器G1,G1通常面向服务器端的垃圾收集器,在我自己的Java应用程序中通过-XX:+PrintGCDetails,发现自己的垃圾收集器是使用了ParallelScavenge + ParallelOld的组合。

    7. 不同垃圾回收算法对比

    • 标记清除法(Mark-Sweeping):易产生内存碎片
    • 复制回收法(Copying):为了解决Mark-Sweep法而提出,内存空间减至一半
    • 标记压缩法(Mark-Compact):为了解决Copying法的缺陷,标记后移动到一端再清除
    • 分代回收法(GenerationalCollection):新生代对象存活周期短,需要大量回收对象,需要复制的少,执行copy算法;老年代对象存活周期相对长,回收少量对象,执行mark-compact算法.新生代划分:较大的eden区 和 2个survivor区

    8. 内存分配

    • 新生代的三部分 |Eden Space|From Space|To Space|,对象主要分配在新生代的Eden区

    • 大对象直接进入老年代
      大对象比如大数组直接进入老年代,可通过虚拟机参数-XX:PretenureSizeThreshold参数设置

    • 长期存活的对象进入老年代
      ext:虚拟机为每个对象定义一个年龄计数器,如果对象在Eden区出生并经过一次MinorGC仍然存活,将其移入Survivor的To区,GC完成标记互换后,相当于存活的对象进入From区,对象年龄加1,当增加到默认15岁时,晋升老年代。可通过-XX:MaxTenuringThreshold设置

    • GC的过程:GC开始前,对象只存在于Eden区和From区,To区逻辑上始终为空。对象分配在Eden区,Eden区空间不足,发起MinorGC,将Eden区所有存活的对象复制到To区,From区存活的对象根据年龄判断去向,若到达年龄阈值移入老年代,否则也移入To区,GC完成后Eden区和From区被清空,From区和To区标记互换。对象每在Survivor区躲过一次MinorGC年龄加一。MinorGC将重复这样的过程,直到To区被填满,To区满了以后,将把所有对象移入老年代。

    • 动态对象年龄判定 suvivor区相同年龄对象总和大于suvivor区空间的一半,年龄大于等于该值的对象直接进入老年代

    • 空间分配担保 在MinorGC开始前,虚拟机检查老年代最大可用连续空间是否大于新生代所有对象总空间,如果成立,MinorGC可以确保是安全的。否则,虚拟机会查看HandlePromotionFailure设置值是否允许担保失败,如果允许,继续查看老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则尝试MinorGC,尽管这次MinorGC是有风险的。如果小于,或者HandlerPromotionFailure设置不允许,则要改为FullGC。

    • 新生代的回收称为MinorGC,对老年代的回收成为MajorGC又名FullGC

    9. 关于GC的虚拟机参数

    GC相关

    -XX:NewSize和-XX:MaxNewSize 新生代大小
    -XX:SurvivorRatio Eden和其中一个survivor的比值
    -XX:PretenureSizeThreshold 大对象进入老年代的阈值
    -XX:MaxTenuringThreshold 晋升老年代的对象年龄

    收集器设置
    -XX:+UseSerialGC:设置串行收集器
    -XX:+UseParallelGC:设置并行收集器
    -XX:+UseParalledlOldGC:设置并行年老代收集器
    -XX:+UseConcMarkSweepGC:设置并发收集器

    堆大小设置

    -Xmx:最大堆大小
    -Xms:初始堆大小(最小内存值)
    -Xmn:年轻代大小
    -XXSurvivorRatio:3 意思是Eden:Survivor=3:2
    -Xss栈容量

    垃圾回收统计信息

    -XX:+PrintGC 输出GC日志
    -XX:+PrintGCDetails 输出GC的详细日志

    10. 方法区的回收

    方法区通常会与永久代划等号,实际上二者并不等价,只不过是HotSpot虚拟机设计者用永久代实现方法区,并将GC分代扩展至方法区。
    永久代垃圾回收通常包括两部分内容:废弃常量和无用的类。常量的回收与堆区对象的回收类似,当没有其他地方引用该字面量时,如果有必要,将被清理出常量池。

    判定无用的类的3个条件:

    1.该类的所有实例都已经被回收,也就是说堆中不存在该类的任何实例

    2.加载该类的ClassLoader已经被回收

    3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

    当然,这也仅仅是判定,不代表立即卸载该类。

    11. JVM工具

    命令行

    1. jps(jvm processor status)虚拟机进程状况工具
    2. jstat(jvm statistics monitoring)统计信息监视
    3. jinfo(configuration info for java)配置信息工具
    4. jmap(memory map for java)Java内存映射工具
    5. jhat(JVM Heap Analysis Tool)虚拟机堆转储快照分析工具
    6. jstack(Stack Trace for Java)Java堆栈跟踪工具
    7. HSDIS:JIT生成代码反汇编

    可视化

    1. JConsole(Java Monitoring and Management Console):Java监视与管理控制台
    2. VisualVM(All-in-one Java Troubleshooting Tool):多合一故障处理工具

    12. JVM内存结构

    1. 堆:新生代和年老代
    2. 方法区(非堆):持久代, 代码缓存, 线程共享
    3. JVM栈:中间结果,局部变量,线程隔离
    4. 本地栈:本地方法(非Java代码)
    5. 程序计数器 :线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址
    6. 注:持久代Java8消失, 取代的称为元空间(本地堆内存的一部分)

    13. JVM的方法区

    与堆一样,是线程共享的区域。方法区中存储:被虚拟机加载的类信息,常量,静态变量,JIT编译后的代码等数据。参见我是一个Java Class。

    14. Java类加载器

    一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:

    1. Bootstrap ClassLoader(引导类加载器) 负责加载java基础类,主要是 %JRE_HOME/lib/目录下的rt.jar、resources.jar、charsets.jar等
    2. Extension ClassLoader(扩展类加载器) 负责加载java扩展类,主要是 %JRE_HOME/lib/ext目录下的jar等
    3. App ClassLoader(系统类加载器) 负责加载当前java应用的classpath中的所有类。
      classloader 加载类用的是全盘负责委托机制。 所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。
      所以,当我们自定义的classloader加载成功了com.company.MyClass以后,MyClass里所有依赖的class都由这个classLoader来加载完成。

    15. 64 位 JVM 中,int 的长度是多大?

    Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。

    16. Serial 与 Parallel GC之间的不同之处?

    Serial 与 Parallel 在GC执行的时候都会引起 stop-the-world。它们之间主要不同 serial 收集器是默认的复制收集器,执行 GC 的时候只有一个线程,而 parallel 收集器使用多个 GC 线程来执行。

    17.Java 中 WeakReference 与 SoftReference的区别?

    Java中一共有四种类型的引用。StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。

    StrongReference:Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内,当没有任何对象指向它时将会被GC回收

    SoftReference:尽可能长时间保留引用,直到JVM内存不足,适合某些缓存应用

    WeakReference:顾名思义, 是一个弱引用, 当所引用的对象在 JVM 内不再有强引用时, 下一次将被GC回收

    PhantomReference:它是最弱的一种引用关系,也无法通过PhantomReference取得对象的实例。仅用来当该对象被回收时收到一个通知

    虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率,但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用。

    18. WeakHashMap 是怎么工作的?

    WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收。

    19. JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?

    当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从 32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍。这也会对 CPU 缓存(容量比内存小很多)的数据产生不利的影响。因为,迁移到 64 位的 JVM 主要动机在于可以指定最大堆大小,通过压缩 OOP 可以节省一定的内存。通过 -XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。

    20. 怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位?

    你可以检查某些系统属性如 sun.arch.data.model 或 os.arch 来获取该信息。

    21. 32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?

    理论上说上 32 位的 JVM 堆内存可以到达 2^32,即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5 GB,Solaris 大约 3GB。64 位 JVM允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。

    22. JRE、JDK、JVM 及 JIT 之间有什么不同?

    JRE 代表 Java 运行时(Java run-time),是运行 Java 应用所必须的。JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOOeicFo-1596373001454)(http://jbcdn2.b0.upaiyun.com/2015/11/4468a2440b48658c08acc50f15c3985b.jpg)]

    23. 解释 Java 堆空间及 GC?

    当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个后台进程,回收无效对象的内存用于将来的分配。

    24. 你能保证 GC 执行吗?

    不能,虽然你可以调用 System.gc() 或者 Runtime.getRuntime().gc(),但是没有办法保证 GC 的执行。

    25. 怎么获取 Java 程序使用的内存?堆使用的百分比?

    可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory() 方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

    26. Java 中堆和栈有什么区别?

    JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

    27. JVM调优

    使用工具Jconsol、VisualVM、JProfiler等

    堆信息查看

    可查看堆空间大小分配(年轻代、年老代、持久代分配)
    提供即时的垃圾回收功能
    垃圾监控(长时间监控回收情况)

    查看堆内类、对象信息查看:数量、类型等

    对象引用情况查看

    有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:

    年老代年轻代大小划分是否合理
    内存泄漏
    垃圾回收算法设置是否合理

    线程监控

    线程信息监控:系统线程数量。
    线程状态监控:各个线程都处在什么样的状态下

    Dump线程详细信息:查看线程内部运行情况
    死锁检查

    热点分析

    CPU热点:检查系统哪些方法占用的大量CPU时间
    内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)

    快照

    系统两个不同运行时刻,对象(或类、线程等)的不同

    举例说,我要检查系统进行垃圾回收以后,是否还有该收回的对象被遗漏下来的了。那么,我可以在进行垃圾回收前后,分别进行一次堆情况的快照,然后对比两次快照的对象情况。

    内存泄漏检查

    年老代堆空间被占满

    持久代被占满

    堆栈溢出

    线程堆栈满

    系统内存被占满

    28. Java中有内存泄漏吗?

    内存泄露的定义: 当某些对象不再被应用程序所使用,但是由于仍然被引用而导致垃圾收集器不能释放。

    内存泄漏的原因:对象的生命周期不同。比如说对象A引用了对象B. A的生命周期比B的要长得多,当对象B在应用程序中不会再被使用以后, 对象 A 仍然持有着B的引用. (根据虚拟机规范)在这种情况下GC不能将B从内存中释放。这种情况很可能会引起内存问题,倘若A还持有着其他对象的引用,那么这些被引用的(无用)对象也不会被回收,并占用着内存空间。甚至有可能B也持有一大堆其他对象的引用。这些对象由于被B所引用,也不会被垃圾收集器所回收,所有这些无用的对象将消耗大量宝贵的内存空间。并可能导致内存泄漏。

    怎样防止:

    1、当心集合类, 比如HashMap, ArrayList等,因为这是最容易发生内存泄露的地方.当集合对象被声明为static时,他们的生命周期一般和整个应用程序一样长。

    29. OOM解决办法

    内存溢出的空间:Permanent Generation和Heap Space,也就是永久代和堆区

    1、永久代的OOM

    解决办法有2种:

    a.通过虚拟机参数-XX:PermSize和-XX:MaxPermSize调整永久代大小

    b.清理程序中的重复的Jar文件,减少类的重复加载

    2、堆区的溢出

    发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap Space的size有关。解决这类问题有两种思路:

    1. 检查程序,看是否存在死循环或不必要地重复创建大量对象,定位原因,修改程序和算法。

    2. 通过虚拟机参数-Xms和-Xmx设置初始堆和最大堆的大小

    30. DirectMemory直接内存

    直接内存并不是Java虚拟机规范定义的内存区域的一部分,但是这部分内存也被频繁使用,而且也可能导致OOM异常的出现。

    JDK1.4引入了NIO,这是一种基于通道和缓冲区的非阻塞IO模式,它可以使用Native函数库分配直接堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,使得在某些场合显著提高性能,因为它避免了在Java堆和本地堆之间来回复制数据。

    31. Java 中堆和栈有什么不同

    每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时 volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。

    32. 双亲委派模型中的方法

    findLoadedClass(),LoadClass(),findBootstrapClassOrNull(),findClass(),resolveClass()

    33. IO模型

    一般来说 I/O 模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞 四种IO模型

    同步阻塞 IO :
    在此种方式下,用户进程在发起一个 IO 操作以后,必须等待 IO 操作的完成,只有当真正完成了 IO 操作以后,用户进程才能运行。 JAVA传统的 IO 模型属于此种方式!

    同步非阻塞 IO:
    在此种方式下,用户进程发起一个 IO 操作以后可返回做其它事情,但是用户进程需要时不时的询问 IO 操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的 CPU 资源浪费。其中目前 JAVA 的 NIO 就属于同步非阻塞 IO 。

    异步阻塞 IO :
    此种方式下是指应用发起一个 IO 操作以后,不等待内核 IO 操作的完成,等内核完成 IO 操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问 IO 是否完成,那么为什么说是阻塞的呢?因为此时是通过 select 系统调用来完成的,而 select 函数本身的实现方式是阻塞的,而采用 select 函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!

    异步非阻塞 IO:
    在此种模式下,用户进程只需要发起一个 IO 操作然后立即返回,等 IO 操作真正的完成以后,应用程序会得到 IO 操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的 IO 读写操作,因为 真正的 IO读取或者写入操作已经由 内核完成了。目前 Java7的AIO正是此种类型。

    BIO即同步阻塞IO,适用于连接数目较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4之前的唯一选择,但程序直观、简单、易理解。

    NIO即同步非阻塞IO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

    AIO即异步非阻塞IO,适用于连接数目多且连接比较长的架构,如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK1.7开始支持

    34. 类加载器按照层次,从顶层到底层,分别加载哪些类?

    启动类加载器:负责将存放在JAVA_HOME/lib下的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用。

    扩展类加载器:这个加载器负责加载JAVA_HOME/lib/ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器

    应用程序类加载器:这个加载器是ClassLoader中getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(Classpath)上所指定的类库,可直接使用这个加载器,如果应用程序没有自定义自己的类加载器,一般情况下这个就是程序中默认的类加载器

    实现自己的加载器

    只需要继承ClassLoader,并覆盖findClass方法。
    在调用loadClass方法时,会先根据委派模型在父加载器中加载,如果加载失败,则会调用自己的findClass方法来完成加载


    五、数据库(Sql、MySQL、Redis等)

    1. Statement

    1.1 基本内容

    • Statement是最基本的用法, 不传参, 采用字符串拼接,存在注入漏洞
    • PreparedStatement传入参数化的sql语句, 同时检查合法性, 效率高可以重用, 防止sql注入
    • CallableStatement接口扩展PreparedStatement,用来调用存储过程
    • BatchedStatement用于批量操作数据库,BatchedStatement不是标准的Statement类
    public interface CallableStatement extends PreparedStatement 
    public interface PreparedStatement extends Statement 
    

    1.2 Statement与PrepareStatement的区别

    • 创建时的区别
    Statement statement = conn.createStatement();
    PreparedStatement preStatement = conn.prepareStatement(sql);
    
    • 执行的时候
    ResultSet rSet = statement.executeQuery(sql);
    ResultSet pSet = preStatement.executeQuery();
    

    由上可以看出,PreparedStatement有预编译的过程,已经绑定sql,之后无论执行多少遍,都不会再去进行编译,而 statement 不同,如果执行多遍,则相应的就要编译多少遍sql,所以从这点看,preStatement 的效率会比 Statement要高一些

    • 安全性

    PreparedStatement是预编译的,所以可以有效的防止SQL注入等问题

    • 代码的可读性和可维护性

    PreparedStatement更胜一筹

    2. 游标

    3. 列出 5 个应该遵循的 JDBC 最佳实践

    有很多的最佳实践,你可以根据你的喜好来例举。下面是一些更通用的原则:

    a)使用批量的操作来插入和更新数据

    b)使用 PreparedStatement 来避免 SQL 异常,并提高性能

    c)使用数据库连接池

    d)通过列名来获取结果集,不要使用列的下标来获取

    4. 数据库索引的实现

    数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

    B树:

    一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:

    1、根结点至少有两个子女;
    2、每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;
    3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:┌m/2┐ <= k <= m ;
    4、所有的叶子结点都位于同一层。

    由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。

    一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN)。从这点可以看出,B-Tree是一个非常有效率的索引数据结构。

    B+树:

    B-Tree有许多变种,其中最常见的是B+Tree,例如MySQL就普遍使用B+Tree实现其索引结构。

    B+树是B树的变形,它把所有的data都放在叶子结点中,只将关键字和子女指针保存于内结点,内结点完全是索引的功能。

    与B-Tree相比,B+Tree有以下不同点:

    1、每个节点的指针上限为2d而不是2d+1。

    2、内节点不存储data,只存储key;叶子节点存储data不存储指针。

    一般在数据库系统或文件系统中使用的B+Tree结构都在经典B+Tree的基础上进行了优化,增加了顺序访问指针。

    在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针

    例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。

    为什么B树(B+树)?

    一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

    这涉及到磁盘存取原理、局部性原理和磁盘预读。

    先从B-Tree分析,根据B-Tree的定义,**可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。**为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:

    每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

    B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。

    综上所述,用B-Tree作为索引结构效率是非常高的。

    而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。

    至于B+Tree为什么更适合外存索引,原因和内节点出度d有关。

    由于B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。


    六、算法与数据结构

    1. 二叉搜索树:(Binary Search Tree又名:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。

    2. RBT红黑树

    二叉搜索树:(Binary Search Tree又名:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。

    红黑树是一棵二叉搜索树,它在每个结点上增加一个存储位来表示结点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树没有一条路径会比其他路径长出2倍,所以红黑树是近似平衡的,使得红黑树的查找、插入、删除等操作的时间复杂度最坏为O(log n),但需要注意到在红黑树上执行插入或删除后将不在满足红黑树性质,恢复红黑树的属性需要少量(O(log
    n))的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。虽然插入和删除很复杂,但操作时间仍可以保持为 O(log n) 次。具体如何保证?引出红黑树的5个性质。

    红黑树的5个性质:满足以下五个性质的二叉搜索树

    1. 每个结点或是红色的或是黑色的
    2. 根结点是黑色的
    3. 每个叶结点是黑色的
    4. 如果一个结点是红色的,则它的两个子结点是黑色的
    5. 对于每个结点,从该结点到其后代叶结点的简单路径上,均包含相同数目的黑色结点

    插入操作:

    由于性质的约束,插入的结点都是红色的。插入时性质1、3始终保持。破坏性质2当且仅当当前插入结点为根节点。变一下颜色即可。如果是破坏性质4或5,则需要旋转和变色来继续满足红黑树的性质。下面说一说插入的几种情况,约定当前插入结点为N,其父结点为P,叔叔为U,祖父为G

    情形1:树空,直接插入违反性质1,将红色改黑。

    情形2:N的父结点为黑,不必修改,直接插入

    从情形3开始的情形假定N结点的父结点P为红色,所以存在G,并且G为黑色。且N存在一个叔叔结点U,尽管U可能为叶结点。

    情形3:P为红,U为红(G结点一定存在且为黑)这里不论P是G的左孩子还是右孩子;不论N是P的左孩子还是右孩子。

    首先把P、U改黑,G改红,并以G作为一个新插入的红结点重新进行各种情况的检查,若一路检索至根节点还未结束,则将根结点变黑。

    情形4:P为红,U为黑或不存在(G结点一定存在且为黑),且P为G的左孩子,N为P的左孩子(或者P为G的右孩子,N为P的右孩子,保证同向的)。
    P、G右旋并将P、G变相反色。因为P取代之前黑G的位置,所以P变黑可以理解,而G变红是为了不违反性质5。

    情形5:P为红,U为黑或不存在,且P为G的左孩子,N为P的右孩子(或P为G的右孩子,N为P的左孩子,保证是反向的),对N,P进行一次左旋转换为情形4

    删除操作比插入复杂一些,但最多不超过三次旋转可以让红黑树恢复平衡。

    其他

    • 黑高从某个结点x出发(不含x)到达一个叶结点的任意一条简单路径上的黑色结点个数称为该结点的黑高。红黑树的黑高为其根结点的黑高。
    • 一个具有n个内部结点的红黑树的高度h<=2lg(n+1)
    • 结点的属性(五元组):color key left right p
    • 动态集合操作最坏时间复杂度为O(lgn)

    3. 排序算法

    • 稳定排序:插入排序、冒泡排序、归并排序、基数排序

    • 插入排序[稳定]
      适用于小数组,数组已排好序或接近于排好序速度将会非常快
      复杂度:O(n^2) - O(n) - O(n^2) - O(1)[平均 - 最好 - 最坏 - 空间复杂度]

    • 归并排序[稳定]
      采用分治法
      复杂度:O(nlogn) - O(nlgn) - O(nlgn) - O(n)[平均 - 最好 - 最坏 - 空间复杂度]

    • 冒泡排序[稳定]
      复杂度:O(n^2) - O(n) - O(n^2) - O(1)[平均 - 最好 - 最坏 - 空间复杂度]

    • 基数排序 分配+收集[稳定]
      复杂度: O(d(n+r)) r为基数d为位数 空间复杂度O(n+r)

    • 树排序[不稳定]
      应用:TreeSet的add方法、TreeMap的put方法
      不支持相同元素,没有稳定性问题
      复杂度:平均最差O(nlogn)

    • 堆排序(就地排序)[不稳定]
      复杂度:O(nlogn) - O(nlgn) - O(nlgn) - O(1)[平均 - 最好 - 最坏 - 空间复杂度]

    • 快速排序[不稳定]
      复杂度:O(nlgn) - O(nlgn) - O(n^2) - O(1)[平均 - 最好 - 最坏 - 空间复杂度]
      栈空间0(lgn) - O(n)

    • 选择排序[不稳定]
      复杂度:O(n^2) - O(n^2) - O(n^2) - O(1)[平均 - 最好 - 最坏 - 空间复杂度]

    • 希尔排序[不稳定]
      复杂度 小于O(n^2) 平均 O(nlgn) 最差O(n^s)[1<s<2] 空间O(1)

    九大内部排序算法代码及性能分析参见我的GitHub

    4. 查找与散列

    4.1 散列函数设计

    • 直接定址法:f(key) = a*key+b

    简单、均匀,不易产生冲突。但需事先知道关键字的分布情况,适合查找表较小且连续的情况,故现实中并不常用

    • 除留余数法:f(key) = key mod p (p<=m) p取小于表长的最大质数 m为表长

    • DJBX33A算法(time33哈希算法hash = hash*33+(unsigned int)str[i];

    平方取中法 折叠法 更多…

    4.2 冲突处理

    闭散列(开放地址方法):要求装填因子a较小,闭散列方法把所有记录直接存储在散列表中

    • 线性探测:易产生堆积现象(基地址不同堆积在一起)
    • 二次探测:f(key) = (f(key)+di) % m di=12,-12,22,-22…可以消除基本聚集
    • 随机探测:f(key) = (f(key)+di),di采用随机函数得到,可以消除基本聚集
    • 双散列:避免二次聚集

    开散列(链地址法):原地处理

    • 同义词记录存储在一个单链表中,散列表中子存储单链表的头指针。
    • 优点:无堆积 事先无需确定表长 删除结点易于实现 装载因子a>=1,缺点:需要额外空间

    5. 跳表

    为什么选择跳表?

    目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。
    想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树
    出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,
    还要参考网上的代码,相当麻烦。
    用跳表吧,跳表是一种随机化的数据结构,目前开源软件 Redis 和 LevelDB 都有用到它,
    它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表,
    就能去实现一个 SkipList。

    跳跃表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。

    Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,是一种“空间来换取时间”的一个算法,在每个节点中增加了指向下一层的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率。

    在Java的API中已经有了实现:分别是

    ConcurrentSkipListMap(在功能上对应HashTable、HashMap、TreeMap) ;

    ConcurrentSkipListSet(在功能上对应HashSet)

    Skip list的性质

    (1) 由很多层结构组成,level是通过一定的概率随机产生的

    (2) 每一层都是一个有序的链表,默认是升序

    (3) 最底层(Level 1)的链表包含所有元素

    (4) 如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现

    (5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素

    时间复杂度O(lgn) 最坏O(2lgn)

    Java实现参见我的GitHub Repo Algorithm

    6. AVL树

    1.LL型

    在某一节点的左孩子的左子树上插入一个新的节点,使得该节点不再平衡。
    举例 A B Ar Bl Br 在Bl下插入N,执行一次右旋即可,即把B变为父结点,原来的根节点A变为B的左孩子,B的右子树变为A的左子树。

    2.RR型

    与LL型是对称的,执行一次左旋即可。

    3.LR型

    指在AVL树某一结点左孩子的右子树上插入一个结点,使得该节点不在平衡。这时需要两次旋转,先左旋再右旋。

    4.RL型

    与LR对称,执行一次右旋,再执行一次左旋。

    删除

    1、被删的节点是叶子节点

    将该节点直接从树中删除,并利用递归的特点和高度的变化,反向推算其父节点和祖先节点是否失衡。

    2、被删的节点只有左子树或只有右子树

    将左子树(右子树)替代原有节点的位置,并利用递归的特点和高度的变化,反向推算父节点和祖先节点是否失衡。

    3、被删的节点既有左子树又有右子树

    找到被删节点的左子树的最右端的节点,将该结点的的值赋给待删除结点,再用该结点的左孩子替换它本来的位置,然后释放该结点,并利用递归特点,反向推断父节点和祖父节点是否失衡。

    7. 一致性Hash

    第一:简单介绍
    一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将对象存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,N是机器节点数。

    1、考虑到比如一个服务器down掉,服务器结点N变为N-1,映射公式必须变为key%(N-1)

    2、访问量加重,需要添加服务器结点,N变为N+1,映射公式变为hash(object)%(N+1)

    当出现1,2的情况意味着我们的映射都将无效,对服务器来说将是一场灾难,尤其是对缓存服务器来说,因为缓存服务器映射的失效,洪水般的访问都将冲向后台服务器。

    第二点:hash算法的单调性

    Hash 算法的一个衡量指标是单调性,单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

    consistent hash 也是一种hash 算法,简单的说,在移除 / 添加一个结点时,它能够尽可能小的改变已存在的映射关系,尽可能的满足单调性的要求。

    第三点:将对象和服务器结点分别映射到环型空间

    通常的一致性哈希做法是将 value 映射到一个 32 位的 key 值,也即是 0~2^32-1 次方的数值空间;我们可以将这个空间想象成一个首( 0 )尾( 2^32-1 )相接的圆环。

    我们可以通过hash函数将我们的key映射到环型空间中,同时根据相同的哈希算法把服务器也映射到环型空间中,顺便提一下服务器或者某个计算节点的 hash 计算,一般的方法可以使用机器的 IP 地址或者机器名作为 hash 输入。

    第四点:将对象映射到服务器

    在这个环形空间中,如果沿着顺时针方向从对象的 key 值出发,直到遇见一个 服务器结点,那么就将该对象存储在这个服务器结点上,因为对象和服务器的hash 值是固定的,因此这个 cache 必然是唯一和确定的。

    这时候考察某个服务器down机或者需要添加服务器结点,也就是移除和添加的操作,我们只需要几个对象的映射。

    第五点:虚拟结点

    Hash 算法的另一个指标是平衡性 (Balance)。平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。

    对于上述的做法,可能导致某些对象都映射到某个服务器,使得分布不平衡。为此可以采用“虚拟结点”的做法。

    “虚拟结点”( virtual node )是实际节点在 hash 空间的复制品,一实际结点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。引入“虚拟结点”会让我们的映射分布更为平衡一些。

    引入“虚拟结点”前:
    Hash(“192.168.1.1”);

    引入“虚拟结点”后:
    Hash(“192.168.1.1#1”);
    Hash(“192.168.1.1#2”);

    8. 如何判断链表是否有环

    方法1:快慢指针法 2.设两个工作指针p、q,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。比如p从A走到D,用了4步,而q则用了14步。因而步数不等,出现矛盾,存在环。

    9. 熟悉哪些算法?

    • [哈希算法] 一致性哈希 time33哈希 FNV1_32_HASH
    • [排序算法] 快速排序
    • [搜索算法] DFS BFS
    • [最小生成树算法] Kruskal Prim
    • [最短路径算法] Dijkstra Floyed

    七、计算机网络

    1.停止等待协议

    停止等待协议是最基本的数据链路层协议,它的工作原理是这样的。

    在发送端,每发送完一帧就停止发送,等待接收端的确认,如果收到确认就发送下一帧。

    在接收端,每收到一个无差错的帧,就把这个帧交付上层并向发送端发送确认。若该帧有差错,就丢弃,其他什么也不做。

    其他细节:

    停止等待协议为了可靠交付,需要对帧进行编号,由于每次只发送一帧,所以停止等待协议使用1个比特编号,编号0和1

    停止等待协议会出现死锁现象(A等待B的确认),解决办法,启动超时计时器,超时计时器有一个重传时间。重传时间一般选择略大于“正常情况下从发完数据帧到收到确认帧所需的平均时间”。

    2.滑动窗口协议

    再说滑动窗口之前,先说下连续ARQ,连续ARQ又称Go-back-N ARQ,意思是当出现差错必须重传时,要向回走N个帧,然后再开始重传,也就意味着只要有一帧出现差错,即使已经正确的帧也需要重传,白白浪费时间,增大开销。为此,应该对发送出去但未被确认的帧的数目加以限制,这就是滑动窗口协议。滑动窗口指收发两端分别维护一个发送窗口和接收窗口,发送窗口有一个窗口值Wt,窗口值Wt代表在没有收到对方确认的情况下最多可以发送的帧的数目。当发送的帧的序号被接收窗口正确收下后,接收端向前滑动并向发送端发去确认,发送端收到确认后,发送窗口向前滑动。收发两端按规律向前推进。

    连续ARQ和选择重传ARQ均是窗口大于1的滑动窗口协议,而停止等待协议相当于收发两端窗口等于1。

    滑动窗口指接收和发送两端的窗口按规律不断向前推进,是一种流量控制的策略。

    3.Http1.0和Http1.1的区别

    1.HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象。
    2.HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象。

    4.Post和Get的区别

    1.安全性上说:get的方式是把数据在地址栏中明文的形式发送,URL中可见,POST方式对用户是透明的,安全性更高。
    2.数据量说:Get传送的数据量较小,一般不能大于2KB,POST传送的数据量更大。
    3.适用范围说:查询用Get,数据添加、修改和删除建议Post

    5.TCP/IP体系各层功能及协议

    TCP/IP体系共有四个层次,分别为网络接口层Host-to-Network Layer, 网际层 Internet Layer, 传输层Transport Layer,应用层Application Layer。

    5.1 网络接口层 -> 接收和发送数据报

    主要负责将数据发送到网络传输介质上以及从网络上接收TCP/IP数据报,相当于OSI参考模型的物理层和数据链路层。在实际中,先后流行的以太网、令牌环网、ATM、帧中继等都可视为其底层协议。它将发送的信息组装成帧并通过物理层向选定网络发送,或者从网络上接收物理帧,将去除控制信息后的IP数据报交给网络层。

    5.2 网际层 -> 数据报封装和路由寻址

    网际层主要功能是寻址和对数据报的封装以及路由选择功能。这些功能大部分通过IP协议完成,并通过地址解析协议ARP、逆地址解析协议RARP、因特网控制报文协议ICMP、因特网组管理协议IGMP从旁协助。所以IP协议是网络层的核心。

    网际协议IP:IP协议是一个无连接的协议,主要负责将数据报从源结点转发到目的结点。也就是说IP协议通过对数据报中源地址和目的地址进行分析,然后进行路由选择,最后再转发到目的地。需要注意的是:IP协议只负责对数据进行转发,并不对数据进行检查,也就是说,它不负责数据的可靠性,这样设计的主要目的是提高IP协议传送和转发数据的效率。

    ARP:该协议负责将IP地址解析转换为计算机的物理地址。

    虽然我们使用IP地址进行通信,但IP地址只是主机在抽象的网络层中的地址。最终要传到数据链路层封装成MAC帧才能发送到实际的网络。因此不管使用什么协议最终需要的还是硬件地址。

    每个主机拥有一个ARP高速缓存(存放所在局域网内主机和路由器的IP地址到硬件地址的映射表)

    举例:A发送B

    (1)A在自己的ARP高速缓存中查到B的MAC地址,写入MAC帧发往此B

    (2)没查到,A向本局域网广播ARP请求分组,内容包括自己的地址映射和B的IP地址

    (3)B发送ARP响应分组,内容为自己的IP地址到物理地址的映射,同时将A的映射写入自己的ARP高速缓存(单播的方式)

    注:ARP Cache映射项目具有一个生存时间。

    RARP:将计算机物理地址转换为IP地址

    ICMP:该协议主要负责发送和传递包含控制信息的数据报,这些控制信息包括了哪台计算机出现了什么错误,网络路由出现了什么错误等内容。

    5.3 传输层 -> 应用进程间端到端的通信

    传输层主要负责应用进程间“端到端”的通信,即从某个应用进程传输到另一个应用进程,它与OSI参考模型的传输层功能类似。

    传输层在某个时刻可能要同时为多个不同的应用进程服务,因此传输层在每个分组中必须增加用于识别应用进程的标识,即端口。

    TCP/IP体系的传输层主要包含两个主要协议,即传输控制协议TCP和用户数据报协议UDP。TCP协议是一种可靠的、面向连接的协议,保证收发两端有可靠的字节流传输,进行了流量控制,协调双方的发送和接收速度,达到正确传输的目的。

    UDP是一种不可靠的、无连接的协议,其特点是协议简单、额外开销小、效率较高,不能保证可靠传输。

    传输层提供应用进程间的逻辑通信。它使应用进程看见的就好像是在两个运输层实体间一条端到端的逻辑通信信道。

    当运输层采用TCP时,尽管下面的网络是不可靠的,但这种逻辑通信信道相当于一条全双工的可靠信道。可以做到报文的无差错、按序、无丢失、无重复。

    注:单单面向连接只是可靠的必要条件,不充分。还需要其他措施,如确认重传,按序接收,无丢失无重复。

    熟知端口:

    20 FTP数据连接 
    21 FTP控制连接 
    22 SSH 
    23 TELNET 
    25 SMTP 
    53 DNS 
    69 TFTP
    80 HTTP
    161 SNMP
    

    UDP重要

    UDP的优点:

    1.发送之前无需建立连接,减小了开销和发送数据的时延

    2.UDP不使用连接,不使用可靠交付,因此主机不需要维护复杂的参数表、连接状态表

    3.UDP用户数据报只有8个字节的首部开销,而TCP要20字节。

    4.由于没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(IP电话等实时应用要求源主机以恒定的速率发送数据是有利的)

    Table,使用TCP和UDP的应用

    应用应用层协议运输层协议
    名字转换DNSUDP
    文件传送TFTPUDP
    路由选择协议RIPUDP
    IP地址配置BOOTTP,DHCPUDP
    网络管理SNMPUDP
    远程文件服务器NFSUDP
    IP电话专用协议UDP
    流式多媒体通信专用协议UDP
    电子邮件SMTPTCP
    远程终端接入TELNETTCP
    万维网HTTPTCP
    文件传送FTPTCP

    注:TFTP:Trivial File Transfer Protocol

    UDP的过程(以TFTP举例):

    1.服务器进程运行着,等待TFTP客户进程的服务请求。客户端TFTP进程启动时,向操作系统申请一个临时端口号,然后操作系统为该进程创建2个队列,
    入队列和出队列。只要进程在执行,2个队列一直存在。

    2.客户进程将报文发送到出队列中。UDP按报文在队列的先后顺序发送。在传送到IP层之前给报文加上UDP首部,其中目的端口后为69,然后发给IP层。
    出队列若溢出,则操作系统通知应用层TFTP客户进程暂停发送。

    3.客户端收到来自IP层的报文时,UDP检查报文中目的端口号是否正确,若正确,放入入队列队尾,客户进程按先后顺序一一取走。若不正确,UDP丢弃该报文,并请ICMP发送”端口不可达“差错报文给服务器端。入队列可能会溢出,若溢出,UDP丢弃该报文,不通知对方。

    服务器端类似。

    UDP首部:源端口 - 目的端口 - 长度 - 检验和,每个字段22字节。

    注:IP数据报检验和只检验IP数据报的首部,而UDP的检验和将首部和数据部分一起都检验。

    TCP重要

    细节:

    TCP报文段是面向字节的数据流。

    TCP首部:20字节固定首部

    确认比特ACK,ACK=1 确认号字段才有效;同步比特SYN:SYN=1 ACK=0表示一个连接请求报文段;终止比特FIN,FIN=1时要求释放连接。

    窗口:将TCP收发两端记为A和B,A根据TCP缓存空间的大小确定自己的接收窗口大小。并在A发送给B的窗口字段写入该值。作为B的发送窗口的上限。意味着B在未收到A的确认情况下,最多发送的字节数。

    选项:最大报文段长度MSS,MSS告诉对方TCP:我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节。若主机未填写,默认为536字节。

    TCP的可靠是使用了序号和确认。当TCP发送一个报文时,在自己的重传队列中存放一个副本。若收到确认,删除副本。

    TCP使用捎带确认。

    TCP报文段的发送时机:1.维持一个变量等于MSS,发送缓存达到MSS就发送 2.发送端应用进程指明要发送,即TCP支持的PUSH操作。3.设定计时器

    TCP的拥塞控制:TCP使用慢开始和拥塞避免算法进行拥塞控制

    慢开始和拥塞避免

    接收端根据自身资源情况控制发送端发送窗口的大小。

    每个TCP连接需要维持一下2个状态变量:

    接收端窗口rwnd(receiver window):接收端根据目前接收缓存大小设置的窗口值,是来自接收端的流量控制

    拥塞窗口cwnd(congestion window):是发送端根据自己估计的网络拥塞程度设置的窗口值,是来自发送端的流量控制

    发送端的窗口上限值=Min(rwnd, cwnd)

    慢开始算法原理:主机刚开始发送数据时,如果立即将较大的发送窗口的全部字节注入网络,由于不清楚网络状况,可能会引起拥塞。通常的做法是将cwnd设置为1个MSS,每收到一个确认,将cwnd+1,由小到大逐步增大cwnd,使分组注入网络的速率更加合理。为了防止拥塞窗口增长引起网络拥塞,还需设置一个状态变量ssthresh,即慢开始门限。

    慢开始门限:ssthresh,当cwnd < ssthresh,执行慢开始算法;cwnd > ssthresh,改用拥塞避免算法。 cwnd = ssthresh时,都可以。

    拥塞避免算法使发送端的拥塞窗口每经过一个RTT增加一个MSS(而不管在此期间收到多少ACK),这样,拥塞窗口cwnd按线性规律增长,拥塞窗口此时比慢开始增长速率缓慢很多。这一过程称为加法增大,目的在于使拥塞窗口缓慢增长,防止网络过早拥塞。

    无论是慢开始还是拥塞避免,只要发送端发现网络出现拥塞(根据是没有按时收到ACK或者收到重复ACK),就将慢开始门限ssthresh设置为拥塞窗口值的一半并将拥塞窗口cwnd置为1,重新执行慢开始算法。这一过程称为乘法减小。目的在于迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

    上述TCP确认都是通过捎带确认执行的。

    快重传和快恢复

    上述的慢开始和拥塞避免算法是早期TCP使用的拥塞控制算法。因为有时TCP连接会在重传时因等待重传计时器的超时时间而空闲。为此在快重传中规定:只要发送端一连收到三个重复的ACK,即可断定分组丢失,不必等待重传计数器,立即重传丢失的报文。

    与快重传搭配使用的还有快恢复:当不使用快恢复时,发送端若发现网络拥塞就将拥塞窗口降为1,然后执行慢开始算法,这样的缺点是网络不能很快恢复到正常状态。快恢复是指当发送端收到3个重复的ACK时,执行乘法减小,ssthresh变为拥塞窗口值的一半。但是cwnd不是置为1,而是ssthresh+3xMSS。若收到的重复ACK
    为n(n > 3),则cwnd=ssthresh+n*MSS.这样做的理由是基于发送端已经收到3个重复的ACK,它表明已经有3个分组离开了网络,它们不在消耗网络的资源。

    注意的是:在使用快恢复算法时,慢开始算法只在TCP连接建立时使用。

    TCP的重传机制

    每发送一个报文段,就对这个报文段设置一次计时器。新的重传时间=γ*旧的重传时间。

    TCP连接建立和释放的过程

    SYN置1和FIN的报文段要消耗一个序号。

    客户端连接状态变迁:CLOSED -> 主动打开,发送SYN=1 -> SYN_SENT -> 收到服务器的SYN=1和ACK时,发送三次握手的最后一个ACK
    -> ESTABLISHED -> 数据传送 -> 主动关闭 -> 发送FIN=1,等待确认ACK的到达 -> FIN_WAIT_1 -> 收到确认ACK后 -> FIN_WAIT_2
    -> 收到服务器发送的FIN=1报文,响应,发送四次挥手的的最后一个确认ACK -> 进入TIME_WAIT状态
    -> 经过2倍报文寿命,TCP删除连接记录 -> 回到CLOSED状态

    客户端状态:CLOSED - SYN_SENT- ESTABLISHED - FIN_WAIT_1 - FIN_WAIT_2 - TIME_WAIT - CLOSED

    服务器端连接状态变迁:CLOSED -> 被动打开 -> LISTEN -> 收到SYN=1的报文,发送SYN=1和确认ACK -> 进入SYN_RCVD -> 收到三次握手
    的最后一个确认ACK -> ESTABLISHED -> 数据传送 -> 数据传送完毕,收到FIN=1 -> 发送确认ACK并进入CLOSED_WAIT -> 发送FIN=1给客户端 -> LAST_ACK
    -> 收到客户端四次挥手的最后一个确认ACK -> 删除连接记录 -> 回到CLOSED状态

    服务器端:CLOSED - LISTEN - SYN_RCVD - ESTABLISHED - CLOSED_WAIT - LAST_ACK - CLOSED

    5.4 应用层

    应用层位于TCP/IP体系结构的最高一层,也是直接为应用进程服务的一层,即当不同的应用进程数据交换时,就去调用应用层的不同协议实体,让这些实体去调用传输层的TCP或者UDP来进行网络传输。具体的应用层协议有,SMTP 25、DNS 53、HTTP 80、FTP 20数据端口 21控制端口、TFTP 69、TELNET 23、SNMP 161等

    5.5 网络的划分

    按网络拓扑结构:总线、星型、环型、树型、网状结构和混合型。

    按覆盖范围:局域网、城域网、广域网

    按传播方式:广播网络和点对点网络

    广播式网络是指网络中的计算机使用一个共享信道进行数据传播,网络中的所有结点都能收到某一结点发出的数据信息。

    单播:一对一的发送形式。

    组播:采用一对一组的发送形式,将数据发送给网络中的某一组主机。

    广播:采用一对所有,将数据发送给网络所有目的结点。

    点对点网络中两个结点间的通信方式是点对点的。如果两台计算机之间没有直连的线路,则需要中间结点的接收、存储、转发直至目的结点。

    6. TCP的三次握手和四次挥手的过程

    以客户端为例

    连接建立(三次握手):首先Client端发送连接请求报文SYN并进入SYN_SENT状态,Server收到后发送ACK+SYN报文,并为这次连接分配资源。Client端接收到Server端的SYN+ACK后发送三次握手的最后一个ACK,并分配资源,连接建立。

    连接释放(四次挥手):假设Client端发起断开连接请求,首先发送FIN=1,等待确认ACK的到达 -> FIN_WAIT_1 -> 收到Server端的确认ACK后时 -> FIN_WAIT_2
    ->收到服务器发送的FIN=1报文,响应,发送四次挥手的的最后一个确认ACK ->进入TIME_WAIT状态
    -> 经过2倍报文寿命,TCP删除连接记录 -> 回到CLOSED状态

    7. 为什么连接建立是三次握手,而连接释放要四次挥手?

    因为当Server端收到Client端发送的SYN连接请求报文后,可以直接发送SYN+ACK报文,其中ACK用来应答,SYN用来同步。但是关闭连接时,当Server端收到FIN报文后,并不会立即关闭socket,所以先回复一个ACK,告诉Client端“你的FIN我收到了”,只有等Server端的所有报文发送完了,Server端才发送FIN报文,因此不能一起发送,故需要四次挥手。

    8. 为什么TIME_WAIT状态需要2MSL(最大报文段生存时间)才能返回Closed状态?

    这是因为虽然双方都同意关闭连接了,而且四次挥手的报文也都协调发送完毕。但是我们必须假想网络是不可靠的,无法保证最后发送的ACK报文一定被对方收到,因此处于LAST_ACK状态下的
    Server端可能会因未收到ACK而重发FIN,所以TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

    9. Http报文格式

    Http请求报文格式:1.请求行 2.Http头 3.报文主体

    请求行由三部分组成,分别是请求方法,请求地址,Http版本

    Http头:有三种,分别为请求头(request header),普通头(General Header)和实体头(entity header)。Get方法没有实体头。

    报文主体:只在POST方法请求中存在。

    Http响应报文:1.状态行 2.Http头 3.返回内容

    状态行:第一部分为Http版本,第二部分为响应状态码 第三部分为状态码的描述

    其中第三部分为状态码的描述,信息类100-199 响应成功200-299 重定向类300-399 客户端错误400-499 服务器端错误500-599

    常见的

    100 continue 初始请求已接受,客户端应继续发送请求剩余部分
    200 OK
    202 Accepted 已接受,处理尚未完成 
    301 永久重定向
    302 临时重定向
    400 Bad Request
    401 Unauthorized
    403 Forbidden 资源不可用
    404 Not Found
    500 Internal Server Error 服务器错误
    502 Bad Gateway
    503 Service Unavailable 服务器负载过重
    504 Gateway Timeout 未能及时从远程服务器获得应答
    

    Http头:响应头(Response Header),普通头(General Header)和实体头(Entity Header)

    返回内容:即Http请求的信息,可以是HTML也可以是图片等等。

    10. Http和Https的区别

    Https即Secure Hypertext Transfer Protocol,即安全超文本传输协议,它是一个安全通信信道,基于Http开发,用于在客户机和服务器间交换信息。它使用安全套接字层SSL进行信息交换,是Http的安全版。

    Https协议需要到CA申请证书,一般免费证书很少,需要交费。

    Http是超文本传输协议,信息是明文传输,https则是具有安全性的tls/ssl加密传输协议。

    http是80端口,https是443端口

    11. 浏览器输入一个URL的过程

    1. 浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址

    2. 解析出IP地址后,根据IP地址和默认端口80和服务器建立TCP连接

    3. 浏览器发出Http请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器

    4. 服务器做出响应,把对应的请求资源发送给浏览器

    5. 释放TCP连接

    6. 浏览器解析并显示内容

    12. 中间人攻击

    中间人获取server发给client的公钥,自己伪造一对公私钥,然后伪造自己让client以为它是server,然后将伪造的公钥发给client,并拦截client发给server的密文,用伪造的私钥即可得到client发出去的内容,最后用真实的公钥对内容加密发给server。

    解决办法:数字证书,证书链,可信任的中间人

    13. 差错检测

    误码率:传输错误的比特与传输总比特数的比率

    CRC是检错方法并不能纠错,FCS(Frame Check Sequence)是冗余码。

    计算冗余码(余数R)的方法:先补0(n个)再对生成多项式取模。

    CRC只能表示以接近1的概率认为它没有差错。但不能做到可靠传输。可靠传输还需要确认和重传机制。

    生成多项式P(X):CRC-16,CRC-CCITT,CRC-32

    14. 数据链路层的协议

    停止等待协议 - 连续ARQ - 选择重传ARQ - PPP - 以太网协议- 帧中继 - ATM - HDLC

    15. 截断二进制指数退避算法

    是以太网用于解决当发生碰撞时就停止发送然后重发再碰撞这一问题。

    截断二进制指数退避算法:基本退避时间为2τ k=min{重传次数,10} r=random(0~2^k-1) 重传所需时延为r倍的基本退避时间


    八、操作系统(OS基础、Linux等)

    1. 并发和并行

    “并行”是指无论从微观还是宏观,二者都是一起执行的,也就是同一时刻执行
    而“并发”在微观上不是同时执行的。是在同一时间间隔交替轮流执行

    2. 进程间通信的方式

    • 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

    • 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    • 信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    • 消息队列( message queue ) 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    • 共享内存( shared memory )

    共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。

    • 套接字( socket ) :套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

    3. LinuxIO模型

    1、阻塞IO模型
    以socket为例,在进程空间调用recvfrom,其系统调用知道数据包到达且被复制到应用进程的缓冲区或者发生错误才返回,在此期间一直等待,进程从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此称为阻塞IO

    2、非阻塞IO模型
    应用进程调用recvfrom,如果缓冲区没有数据直接返回EWOULDBLOCK错误。一般对非阻塞IO进行轮询,以确定是否有数据到来。

    3、IO多路复用模型

    Linux提供select/poll,通过将一个或多个fd传递给select或poll系统调用,阻塞在select上。select/poll顺序扫描fd是否就绪。

    4、信号驱动IO

    开启套接字接口信号驱动IO功能,并通过系统调用sigaction执行信号处理函数。当数据准备就绪时,为该进程生成SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主函数处理数据。

    5、异步IO

    告知内核启动某个操作,并让内核在整个操作完成后通知我们。它与信号驱动IO的区别在于信号驱动IO由内核通知我们何时可以开始IO操作。而异步IO模型由内核通知我们IO操作已经完成。

    九、其他

    1. 开源软件有哪些?

    Eclipse、Linux及其Linux下的大多数软件、Git等。

    Apache下的众多软件:Lucene、Velocity、Maven、高性能Java网络框架MINA、版本控制系统SVN、应用服务器Tomcat、Http服务器Apache、MVC框架Struts、持久层框架iBATIS、Apache SPARK、ActiveMQ

    2. 开源协议

    MIT:相对宽松。适用:JQuery

    Apache:相对宽松与MIT类似的协议,考虑有专利的情况。适用:Apache服务器、SVN

    GPL:GPLV2和GPLV3,如果你在乎作品的传播和别人的修改,希望别人也以相同的协议分享出来。

    LGPL:主要用于一些代码库。衍生代码可以以此协议发布(言下之意你可以用其他协议),但与此协议相关的代码必需遵循此协议。

    BSD:较为宽松的协议,包含两个变种BSD 2-Clause 和BSD 3-Clause,两者都与MIT协议只存在细微差异。

    上面各协议只是针对软件或代码作品,如果你的作品不是代码,比如视频,音乐,图片,文章等,共享于公众之前,也最好声明一下协议以保证自己的权益不被侵犯,CC协议。

    展开全文
  • 计算机网络期末复习提纲(全知识点总结

    万次阅读 多人点赞 2021-02-12 13:31:44
    计算机网络期末复习提纲全知识点总结第一章 概述1.基本概念- 链路,结点,协议和服务,实体和对等实体,各层PDU- C/S模式,B/S模式,P2P模式- LAN,WAN,MAN,PAN的划分- 网络性能参数:速率,带宽,吞吐量,时延,往返...

    计算机网络期末复习提纲全知识点总结


    注:粗体为次重点,粗斜体为重点

    第一章 概述

    1.基本概念

    - 链路,结点,协议和服务,实体和对等实体,各层PDU

    1. 链路:连接结点的称为链路,可以是铜缆,光纤,卫星等
    2. 结点:可以是计算机,集线器,交换机或路由器等
    3. 协议: 两个对等实体之间的通信规则。协议规定了通信实体之间所交换的消息的格式、意义、顺序以及针对收到信息或发生的事件所采取的动作。协议有三要素:语法(数据与控制信息的结构或格式、信号电平)、语义(需要发出何种控制信息、完成何种动作以及做出何种响应、差错控制)、时序(事件顺序、速度匹配)
    4. 服务:在协议的控制下,本层向上一层提供服务,本层使用下一层所提供的服务
    5. 实体:任何可发送或接收信息的硬件或软件进程
    6. 对等实体:位于同等层中相互通信的两个实体。对等实体之间处理相同的PDU。
    7. 各层PDU:PDU:对等层之间传送的数据单位各层PDU

    - C/S模式,B/S模式,P2P模式

    1. C/S模式:也即客户-服务器方式。客户是服务请求方,服务器是服务提供方。客户必须知道服务器的地址,反之不必
    2. B/S模式:也即浏览器-服务器方式。在服务器安装SQLserver,MYSQL等数据库,浏览器通过web server同数据库进行数据交换
    3. P2P模式:对等方式,通信在对等实体之间直接进行。每一个主机既是客户又是服务器,本质上仍是C/S

    - LAN,WAN,MAN,PAN的划分

    LAN,WAN,MAN,PAN的划分:按照网络的作用范围进行分类,分别为:广域网WAN(几十到几千公里)、城域网MAN(5~50KM)、局域网LAN(1km左右)、个人局域网PAN(10米左右)

    - 网络性能参数:速率,带宽,吞吐量,时延,往返时间,信道利用率

    1. 速率:数据的传送速率,单位是Bit/s
    2. 带宽:在计算机网络中,网络带宽表示单位时间内网络中某信道所能通过的“最高数据率”,单位为bit/s
    3. 吞吐量:表示在发送端与接收端之间实际的传送数据速率(bit/s)
    4. 时延:指数据从网络的一端传送到另外一端所需的时间。
      1. 发送时延:是主机或路由器发送数据帧所需要的时间。公式为:数据帧长度(bit)/发送速率(bit/s)
      2. 传播时延:是电磁波在信道中传播一定的距离需要花费的时间。公式为:信道长度(m)/电磁波在信道上的传播速率(m/s)
      3. 处理时延:主机或路由器在收到分组时要花费一定的时间进行处理
      4. 排队时延:在分组进入路由器后要先在输入队列中排队等待处理
    5. 往返时间:从发送方发送数据开始,到发送方收到来自接受方的确认,总共经历的时间
    6. 信道利用率:指某信道有百分之几的时间是有数据通过的
      1. 信道利用率并非越高越好,因为当利用率增大时,该信道引起的时延也就迅速增加

    2.互联网的组成(边缘部分与核心部分的作用)

    边缘部分:各种端系统如主机,手机,大型或超级计算机组成。位于网络边缘;运行网络应用程序
    核心部分:互联的路由器网络。关键功能:路由和转发,其中交换机是在同一个子网内部转发数据,路由器是在不同子网之间转发数据。以数据交换的方式实现数据从源主机通过网络核心到达目的主机。

    3.电路交换与分组交换,数据报交换和虚电路交换的特点

    1. 电路交换:最经典的电路交换网络是电话网络。主要特点就是独占资源。电路交换的三个阶段:建立连接(呼叫)、通信、释放连接(挂机)。用多路复用技术解决一条链路被多路通信共享的问题
    2. 分组交换:
      报文:源应用发送的信息整体
      分组:由报文拆分成较小的数据块
      1. 在发送端,先把较长的报文划分成较短的,固定长度的数据段
      2. 每一个数据段前面添加上首部构成分组。每一个分组的首部都含有地址等控制信息
      3. 依次把各分组发送到接收端。每个分组在互联网中独立地选择传输路径
      4. 接收端收到分组后剥去首部还原成报文
    3. 数据报交换:将整个报文先传送到相邻结点,全部存储下来后查找转发表,转发到下一个结点
    4. 虚电路交换:
      即先建一条逻辑通路,其通信过程类似电路交换。每个分组除了包含数据之外还包含一个虚电路标识号,而不是目的地址的信息;在预先建好的路径上的每个节点都知道把这些分组引导到哪里去,数据分组按已建立的路径顺序通过网络,不再需要路由选择判定。

    4.TCP/IP体系结构,数据的封装与解封装

    TCP/IP体系结构TCP/IP结构表示一
    TCP/IP结构表示二
    TCP/IP结构表示三

    数据的封装与解封装
    数据封装详细过程
    *要注意链路层不仅加了首部还加了尾部
    数据的封装和解封装

    第二章 物理层

    1.信号编码:不归零编码,曼切斯特编码

    不归零编码:1为高电平,0为低电平
    曼切斯特编码:1开始为高电平中间转为低电平,0开始为低电平中间转为高电平常见编码方式

    2.影响信号失真程度的因素

    影响信号失真程度的因素:传输速率、传输距离、传输介质、噪声干扰
    在任何信道中,码元传输的速率是有上限的,否则会出现码间串扰

    3.传输介质:双绞线,同轴电缆,光纤(单模和多模),无线介质

    双绞线

    • 又4组绞合起来的线(共8根)组成
    • 分为非屏蔽双绞线和屏蔽双绞线,区别在于每组线上是否包有屏蔽材料。
    • 如果两头都是T568A或T568B类型,则为直通双绞线,适用于不同设备;如果两端类型不同则为交叉双绞线,适用于连接相同设备

    同轴电缆:

    • 50Ω同轴电缆常用于LAN/数字传输
    • 75Ω同轴电缆常用语有线电视/模拟传输

    光纤(单模和多模)

    • 由低折射率的包层和高折射率的纤芯组成,光线在纤芯中通过全反射传输
    • 多模光纤适用于近距离,可以存在多条不同角度入射的光线,允许更大的散射,会导致信号丢失,消耗较大,使用LED作为光源
    • 单模光纤适用于远距离,光纤直径小,使光线一直向前传播,不产生反射,制作成本高,使用半导体激光器作为光源
      无线介质:无线领域使用频段范围

    4.几种复用技术的特点:频分复用,时分复用,统计时分复用,波分复用,码分复用

    几种复用技术的特点:

    1. 频分复用
      • 将整个宽带分为多份,用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带
      • 所有用户在同样的时间占用不同的宽带资源
    2. 时分复用
      • 将时间划分为等长时间复用帧
      • 所有用户在不同的时间占用同样的频带宽度
      • 当某用户暂时无数据发送时,在时分复用帧中分配给该用户的时隙只能处于空闲状态
    3. 统计时分复用
      STDM帧不是固定分配时隙,而是按需动态分配时隙
    4. 波分复用
      使用一根光纤来同时传输多个光载波信号,就是光的频分复用
    5. 码分复用
      • 常用名称:码分多址CDMA,广泛应用于2G,3G网络
      • 各用户使用经过特殊挑选的不同码型(必须各不相同,必须相互正交),彼此不会干扰
      • CDMA信号有很强的抗干扰能力,保密性强
      • 不同用户在相同的时间占用同样的频带宽度
      • 每一个比特时间划分为m个短的间隔,称为码片
      • 每个站被指派一个唯一的mbit码片序列,如果发送1则发送自己的mbit码片序列,如果发送0则发送该码片序列的二进制反码
      • 两个不同站的码片序列正交,就是向量S和T的规格化内积等于0
      • 任何一个码片向量和该码片向量自己的规格化内积都是1,和giant码片反码的向量的规格化内积值是-1

    5.宽带接入技术:ADSL,HFC,FTTX

    • ADSL

      • 使用现有的模拟电话用户线,采用频分复用技术ADSL的组成
    • HFC

      • 使用有线电视网CATV,采用频分复用技术
      • 使用同轴电缆连接到机顶盒,机顶盒再连接到电视机
      • 使用电缆调制解调器连接到计算机HFC网的结构
    • FTTx

      • 光纤到户FTTH:光纤一直铺设到用户家庭
      • 光纤到大楼FTTB:光纤进入大楼,用电缆或双绞线分配到各用户
      • 光纤到路边FTTC:光纤铺到路边,从路边到各用户可使用星型结构双绞线作为传输媒体

    第三章 数据链路层

    1.理解数据链路层的地位与作用,三个基本问题

    1. 链路:从一个结点到相邻结点的一段物理线路(有线或无线),中间没有任何其他交换结点
    2. 数据链路:物理链路+通信协议
    3. 数据链路层的地位:局域网中的主机、交换机必须实现数据链路层;网络中的主机、路由器必须实现数据链路层。
    4. 数据链路层的作用:网络中两个主机发送数据所经过的网络可以是多种不同类型的,不同类型网络的链路层可能采用不同的协议
    5. 三个基本问题:
      • 封装成帧:在一段数据的前后分别添加首部和尾部,构成一个帧。帧定界符:SOH(帧开始符),EOT(帧结束符)
      • 透明传输:若帧出现定界符,在其前面用字符填充法
      • 差错检测:循环冗余检验的原理:在发送端,计算CRC冗余码(在待发送数据(k位)后面再添加供差错检测用的CRC冗余码(n位),实际发送k+n位);在接收端:利用n位CRC冗余码对收到的数据进行检验计算冗杂码
      • 用除数P再除去收到的数,若余数R=0,则证明这个帧无差错,接受

    2.使用点对点信道的链路层:信道特点,PPP帧格式,零比特填充法和字节填充法,差错检测(CRC)

    • 信道特点:点对点信道使用一对一的点对点通信方式。通常使用PPP协议,用户通过PPP协议接入ISP,再接入互联网

    • PPP帧格式PPP帧格式
      图中F为标志字段表示开始和结束,是PPP帧的定界符;A和C实际上并没有携带PPP帧的信息;协议字段中的不同数据表示该帧的数据部分的作用不同(背)

    • 零比特填充法:同步传输(一连串比特连续传送)
      在原始数据中出现连续5个1时在其后面加一个0,在接收端收到数据时将这个0删去

    • 字节填充法:异步传输(逐个字符传送)
      在原始数据中若出现开始符7E修改为7D5E;出现7D修改为7D5D;出现03修改为7D23;字符填充法

    • 差错检测(CRC) :同上面的差错检验,用冗杂码进行加密检验

    3.使用广播信道的链路层:信道特点,CSMA/CD协议,MAC帧格式,最小帧长和最大帧长

    • 信道特点:

      • 局域网使用广播信道;
      • 多台主机共享局域网内软硬件资源;
      • 若多个设备在共享的广播信道上同时发送数据,则会彼此干扰,导致发送失败
    • CSMA/CD协议:载波监听多点接入/碰撞检测

      • “多点接入”:使用广播信道的总线型网络
      • “载波监听”:不停地检测信道(发送前、发送中)
      • “碰撞检测”:检测到碰撞→立即停止发送→等待随机事件后再发送
      • 争用期=以太网的端到端往返时间2τ
      • 10Mbit/s以太网的争用期2τ=51.2μs。
      • 最先发送数据的站,在争用期内没有检测到碰撞,则这次发送肯定不会发生碰撞
      • 如果在争用期内发生发生碰撞,需要用截断二进制支书退避算法来计算等待时间。即退避时间=r倍的争用期=r*2τ,r为离散集合【0,1,…,2^k-1】中的一个随机数。k=Min[重传次数,10]。当重传次数=16次,仍不能成功时即丢弃该帧,并向高层报告
        CSMA/DA工作流程碰撞实例
    • MAC帧格式:类型:0x0800(IP数据报)、0x0806(ARP报文)
      MAC帧的格式

    • 最小帧长和最大帧长:最小:64,最大1518主要取决于数据部分的长度

    4.网卡的功能和MAC地址,帧的类型(单播帧,广播帧,多播帧)

    网卡的功能:计算机通过网络适配器(网卡)和局域网进行通信网卡

    MAC地址:MAC地址固化在网卡的ROM中,全球唯一。由6个字节组成,前3个字节由IEEE注册管理机构RA分配,后3个字节由厂家自行指派。
    注意:当主机或路由器安装有多个适配器,就有多个“MAC地址”
    帧的类型(单播帧,广播帧,多播帧)

    • 一台主机发送单播帧,仅当帧的目的地址与本网卡地址相同时才接收
    • 一台主机发送广播帧,其他主机都接收该帧
    • 一台主机发送多播帧,即发送给本局域网上一部分站点

    5.比较集线器与交换机,交换机的自学习功能及转发帧的过程

    比较集线器与交换机

    • 集线器:物理上星型,逻辑上总线型;每个主机到集线器的距离不超过100m;可以使用光纤扩展主机和集线器之间的距离,使用集线器扩展以太网(前提是连接的多个以太网段的速率要相同);采用CSMA/CD,不具有交换机的自学习能力,发送数据采用广播的方式,整个集线器是个碰撞域,不可以缓存帧
    • 交换机:以太网交换机工作在数据链路层,处理对象是帧;全双工,不使用CSMA/CD;向某个接口转发帧;每一个接口是个碰撞域;可缓存帧,可自学习。
    • 半双工数据传输允许数据在两个方向上传输,但是同一时刻只允许一个方向;全双工也允许在两个方向传输,但同时刻可以同时接受和发送信息

    交换机的自学习功能及转发帧的过程

    1. 开始时,交换表是空的
    2. 收到第一个帧后,广播发到其他接口,非目标主机会把收到的帧丢弃,并记录这个接口对应的MAC地址
    3. 当一个接口发送帧时,先从原接口进入,查找交换表是否有目的地址的记录,如果有就直接发送;如果没有就广播发帧。
    4. 交换表上的记录会存在有效时间,过了有效时间会清除记录,以免接口更换主机或者主机更换网卡
    5. 如果两个交换机有两个接口相互连接,会利用生成树协议,在逻辑上删除一个接口

    6.广播域和碰撞域,VLAN,生成树协议STP

    广播域:指网络中一个站点发出广播帧所影响的范围
    碰撞域:指网络中一个站点发出的单播帧会与其他站点发出的单播帧产生碰撞的范围;任一个时刻在一个碰撞域中只能有一个主机发送数据
    VLAN:即虚拟局域网,不改变网络的物理局域网,在逻辑上划分虚拟局域网。可以基于交换机端口,基于主机MAC地址,基于主机IP地址(交换机只在802.1Q标记相同的接口之间转发帧)划分VLAN802.1Q帧

    生成树协议STP:不改变网络的物理拓扑,但在逻辑上切断某些链路,消除回路

    第四章 网络层

    1.网络连接设备:中继器,集线器,交换机,路由器的工作层次

    中继器:物理层使用设备
    集线器:物理层使用设备
    交换机:数据链路层使用设备
    路由器:网络层使用设备

    2.IP地址:分类IP地址;互联网中的IP地址,特殊IP地址(网络地址,广播地址)

    分类IP地址

    • A类地址:0.0.0.0~127.255.255.255
    • B类地址:128.0.0.0~191.255.255.255
    • C类地址:192.0.0.0~223.255.255.255
    • D类地址:224.0.0.0~239.255.255.255
    • E类地址:240.0.0.0~255.255.255.255

    互联网中的IP地址:有两个字段组成,第一个字段是网络号,标志着主机(或路由器)要连接到的网络;第二个字段是主机号,标志着一台主机号在他前面的网络号所指明的网络范围内必须是唯一的
    特殊IP地址(网络地址,广播地址等)

    • 网络号特定值;主机号全是0:网络地址,表示一个网络,如:10.0.0.0
    • 网络号特定值,主机号全是1:直接广播地址,指特定网络中的所有主机,如:10.255.255.255
    • 网络号主机号都为1,有限广播地址,指本网络中的所有主机:255.255.255.255
    • 网络号主机号都为0,未获取UO地址的主机或路由表中的默认路由
    • 网络号127,主机号全0或全1除外的任何数,环回地址,用于本主机软件环回测试
    • 网络号169.254,主机号全0或全1除外的任何数,当不能通过DHCP正常得到IP地址时,由Windows系统自动为主机分配的IP地址

    3.IP地址与硬件地址的关系,ARP协议(ARP原理,ARP缓存,同一局域网使用ARP,跨网使用ARP)

    IP地址与硬件地址的关系:在网络中传输数据时,目的IP地址不变,但目的MAC地址会随着传输到不同设备改变
    ARP协议(ARP原理,ARP缓存,同一局域网使用ARP,跨网使用ARP)

    • ARP的作用:已知主机或路由器接口的IP地址,找出其MAC地址
    • ARP缓存:每个主机都有一个ARP高速缓存,保存本局域网中IP地址到MAC地址的映射表
    • 同一局域网使用ARP:当主机A向本局域网中主机B发送数据时,先查ARP高速缓存,若没有,则运行ARP,查找B的MAC地址
    • ARP原理:主机A广播发送ARP请求分组,目标主机B收到请求后,向A发送ARP相应分组
    • 跨网使用ARP:判断目标IP和源IP不是同一网段后,主机就要通过网关来传递信息了。信息先发送到网关机上,再由网关机转发。在查找目标不在同一网段后,目标IP改为网关机的IP,MAC地址为广播地址,发送信息时加上目标IP和MAC地址发送到网关中。

    4.IP数据报格式:首部长度和总长度,IP分片与重组(标识,标志,片偏移),生存时间TTL,协议,首部检验和

    首部长度:4位,首部长度=固定部分(20字节)+可选字段(0~40字节),取值范围5到15,单位为4字节
    总长度:16位,单位为1字节,最大值为65535,但总长度必须不超过MTU
    IP分片与重组(标识,标志,片偏移)

    • 网络链路存在MTU:链路层帧可封装数据的上限;不同链路的MTU不同
    • 大IP分组向较小MTU链路转发时,可以被“分片”
    • IP分片到达目的主机后进行“重组”
    • 标识(16位):标识一个IP数据报,IP数据报分片时,所有分片具有相同的标识
    • 标志(3位):MF=1,还有分片;MF=0,最后一个分片;DF=1,禁止分片;DF=0,允许分片
    • 片偏移(13位):某分片在原IP数据报中的相对位置。单位为8个字节

    生存时间TTL:8位,指数据报在网络中可通过的路由器数的最大值。IP数据报每经过一个路由器,TTL减1。当减到0时,这个数据报就会被丢失
    协议:8位,指数据部分是何种协议

    • =6,TCP
    • =17,UDP
    • =1,ICMP
    • =41,IPv6
      首部检验和:只检验首部,不检验数据部分。,设首部检验和为0,将首部每2个字节当做一个数,将所有数相加求和,进位累加,对求和结果求反得到

    5.划分子网:子网划分,子网掩码,根据IP地址和子网掩码计算该IP地址所在网络的网络地址,广播地址,子网数和子网中的主机数

    子网划分子网划分

    子网掩码:形如IP地址,网络号和子网号全取1,主机号全取0默认子网掩码

    根据IP地址和子网掩码计算该IP地址所在网络的网络地址、广播地址、子网数和子网中的主机数子网掩码求网络地址
    路由优先级:直连路由》特定主机路由》静态路由》动态路由》默认路由

    6.CIDR(给定一个CIDR地址快,计算最小IP地址,最大IP地址,掩码和地址总数)和路由聚合(给定几个IP地址,计算聚合后的地址)

    CIDR(给定一个CIDR地址快,计算最小IP地址,最大IP地址,掩码和地址总数)
    - 无类域间路由CIDR:a.b.c.d/x
    - 例如:200.23.16.0/23==200.23.16.0,255.255.254.0
    路由聚合(给定几个IP地址,计算聚合后的地址) :将多个子网聚合为一个较大的子网。前提:地址块是连续的。最长前缀匹配优先路由聚合

    7.ICMP协议:ICMP协议的作用,ICMP差错报文何时产生,由谁产生.PING命令和Tracert命令的工作原理

    ICMP协议的作用:支持主机或路由器进行差错报告和网络探询。向源主机报告IP数据报的差错信息;只是报告差错,不能纠正差错。ICMP报文有两种,即ICMP差错报告报文(单向,向源主机报告差错)和ICMP询问报文(双向,向源主机请求,向目的主机应答)
    ICMP差错报文何时产生,由谁产生

    1. 终点不可达:当路由器或主机不能交付数据报时向源点发送终点不可达报文
    2. 时间超过: 当路由器收到生存时间为零的数据报,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
    3. 参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确就丢弃该数据报,并向源点发送参数问题报文
    4. 改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发给另外的路由器
      PING命令和Tracert命令的工作原理: 分组网间探测PING用来测试两台主机之间的连通性,使用了ICMP回送请求与回送回答报文;tracert命令用来跟踪一个分组从源点到终点的路径

    8.路由器:给定拓扑写出路由器(直连路由,静态路由和动态路由,默认路由),路由器根据路由器转发IP数据报的过程

    给定拓扑写出路由器(直连路由,静态路由和动态路由,默认路由)

    • 静态路由:管理员手工配置的路由;需要人工维护,适合拓扑简单、稳定的网络,路由器开销小
    • 动态路由:管理员在路由器上配置动态路由协议,使路由器与其他路由器进行通信来维护路由表;无需人工维护,适合拓扑复杂、变化的网络;路由器开销大
    • 默认路由:是对IP数据报中的目的地址找不到存在的其他路由时,路由器所选择的路由。目的地不在路由表里的所有数据包都会使用默认路由。这条路由一般会连去另一个路由器,而这个路由器也同样处理数据包;如果知道应该怎么路由这个数据抱,则数据包被转发到已知的路由;否则,数据包会被转发到默认路由,从而到达另一个路由器。每次转发,路由都增加了一跳的距离。
    • 直连路由:路由器接口所连接的子网的路由方式称为直连路由。直连路由是由链路层协议发现的,一般指去往路由器的接口地址所在网段的路径,该路径不需要网络管理员维护,也不需要路由器通过某种算法进行计算获得,只要该接口处于活动状态,路由器就会把通向该网段的路由学习天写到路由表中去,直连路由无法使路由器获取与其不直接相连的路由信息。

    路由器根据路由器转发IP数据报的过程

    • 路由选择:根据IP数据报的目的地址查询路由表,确定下一跳地址。经过网络中的所有节点共同协调工作后,选择一条最佳路由

    9.RIP:距离,距离向量算法,工作过程,特点

    • 自治系统AS:属于一个组织机构的内部网络
    • 内部网关协议:运行与AS内部路由器上的动态路由协议,如:RIP、OSPF
    • 外部网关协议:用于在AS与AS之间建立动态路由的协议,如:BGP-4

    距离

    • 从一个路由器到直接连接的网络的距离定义为1
    • 从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加1
    • RIP协议中的“距离”也称为“跳数”,实际上指的是“最短距离”
    • RIP认为一个好的路由就是他通过的路由器的数目少,即“距离短”
    • RIP允许一条路径最多只能包含15个路由器
    • “距离”的最大值为16时即相当于不可达。可见RIP只适用于小型互联网
    • RIP不能再两个网路之间同时适用多条路由

    距离向量算法:路由器R收到邻居路由器X的路由表后:

    1. 将收到的路由表(即邻居的路由表)中所有的项目的“下一跳”改为X,所有“距离”值加1
    2. 对修改的每个项目(N,d,X):
      • 若N不在R的路由表中,则添加该项目
      • 若N在R的路由表中,且“下一跳”也是X,则更新该项目
      • 若N在R的路由表中,但“下一跳”不是X,如果距离d值较小,则用该项目替换原项目
        距离向量算法实例

    工作过程

    • 路由器在刚刚开始工作时,只知道到连接的网络的距离(此距离定义为1)。他的路由表是空的
    • 以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息
    • 经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址
    • RIP协议的收敛过程较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程
    • RIP协议让互联网中的所有路由器都和自己的相邻路由器不断交换

    特点

    1. 仅和相邻路由器交换信息
    2. 交换的信息是当前本路由器所知道的全部信息,即自己的路由表
    3. 按固定的时间间隔交换路由信息,例如每隔30秒。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息
    4. 网络规模较小
    5. 以跳表示链路开销
    6. 占用宽带较多
    7. 收敛慢:当网络出现故障时,RIP需较长时间才能让所有路由器知晓

    10.OSPF:链路状态,OSPF的工作过程,OSPF区域

    链路状态

    • 本路由器的各接口IP地址和接口状态
    • 相邻路由器接口IP地址
    • 链路的开销

    OSPF的工作过程

    • 每个路由器维护链路状态数据库(全网的拓扑结构图)
      • 可知全网共有多少台路由器
      • 哪些路由器是相连的
      • 链路代价是多少
    • 每个路由器根据链路状态数据库,利用Dijkstra算法,求出到达每个网络的最短路径,一次构造路由表
      原链路状态数据库
      R8根据链路状态数据库调用Dijkstra算法获得以R8为根的最短路径树最短路径树
      根据最短路径树生成路由表
      根据最短路径树,生成路由表

    OSPF区域:为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫做区域。
    划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量OSPF区域
    粉色区域为主干区域,里面的路由器叫主干路由器(包括边缘的)
    主干边缘和其他区域交接的路由器又叫区域边界路由器
    R6这种位置的叫自治系统边界路由器
    OSPF报文格式
    洪泛法

    11.外部网关协议BGP:寻找可达性的路由,策略路由

    寻找可达性的路由:用于在不同自治系统的边界路由器之间交换路由信息,寻找一条可以到达目的网络的较好路径
    策略路由:BGP路由选择策略

    12.IPv6:ipv6数据报格式,IPv6相比IPv4的变化,IPv6地址的表示,从IPv4相比IPv6的过渡技术

    ipv6数据报格式:IPv6数据报=基本首部+有效载荷;有效载荷=扩展首部+数据部分
    IPv6数据报格式

    • 优先级(8位):为了区分不同的IPv6数据报的类别或优先级
    • 流标签(20位):属于同一个流的数据报具有同样的流标签
    • 有效载荷长度(16位):指IPv6数据报除基本首部以外字节数,最大值是65535
    • 下一个首部(8位):相当于IPv4的协议字段
    • 跳数限制(8位):相当于IPv4的TTL字段
      IPv6相比IPv4的变化IPV4和IPV6的区别

    IPv6地址的表示

    1. 冒号十六进制记法:各段之间用冒号分隔:68E6:8C64:FFFF:FFFF:0000:1180:960A:FFFF
    2. 零压缩表示法:连续的零可用双冒号代替(只能使用一次):0:0:0:2AA:23:0:0:0→::2AA:23:0:0:0
    3. CIDR表示法:21DA::D3:0:0/48
    4. URLs:http://[3FFE::1:800:200C:417A]:8000

    从IPv4相比IPv6的过渡技术

    1. 使用双协议栈
      路由器B和E同时具有两种IP地址:一个IPv6地址和一个IPv4地址
    2. 使用隧道技术
      路由器B把IPv6数据报封装在IPv4数据报中发送给路由器E

    13.IP多播:比较(单播,广播,多播,任播),IP多播数据报的封装,多播IP地址与多播MAC地址,IGMP协议的作用

    比较(单播,广播,多播,任播):

    • 单播:单个源节点向单个目的结点发送分组
    • 广播:单个源节点向同网络中的所有结点发送分组
    • 多播:单个源节点向多个目的结点发送分组
    • 任播:单个源节点向多个目的结点中距离最近的单个结点发送分组

    IP多播数据报的封装:IP首部加上IGMP报文,其中首部的协议字段等于2,目的地址为D类IP地址(224.0.0.0~239.255.255.255)

    多播IP地址与多播MAC地址

    • 多播IP地址即D类IP地址:224.0.0.0~239.255.255.255
    • 多播MAC地址的最低23位来自D类IP地址,即01-00-5E-00-00-00 ~ 01-00-5E-7F-FF-FF

    IGMP协议的作用:是让连接在本地局域网上的多播路由器知道本局域网上是否有主机参加或退出了某个多播组

    14.VPN:私有IP,VPN路由器封装IP数据报的过程,三种VPN类型的判断,NAT路由器封装IP数据报的过程

    私有IP:仅在机构内部使用,不需要向因特网管理机构申请

    1. A类:10.0.0.0到10.255.255.255
    2. B类:172.16.0.0到172.31.255.255
    3. C类:192.168.0.0到192.168.255.255

    VPN路由器封装IP数据报的过程:用隧道技术实现VPN。将原本的IP数据报作为数据部分加密到新的IP数据报中,并为她添加新的数据报首部,源地址是发送的路由器地址,目的地址是收到的路由器地址

    三种VPN类型的判断

    • 内联网VPN:同属于一个机构的内部部门A和B之间建立的VPN
    • 外联网VPN:一个机构和某些外部机构共同建立的VPN
    • 远程接入VPN:外地出差的工作人员与公司网络之间建立的VPN
      NAT路由器封装IP数据报的过程
    • 替换:替换每个外出IP数据报的源地址
    • 记录:替换信息存储到NAT转换表
    • 替换:替换每个进入内网的IP数据报的目的地址NAT实例

    15.MPLS:与传输路由技术的比较,负载均衡与FEC

    MPLS:多协议标记交换,在MPLS域的入口处给每个IP数据报打标机,使用硬件转发
    MPLS的基本原理

    与传输路由技术的比较

    • 传统路由器技术数据转发机制:传统路由器IP寻址方式是逐跳转发的。转发需要由路由器对IP数据包进行解包处理,再通过路由协议决定转发方向。由于IP包的不定长特性,也就意味着时延大、转发速度慢
    • 基于ATM的MPLS数据转发机制:多协议,因为MPLS基于IP路由和控制协议,一个介于第三层和第二层之间的“垫层”,MPLS不受链路层协议的限制(可使用多种链路层协议)

    负载均衡与FEC

    • 转发等价类FEC:指路由器按照同样方式对待的IP数据报的集合
    • “按照同样方式对待”表示:从同样接口转发到同样的下一跳地址,并且具有同样服务类别和同样丢弃优先级等
    • FEC和标记是一一对应的关系:MPLS的入口结点将属于同样FEC的IP数据报指派同样的标记负载平衡

    第五章 运输层

    1.运输层的作用

    运输层向它上面的应用层提供通信服务(提供端到端,进程到进程的可靠通信),为运行在不同host上的进程提供逻辑通信,向高层用户屏蔽通信子网的细节

    2.UDP和TCP的特点,及使用它们的应用程序,熟知端口号

    UDP和TCP的特点:

    • UDP
      • 支持单播、多播、广播
      • 无连接,不可靠
      • 可以任何速率发送数据
    • TCP
      • 仅单播,不支持多播、广播
      • 面向连接,可靠按序
      • 流量控制(发送速率不超过接收方的接收能力)
      • 拥塞控制(网络过载时限制发送方的发送速率)

    及使用它们的应用程序:使用UDP,TCP的经典应用

    熟知端口号两类端口号熟知端口号

    3.UDP:首部格式,检验和

    首部格式UDP首部格式

    检验和UDP检验和
    发送端:

    1. 先设置检验和字段为0
    2. 每两个字节为一组,进位累加求和,多出的加到最后一位
    3. 把求和结果求反,求反即转换成2进制后,0变1,1变0
    4. 把计算结果放入检验和字段

    接收端

    1. 把每2个字节为一组,进位累加求和
    2. 把求和结果求反:为0即未检验出差错(不排除没检测出来的错误)
      UDP计算检验和

    4.TCP的首部格式(端口号,序号,确认号,窗口,首部长度,检验和,6个标志位)

    TCP首部格式

    端口号:各占2个字节
    当访问百度时,源端口使用客户端系统随机分配的端口号,目的端口是使用熟知端口号80
    序号:占4个字节。序号范围是【0~2^32-1】,循环使用
    确认号:占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则代表:序号N-1为止的所有数据都已正确收到
    窗口:占2个字节。窗口值是【0~2^16-1】之间的整数。窗口指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。窗口值作为接收方让发送方设置其发送窗口的依据。
    窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化着
    首部长度:占4位,也叫数据偏移,最小20,最大60
    检验和:占2位,检验和字段检验的范围包括首部和数据两部分
    6个标志位

    • 紧急URG:当URG=1时,表明紧急指针字段有效。紧急指针:指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
    • 确认ACK:只有当ACK=1时确认号字段才有效
    • 推送PSH:接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
    • 复位RST:当RST=1时,表明TCP连接中出现严重差错,重新建立运输连接
    • 同步SYN:同步SYN=1表示这是一个连接请求或连接接受报文
    • 终止FIN:FIN=1表明发送端的数据已发送完毕,并要求释放运输连接

    5.TCP的可靠传输:超时重传机制,TCP流量控制(序号,确认号,确认标志位,窗口,死锁问题与持续计时器),发送缓存和接受缓存的作用,捎带确认与累积确认

    超时重传机制
    超时计时器时间RTO:RTO=RTTs+4*RTTD
    测量多个sampleRTT求平均值,形成RTT的估计值RTTs:
    RTTs=(1-α) * RTTS+α * SampleRTT 典型值α=1/8
    测量RTT的变化值:RTTs与SampleRTT的差值:
    RTTd=(1-β) * RTTD+β * |RTTs-SampleRTT| 典型值:β=1/4
    TCP流量控制(序号,确认号,确认标志位,窗口,死锁问题与持续计时器)

    • 序号:发送窗口里面的序号表示允许发送的序号
    • 确认号:表明主机期望收到的下一个序号,而上一个序号位置的数据已经收到了
    • 确认标志位:
    • 窗口:窗口指的是发送本报文段的一方的接收窗口;发送窗口表示:在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。
    • 死锁问题:发送方等待接收方通知窗口大小,接收方等待发送方发送数据
    • 持续计时器:当发送方收到接收方的零窗口通知,启动持续计时器。若持续计时器到期,就发送一个零窗口探测报文段
    • 接收方发送的确认报文段中:
      若窗口仍是零,则重置持续计时器
      若窗口不是零,则死锁打开
      发送缓存和接受缓存的作用
    • 发送方应用进程把数据发送到TCP的发送缓存;发送缓存暂时存放:1准备发送的数据;2已发送未确定的数据
    • 接收方应用进程从TCP的接收缓存中读取字节流;接收缓存暂时存放:1已收到但尚未提交的数据;2失序的数据
      捎带确认与累积确认
    • 累积确认:即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组位置的所有分组都已正确收到了
    • 捎带确认:当一个数据帧到达的时候后,接收方并不是立即发送一个单独的控制帧,而是抑制一下自己并且开始等待,知道网络层传递给他下一个分组,然后,确认信息被附在往外发送的数据帧中(使用帧头中的ack域)。实际上,确认报文搭了下一个外发数据帧的便车。

    6.TCP的拥塞控制:网络拥塞的判断,传输轮次与拥塞窗口大小的关系(慢开始与拥塞避免,门限ssthresh,重传计时器超时与三个重复ACK)

    网络拥塞的判断:重传定时器超时
    ***传输轮次与拥塞窗口大小的关系(慢开始与拥塞避免,门限ssthresh,重传计时器超时与三个重复ACK)***:

    • 慢开始:每经过一个RTT,cwnd翻倍
    • 拥塞避免:每经过一个RTT,cwnd加一
    • 慢开始门限ssthresh:当cwnd = ssthresh时由指数增长切换为线性增长;ssthresh=24时,重传计时器超时,发送方判断为网络拥塞。调整ssthresh=cwnd/2,拥塞窗口cwnd=1,执行慢开始拥塞避免

    7.TCP连接:TCP的套接字,三次握手建立TCP连接,四次握手释放TCP连接

    TCP的套接字:就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制
    三次握手建立TCP连接:

    • 刚开始客户端A和服务端B都是关闭的
    • B的TCP服务器进程被动打开,准备接受客户进程的连接请求
    • A主动打开,A向B发出SYN报文段,选择初始序号,不携带数据。SYN=1,SEQ=X
    • B收到SYN报文段,发回ACK报文段,选择初始序号,分配缓存,不携带数据。SYN=1.ACK=1.SEQ=Y,ack=x+1
    • A向B发送SYN+ACK报文段,可携带数据。通知上层应用进程:TCP连接已建立。
    • B通知其上层应用进程TCP连接已经建立。三报文握手

    四次握手释放TCP连接:

    • 客户端A主动关闭。A向B发出FIN报文段,并停止发送是数据。FIN=1,seq=u
    • B通知应用进程。B收到FIN报文段,回复ACK报文段。TCP连接处于半关闭状态:B仍可发送数据。ACK=1,seq=v,ack=u+1
    • B被动关闭。若B已经没有要向A发送的数据,向A发送FIN报文段。FIN=1,ACK=1,seq=w,ack=u+1
    • A收到FIN报文段后,必须发出ACK报文段。ACK=1,seq=u+1,ack=w+1
    • B收到ACK报文段后,TCP连接关闭。TCP的关闭四报文握手

    第六章 应用层

    1.域名系统DNS

    1)IP与域名的关系,DNS的作用,域名的结构

    IP与域名的关系:一个域名只有一个IP地址,但是一共IP地址却是可以对应多个域名的。所以,IP地址与域名是一对多的关系。
    DNS的作用:查询域名与IP地址的映射;主机别名;负载均衡(web服务器);Internet核心功能;多层命名服务器构成的分布式数据库
    域名的结构:域名的结构由标号序列组成,各标号之间用点隔开
    域名结构

    2)四类域名服务器(根域名服务器,顶级域名服务器,权限域名服务器和本地域名服务器)

    四类域名服务器(根域名服务器,顶级域名服务器,权限域名服务器和本地域名服务器)
    根域名服务器:知道所有顶级域名的映射
    顶级域名服务器:负责com,org,ney,cn,uk等顶级域名
    权威域名服务器:属于组织的,负责组织内部服务器的解析
    本地域名服务器

    • 主机应至少配置一个本地域名服务器
    • 主机向本地域名服务器发送DNS查询请求报文
    • 本地域名服务器若无法解析一个域名时,首先求助于根服务器

    3)迭代与递归解析域名的方式,DNS缓存

    迭代与递归解析域名的方式迭代查询
    递归查询

    DNS缓存:每个域名服务器和主机都维护一个DNS高速缓存。
    查看主机DNS缓存命令:ipconfig /displaydns
    清空主机DNS缓存命令:ipconfig /flushdns

    2.文件传输协议FTP:FTP协议的作用,控制连接与21号端口,数据连接与20号端口,匿名FTP的三种使用方式

    FTP协议的作用:是互联网上使用最广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件的类型和格式,并允许文件具有存取的权限。基于TCP,使用C/S方式
    控制连接与21号端口:FTP客户使用临时端口号,用来传输控制信息,使用21号端口,发送你用户名、密码、读取文件等命令
    数据连接与20号端口:FTP服务器从控制连接上收到一个读取文件命令后,使用20号端口与客户端临时端口号建立一个数据连接;通过数据连接传输文件;文件传输完毕后关闭数据连接
    匿名FTP的三种使用方法:

    • 利用windows系统中的ftp程序,在命令行中输入:ftp ftp服务器域名
    • 使用web浏览器,在地址栏中输入:ftp://ftp服务器域名
    • 使用FTP专用软件,如CuteFTP等

    3.WWW服务:HTTP协议的作用,URL,在浏览器的地址栏中输入一个URL后发生的报文交互情况,流水线持久连接,HTTP报文,Cookie的作用,三类web文档,搜索引擎

    HTTP协议的作用:使万维网客户程序与万维网服务器程序之间的交互遵循严格的协议,实现万维网上的各种链接,取得所需的web文档

    URL:是用来表示从互联网上得到的资源位置和访问这些资源的方法。URL给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位,只要能够对资源定位,系统就能对资源进行各种操作,如存取、更新、替换和查找其属性等。
    URL的一般格式
    😕/规定的格式
    <主机>是存放资源的主机在互联网中的域名
    <端口>/<路径>有时可省略

    在浏览器的地址栏中输入一个URL后发生的报文交互情况交换情况

    流水线持久连接:

    • HTTP 1.1的默认选项
    • 客户端只要遇到一个引用对象就尽快发出请求
    • 理想情况下,收到所有对象耗时约1RTT
    • 所需时间=文档发送时间+2RTT
      在这里插入图片描述

    HTTP报文:

    • HTTP请求报文=请求行+首部行+空行+实体主体
    • HTTP响应报文=状态行+首部行+空行+实体主体

    Cookie的作用:网站为识别用户身份、跟踪用户访问行为而存储在用户端的数据。主要用在身份认证,购物车,个性化推荐,隐私问题等方面上

    类web文档:

    • 静态web文档
      文档创建后保存在服务器中,内容不变
    • 动态web文档
      文档的内容是在浏览器访问服务器时,由服务器端的CGI程序动态创建的
    • 活动web文档
      服务器返回活动文档程序,浏览器运行该程序,活动文档的内容可连续改变

    搜索引擎:

    • 全文检索搜索引擎:谷歌,必应,百度
    • 分类目录搜索引擎:雅虎,新浪,搜狐,网易

    4.电子邮件系统:电子邮件系统的组成,E-mail格式,SMTP,MIME,POP3和IMAP的区别,基于万维网的电子邮件

    电子邮件系统的组成:邮件客户端+邮件服务器+邮件传输协议(Outlook,Foxmail,web浏览器+Winmail Server U-mail+STMP,POP/IMAP)
    E-mail格式:电子邮件的格式

    SMTP,MIME,POP3和IMAP的区别

    • SMTP协议
      • 使用TCP,端口25
      • 传输过程的三个阶段:建立连接、报文传输、关闭
      • 命令响应交互模式:ASCII文本(命令)、状态代码和语句(响应)
    • MIME协议(多媒体扩展)
      通过在邮件首部增加额外的行以声明MIME的内容类型
    • 邮件读取协议POP3、IMAP
      邮件读取协议

    基于万维网的电子邮件:
    万维网电子邮件

    5.动态主机配置协议DHCP:DHCP的作用(IP地址,子网掩码,默认网关IP地址,默认DNS服务器IP地址),DHCP的工作过程,IP租约期,DHCP服务器的位置及DHCP中继

    DHCP的作用(IP地址,子网掩码,默认网关IP地址,默认DNS服务器IP地址):主机从DHCP服务器动态获取IP地址、子网掩码、默认网关地址、DNS服务器地址

    DHCP的工作方式:

    1. 需要IP地址的主机广播发送DHCP DISCOVER报文,寻找DHCP服务器
    2. DHCP服务器从IP地址池中选取一个IP地址,广播DHCP OFFER报文,提供IP地址等信息给主机

    IP租约期:DHCP服务器分配给DHCP客户的IP地址的临时使用期。IP租用期的长短不固定,通常在DHCP服务器端设定

    DHCP的工作过程:

    1. DHCP服务器在UDP 67端口监听,等待客户端的请求
    2. DHCP从UDP68端口发送DHCPDISCOVER报文
    3. DHCP服务器发出DHCPOFFER报文,DHCP客户端可能收到多个DHCPOFFER报文
    4. DHCP客户从几个DHCPOFFER报文中选择其中一个,并向所选择的DHCP服务器发送DHCPREQUEST报文
    5. 被选择的DHCP服务器发送DHCPACK报文,进入已绑定状态,开始使用得到的临时IP地址
    6. 租用期到达50%时,DHCP客户发送DHCPREQUEST报文,要求更新租用期
    7. DHCP服务器若同意,则发回DHCPACK报文
    8. DHCP服务器若不同意,则发回DHCPACK报文,客户须重新申请IP地址
    9. 若DHCP服务器不响应,则在租用期到达87.5%时,DHCP客户必须重新发送DHCPREQUEST报文
    10. DHCP客户可随时发送DHCPRELEASE报文提前释放IP地址
      DHCP工作过程

    DHCP服务器的位置及DHCP中继:
    DHCP服务器可以不和主机在同一个网络,可以通过DHCP中继代理单播穿过其他网络传到DHCP服务器上DHCP中继代理

    6. P2P应用:文件分发

    文件分发应用
    发送Trunk原则:Tit-for-Tat

    • 节点(Alice)向4个邻居发送Chunk:
      • 正在向Alice发送Chunk且速率最快的4个
      • 每10秒重新评估Top4
    • 每30秒随机选择一个其他节点,向其发送Chunk
      • 新节点可能成为ALICE的top4

    第七章 网络安全

    网络攻击的常见方式,对称密码体制和公钥密码体制,数字签名与保密通信,秘钥分配(KDC,CA)

    网络攻击的常见方式:

    1. 从原站截获数据
    2. 篡改从原站截获的数据
    3. 用恶意程序攻击目的站
    4. 多主机访问目的站导致拒绝服务
      对称密码体制和公钥密码体制数据加密模型
    • 对称密钥密码体制:E和D公开,K1和K2保密(K1=K2),加密密钥和解谜密钥相同
    • 公钥密码体制:E和D公开,K1公开,K2(保密),每人都有一堆密钥(公钥与私钥),且二者不同
      特点:
      • 密钥对产生器产生出接收者B的一对密钥:加密密钥PKb和解谜密钥SKb。发送者A所用的加密密钥PKb就是接收者B的公钥,它向公众公开。而B所用的解密密钥SKb就是接收者B的私钥,对其他人保密
      • 发送者A用B的公钥PKb通过E运算对明文X加密,得出密文Y,发送给B。B用自己的私钥SKb通过D运算进行解密,恢复出明文
      • 虽然公钥可以用来加密,但却不能用来解密

    数字签名与保密通信

    • 数字签名的特点:
      • 接收者能够核实发送者对报文的签名。报文鉴别
      • 接收者确信所收到的数据和发送者发送的完全一样没有被篡改过。报文的完整性
      • 发送者事后不能抵赖对报文的签名。不可否认

    数字签名

    秘钥分配(KDC,CA):kdcD
    CA

    第九章 无线局域网

    两类WLAN,AdHoc,无线传感器网络,CSMA/CA,802.11帧(四个地址)

    两类WLAN:

    1. 有固定基础设施的WLAN
      主机之间的通信必须通过AP的转发
    2. 无固定基础设施的WLAN(移动自组织网络Adhoc)
      无AP,临时网络,不和其他网络连接;结点需运行路由选择协议,结点需转发分组

    无线传感器网络WSN:
    低功耗、低宽带、低存储容量、物联网
    无线传感器网络

    CSMA/CA:
    情景:A要发送数据给B,C也想发送数据给D

    • A监听到信道空闲,等待一个分布帧间隔DIFS(128μs)后发送该帧

    • B收到数据帧后,等待一个短帧间隔SIFS(28μs)后发回一个确认帧

    • C监听到信道忙,选取一个随机回退值继续侦听。如果信道空闲递减该值,如果信道忙保值该值;当回退值=0时,发送帧并等待确认

    • CSMA/CA

    • CSMA/CA可能发生碰撞的两种情况:

      • 随机回退值相近
        情景A要发送数据给B,C也想发送数据给D
        - A和C监听到信道忙,各选取一个随机回退值继续侦听
        - 当两个回退值同时为0时,A和C同时发送数据
        - 随机回退值相近

      • 隐蔽站问题
        情景:A要发送数据给B,C也想发送数据给B
        - C在A的传输范围之外,A和C都认为信道空闲,都向B发送数据–将发生碰撞
        - 隐蔽站问题

    802.11帧:
    802.11帧格式
    AtoB
    AtoB地址
    AtoC
    AtoC地址

    其他

    1.归纳比较:

    地址长度(MAC地址,IPv4地址,IPv6地址,端口号)

    • MAC地址:6个字节。前三个字节是组织唯一标识符(24位)由IEEE注册管理机构RA分配,后三个字节是扩展唯一标识符(24字节)由厂家自行指派
    • IPv4地址:32比特,4个字节。用来标识主机、路由器的接口
    • IPv6地址:128位,16字节。可以用冒号十六进制记法、零压缩表示法、CIDR表示法等表示。有组播地址;单播地址;任播地址三种分类
    • 端口号:16bit,运输层通过端口号来区别相同计算机所提供的这些不同的服务

    首部长度(帧首部,IPv4首部,IPv6首部)

    • 帧首部:以太网帧首部加尾部长度共为18字节
    • IPv4首部:首部固定长度为20字节加上选项长度(0~40)
    • IPv6首部:基本首部长度为40字节

    差错检验(帧校验CRC,IPv4,TCP和UDP的校验检验和)

    • 帧校验CRC
      1. 在发送端先把数组按照一定划分大小划分为组,假设每组K个比特,要传输的数据记位M,发送方要做的就是在数据M后面添加用于差错检验的n位冗杂码,然后构成一个帧发送出去,也就是说此时发送的数据在原理基础上增加了n为冗杂码
      2. 首先在原数据M后面添加n个0相当于左移n位,此时数据长度变为原理的每组K个比特加n即(k+n)位。然后用该序列除以在计算之前规定的一个长度为(n+1)位的除数p,根据二进制的模2运算,计算出余数R。这个余数R就会作为冗杂码拼接在原数据后面发送出去
      3. 模2算法:一样为0,不同为1
      4. 接收方把收到的每一个帧都除以同样的除数,然后检查得到的余数R。R=0即这个帧没问题,接受;R!=0,则判断这个帧有错。
    • IPv4校验检验和
      1. 先设置“首部检验和”字段为0
      2. 将首部每2个字节当做一个数
      3. 将所有数相加求和,进位累加“3029F=02A2”
      4. 对求和结果求反得:FD5D
      5. 则发送方发送的IP分组首部的检验和为:FD5D
      6. 接受方收到的IP数据报要进行检验
      7. 将首部每2个字节当做一个数
      8. 将所有数相加求和,进位累加:3FFFC=FFFF
      9. 对求和结果求反,得:0000
      10. 结论:收到的IP分组首部没有检测出差错
    • UDP校验检验和
      1. UDP校验检验和在计算检验和时,要在UDP用户数据报之前增加伪首部。把首部,伪首部,数据部分一起都检验。
      2. 在发送方,首先是先把全零放入检验和字段,在把伪首部以及UDP用户数据报看成是由许多16位字串接起来。若UDP用户数据报的数据部分不是偶数字节,则要填入一个全零字节(但不发送)。按二进制算法将他们相加,再求反码即为检验和
      3. 在接收方,把收到的UDP用户数据报连同伪首部一起,按照二进制反码求这些16位字的和。当无差错时其结果应为全1;否则就表明有差错
      4. UDP的伪首部由源IP地址,目的IP地址,0,协议号17,UDP数据报长度组成
    • TCP校验检验和
      • 与UDP校验检验和十分相像,仅在伪首部的协议号由17改为6,UDP长度改为TCP长度上有区别

    路由技术(RIP,OSPF,BGP,MPLS)

    • RIP
      内部网关协议,分布式基于距离向量的路由选择协议。RIP要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录,使用跳数表示目标地址的路由距离。这种协议的路由器只关心自己周围的世界,只与自己相邻的路由器交换信息,范围限制在15跳以内
    • OSPF
      开放式最短路径优先,用著名的迪克斯特算法计算最短路径树,使用分布式链路状态协议。会讲一个自治系统划分为若干个小区域,利用洪泛法交换状态信息
    • BGP
      边界网关协议BGP,只能力求寻找一条能够到达目的网络且比较好的路由,并非要寻找一条最佳路由。采用了路径向量路由选择协议。在配置BGP时,每一个自治系统的管理员要选择至少一个路由器作为该自治系统的BGP发言人。一般来说,两个BGP发言人都是通过一个共享网络连接到一起的,而BGP发言人往往就是BGP边界路由器,但也可以不是BGP边界路由器。一个BGP发言人与其他AS的BGP发言人要交换路由信息,就要先建立TCP连接(端口号179),然后在此连接上交换BGP报文以建立BGP会话,利用BGP会话交换路由信息。
    • MPLS
      多协议标记交换MPLS,利用面向连接技术,使每个分组携带一个叫做“标记”的小整数,当分组到达交换机时,交换机读取分组的标记,并用标记值来检索分组交换表,再进行将标记由入标记兑换成出标记后,将报文发出到下一个LSR(标记交换路由器)。当到达出口时,MPLS域的出口结点就把MPLS的标记去除,发给正常的主机和路由器

    数据交换(电路交换,报文交换,分组交换)

    • 电路交换
      由于电路交换在通信之前要在通信双方之间建立一条被双方独占的物理通路(由通信双方之间的交换设备和链路铸逐段连接而成),电话交换的经典应用就是电话通讯网络。电话通信有三个阶段:建立、通话、拆除
    • 报文交换
      报文交换是以报文为数据交换的单位,报文携带有目标地址、源地址等信息,在交换结点采用存储转发的传输方式
    • 分组交换
      分组交换仍采用存储转发传输方式,但将一个长报文先分割为若干个较短的分组,然后把这些分组(携带源、目的地址和编号信息)逐个地发送出去。是现在计算机较常使用的交换方式

    TCP与UDP

    • TCP
      传输控制协议,是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须需要经过三次“对话”才能建立起来,而结束需要四次“对话”
    • UDP
      UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输宽带的限制;在接收端,UDP把每个消息端放在队列中,应用程序每次从队列中读一个消息端
      由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

    IPv4与IPv6

    IPv6的优点:

    • 更大的地址空间
    • 扩展的地址层次结构
    • 灵活的首部格式
    • 改进的选项
    • 允许协议的继续扩充
    • 支持即插即用
    • 支持资源的预分配
    • 8字节对齐

    IPv4和IPv6的区别:

    1. 取消了首部长度字段,因为它的首部长度是固定的
    2. 取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能
    3. 取消了总长度字段,改用有效载荷长度字段
    4. 取消了标识】标志、和片偏移字段,因为这些功能已包含在分片扩展首部中
    5. 把TTL字段改称为跳数限制字段,但作用是一样的
    6. 取消了协议字段,改用下一个首部字段
    7. 取消了检验和字段,这样加快了路由器处理数据报的速度
    8. 取消了选项字段,而是扩展首部来实现选项功能

    P2P与C/S

    • P2P
      p2p对等连接是指两台主机在通信时并不区分哪一个是服务请求方哪个是服务提供方,只要两台主机都运行了对等连接软件。他们就可以进行平等的、对等连接通信
    • C/S
      指客户端服务器方式,都是指通信中所涉及的两个应用进程,客户是服务请求方,服务器是服务提供方。

    搜索引擎(全文检索与分类目录)

    • 全文检索
      全文检索搜索引擎是一种纯技术型的检索工具。它的工作原理是通过搜索软件到互联网上的各网站收集信息,找到一个网站后可以从这个网站再连接到另一个网站,像蜘蛛爬行一样。然后按照一定的规则建立一个很大的在线索引数据库供用户查询。用户在查询时只要输入关键词,就从已经建立的索引数据库里查询。
    • 分类目录检索
      分类目录搜索引擎并不采集网站的任何信息,而是利用各网站向搜索引擎提交网站信息时填写的关键词和网站描述等信息,经过人工审核编辑后,如果认为符合网站的登录条件,则输入到分类目录的数据库中,供网上用户查询

    CSMA/CD与CSMA/CA

    • CSMA/CD
      载波监听多点接入/碰撞检测技术
      多点接入,就是说明这是总线型网络许多计算机以多点接入的方式连接在一根总线上。协议的本质是载波监听和碰撞检测
      载波监听,就是用电子技术检测总线上有没有其他计算机也在发送,就是检测信道,不管在发送前,还是在发送中,每个站都必须不停地检测信道
      碰撞检测,也就是边发送边监听,即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。当电压变化幅度超过限制值,就认为总线上至少有两个站同时在发送数据。
    • CSMA/CA
      就是带有冲突避免的CSMA/CD,属于升级版,主要应用在无线网络上

    网络攻击方式(蠕虫,木马,逻辑炸弹,后门入侵,流氓软件,窃听,拒绝服务攻击)

    • 蠕虫、木马、逻辑炸弹、后门入侵、流氓软件
      都是属于恶意程序
    • 窃听
      从源站截获后再发给目的站
    • 拒绝服务攻击
      指攻击者向互联网上的某个服务器不停地发送大量分组,使该服务器无法提供正常的服务,甚至完全瘫痪

    2.主要命令

    Ipconfig命令(/all,/displaydns,/flushdns,/release,/renew)

    • ipconfig /all
      显示它已配置且所要使用的附加信息,并且显示内置于本地网卡中的物理地址
    • ipconfig /displaydns
      显示本地DNS内容
    • ipconfig /flushdns
      清除本地DNS缓存内容
    • ipconfig /release
      所有接口的租用IP地址便重新交付给DHCP服务器
    • ipconfig /renew
      本地计算机便设法与DHCP服务器取得联系,并租用一个IP地址

    ping命令(-n,-l,-t等参数)

    • ping -n count
      count参数指定发送的echo数据包数,默认为4
    • ping -l size
      定义echo数据包大小。默认为32字节
    • ping -t
      想目标主机连续不断发送数据包,直到被用户已ctrl+C中断

    Traceroute命令

    • traceroute
      查看发送到目标网站的路径

    arp命令(-a,-d,-s参数)

    • arp -a
      显示ARP表中所有项目
    • arp -d
      清除ARP高速缓存中所有项目
    • arp -s
      向ARP高速缓存中添加静态表项

    3.术语:ISP,IXP,Hub,LAN,MAN,WAN,WLAN,VLAN,P2P,C/S,CSMA/CD,CSMA/CA,LiFi,Wifi,ADSL,HFC,FTTH,URL,VPN,IPSec,NAT,ICMP,IGMP,MSS,BGP,自治系统AS,HTTPS,MPLS,AP,SSID,AdHoc,区块链

    1. ISP
      互联网服务提供者ISP,在许多情况下ISP就是一个进行商业活动的公司
    2. IXP
      互联网交换点IXP的主要作用就是允许两个网络直接相连并交换分组,而不需要再通过第三个网络转发
    3. Hub
      多端口转发器Hub,在以Hub为中心设备时,即使网络中某跳线路产生了故障,并不影响其他线路的工作。所以HUB在局域网中得到了广泛的应用
    4. LAN
      局域网,一般用微型计算机或工作站通过高速通信线路相连,但地理上则局限在较小的范围
    5. MAN
      城域网,作用范围一般是一个城市,可跨越几个街区甚至整个城市,其作用距离是5~50Km
    6. WAN
      广域网,作用范围通常是几十到几千公里,因而有时也称为远程网。是互联网的核心部分,其任务是通过长距离运送主机所发送的数据
    7. WLAN
      无线局域网,是指应用无线通信技术将计算机互联起来,构成可以互相通信和实现资源共享的网络体系。无线局域网本质的特点是不再使用通信电缆将计算机与网络连接起来,而是通过无线的方式连接,从而使网络的构建和终端的移动更加灵活
    8. VLAN
      虚拟局域网,是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能、部门应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样
    9. P2P
      对等连接,是指两台主机在通信时并不区分哪一个是服务请求方哪一个是服务提供方。只要两台主机都运行了对等连接软件,他们就可以平等的、对等连接通信
    10. C/S
      客户-服务器方式,客户和服务器都是指通信中所涉及的两个应用进程,客户是服务请求方,服务器是服务提供方
    11. CSMA/CD
      载波监听多点接入/碰撞检测技术
      多点接入,就是说明这是总线型网络许多计算机以多点接入的方式连接在一根总线上。协议的本质是载波监听和碰撞检测
      载波监听,就是用电子技术检测总线上有没有其他计算机也在发送,就是检测信道,不管在发送前,还是在发送中,每个站都必须不停地检测信道
      碰撞检测,也就是边发送边监听,即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。当电压变化幅度超过限制值,就认为总线上至少有两个站同时在发送数据。
    12. CSMA/CA
      带有冲突避免的载波监听多路访问技术
      是一种数据传输时避免各站点之间数据传输冲突的算法,其特点是发送包的同时不能检测到信道上有无冲突,只能尽量避免
    13. LiFi
      可见光通讯LiFi,点一盏LED灯就能上网
    14. WiFi
      使用802.11系列协议的局域网又称为WiFi
    15. ADSL
      非对称数字用户线技术ADSL,用数字技术对现有的模拟电话用户线进行改造,使其能够承受宽带数字业务。
      ADSL由三个部分组成:数字用户线接入复用器DSLAM、用户线和用户家中的一些设施。其中DSLAM包括许多ADSL调制解调器,也称接入端接单元ATU。需要成对使用,用户端的是ATU-R和电话分离器连接;电话端局的是ATU-C
    16. HFC
      光纤同轴混合网HFC网
      是在有限电视网的基础上开发的一种居民宽带接入网。机顶盒连接在同轴电缆和用户的电视机之间,使模拟电视机能够接受数字电视信号。还需要增加一个为HFC网使用的调制解调器,它又称为电缆调制解调器。不需要成对使用,而只需安装在用户端。
    17. FTTH
      FTTX技术即光线到x技术,最常见的是FTTH光线到户技术,也有FTTC到路边、FTTZ到小区、FTTO到办公室、FTTB到大楼、FTTF到楼层、FTTD到桌面等。
    18. URL
      统一资源定位符URL,是用来表示从互联网上得到的资源位置和访问这些资源的方法
      URL给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位
      <协议>://<主机>:<端口>/<路径>
    19. VPN
      虚拟专用网VPN,在公用网络上建立专用网络,进行加密通讯。VPN网关通过对数据包的加密和数据包目标地址的转换实现远程访问
    20. IPSec
      是一个协议报,通过对IP协议的分组进行加密和认证来保护协议的网络传输协议族
    21. NAT
      网络地址转换NAT,需要在专用网连接到互联网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。
    22. ICMP
      网际组控制协议ICMP
    23. IGMP
      网际组管理协议IGMP,使用IP数据报传递其报文,但他也向IP提供服务。
      第一步,当某台主机加入新的多播组时,该主机应向多播组的多播地址发送一个IGMP报文。
    24. MSS
      最大报文段长度MSS,是每一个TCP报文中的数据字段的最大长度
    25. BGP
      外部网关协议BGP,只能力求寻找一条能够到达目的网络且比较好的路由,并非寻找一条最佳路由,BGP采用了路径向量路由选择协议。
    26. 自治系统AS
      是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。
    27. HTTPS
      超文本传送协议HTTP,HTTPS是以安全为目的的HTTP通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。在HTTP的基础上加入了SSL,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
    28. MPLS
      多协议标记交换MPLS,多协议表示在MPLS的上层可以采用多种协议。MPLS利用面向连接技术,使每个分组携带一个叫做标记的小整数。当分组到达交换机时,交换机读取分组的标记,并用标记值来检索分组转换表
    29. AP
      接入点,基本服务集内的基站叫做AP,其作用和网桥类似
    30. SSID
      服务集标识符SSID,即WLAN的名称,当网络管理员安装AP时,必须为该AP分配一个不超过32字节的服务集标识符SSID合一个信道
    31. AdHoc
      AdHoc(点对点模式):AdHoc模式就和以前的直连双绞线概念一样,是P2P的连接,所以就无法与其它网络沟通了,可以用来组件家庭无线局域网
    32. 区块链
      本质上来讲,它是共享数据库,存储于其中的数据或信息,具有“不可伪造”,“全程留痕”,“可以追溯”,“公开透明”,“集体维护”等特征。
    展开全文
  • MySQL知识点总结

    万次阅读 多人点赞 2018-07-25 12:16:20
    MySQL大纲 数据库概述  数据库(DATA BASE)指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。  数据库管理系统(DataBase Management System,DBMS):指一种...
  • 最全面的web程序设计知识点总结

    千次阅读 2021-03-17 21:37:14
    6.1 JavaServlet和JSP概念原理 6.2 ASP.NET基本概念和原理 6.3 PHP基本概念和原理 6.4 AJAX基本概念和原理 总结 前言 本文章是围绕全国计算机等级考试-web程序设计的相关内容 一、web技术基础? 1.1 Internet的基本...
  • Linux基础知识点总结

    千次阅读 2022-04-02 17:01:01
    2.Windows用户多–》图形化界面,鼠标,入门容易 —》对用户友好 3.Linux更专业化 [root@localhost ~]# uname -r 查看Linux内核版本 3.10.0-327.el7.x86_64 cpu,内存,磁盘,网卡等硬件 =》躯壳 操作系统 =》软件...
  • 计算机操作基础知识点总结

    万次阅读 多人点赞 2019-02-21 16:09:17
    7.网卡 8.声卡 9.电源 10.操作系统 二、CPU型号: 1.INTEL 1)主频:2.8-3.7GHZ 2)核心:双核、四核、八核、十核 3)高速总缓冲:2-20MB 4)优点:发热性小,稳定,兼容性好 2.AMD 1)主频:3.0-4.0GHZ 2)核心:双核、...
  • 软考网络工程师历年知识点总结 IP 寻 址 一、IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段;主机ID用来标识...
  • 漏洞利用的核心,是利用程序漏洞去执行shellcode...国家信息安全漏洞共享平台是CNCERT联合国内重要信息系统单位建立的信息安全漏洞共享知识库,它的英文缩写是CNVD。 电子签名需要第三方认证,是由依法设立的电子
  • 计算机应用基础会考复习主要知识点一、信息技术与计算机1、计算机硬件发展(1) 世界第一台计算机诞生的时间、地点、名字:1946年,美国,Eniac(埃尼阿克)(2) 计算机主要部件: 显示器,主机,键盘,鼠标,音箱,打印机...
  • 计算机网络知识点总结

    万次阅读 多人点赞 2019-01-09 17:15:33
    总结一(必备知识点) 数字化、网络化、信息化是21世纪的重要特征,它是一个以网络为核心的信息时代。 互联网具有联通性和共享这两个重要的基本特点。 共享即资源共享,包括信息共享、软件共享、硬件共享…… ...
  • JavaScript基础知识总结

    万次阅读 多人点赞 2019-04-11 10:37:31
    script> head> 写在外部js文件中,在页面引入 <script src="main.js">script> 注意 引用外部js文件的script标签中不可以写JavaScript代码 计算机组成 软件 应用软件:浏览器(Chrome/IE/Firefox)、QQ、Sublime、...
  • Java基础知识总结(2021版)

    万次阅读 多人点赞 2021-01-09 16:20:53
    但感觉知识还是相当的匮乏,没自信,也许是努力程度还不够吧。很感谢CSDN,因为是它给了我学习的动力,之前写了一篇记录CSDN博客访问量的文章,也许大家感觉很幼稚,但真的很有用,很有效果,仿佛磕了药一样,努力...
  • 计算机三级(数据库)复习重点欢迎阅读我的计算机三级总结第一章 数据库应用系统开发方法第二章 需求分析第三章 数据库结构设计(自底向上)第四章 数据库应用系统功能设计与实现第五章 UML与数据库应用系统第六章 ...
  • WEB开发技术 知识点总结

    万次阅读 多人点赞 2018-05-11 00:10:58
    WEB开发技术 知识点总结第一章:(填空判断)1、什么是WWWWWW是World Wide Web的缩写,中文译名“万维网”。Web是Internet提供的一种服务,是基于Internet、采用Internet协议的一种体系结构。2、Web三要素:统一资源...
  • html重要知识点总结

    千次阅读 多人点赞 2017-12-03 16:33:15
    HTML知识点总结 一、div,span 看起来相对于,啥的没有什么效果,实际上是最实用的,有两大功能 1、容器,分块明确,使页面更结构化 dkjgaklgja 分块操作 &src=...
  • 5、后续防护建议 1)对网站进行定期的渗透测试 2)使用网站监测工具进行7*24小时监测 三、错误处置方法 确定网页被篡改后,只用备份文件恢复,没有做进一步排查。可能会导致又一次被入侵。 四、常用工具 1、日志...
  • 1.网络安全之windows系统知识

    千次阅读 2022-03-21 08:52:38
    网络空间安全学习入门知识windows操作系统基础操作与网络配置
  • 内网渗透知识点总结

    千次阅读 2019-07-01 14:19:14
    文章内容没谈 snmp 利用,可以去乌云等社区...windows-kernel-exploits Windows 平台提权漏洞集合 https://github.com/SecWiki/windows-kernel-exploits linux-kernel-exploits Linux 平台提权漏洞集合 ...
  • 全国计算机等级考试三级数据库知识点总结

    千次阅读 多人点赞 2019-07-05 12:56:39
    知识点(部分,分类可能不准确) 一、数据库引用系统开发方法 1.数据库运行维护工作:日常维护;监控与分析;性能优化调整;系统进化。 2.DBAS实施与部署工作:建立数据库结构;数据加载;事务和应用程序的编码及...
  • javase知识点大全总结

    万次阅读 多人点赞 2018-09-24 12:21:02
    JAVASE知识点总结 Java基础语法 1.标识符 1.在java语言中,对各种变量,方法和类等要素命名时所使用的字符序列就是标识符。 这些标识符有jdk定义好的,也有我们自己开发时候需要定义的。 2.java中标识符由26个英文...
  • 三级数据库知识点总结

    千次阅读 2019-04-01 12:12:38
    三级数据库知识点总结 一、数据库的基本知识 1.数据库系统(DBS):主要提供应用数据的组织、存储、维护、访问等数据管理功能。 2,。数据库应用系统(DBAS):不仅为用户提供数据管理功能,还根据具体应用领域业务...
  • Linux基础知识总结

    万次阅读 多人点赞 2018-11-13 19:40:45
    /selinux:这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的 /srv:存放一些服务启动之后需要提取的数据 /...
  • Linux 操作系统基础知识总结

    千次阅读 2022-03-07 10:20:04
    1、操作系统总体介绍 CPU: 就像人的大脑,主要负责相关事情的判断以及实际处理的机制。 查询指令: cat /proc/cpuinfo...Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会
  • Python知识点(史上最全)

    万次阅读 多人点赞 2021-07-28 22:40:37
    Python期末考试知识点(史上最全) python简介 Python是一种解释型语言 Python使用缩进对齐组织代码执行,所以没有缩进的代码,都会在载入时自动执行 数据类型:整形 int 无限大 浮点型 float 小数 复数 complex ...
  • 这是算法工程师面试知识点总结的第四篇,有兴趣的朋友可以看看前三篇的内容: 深度学习算法工程师面试知识点总结(一) 深度学习算法工程师面试知识点总结(二) 深度学习算法工程师面试知识点总结(三) 基于...
  • 自适应网页设计的知识点总结

    千次阅读 2014-02-08 17:16:57
    自适应网页设计的知识点总结 "自适应网页设计"到底是怎么做到的?其实并不难。 一. 允许网页宽度自动调整: 首先,在网页代码的头部,加入一行viewport元标签。 viewport是网页默认的宽度和高度,上面这行代码...
  • C++重要知识点精华总结

    万次阅读 多人点赞 2018-03-25 15:37:49
    C++重要知识点精华总结cin的使用:1&gt;cin&gt;&gt;a;键盘读入数据赋值给a;1&gt;程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,227
精华内容 27,290
关键字:

windows7知识点总结